x264源码分析与应用示例(三)——浅谈码率控制的优化问题

本文包含以下内容,由于这部分内容比较复杂,这么多年也都是大家研究的重点,我这里只做一个简单的介绍。

1、如何简单的通过修改命令行参数来优化码率控制的结果

2、如何从算法角度通过修改源码来优化码率控制的结果

首先需要明确的是,评价一个码率控制的结果好坏,基本上要看三点内容:1、码率是否准确 2、实时性如何;一半来说x264的2pass模式的码率控制效果最好,但却是完全不适合于实时应用的,另一种通过abr+vbv也能近似实现cbr的,只不过是一种平均码率上的constant(但是很多时候运营商是按照最大占用带宽来收费的,所以这种平均码率上的constant也有其不足之处),那么对于这种情况不同的vbv size就会对实时性造成影响了 3、质量;如果能够通过优化,实现同样码率下更好的质量,自然是最好的,这里的质量评价方法既可以用客观方法(PSNR、SSIM等)也可以进行主观评价实验来验证

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

简单的通过修改命令行参数来优化码率控制

x264的众多命令行参数中有哪些是和码率控制相关的呢?不了解的读者可以参见这篇文章。不过既然之前已经带着大家分析过源码了,是不是也可以试一下自己直接在源码里找出相关的命令行参数呢~

为了弄明白各个参数对最终结果的影响,可以通过反复修改命令进行编码来实验一下。这里我举一个简单的例子,在都使用2pass方法的前提下,修改参数(不同的GOP大小;是否开启宏块树码率控制mb_tree;不同的量化器曲线压缩参数qcomp;不同的自适应量化强度aq_strength;不同的rc-lookahead值)来比较最后的PSNR。首先使用如下的初始命令行。我这里用了ffmpeg,和x264相关的参数都在x264_opts后面了,我这里只是因为对ffmpeg的命令行更熟悉,其实和直接用x264是一样的。

ffmpeg -y -i test.mp4 -vcodec libx264 -tune animation -b:v 600k -pass 1 -x264opts keyint=500:bframes=16:b-adapt=1:b-pyramid=normal:open_gop=0:rc_lookahead=250:ref=9:me=hex:me_range=16:subme=9:psy_rd=0.90:trellis=1:deadzone-intra=11:deadzone-inter=21:threads=6:direct=auto:mbtree=0:qpmin=16:qpmax=56:qcomp=0.10:aq-mode=1:aq-strength=0.9:8x8dct=1 -f mp4 NUL && ffmpeg -y -i 1.mp4 -vcodec libx264 -b:v 600k -tune animation -pass 2 -psnr -x264opts keyint=500:bframes=16:b-adapt=1:b-pyramid=normal:open_gop=0:rc_lookahead=250:ref=9:me=hex:me_range=16:subme=9:psy_rd=0.90:trellis=1:deadzone-intra=11:deadzone-inter=21:threads=6:direct=auto:mbtree=0:qpmin=16:qpmax=56:qcomp=0.10:aq-mode=1:aq-strength=0.9:8x8dct=1 testout.mp4 2>testout.txt

A、使用这样的命令行对四部不同的动画片(都没有激烈的打斗画面)进行编码,都编码为600k,PSNR结果如下

扫描二维码关注公众号,回复: 14535445 查看本文章

序列1 43.93

序列2 46.672

序列3 42.384

序列4 41.46

B、在初始命令基础上验证不同GOP大小的影响,可以看到虽然动画适合采用长GOP,但是过长也会降低质量

keyint 250 500

序列1 44.401 43.93

序列2 46.659 46.672

序列3 42.415 42.384

序列4 41.534 41.46

C、在初始命令基础上验证开启宏块树码率控制的影响,可以看到开启之后会提升质量

mbtree 开 关

序列1 45.788 43.93

序列2 48.378 46.672

D、在初始命令基础上验证不同的量化器曲线压缩参数的影响,参数越大,越趋近于使用固定QP,可以看到该参数不适宜取得太大

qcomp 0.1 0.3 0.5 0.7 0.9

序列1 43.982 43.972 43.955 43.93 43.898

序列2 46.71 46.699 46.684 46.672 46.672

序列3 42.241 42.326 42.376 42.336

E、在初始命令基础上验证不同的自适应量化强度的影响,强度越大,对平坦区域的压缩质量越差,可以看到,对动画片,非常适合设置较小的量化强度

aq-strength 0.1 0.3 0.5 0.7 0.9 1.1 1.3 1.5 1.7 1.9

序列1 45.112 44.951 44.653 44.307 43.93 43.423 42.889 42.412 41.931 41.47

序列2 48.273 47.909 47.103 46.21 45.715 45.201 44.621 44.007

F、在初始命令基础上验证不同的rc-lookahead的影响,该参数对应于码率控制时可用的帧的数量,仅对码率控制精确程度有影响,对最终质量无影响,也是因为测试的动画类视频帧间差距不大的结果

rc-lookahead 40 100 150 250

序列1 43.93 43.93 43.93 43.93

G、再简单说一下其他几个很有意思的参数

subq:设置亚像素估计的复杂度,值越高复杂度越高,估计越准确,同时,值大于8时才会显著增加估计时间

i_qfactor:设置平均的I帧的量化器相比P帧量化器增值。更高的值意味着更高的I帧质量,过高的值会增加编码时间

trellis:使用网格编码量可以增进编码效率

fast_pskip:P帧的早期跳过决策,会增加耗时,同时质量提升不多

本文福利, 免费领取C++音视频学习资料包、技术视频,内容包括(音视频开发,面试题,FFmpeg webRTC rtmp hls rtsp ffplay srs↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/127337660
今日推荐