【发布时间】:2013-12-19 11:47:36
【问题描述】:
我正在尝试开发一个 Android 应用程序,该应用程序将使用 MediaRecorder 录制 15 秒 640x640 视频,使用 ffmpeg 提取所有帧,使用 gpuimage 应用一些艺术过滤器,然后使用 ffmpeg 将帧组合回视频。
我在录制分辨率为 640x640 的视频时遇到问题。 (Instagram android 应用程序会这样做)
我尝试使用 MediaRecorder 的 setVideoSize(640, 640),输出视频为 640x640,但视频看起来像是垂直拉伸的 640x480 视频,使其成为 640x640。我猜这是因为 640x640 不是设备支持的视频捕获分辨率列表返回的分辨率。有没有办法告诉媒体记录器在进行这种缩放时保持纵横比,以便我通过裁剪宽度而不是拉伸高度来获得从 640x480 缩放到 640x640 的视频?
【问题讨论】:
-
我目前的替代方法是以 640x480 录制视频,提取帧并将每帧裁剪为 480x480,方法是从左右下降 80 个像素,然后将每帧放大到 640x640。但这是一个耗时的过程,如果无论如何我可以告诉 MediaRecorder 在以自定义分辨率视频捕获时保持纵横比,用户必须等待的时间会大大缩短。
-
我的MediaRecorder设置如下:
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mediaRecorder.setVideoEncoder(VideoEncoder.H264); mediaRecorder.setOutputFile(Environment.getExternalStorageDirectory().getPath()+"/test.3gp"); mediaRecorder.setMaxDuration(15000); mediaRecorder.setMaxFileSize(50000000); mediaRecorder.setVideoSize(640, 640); 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", frame%03d.jpg"}; -
奇怪的是,ffmpeg 中的crop+scale 在你还要面对解码、艺术滤镜和重新编码的时候,意义重大。除非您使用硬件编码器。您可以考虑替代方案 - 接收预览帧(640x480,或者如果您的相机支持,则可能是 800x600),裁剪和应用过滤器以及编码 - 所有这些都是实时的。
-
这里是实现FPS不比MediaRecorder差的方法:stackoverflow.com/a/19924579/192373
标签: android video ffmpeg crop mediarecorder