H.264的码率控制算法采用了多种技术,其中包括自适应基本单元层(Adaptive Basic Unit Layer)、流量往返模型(Fluid Traffic Model)、线性MAD模型、二次率失真模型等。并且采用了分层码率控制策略,共分为三层:GOP层、帧层和基本单元层。在JVT的提案中,采用的是JVT-G012码率控制算法,该算法提出了基本单元的概念,将一帧划分为若干个基本单元,基本单元可能是一宏块、一行宏块、一场或一帧。帧层码率控制根据网络带宽、缓存占用量、缓存大小及剩余比特来分配每一帧的目标比特;在基本单元层码率控制中,目标比特由该帧的剩余目标比特平均得到。这些技术的采用成功地解决了传统码率控制算法与H.264的率失真优化技术之间存在的因果矛盾,能较准确地控制输出码率,输出视频质量较好。

H.264中的JVT.G012算法采用的二次R—Q模型如下:

这一模型用于基本单元的量化参数计算,其中R代表编码量化系数所需的码字位数,Q指基本单元的量化步长,MAD通过以下线性预测模型进行预测:

其中MADcb和MADpb代表当前基本单元和前一帧相应位置处的MAD,a1,a2是模型系数,在每一个基本单元的最后一个宏块处理中通过线性回归的方法进行更新。

JVT的码率控制比以往的标准更加困难。因为量化参数不仅在码率控制算法中使用而且在率失真优化中应用,从而导致一种称为“鸡与蛋"的悖论(Chicken and Egg Dilemma):为了在当前帧的宏块中应用率失真优化,首先要有一个量化参数,这个量化参数通过计算当前帧的MAD(Mean Absolute Difference)得到。然而,只有在率失真优化以后才能得到当前帧的MAD。并且编码处理所使用的信道带宽可能是恒定的,也可能是可变的。必须同时考虑恒定比特率(Constant Bit Rate,CBR)和可变比特率(Variable Bit Rate,VBR)两种情况。目前的码率控制机制大多针对恒定码率的情况.

率失真理论是视频编码的一个基本部分。率失真优化(RDO)在给定的码率限制下最小化解码失真,Lagrangian方法可以在码率和失真之间有效地进行折中。在H.264标准中,Lagrangian方法用于运动补偿的模式选择和帧内预测。换言之,它可以在给定的码率限制下,最小化失真,寻找到块的最佳运动向量和编码模式。然而,Lagrangian方法的应用使码率控制变得更困难,因为QP涉及到码率控制和失真计算。换言之,码率控制方案在调整QP后将影响块的运动和模式选择。在MPEG.4码率控制中,可以在估计QP前通过执行二次R—D模型来获得X1,X2、MAD和目标比特数。但在H.264标准中,QP在码率控制和RDO中都指定了,因此在执行RC时就存在一个问题:对MB执行RDO,要先通过MB的MAD决定MB的QP,然而MB的MAD只有在RDO运行后才能获得。这就是一个蛋鸡悖论

如上所述,在H.264标准的码率控制中存在两个问题:
1.在执行RDO之前,MAD是未知的。
2.虽然在运动补偿后可以获得每个编码模式的MAD,但最佳编码模式仍然未知,所以不能决定哪个MAD可以用于估计QP。
Ma等人提出了一个新的H.264码率控制方案,该方案没有考虑QP与MAD之间的相关性,但它不是single—pass码率控制算法。虽然该算法可以实现目标比特数且没有明显的比特变动,但执行RDO要花费2倍的时间,对宏块而言这样的时I司复杂度是不可接受的。

H.264中的码率控制方法是以提案JVT—G012为蓝本的。JVT.G012提案通过引入基本单元和线形模型的概念,提出一种自适应基本单元层码率控制方案。基本单元可能是一帧、片或宏块。并提出了一种线性模型,通过前一帧相应位置的基本单元预测当前基本单元MAD。为阐述G012提案,本文首先对其中的关键技术进行分析。

1。基本单元的定义

假设某一帧由Nmbpic个宏块组成,那么定义基本单元为一个由Nmbpic个宏块中连续的Nmbunit个宏块所组成的组。那么在该帧中的总的基本单元的个数为:

Nunit=Nmbpic/Nmbunit

需要注意的是,如果采用了比较大的基本单元,那么PSNR可以达到一个较高的值,同时比特的波动也会增大。另一方面,如果采用了比较小的基本单元,比特的波动会比较的小,但是相应的会带来PSNR的损失。

2.流量往返模型(Fluid Tramc Model)

3.MAD的线性预测模型
       这里,该算法一个线性模型来预测当前帧中的基本单元的MAD值,它的参

预测模型参数a1和a2更新方法分为三步,如下所述:
      第一步一数据点选择:数据点是用于更新模型参数,数据点的数量以及质量对于模型的准确性有着重要的影响。通常而言,数据点越多,模型越准确。在JM86模型中,采用滑动窗口机制进行数据点的选择,窗口大小通常为20。
      第二步一计算模型参数:根据选中的数据点,算法收集预测的MAD和实际MAD的值,采用线性回归的方法,计算得到a1和a2。
      第三步一去除坏的数据点:在得到al和a2之后,根据滑动窗口中数据点的参考值,用a1和a2形成的预测模型计算数据点的预测值,然后将得到的值与数据点的原始预测值比较,计算误差,如果误差大于一定的值(JM中取误差的均值),则将该数据点去除,用更新后的数据点重新计算模型参数al和a2。

H.264的码率控制算法相关推荐

  1. H.264码率控制机制

    H.264标准码率控制算法步骤如下: 1.计算当前帧的目标码字,并将其限定到HRD的边界中. 2.通过线性模型(式4.5)预测当前帧中基本单元的MAD. 3.为未编码基本单元分配码字. 4.通过二次R ...

  2. H.264算法的DSP移植与优化

    摘要:在TMS320DM643平台上实现H.264基档次编码器的移植与优化显得格外实用和必要.基于对DSP平台的结构特性和H.264的计算复杂度分析,主要从核心算法.数据传输和存储器/Cache使用几 ...

  3. Android视频压缩实现,基于Android系统的H.264视频压缩技术实现

    3.2 底层驱动移植模块设计 Android系统本身是一个庞大的系统,移植需要考虑Android系统的硬件抽象层(HAL)和Linux中的相关设备驱动程序.移植的目的就是为了改动较小的内容,支撑较为庞 ...

  4. H.264解码器中CAVLC码表查找算法的分析与优化

    0 引言    近年来,随着信息技术飞速发展和互联网的日益普及,尤其是以视频为信息主要来源的多媒体领域越来越受到人们的关注.H.264是ITU-T的视频编码专家组(VCEG)和ISO/IEC的活动图像 ...

  5. 解析H.264视频编解码DSP实现与优化

    引言 基于互联网的数字视频产业前景看好,而3G的规模部署,也会推动移动视频通信成为现实.但数字化后的视频图像具有数据海量性,给图像的存储和传输造成较大的困难.数字视频产业,是指数字内容中以数字视频形态 ...

  6. H.264码率控制算法研究及JM相应代码分析(二)

    在前一篇文章的基础上,现在先看一下MPEG4 编码标准中应用的码率控制算法,总结起来,各大算法都是在解决两个问题:RD 率失真的优化以及避免缓冲区的上溢下溢. MPEG-4 VM8 码率控制算法 在这 ...

  7. H.264的码率控制策略

    码率控制实际上是一种编码的优化算法,它用于实现对视频流码流大小的控制.那么它控制的目的是什么呢?     我们可以试想一下,同样的视频编码格式,码流大,它包含的信息也就越多,那么对应的图像也就越清晰, ...

  8. 如何确定h.264的码率

    A:如何确定h.264的码率? 码率 = 编码产生的总比特数 * 帧频 / 编码总帧数 码率控制机制就是使编码器编码产生的码流尽量符合你设定的码率.从上面的公式可以看出,当编码帧数和帧频确定后,码率控 ...

  9. JM编码器码率控制算法笔记:以JVT-G012r1为例

    应用率失真优化需要三个算法/模型 根据信源输入及选择的编码框架,建立合适的R-D模型(通常是R-Q.D-Q关系): 根据给定的码率R以及缓冲区状态,为每个编码单元分配比特并带入R-D模型求解Q,并在编 ...

最新文章

  1. 算法之递归(3)- 链表操作
  2. 谢尔排序/缩减增量排序(C++)
  3. Django的路由分发与名称空间
  4. The Little Match Girl
  5. 牛客 - Animal Protection(单调栈)
  6. 易学源码html,HTML
  7. TypeScript 素描 - 类
  8. armadillo: run time error: need lapack
  9. Vue:打印组件PrintPage
  10. 用Python实现简单的人脸识别,10分钟搞定!(附源码)
  11. win10下如何关闭445端口,教程演示
  12. 择校秘籍|南大计算机 和 北航计算机 应该怎么选?
  13. Linux 文件压缩和解压命令 (压缩、解压)
  14. HttpClilent整合Spring使用
  15. 双系统装完只能u盘启动_双系统启动引导修复 双系统启动引导设置教程
  16. java游戏征途2008_醉剑逍遥-征途天下
  17. 彻底弄透Java处理GMT/UTC日期时间
  18. 「Hudi系列」Hudi查询写入常见问题汇总
  19. sequoia中的自动故障处理
  20. 【连载】大学物理笔记——第一章末+第二章质点动力学

热门文章

  1. [转载]基于TFS实践敏捷-修复Bug和执行代码评审
  2. java Integer 源码学习
  3. 【编译原理】为什么编程语言中,标识符不能以数字开头?
  4. 【Python 标准库学习】时间相关的函数库 — time
  5. Mybatis四种分页方式
  6. mongo更新数组字段_更新mongodb中嵌套数组中的几个字段(使用pymongo)
  7. 浏览器使用java_java如何调用本地的浏览器
  8. fxml设置背景_JavaFX – 如何获取Tab,Button等的背景颜色
  9. CCNA-网络常用工具介绍篇
  10. 【 HDU - 3062】Party(2-sat)