ffmpeg码率控制

什么是码率控制?

它是编码器决定为每帧视频分配多少比特的工具

码率控制有多种方式

接下来会对“1-pass”、“2-pass”、“CBR”、“VBR”、“VBV Encoding”和“CRF”做相应的介绍

可变码率

可变码率是在固定码率的基础上发展出来的,可变码率(Variable Bitate, VBR)可以确保在给定限制下使用最少的比特的情况下保持最高质量。也就是说在难编码的地方花费更多的比特,在简单的地方花费更少的比特。

码率的控制模式

以下基于ffmpeg中的x264、x265和libvpx编码器,介绍码率的控制方式

固定QP(Constant QP, CQP)

QP控制着文件压缩的大小,H.264与H.265中QP值在0-51之间的整数范围内,QP值越大压缩率越高同时质量越低,但有的编码器并没有QP值例如:libvpx编码器

1
2
ffmpeg -i <input> -c:v libx264 -qp 20 <output>
ffmpeg -i <input> -c:v libx265 -x265-params qp=20 <output>

非必要不要使用QP模式,采用QP模式会导致根据场景复杂度不同比特率的波动很大,你无法控制实际的比特率

平均比特率(Average Bitrate, ABR)

给定编码器一个目标的码率,编码器计算如可达到这个码率:

1
2
3
ffmpeg -i <input> -c:v libx264 -b:v 1M <output>
ffmpeg -i <input> -c:v libx265 -b:v 1M <output>
ffmpeg -i <input> -c:v libvpx-vp9 -b:v 1M <output>

ABR不是一种恒定码率模式,而是一种可变的码率模式。所以避免使用这个模式,因为它会在短时间内质量波动比较大

恒定码率(Constant Bitrate, CBR)

可以通过设置nal-hrd使编码器强制在特定码率

1
ffmpeg -i <input> -c:v libx264 x264-params "nal-hrd=cbr:force-cfr=1" -b:v 1M