视频编码的码率控制

H264码率控制为什么一定要MAD

最近一直在研究视频编码中打的码率控制,有一个问题一直没想明白,就是:H264由于引入了率失真优化模型,导致了码率控制出现了蛋鸡悖论的问题,具体描述如下,H264的模式选择需要用率失真优化,率失真优化需要确定QP值,而QP值是码控确定的,码控又需要MAD作为输入,MAD又是模式选择确定好模式后才能算出来。
  视频编码的码率控制

放一张很多地方都会用来解释的图。这个过程大体都能理解,唯一不太明白的是,为啥码率控制需要一定要用到MAD,是官方模型这样子吗?找了很多文章都没有说为什么,H264的提案相关文章也没找到,只找到一些如何解决蛋鸡悖论,进行MAD预测的提案。只能自己分析下。

率失真模型到码控模型

编码的时候需要用到QP,我们先分析下码控模块如何进行QP值的决策,首先你需要根据一些因素来决定给当前帧/宏块分配多少bits,然后根据RQ模型,也就是码率和QP的函数关系来算出QP值,如果说这个关系是一个很简单的二次模型(a假如是个常数),比如:
视频编码的码率控制
  那么问题就简单了,也不需要MAD了,啥蛋鸡悖论根本就不存在。但实际是这个模型并不是这样。我们往往需要先确定率失真模型即RD模型,然后再根据DQ模型是一个线性关系来决定RQ模型,至于DQ模型为啥是线性关系,这个是论文里面看到的。首先来看下H264的RD模型:
  视频编码的码率控制
然后把DQ的线性关系代入,同时引入MAD作为衡量编码复杂度的参数,得到最终的H264 RQ模型:视频编码的码率控制
其中H为各种码流头部消耗的bits数,至此应该就比较明显了,根本原因在于H264考虑的复杂度这个影响因素。为啥要考虑这个呢,其实这和人眼的遮蔽效应有关,比如纹理复杂的区域,运动很快的区域,这时候即使码率给的低一点,肉眼也不太能分辨出来质量损失。

总结

H264之所以存在蛋鸡悖论,是因为码控需要用到MAD,MAD可以衡量一帧的编码复杂度,MAD太大往往意味着预测残差较大,此时要么是该帧的纹理复杂,要么是运动复杂,而人眼对这两种情况的感知都不明显,也就是可容忍的失真度较高,所以可以稍微少给一点码率。从开源项目x264、x265的代码里面也可以发现,x264/x265的码率控制也是考虑了这个因素的,在项目里叫做模糊复杂度blurComplex。至于x264和x265的具体码控实现,除了通过这种考虑复杂度的帧级QP的决策,还有AQ和CUTree两个技术来进行宏块级别的QP决策,后续再分析。

上一篇:前端-HTML基础+CSS基础


下一篇:R语言中的mad函数绝对中位差