FFmpegFrameRecorder 调用 record() 20 次,但生成的 mp4 文件只有 2 帧

FFmpegFrameRecorder calls record() 20 times but the resulting mp4 file only has 2 frames

我正在使用 FFmpegFrameRecorder 从相机预览创建 mp4(H264) 视频。我的录音机配置如下

recorder = new FFmpegFrameRecorder(filePath, width, height);
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setFormat("mp4");
recorder.setFrameRate(VIDEO_FPS);
recorder.setVideoBitrate(16384);
recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);

对于其余部分,我严格遵循示例代码 RecordActivity.java 并且能够验证

recorder.record(yuvIplimage)

被调用 20 次(或更多次),这应该会创建一个包含 20 帧的 mp4。但是,打开后得到的mp4文件只有2帧(两个预览的第一帧)!我不知道是什么导致了这种行为。任何帮助将不胜感激。谢谢。

龙乐

我想通了:问题是因为我不知道自己在做什么。我是 javacv 的新手,我假设它基于 this Whosebug entry, that the number of frames in the resulting video should be equal to the number of record() calls. However, this is not the case with video encoding, especially with H264. I figured this out by trying with MPEG4 encoding and there's definitely more than 2 frames. H264 seems to require a minimum number of input frames,因此不适合短(<1 分钟)视频剪辑生成(这是我的应用程序)。一种解决方案是切换到 MPEG4 编码。但是,大多数播放 .mp4 文件的浏览器不支持 MPEG4 编码。另一种解决方案是使用 H264 最小化压缩,通过添加以下配置

recorder.setVideoQuality(0); // maximum quality, replace recorder.setVideoBitrate(16384);
recorder.setVideoOption("preset", "veryfast"); // or ultrafast or fast, etc.