我正在尝试开发一个 Android 应用程序,该应用程序将使用 MediaRecorder 录制 15 秒 640x640 视频,使用 ffmpeg 提取所有帧,使用 gpuimage 应用一些艺术滤镜,然后使用 ffmpeg 将帧组合回视频。
我在录制分辨率为 640x640 的视频时遇到问题。 (Instagram android 应用程序执行此操作)
我尝试使用 MediaRecorder 的 setVideoSize(640, 640) 并且输出视频为 640x640,但视频看起来像一个 640x480 的视频,垂直拉伸(stretch)为 640x640。我想那是因为 640x640 不是设备支持的视频捕获分辨率列表返回的分辨率。有什么方法可以告诉媒体记录器在进行此类缩放时保持纵横比,以便我通过裁剪宽度而不是拉伸(stretch)高度来获得从 640x480 缩放到 640x640 的视频?
最佳答案
我最终以 640x480 捕获,将其裁剪为 480x480,同时使用 ffmpeg 分割成帧,最后当使用 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 像素稍后被裁剪的视频。因此,用户可以得到他在预览中看到的内容。
关于android - 使用 1 :1 aspect ratio on Android 捕获视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20350833/