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

时间:2015-01-08 00:31:47

标签: ffmpeg javacv

我使用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帧(预览的两个第一帧)!我不知道是什么导致了这种行为。任何帮助都会非常感激。谢谢。

龙乐

1 个答案:

答案 0 :(得分:0)

我明白了:问题是因为我不知道自己在做什么。我是javacv的新手,我假设,基于this stackoverflow条目,生成的视频中的帧数应该等于record()调用的数量。但是,视频编码并非如此,尤其是H264。我通过尝试MPEG4编码来解决这个问题,而且肯定超过2帧。 H264似乎需要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.