我正在尝试将视频转码为 H.264/MP4。我正在使用该crf = 20
选项,但根据要求,我还想将最大比特率限制为 3 MBit/s。
我试图通过使用x264opts
这样的方式作弊
-x264opts crf=20:vbv-bufsize=14000:vbv-maxrate=3000:keyint=40
这是正确的做法吗?可以这样做吗?还是我只能使用恒定比特率,而不用 CRF?
答案1
使用-maxrate
和-bufsize
强制 VBV(视频缓冲区验证器)限制输出比特率:
ffmpeg -i input.file -c:v libx264 -crf 20 -maxrate 3M -bufsize 6M output.mp4
3M = 3 mbit/s,您也可以使用 3000k(代表 3000 kbit/s)。根据您期望客户端能够缓冲多少来设置缓冲区大小。
看本指南有关使用 x264 与 FFmpeg 的更多信息(尽管它没有提到 VBV 编码)。
答案2
这只是对其他阅读此文的人的一个公平警告;我注意到 VBV(ffmpeg -maxrate for x264)是远的与适当的 2 遍速率控制编码相比,它对丢弃的比特更加不加区分。一种更好的(但也更棘手、更昂贵)方法是使用 CRF 对整个视频进行编码,然后使用带比特率目标的 2 遍对有问题的峰值片段进行重新编码。
或者,使用对 capped CRF 具有更好编码器支持的较新的编解码器(例如 AV1)