Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android上以1:1的纵横比捕获视频_Android_Video_Ffmpeg_Crop_Mediarecorder - Fatal编程技术网

在Android上以1:1的纵横比捕获视频

在Android上以1:1的纵横比捕获视频,android,video,ffmpeg,crop,mediarecorder,Android,Video,Ffmpeg,Crop,Mediarecorder,我正在尝试开发一个android应用程序,它可以使用MediaRecorder录制15秒的640x640视频,使用ffmpeg提取所有帧,使用gpuimage应用一些艺术过滤器,然后使用ffmpeg将帧合并回视频 我在录制分辨率为640x640的视频时遇到问题。(Instagram android应用程序可以做到这一点) 我尝试使用MediaRecorder的setVideoSize(640640640),输出视频为640x640,但视频看起来像是垂直拉伸的640x480视频,使其为640x64

我正在尝试开发一个android应用程序,它可以使用MediaRecorder录制15秒的640x640视频,使用ffmpeg提取所有帧,使用gpuimage应用一些艺术过滤器,然后使用ffmpeg将帧合并回视频

我在录制分辨率为640x640的视频时遇到问题。(Instagram android应用程序可以做到这一点)


我尝试使用MediaRecorder的setVideoSize(640640640),输出视频为640x640,但视频看起来像是垂直拉伸的640x480视频,使其为640x640。我猜这是因为640x640不是设备支持的视频捕获分辨率列表返回的分辨率。有没有办法告诉media recorder在进行这种缩放时保持纵横比,这样我就可以通过剪切宽度而不是拉伸高度来获得一个从640x480缩放到640x640的视频?

我最终以640x480进行捕获,在使用ffmpeg分割到帧时将其剪切到480x480,最后,当使用ffmpeg将帧合并回视频时,它将被放大到640x640

String[] ffmpegCommand = {"/sdcard/frames/ffmpeg",
    "-i", "/sdcard/frames/test.3gp",
    "-vf", "crop=480:480:80:0,transpose=1",
    "-r", "30", "-an", "-qscale:v", "2", "-vsync", "1", "-threads", "4",  "/sdcard/frames/image%03d.jpg"};
当应用程序在纵向模式下工作时,需要transpose=1


注意:在拍摄时,为了只显示将包含在最终裁剪视频中的视频部分,我在预览显示的顶部添加了两个80像素的黑色条,以隐藏随后裁剪的视频两侧的80像素。因此,用户可以在预览中看到什么。

我当前的替代方案是以640x480录制视频,提取帧,并通过从左右两侧删除80个像素将每个帧裁剪为480x480,然后将每个帧放大到640x640。但这是一个耗时的过程,如果有任何方法,我可以告诉MediaRecorder在以自定义分辨率拍摄视频时保持纵横比,用户需要等待的时间将大大减少。我的MediaRecorder设置如下:
MediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);setOutputFormat(mediaRecorder.OutputFormat.ThreeGPP);mediaRecorder.setVideoEncoder(VideoEncoder.H264);mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getPath())+‌​“/test.3gp”);mediaRecorder.setMaxDuration(15000);mediaRecorder.setMaxFileSize(50000000);mediaRecorder.setVideoSize(640640640);mediaRecorder.setVideoFrameRate(30);mediaRecorder.setVideoEncodingBitRate(3000000)
和用于从视频中提取帧的ffmpeg命令:
String[]ffmpegCommand={“ffmpeg”、“-I”、“test.3gp”、“-r”、“30”、“-an”、“-s”、“640x640”、“-qscale:v”、“2”、“-vsync”、“1”、“-threads”、“4”、帧%03d.jpg”}奇怪的是,FFMPEG中的GISD+标尺在你面对解码、艺术过滤器和重新编码时也是有意义的。除非你使用HW编码器。你可以考虑另一种选择——接收预览帧(640x480,或者如果你的相机支持的话,可能是800×600)。,裁剪和应用过滤器,以及编码-所有这些都是实时的。下面是实现FPS不比MediaRecorder差的方法:你能提供更多的信息/代码等,我也在做同样的工作issue@MuhammadUmarNikhil你能在这个问题上指导我吗?