x264可以设置VBR和CBR的编码模式,VBR为可变码率,CBR为恒定码率。尽管互联网上VBR居多,但是CBR依然存在。
ffmpeg是通过-b:v来指定视频码率,但这个设定的是平均值,并不能够很好的控制上下波动幅度。如果要控制波动,还需要控制最大码率和最小码率,即-b:v,maxrate,minrate。同时为了更好的控制编码时的波动还可以设置编码时的buffer大小,即设置-bufsize即可。buffer的设置并不是越小越好,而是恰到好处,如1Mbit/s,bufsize设置为50KB,可以很好的控制码率波动。
ffmpeg -i input.mp4 -c:v libx264 -x264opts "bframes=10:b-adapt=0" -b:v 1000k -maxrate 1000k -minrate 1000k -bufsize 50k -nal-hrd cbr -g 50 -sc_threshold 0 output.ts
下面就来分析一下这条命令行,具体如下。
● 设置B帧的个数,并且是每两个P帧之间包含10个B帧
● 设置视频码率为1000kbit/s
● 设置最大码率为1000kbit/s
● 设置最小码率为1000kbit/s
● 设置编码的buffer大小为50KB
● 设置H.264的编码HRD信号形式为CBR
● 设置每50帧一个GOP
● 设置场景切换不强行插入关键帧
根据上述参数设置之后生成的output.ts文件,使用Bitrate Viewer观察其码率波动效果,结果如图4-6所示。
从图中可以看到码率波动为最小996kbit/s,最大码率为1001kbit/s,码率得到了控制
补充关于B帧:
如果不希望出现B帧,多用B帧才能使得h264真正压缩率达到200,I帧压缩率最低,P帧中等,B帧最高,因此B帧也会增加编码器负载,但可以减少码率。与不用相比,多用B帧时,同样的码率视频更清晰。
补充:
ABR是VBR和CBR的混合方案,VBR一般用于媒体存储,而不是网络传输,其实网络传输所谓的CBR一般都是ABR,只要单位时间内把码率控制住就可以了。ABR编码在速度上是VBR编码的2到3倍,但低于CBR。
CBR编码的缺点在于质量不稳定,当有运动产生时,质量会下降,尤其是设置的码率较低时更明显。
VBR的优势是当内容简单时,分配的码率就少,当视频复杂时就多分配点码率,因此在相同文件大小时,VBR的视频质量要好于CBR。当两者质量相同时,VBR大小可能只是CBR的一半。
h264编码的帧由大到小依次为:
I > P > B
(互相之间约有5倍的差距)
x264的编码耗时由长到短依次为:
P > B > I
通常而言,较小的帧因为帧内压缩计算量(deblock、cabac等)小,所以耗时相对短。
P帧的编码耗时长是因为帧间压缩(宏块寻找、运动补偿等)耗时长所以提高了总体耗时。