使用 FFmpeg 编码 H.264 CBR 视频

Posted

技术标签:

【中文标题】使用 FFmpeg 编码 H.264 CBR 视频【英文标题】:Encoding H.264 CBR videos with FFmpeg 【发布时间】:2011-10-30 19:49:42 【问题描述】:

我正在尝试将使用 ffmpeg 的视频编码为具有恒定比特率的 H.264(通过 libx264 库)。我知道,我知道,VBR 通常是首选,但对于这个特定的工作,我需要使用 CBR(只要它每秒这么多千字节;它不必是每帧的精确千字节,afaik) .我用来测试的示例视频来自这里:http://a1408.g.akamai.net/5/1408/1388/2005110403/1a1a1ad948be278cff2d96046ad90768d848b41947aa1986/sample_iTunes.mov.zip(来自http://support.apple.com/kb/HT1425)

使用 MPEG-4 视频(使用命令ffmpeg -i sample_iTunes.mov -b 819968 -minrate 819968 -maxrate 819968 out.mov)对视频进行编码时,我可以获得恒定的比特率,并且比特率符合预期。通过 QuickTime Inspector 阅读视频的规格,它的数据速率为 844.94 kbit/s。很酷。

但是,当我将编解码器更改为 libx264 时,它似乎完全忽略了我的比特率请求!我正在尝试的命令是“ffmpeg -i sample_iTunes.mov -vcodec libx264 -vpre medium -b 819968 -vb 819968 -minrate 819968 -maxrate 819968 -bufsize 400000 test.mov”。但是当我通过 QuickTime Inspector 检查视频规格时,它的数据速率为 254.74 kbit/s。怎么回事?那还差得远!

我尝试过更改这么多参数并添加大量不同的东西,我花了 2 天时间在谷歌上搜索,但我似乎无法让它工作。如果我使用 MainConcept H.264 编码器对视频进行编码,我可以获得恒定的比特率,但我需要它才能与 ffmpeg 一起使用。

如果有人能帮我弄清楚如何使用 FFmpeg 进行 CBR H.264 编码,我会永远爱你!

【问题讨论】:

【参考方案1】:

我也一直在努力尝试使 CBR 脱离 x264。我发现 Dark Shakari 的这个博客 post 很有趣。

这是我将低延迟 CBR 视频转换为 MPEG 传输流的内容:

ffmpeg -i sintel_trailer-720p.mp4 -an -tune zerolatency \
       -x264opts bitrate=4000:vbv-maxrate=4000:vbv-bufsize=166 \
       -vcodec libx264 -f mpegts -muxrate 4000K -y trailer.ts

根据你设置的x264开发者博客:

vbv-maxrate = 比特率 = B = 目标比特率 vbv-bufsize = B / fps(在本视频中为 24 fps)

最后,为 x264 设置 ffmpeg 开关 -tune zerolatency。

希望对您有所帮助。而且,如果有人对此有改进,请告诉我!

【讨论】:

我仍然看到这些选项存在相当大的差异。但是,+1 因为它让我找到了一个对我的情况有帮助的选项,-muxrate。这会向传输流添加空值填充,以尝试实现您的 CBR 目标。它并不完美,但它让我足够接近。据我所知,ffmpeg 根本不支持 CBR。 Min=avg=max 也不起作用。空填充尽可能接近。 我可以使用这些选项接近 CBR,因此 +1。当设置为 4000K 时,我得到 4000、3999.9 和 3999.8,所以不是完全 CBR,但该死的接近! 如果您需要 23.976 FPS 来解决音频同步问题怎么办?您的命令会创建一个音频不同步的文件【参考方案2】:

-bufsize 400000 之后指定-nal-hrd cbr

【讨论】:

【参考方案3】:

好的,所以我想我可能已经找到了问题的一部分。使 -bufsize 大于数据速率似乎已经解决了这个问题。当然,我不知道它是否在编码 real CBR,但 Quick Time Inspector 读取的数据速率看起来是现在。

【讨论】:

【参考方案4】:

这可能是一个线索(假设您设置了比特率)“CBR 是设置 maxrate == 比特率和 bufsize 时”http://ffmpeg-users.933282.n4.nabble.com/Does-constant-bitrate-exist-in-libx264-td2255554.html

bufsize 应该是“接收客户端的”最大缓冲区大小。

【讨论】:

以上是关于使用 FFmpeg 编码 H.264 CBR 视频的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg 使用 Nvidia 硬件编码器编码 H.264

ffmpeg用于将视频编码为H264编解码器格式

使用 FFmpeg 通过 RTMP 发送 H.264 编码流

使用 ffmpeg 将视频转换为 MP4 (H.264/AAC)

YUV420P的像素数据编码为H.264的压缩编码数据

YUV420P的像素数据编码为H.264的压缩编码数据