最近调试HEVC中码率控制, 发现HM里面一个重大bug
最近调试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相关推荐
- x264中码率控制(一)
x264码率控制方法:采用的码率控制算法并没有采用拉格朗日代价函数来控制编码,而是使用一种更简单的方法,即利用半精度帧的SATD(sum of absolute transformeddifferen ...
- x264中码率控制(三)rate_estimate_qscale函数
// 依据到目前为止编码bit数估算一帧的qscale 该函数主要进行qscale的初始化和调整,是码率控制部分的核心之一,另一个是get_scale. 0.计算SATD和图像的模糊复杂度 1.在ge ...
- x264中码率控制(二)x264_ratecontrol_start函数
在一帧的编码前就选择QP值.帧层码率控制,到这一步,一帧中所有宏块还是统一qp的 void x264_ratecontrol_start( x264_t *h, int i_force_qp ) {x ...
- 【Android 逆向】Android 进程注入工具开发 ( 调试进程中寄存器的作用 | 通过 EIP 寄存器控制程序运行 | EIP 寄存器的存档与恢复 )
文章目录 一.调试进程中寄存器的作用 二.通过 EIP 寄存器控制程序运行 三.EIP 寄存器的存档与恢复 一.调试进程中寄存器的作用 内存是一个线性结构 , 将动态库加载到内存中后 , 每个动态库文 ...
- X264码率控制流程分析
码率控制的理论知识: 码率控制的目的和意义: 图像通信中码率控制的目的:通过调节编码参数,控制单位时间内的编码视频流的数据量,以使产生的比特流符合各种应用的需求.视频压缩的效率和视频内容有很大的关系, ...
- HEVC/H.265编码HM码率控制
HEVC/H.265编码标准HM平台码率控制流程 研究生期间了解过HM平台的码率控制过程,现在时隔2年多又回顾了一下HM平台的码控流程,发现相较之前多了CpbSaturationEnabled这么个机 ...
- HEVC码率控制介绍(R-Lamda)
本来是不想贴出相应的代码的,但是还是贴出来大概的模块吧,这样才能不纸上谈兵! R-lamda模型提出到优化已有2年,从近几年的文章来看,大体归为以下几类:一类是帧内的码率控制算法,一类是模型参数更新, ...
- HEVC码率控制TEncRCPic
TEncRCPic帧级别码率控制 先开看成员属性 补充:m_totalCostIntra是指该帧(I帧)的帧内所有LCU的代价总和,该值通过TEncSlice::calCostSliceI函数赋值,同 ...
- VVC码率控制中的质量依赖因子QDF
本文来自提案JVET-M0600<Quality dependency factor based rate control for VVC> VTM沿用了HM中的码率控制方式,即R-lam ...
最新文章
- Sql Server导出表结构Excel
- getopt:命令行选项、参数处理
- 转:Oracle SQL 内置函数大全 (一)
- 深度学习核心技术精讲100篇(七十六)-分类-决策树
- 恶意代码实战Lab13-01分析
- Nginx配置报错unknown directive echo的解决
- PHP ThinkPHP学习第一步(搭建及认识ThinkPHP入口文件)
- 第512章 河系量子计算机,第512章 河系量子计算机
- 校外分散实习(14)
- crop和resize操作区别
- 10-08 长假结束
- 新上手的Mac怎么开始盘?
- 使用EasyExcel读取excel文件案例
- 时速云:基于K8S的容器PaaS,将成为未来IT基础设施的重要组成部分
- 睡眠多少分钟一个循环_睡眠分多少阶段
- 一个exe可执行程序的生与死
- 如何用友远程到服务器,怎么安装用友T3远程通
- 图像风格迁移cvpr2020_CVPR 2020 论文大盘点-文本图像篇
- 无线通信——调制与编码
- edge浏览器如何把网页放到桌面_edge浏览器怎么把网页放桌面 - 卡饭网