背景
在对编码器的Context进行反复折腾,设置各种bit_rate
, bit_rate_tolerance
, rc_max_rate
, rc_max_available_vbv_use
,发现平均码率似乎能够降低,但是峰值码率总是很高。
后来想了一下如果在质量相同的情况下对一个视频进行编解码,似乎很难将做到编码的码率小于解码的码率。因为H264压缩做得那么好,已经压缩后的H264视频,应该几乎无法进行再次压缩了。
所以换一个思路来进行控制码率,就是控制视频质量,如果允许降低部分视频质量,码率自然可以得到降低。
实验
通过观察一般的视频文件,发现其 q:2-31
,于是对编码器的 Context->qmin
及 Context->qmax
进行调整,期望通过修改这两个值实现质量的更改.
qmin 最小量化系数 Q值越小,压缩程度越小,画面越清晰,文件大小越大
qmax 最大量化系数 (该参数对码率也会有影响,但是如果qmax过大,会存在明显间歇性的清晰度下降)
实验结果如下:
id | gop | rate | inputBps | qmin | qmax | outMinBps | outMaxBps | outAvgBps |
---|---|---|---|---|---|---|---|---|
origin | 12 | null | 660K | 2 | 31 | 495K | 901K | 686K |
1 | 60 | 0.8 | 660K | 2 | 31 | 315K | 1229K | 711K |
2 | 60 | 0.8 | 660K | 10 | 31 | 313K | 1137K | 737K |
3 | 60 | 0.8 | 660K | 2 | 41 | 260K | 888K | 517K |
4 | 60 | 0.8 | 660K | 10 | 41 | 302K | 794K | 512K |
5 | 60 | 0.8 | 660K | 30 | 31 | 300K | 1121K | 715K |
6 | 60 | 0.8 | 660K | 10 | 45 | 282K | 732K | 503K |
峰值一般出现在对视频进行贴图时
结论
- 通过设置qmin、qmax 可以起到降低码率的效果
- 设置qmin 可以降低部分峰值码率
- 设置qmax 对码率的影响较大,对降低平均码率及峰值码率都有较明显的效果
补充
- 未进行实时更改测试,暂不确定
qmin
,qmax
是否能够进行实时修改 - 另有两个参数
qblur
表示Q值的比例随时间消减的程度 ,qcompress
表示Q值的帧间变化范围,可能对质量的限制有帮助,暂未测试。