最近调试HEVC中码率控制, 发现里面一个重大bug!

码率控制中有这么一个函数:

Int TEncRCGOP::xEstGOPTargetBits( TEncRCSeq* encRCSeq, Int GOPSize )
{
Int realInfluencePicture = min( g_RCSmoothWindowSize, encRCSeq->getFramesLeft() );
Int averageTargetBitsPerPic = (Int)( encRCSeq->getTargetBits() / encRCSeq->getTotalFrames() );
Int currentTargetBitsPerPic = (Int)( ( encRCSeq->getBitsLeft() - averageTargetBitsPerPic * (encRCSeq->getFramesLeft() - realInfluencePicture) ) / realInfluencePicture );
Int targetBits = currentTargetBitsPerPic * GOPSize;

  if ( targetBits < 200 )
{
targetBits = 200;   // at least allocate 200 bits for one GOP
}

  return targetBits;
}

主要就是控制目标码率的范围!
         H.265 码率控制比H.264比较, 直观上增加了一个参与计算的参数就是编码帧数!也就是cfg里面的参数FramesToBeEncoded。

所以大家最好是变多少帧, 配置为对少帧,  但有些情况是不知道要编码多少帧, 有些同学就写一个最大值, 比如 999999, 表面上看没问题!

但是编码几帧后就会发现!上面这段程序会进入  targetBits = 200 , 导致QP一直是51, 从而码率控制失效, 设置不当还会导致 QP一直很小, 更是起不到码率控制的作用!

解决办法:

方法一1. 设置实际编码帧数, 这样控制最准, 当然不要导致Int currentTargetBitsPerPic = (Int)( ( encRCSeq->getBitsLeft() - averageTargetBitsPerPic * (encRCSeq->getFramesLeft() - realInfluencePicture) ) / realInfluencePicture );这里溢出!

方法2.  修改代码, 防止溢出, 修改如下:

Int TEncRCGOP::xEstGOPTargetBits( TEncRCSeq* encRCSeq, Int GOPSize )
{
Int realInfluencePicture = min( g_RCSmoothWindowSize, encRCSeq->getFramesLeft() );
Int averageTargetBitsPerPic = (Int)( encRCSeq->getTargetBits() / encRCSeq->getTotalFrames() );
Int currentTargetBitsPerPic = (Int)( ( encRCSeq->getBitsLeft() - (Int64)averageTargetBitsPerPic * (Int64)(encRCSeq->getFramesLeft() - realInfluencePicture) ) / realInfluencePicture );
Int targetBits = currentTargetBitsPerPic * GOPSize;
if ( targetBits < 200 )
{
targetBits = 200;   // at least allocate 200 bits for one GOP
}
return targetBits;
}

方法3:  修改代码

修改参与计算的帧数, 比如以2000帧为单位做一次控制, 每2000帧重新配置下码率控制!这样来避免溢出!

最近调试HEVC中码率控制, 发现HM里面一个重大bug相关推荐

  1. x264中码率控制(一)

    x264码率控制方法:采用的码率控制算法并没有采用拉格朗日代价函数来控制编码,而是使用一种更简单的方法,即利用半精度帧的SATD(sum of absolute transformeddifferen ...

  2. x264中码率控制(三)rate_estimate_qscale函数

    // 依据到目前为止编码bit数估算一帧的qscale 该函数主要进行qscale的初始化和调整,是码率控制部分的核心之一,另一个是get_scale. 0.计算SATD和图像的模糊复杂度 1.在ge ...

  3. x264中码率控制(二)x264_ratecontrol_start函数

    在一帧的编码前就选择QP值.帧层码率控制,到这一步,一帧中所有宏块还是统一qp的 void x264_ratecontrol_start( x264_t *h, int i_force_qp ) {x ...

  4. 【Android 逆向】Android 进程注入工具开发 ( 调试进程中寄存器的作用 | 通过 EIP 寄存器控制程序运行 | EIP 寄存器的存档与恢复 )

    文章目录 一.调试进程中寄存器的作用 二.通过 EIP 寄存器控制程序运行 三.EIP 寄存器的存档与恢复 一.调试进程中寄存器的作用 内存是一个线性结构 , 将动态库加载到内存中后 , 每个动态库文 ...

  5. X264码率控制流程分析

    码率控制的理论知识: 码率控制的目的和意义: 图像通信中码率控制的目的:通过调节编码参数,控制单位时间内的编码视频流的数据量,以使产生的比特流符合各种应用的需求.视频压缩的效率和视频内容有很大的关系, ...

  6. HEVC/H.265编码HM码率控制

    HEVC/H.265编码标准HM平台码率控制流程 研究生期间了解过HM平台的码率控制过程,现在时隔2年多又回顾了一下HM平台的码控流程,发现相较之前多了CpbSaturationEnabled这么个机 ...

  7. HEVC码率控制介绍(R-Lamda)

    本来是不想贴出相应的代码的,但是还是贴出来大概的模块吧,这样才能不纸上谈兵! R-lamda模型提出到优化已有2年,从近几年的文章来看,大体归为以下几类:一类是帧内的码率控制算法,一类是模型参数更新, ...

  8. HEVC码率控制TEncRCPic

    TEncRCPic帧级别码率控制 先开看成员属性 补充:m_totalCostIntra是指该帧(I帧)的帧内所有LCU的代价总和,该值通过TEncSlice::calCostSliceI函数赋值,同 ...

  9. VVC码率控制中的质量依赖因子QDF

    本文来自提案JVET-M0600<Quality dependency factor based rate control for VVC> VTM沿用了HM中的码率控制方式,即R-lam ...

最新文章

  1. Sql Server导出表结构Excel
  2. getopt:命令行选项、参数处理
  3. 转:Oracle SQL 内置函数大全 (一)
  4. 深度学习核心技术精讲100篇(七十六)-分类-决策树
  5. 恶意代码实战Lab13-01分析
  6. Nginx配置报错unknown directive echo的解决
  7. PHP ThinkPHP学习第一步(搭建及认识ThinkPHP入口文件)
  8. 第512章 河系量子计算机,第512章 河系量子计算机
  9. 校外分散实习(14)
  10. crop和resize操作区别
  11. 10-08 长假结束
  12. 新上手的Mac怎么开始盘?
  13. 使用EasyExcel读取excel文件案例
  14. 时速云:基于K8S的容器PaaS,将成为未来IT基础设施的重要组成部分
  15. 睡眠多少分钟一个循环_睡眠分多少阶段
  16. 一个exe可执行程序的生与死
  17. 如何用友远程到服务器,怎么安装用友T3远程通
  18. 图像风格迁移cvpr2020_CVPR 2020 论文大盘点-文本图像篇
  19. 无线通信——调制与编码
  20. edge浏览器如何把网页放到桌面_edge浏览器怎么把网页放桌面 - 卡饭网

热门文章

  1. 原始值和引用值类型及区别
  2. 杭电考研计算机多少分及格,2020考研:杭电计算机好考吗?分数线是多少?
  3. 攻防世界Reverse进阶区-answer_to_everything-writeup
  4. netlogo建模案例_NetLogo用于科研:建模
  5. 用户 'sa' 登录失败的解决方案
  6. 实施工程师的必要条件
  7. 职场人必看丨项目管理十大理念
  8. 计算机网络 一、 IP地址,域名,DNS
  9. ElastAlert规则
  10. 武汉市公交老年卡在什么地方可以年检