ffmpeg输出x264的CBR流或者文件

CBR(Constant Bit Rate)是以恒定比特率方式进行编码,有Motion发生时,由于码率恒定,只能通过增大QP来减少码字大小,图像质量变差,当场景静止时,图像质量又变好,因此图像质量不稳定。这种算法优先考虑码率(带宽)。
这个算法也算是码率控制最难的算法了,因为无法确定何时有motion发生,假设在码率统计窗口的最后一帧发生motion,就会导致该帧size变大,从而导致统计的码率大于预设的码率,也就是说每秒统计一次码率是不合理的,应该是统计一段时间内的平均码率,这样会更合理一些。

VBR(Variable Bit Rate)动态比特率,其码率可以随着图像的复杂程度的不同而变化,因此其编码效率比较高,Motion发生时,马赛克很少。码率控制算法根据图像内容确定使用的比特率,图像内容比较简单则分配较少的码率(似乎码字更合适),图像内容复杂则分配较多的码字,这样既保证了质量,又兼顾带宽限制。这种算法优先考虑图像质量。
参考自:http://blog.csdn.net/szfhy/article/details/50820119


由于项目中,不允许出现波动较大的流,所以VBR不适合。
在网上也有找一些关于CBR的编码参数,有些参数确实可以很好的控制媒体流的码率,但是质量影响太大了。所以我需要一组参数,介于CBR与VBR之前。即码率可以允许波动,但不要波动太大。

  1. 固定码率

    ffmpeg -i orig.mp4 -vcodec libx264 -profile:v baseline -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 250k -an -movflags rtphint -bf 0 test.mkv
    用bitrate工具分析test.mkv的码率,波动很小,如图:
    这里写图片描述
    其中,bufsize的大小等于bitrate / framerate。(但不清楚为什么bitrate分析出来的码率值与转码参数中的值有些出入)。可以看出,加入码率控制相关的参数,ffmpeg确实可以很好的控制输出文件的码率。但质量影响很大。再看Elecard工具分析的截图:
    这里写图片描述
    从各帧的大小来看,I帧码率与P帧差不多,可以想象,I帧的质量会有多差。播放效果也指明,在场景切换的时候,质量会很差,然后又会好起来。

所以,这种CBR的参数并不实用。

  1. 介于CBR与VBR之间
    ffmpeg -i orig.mp4 -vcodec libx264 -profile:v baseline -b:v 6000k -minrate 6000k -maxrate 6000k -bufsize 500k -an -movflags rtphint -bf 0 test.mkv
    跟上一组参数比较,bufsize放大了一倍,其它参数不变,然后再用bitrate工具分析其码率,如图:
    码率分析
    码率出现了一些波动,但波动范围很小。再看看elecard工具分析的截图:
    这里写图片描述
    I帧的码率上去了,图像质量也有明显的提升。

简单总结:想要输出CBR,bufsize参数很重要(具体多少合适,应该根据使用场景来确定,但网上给的公式:bufsize = bitrate / framerate肯定不合适),否则影响画面质量。

猜你喜欢

转载自blog.csdn.net/topsluo/article/details/79196641