有关码率控制的FAQ

来源:互联网 发布:诺基亚e63怎样下载软件 编辑:程序博客网 时间:2024/05/02 03:00

有关码率控制的FAQ
--------ByHychong
1.码率控制中几个参数含义的理解
在 RC 中经常会碰到这几个参数,InitialDelayOffset, Pm_X1,Pm_X2,Pm_rgQp[20],Pm_rgRp[20],
UpperBound1, UpperBound2, LowerBound,谁能解释一下他们的含义啊,在程序里多次出现,就是搞不
懂他们是用来干什么的,郁闷!
你应该先好好学习一下JVT-H017r3,先熟悉理论,然后把代码跑起来跟踪JM 的RC 流程怎么走的,
然后结合理论来理解就容易明白得多了。
UpperBound1, UpperBound2, LowerBound 就是JVT-H017r3 中的公式18、19
Pm_rgQp、Pm_rgRp、Pm_X1、Pm_X2 的含义是:
double Pm_rgQp[20]; //++ 参数值传递过程中的中间临时变量,可直接用m_rgQp 替换
double Pm_rgRp[20]; //++ 参数值传递过程中的中间临时变量,可直接用m_rgRp 替换
double Pm_X1; //++ 参数值传递过程中的中间临时变量,可直接用m_X1 替换
double Pm_X2; //++ 参数值传递过程中的中间临时变量,可直接用m_X2 替换
而 m_rgQp、m_rgRp、m_X1、m_X2 的含义是:
double m_rgQp[21]; //++ FIFO 队列用来存储各个基本单元的量化步长
double m_rgRp[21]; //++ FIFO 队列用来存储各个基本单元编码完成后的二次方程左边项
double m_X1; //++ 二次模型第一个系数
double m_X2; //++ 二次模型第二个系数
FIFO 队列则是指计算二次模型参数时候的样本候选队列。这些思想都是来源于“Scalable Rate Control
for MPEG-4 Video” 这篇文章,看了这篇文章你就明白了。
2.请教关于RDO 的实现问题
在看论文的时候,注意到H. 264 采用多模式编码,其编码模式可表示为集合: { Int ra16 ×16 , Int ra4
×4 , Inter16 ×16 , In2ter16 ×8 , Inter8 ×16 , Inter8 ×8 , Inter8 ×4 , Inter4 ×8 , Inter4
×4 , SKIP , DIRECT}. 对于以上11 种编码模式,H. 264 采用了一种在码率约束下的Lagrangin 优化
方法,来选择最佳编码模式,以使编码代价η最小,这里我有一点不太清楚,在已知量化步长的情况下进
行模式选择时是不是把这11 种编码模式分别带入拉格朗日代价函数(每种模式都对应一个D 和一个R),
然后取使拉格朗日代价函数取得最小值的那种模式为最终的模式,且此种模式对应的D(用MAD 或SSD
来表征)和R 就是实际的失真和比特率,不知我的想法对不对?
还有一点在数学上有个求条件极值的拉格朗日乘数法,不知在进行模式选择时是如何具体应用此方法实
现的
还望高人指点一二
去看看毕厚杰书上第6.10 小节。
3.G012 rate control 的問題
小弟最近在研究H.264 的 rate control 方法,
於是剛開始看JVT-G012 這份文件,
目前碰到了幾個問題...想請教這裡的前輩們
1. Fluid Flow traffic model 的物理意義是什麼 ?
式子是看的懂式子...但無法體會它背後式子是從何而來?
其中的min, max 應是調整它不要underflow, overflow...
但中間重要的那項卻想不太通了...
2. Frame level 的bit allocation
這是做frame layer 的bit 分配,前面那項應是先平均分配bitrate 給所有的frame,
可是後面為什麼還要減去那項呢?
1、流体模型的原理就是一个水库。最佳状态是进水库的水要与出水库的水刚好相等,否则水库要么会干
涸要么会漫溢;
2、看你写的繁体字,应该是港澳台的朋友,港澳台的朋友英文水平应该是很高的。而你却没有仔细阅读
JVT-G012 3.1 节中这个公式上下的内容,这个公司并不是计算图像层的比特数的;
3、JVT-G012 是比较经典,但也是比较老的提案。据我所知JM86、JM90、JM96 使用的RC 实现代码
与JVT-H017r3 更接近。因此你可以对照JVT-G102 与JVT-H017r3 学习,这两个提案核心思想相同,
只是在公式和变量名上有稍微的改动。甚至两个提案里的公式都是能一一对应的。
1. Bc(n i,j)是编码j帧时缓冲占用大小,A(n i,j)是编码j 帧产生的比特数(也就是流出缓冲的比特
数),u/F 是说的瞬时从缓冲流出去的比特数。
通过该公式说明编码j 帧后,当前缓冲的大小值为:原来的缓冲量Bc(n i,j) + 新增加的比特数A(n
i,j) - 新流出的比特数u/F
謝謝樓上的回答,第一個式子我大概了解了...
找到了02 年的一篇論文,附圖可以瞭解這個觀念,
雖然版上應該大都已經瞭解...不過還是分享一下
第二個式子確如版主所言,其應該是GOP layer 的比特數分配,
前面一項: u / F * N 應是先將channel 上的比特數均分給每張frame 後再算出現在GOP 擁有多少
bits,
但為何仍需減去Bs / 8 (初始的緩衝區大小) 以及加上Bc 呢???
另外...所以較新版本的JM 是以H017 來實作囉?
那又要再去看看這份文檔了
4.264 中的码率估算的等式在哪里?
整个图像的比特数计算在rc_init_pict 函数里如下代码:
//++ JVT-H017 公式15
T = (int) floor(Wp*R/(Np*Wp+Nb*Wb) + 0.5);
//++ JVT-H017 公式14
T1 = (int) floor(bit_rate/frame_rate-GAMMAP*(CurrentBufferFullness-TargetBufferLevel)+0.5);
T1=MAX(0,T1);
//++ JVT-H017 公式16
T = (int)(floor(BETAP*T+(1.0-BETAP)*T1+0.5));
每个基本单元的比特数计算在updateQuantizationParameter 函数里如下代码:
{
//++ 预测下一待编码基本单元MAD,JVT-H017 公式20
CurrentFrameMAD=MADPictureC1*BUPFMAD[TotalNumberofBasicUnit-NumberofBasicUnit]+MAD
PictureC2;
TotalBUMAD=0;
//++ 计算JVT-H017 公式24 中的分母
for(i=TotalNumberofBasicUnit-1; i>=(TotalNumberofBasicUnit-NumberofBasicUnit);i--)
{
CurrentBUMAD=MADPictureC1*BUPFMAD[ i ]+MADPictureC2;
TotalBUMAD +=CurrentBUMAD*CurrentBUMAD;
}
}
/*compute the total number of bits for the current basic unit*/
m_Bits =(int)(T*CurrentFrameMAD*CurrentFrameMAD/TotalBUMAD); //++ JVT-H017 公式24
/*compute the number of texture bits*/
m_Bits -=PAveHeaderBits2; //++ JVT-H017 公式26
【说明】:以上为JM86 版本。
5.H.264 中的有关码率控制的问题
在 H.264 中的JM 中的码率控制,利用DCT 域中交流系数的均方和代替像素域的方差,作为
宏块运动复杂度的表征,
即是:将MAD的计算方法改变一下:
msacc=0;
for(u=0;u<16;u++)
for(v=0;v<16;v++)
if(F(u,v)!=0)
msacc+=F(u,v)*F(u,v)
MAD=msacc;
下面是我对这部分在JM 里面对ratectl.c 中对应的MAD 的计算方法的程序改变:
double calc_MAD()
{
int k,l;
int u=0,v=0;
int msacc = 0;
int f[16][16];
double MAD;
double pi = 3.14159265359;
switch(u)
{
case(0):
for(k=0; k<16; k++)
for(l=0; l< 16;l++)
{f[0][0]=0;
f[0][0]+=diffy[k][l]/16;
break;
}
case(!0):
for(u=0;u<16;u++)
for(v=1;v<16;v++)
{
f[v]=0;
for(k=0;k<16;k++)
for(l=0;l<16;l++)
f[v]+= (int) diffy[k][l]* double _cdecl _cos{(2k+1)*u*pi/16}*double
_cdecl _cos{(2l+1)*v*pi/16}/8;
break;
}
}
for (u = 0;u < 16; u++)
for (v = 0; v <16; v++)
{if(f[v]!=0)
msacc+= abs(f[v]*f[v]);
}
MAD=msacc;
return MAD;
}
这样会对码率控制的性能有改善吗?请求高手指点!
完成程序之后,与原来的算法比较一下 PSNR、编码时间等各个性能指标就知道了。性能是否有改善要用
试验数据说话。
6. 关于码率控制的疑问
1:rc_init_pict 函数中,计算目标比特数时有:
if(img->BasicUnit==img->Frame_Total_Number_MB)
{}//帧层目标比特分配
else
{}//基本单元目标比特分配
假如BasicUnit设为99,岂不是只有帧层码率控制,没有了基本单元/宏块层的了?
2:计算缓冲器饱和度是当前帧实际编码的缓存大小(即更新之前的实际的
CurrentBufferFullness)/BufferSize?
3:利用MAD比例(当前帧j 的MAD与前面已编码帧的MAD平均值比例)预测当前帧目标比特,
rc_init_pict()预测目标比特在先,updateQuantizationParameter()计算当前帧MAD在后,
预测下一帧的目标比特时,MAD 比例没有随之更新,换句话说,j=4 时,MADratio,4 可以得到;
下一帧目标预测目标比特,应该是MADratio,5吧?怎么得到?
1、是的;
2、虚拟缓冲实际值= 前一图像编码后虚拟缓冲实际值 + 当前图像实际编码比特数- 当前图像目标比
特数;
3、不太理解你的意思。但好像你没有把 RC 的过程弄清楚。编码当前帧的时候不需要预测下一帧的目标
比特。
那么说,rc_init_pict()预测的是当前要编码帧的目标比特;
updateQuantizationParameter()根据目标比特和预测的当前帧的MAD,计算用于当前帧编码的量化参数
(QP),对不?
谢谢老大解答!
其实第三个问题是这样的.如何实现根据帧复杂度(MADratio表示)调整当前帧的目标比特.
过程是:
MADratio 的涵义:当前帧预测的MAD 与前面已编码帧(P 帧)实际MAD 的平均值的比例值.
这样在rc_init_pict()加一段代码,预测当前帧MAD,对前面编码帧MAD求平均,得MAD比例MADratio,进
而调整当前帧的目标比特数,这样就不知道我这样说算说明白了吗?
图像复杂度跟MAD 没有关系。请你去看一下 JVT-H017。图像复杂度= 图像实际编码比特数*图像平均
QP。复杂度参与当前图像目标比特数计算的过程是:用前一图像复杂度与前一次的加权复杂度计算出本
次的加权复杂度,然后用本次的加权复杂计算一个目标缓冲的第一加权值,再用目标缓冲第一加权值与
第二加权值来计算得到最终的目标比特数。
7.请教h.264 的RDO 问题,为何存在蛋鸡悖论?
JVT-G012r文檔里面有一段话,用来描述h.264 的RDO 问题,看的不是很明白,求教高人:
Since quantization parameters are specified in both rate control and RDO, there exists a problem when the
rate control is implemented:
to perform RDO for a MB, a quantization parameter should be first determined for the MB by using the MAD
of MB. However, the MAD of current
MB is only available after performing the RDO. This is a typical chicken and egg dilemma.
意思是:在某个MB 中,若要求RDO,要先确定其QP,也就是说要先确定其MAD;而其MAD 只能在求完
RDO 之后,才能确定。
请教高人:
(1) MAD: mean absolute difference,其意义是否和SAD差不多? 也就是说代表的是当前MB的residual 大
小? 而不是经由DCTà量化àentropy codingà再重建回来,与原画面的误差? 这个误差应该是叫做distortion
而非MAD,对吗?
(2) 为什么MAD 只能在求完RDO 之后才能确定? 假如实行full search,之后不就能确定该MB 的resiudal
了?
(3) H.264之前的标准,如H.263,也有定义数个mode,但为什么H.264 之前的标准,
都不曾听闻其mode selection存在蛋鸡悖论的问题?
这几个问题是存在很久的疑问,盼高人指点……
(1)
答:
MAD:mean absolute difference
SAD:Sum of Absolute Difference
so MAD=SAD/(16x16)
=(|预测的象素值pre(n)-原本的org(n)|),
/////////////////////////下面这段好象于主题无关,但已经写了:)
pre(n)由ref(n)经运动补偿得到, 而ref(n)是前面图象解码后经块滤波得到:
ref(n)=loopfilter(decodF(n));
decodF(n)=IDCT(DCT(pre(m)-org(m)))+ref(m);
n 当前帧序号;m指参考帧对应的帧序号
/////////////////////////
(2)
1.根据:J=ssd+lamda(qp)*rate;在使用rdo选择最佳模式时需要qp;在得到最佳模式后由最佳模式下的
象素与原始象素的差得到MAD
2.而1 中qp 的得到需要用到MAD(when rate control is enable)
so。。。。。
注:进行fullsearch后你得到是各种模式下的mv,ref等,但不知道哪个是最佳模式,也就不能得到要求
的MAD
(3) 答:对于上述蛋鸡悖论,对h.264 也只有ratecontrolEnable 时才出现(因为没码率控制时qp是定的,
或根本用不到MAD) h.263 不大清楚
因为 H.264 以前标准在模式选择时候不会用到 QP,所以不存在蛋鸡悖论。
8. 对帧间预测中的代价函数谈谈个人理解,请各位指正
在 帧间模式选择的时候要用到
J(s,c,mode/QP/lamda1)=ssd(s,c,mode/Qp)+lamda1*R(s,c,mode/Qp) (1)
在运动估计的代价函数中有要用到 J(m,lamda2)=ssd(s,c(m))
+lamda2*R(m-p) (2)
我看了很长时间的文档,想找出2 者的差别。个人认为:
(1)lamda1 代表模式选择中的系数,lamda2 代表运动估计中的系数。二者根据ssd()或sad()有一些不
同。
(2)对于ssd()部分,式1 中的c 是经过变换量化以及反变化反量化得到的;2式中的c(m) 是由运
动估计预测得到的还是经过变换量化,反变换反量化得到的呢,这一点还不清楚,还请高手指教。
(3)R 不同, 式 1中的R 是选择了指定模式时的总的编码为数,包括宏块头信息,运动矢量和所有的
DCT 系数等,它是对宏块进行实际的编码。2 式中 R 表示的是m(通过运动估计获得的)与p(通过周围已
编码块的运动矢量预测所得到的预测运动矢量)的差,再编码所得的编码位数
以上只是个人理解,还请高手不吝赐教。
JM 中运动估计的代价函数使用的不是SSD,而是SAD。当然从理论上来说是可以使用SSD 的
仅个人理解:
1. lamda1 或lamda2 仅是个变量,在程序里没有对应关系。之所以名称不同仅因为变量值不一样(因I
P B 差异),但都是一个性质的。
2. c(m) 为重建图像,经运动矢量补偿后变换量化,反变换和量化的图像。两式定义一样。注意,JM里
遍历模式也包括完成运动估计。
3.理解正确。
若有不当,还请高人指点!
这两者表达的含义并不想同,模选一般用的是RDO,而运动估计没有进行RDO,而是计算预测残差的SAD
值,这些是在编码之前完成的,所以不存在反变换反量化的过程。当然运动估计中用SSD 也是可以的,
但计算量太大,还有用SATD 的,效果不好,因为运动估计是像素域的运算。
[请教] 几种代价函数
SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即绝对误差和
SATD(Sum of Absolute Transformed Difference)即hadamard 变换后再绝对值求和
MAD(Mean Absolute Difference)=MAE(Mean Absolute Error)即平均绝对差值
SSD(Sum of Squared Difference)=SSE(Sum of Squared Error)即差值的平方和
MSD(Mean Squared Difference)=MSE(Mean Squared Error)即平均平方误差
还有一个RDO,它是用来进行编码模式选择的,那么当不启用RDO 时,又是什么作为编码
模式选择的判断准则?
请问以上概念具体在什么地方会用到?也就是它们的计算位于什么环节?谢谢!
SAD 在作整数像素搜索的时候作为代价函数sad+MVCOST
satd 在作1/2和1/4像素搜索的时候作为代价函数
ssd 在作模式选择的时候一般是ssd 作为distrotion(RDO off 的情况下作为代价函数)
mad msd 在JM中好像没有用到
1、MVCOST 又是如何计算的?
2、RDO 做为编码模式选择依据的时候,是否是所有的编码模式(帧间16*16、16*8、8*16、
8*8、8*4、4*8、4*4、SKIP,帧内4*4、16*16、IPCM)都采用它来做判断?
3、你说的好像还不完整,据我所知:SAD 在4*4 帧内预测模式选择时候也被用做代价函
数。请高手补充一下。谢谢!
这样说要清楚些:
SAD 和MAD、SSD 和MSD 是一样的,就差个倍数关系而已。
SAD+COST(MV)用于整数像素运动估计
如果使能SATD 的话,亚像素运动估计使用SATD+COST(MV),否则依然使用SAD+COST(MV)。
使用SA(T)D+COST(MV)+COST(ref)得到7 个模式下各自的最佳匹配运动矢量和参考帧后,
如果使能RDO,使用SSD+COST(R)判断最佳模式。这里SSD 是重建块和源图像的均方和,
R 是该模式编码下的码流,
否则,使用SA(T)D+COST(MV)+COST(ref)+COST(mode)判断最佳模式。
帧内模式下,情况类似,略。
想请教一下COST(ref),COST(mode)的具体含义,及如何计算
回楼上:
因为允许多帧参考COST(REF)是使用不同的参考帧时候,标记这些参考帧所需要的比特数
COST(mode)是编码模式时候要用的比特数,
比如264编码MB inter 模式用的是0 阶指数哥伦布码, 不同模式的码长不一样
回 2楼:
MAD 在JM RC 里面是不是有用到?
看看 JM 代码就知道了:
#define MV_COST(f,s,cx,cy,px,py)
(WEIGHTED_COST(f,mvbits[((cx)<<(s))-px]+mvbits[((cy)<<(s))-py]))
#define REF_COST(f,ref,list_offset)
(WEIGHTED_COST(f,((listXsize[list_offset]<=1)? 0:refbits[(ref)])))
2 楼:
ssd 在作模式选择的时候一般是ssd 作为distrotion(RDO off 的情况下作为代价函数)
5 楼:
如果使能RDO,使用SSD+COST(R)判断最佳模式。这里SSD 是重建块和源图像的均方和,
R 是该模式编码下的码流,
否则,使用SA(T)D+COST(MV)+COST(ref)+COST(mode)判断最佳模式。
那么RDO=off的时候,到底是使用SSD 还是SA(T)D作为代价函数啊?
JM 中是RDO = on 时候使用SSD,off 时候使用SA(T)D。但这并不是所有H.264 编码器
采用的策略,因为标准并没有规定模式选择的判断依据,所以不同的编码器可以采用不同
的判决标准。
9. 关于运动估计和帧间模式选择的关系
在此想和大家探讨一下帧间模式选择和运动估计的关系。
到底是怎样进行模式选择的呢?
我的理解是:首先对每种模式进行遍历,求出每种模式下的运动估计和率失真优化代价(RDcost),
通过比较每种模式下的RDcost来选择最佳模式。
比如说16x8 模式时,就要计算出2 个MV 然后再根据每个MV求出SAD 和编码码率R(即RDcost),
再把2 个RDcost 相加就得到在该模式下的RDcost,同理对于P8x8中的4x4 时,要对16 个4x4 块分别进
行ME 得到16 个MV,再计算每个得RDcost,最后把16 个值相加得到该模式下的RDcost ,通过比较各模
式找出最小RDcost 对应的模式。
每种模式之间的MV 是不是可以相互参考和利用呢?以上只是个人理解,请求高人给与指点。谢谢
1、编码码率并不是RDCost。RDCost = D(失真) + λ * R(码率)。因此,你描述的RDcost 的计算
方法也是不正确的。比如说16x8 模式时,应该是分别计算出整个MB 的 D,和在16*8 分割情况下编码
的 R,然后计算出代价。也就是说这个过程是对整个MB 进行的,而并不是对每个分割进行然后相加。D
一般采用SSD 作为判别准则;
2、据我所知每种模式之间的MV 是不可以相互参考和利用的。
按照您(firstime)的说法,D 是对整个宏块说的。那么,在计算SSD 时,就要做整个宏块的运动估计,
从而求出SSD.这样说对吗?在分割的时候,比如16x8,还要分别求出一个宏块中上下两个16x8 块的MV,
然后计算在16x8 模式下的R,这样D+ λ *R=RDcost,是这样吗?
怎么产生如棋盘式的错误丢失效果(MB 交错丢失)--如图1
用mobileip 出来的效果一般效果是一行或者几行一起丢失--如图2
10 请教关于码率控制中基本单元层编码的有关问题
这段码是码率控制中关于帧层控制中基本单元编码的.请教下大致表示什么意思?谢谢!
{
if((img->FieldControl==0)||((img->FieldControl==1)/
&& (img->IFLAG==0)))//IFLAG==0表示当前编码帧不是I 帧
{
/*top field of the first P frame*/
m_Qc=MyInitialQp;//第一个GOP中的所有I 帧和第一个P 帧是预先给定的,参
考G012 中关于GOP control 部分。。。
img->NumberofBasicUnitHeaderBits=0;
img->NumberofBasicUnitTextureBits=0;
NumberofBasicUnit--;
/*bottom field of the first P frame*/
if((!topfield)&&(NumberofBasicUnit==0))
//如果不是顶场,并且是最后一个单元
{
/*frame coding or field coding*/
if((active_sps->frame_mbs_only_flag)||(input->;
PicInterlace==FIELD_CODING))
{
img->TotalQpforPPicture +=m_Qc;
PreviousQp1=PreviousQp2;
PreviousQp2=m_Qc;
PAveFrameQP=m_Qc;
PAveHeaderBits3=PAveHeaderBits2;
}
/*adaptive frame/field coding*/
else if((input->; PicInterlace==ADAPTIVE_CODING)/
||(input->MbInterlace))
{
if(img->FieldControl==0)
{
FrameQPBuffer=m_Qc;
FrameAveHeaderBits=PAveHeaderBits2;
}
else
{
FieldQPBuffer=m_Qc;
FieldAveHeaderBits=PAveHeaderBits2;
}
}
}
Pm_Qp=m_Qc;
TotalFrameQP +=m_Qc; //这难道就为了计算这个GOP的总的QP 么???
return m_Qc;
}
}
这里有几个问题:
(1)img->NumberofBasicUnitHeaderBits=0;
img->NumberofBasicUnitTextureBits=0;
NumberofBasicUnit--;表示初试化吗?或者表示其他意思?
(2)if((active_sps->frame_mbs_only_flag)||(input->; PicInterlace==FIELD_CODING))
{
img->TotalQpforPPicture +=m_Qc;
PreviousQp1=PreviousQp2;
PreviousQp2=m_Qc;
PAveFrameQP=m_Qc;
PAveHeaderBits3=PAveHeaderBits2;
}
/*adaptive frame/field coding*/
else if((input->; PicInterlace==ADAPTIVE_CODING)/
||(input->MbInterlace))
{
if(img->FieldControl==0)
{
FrameQPBuffer=m_Qc;
FrameAveHeaderBits=PAveHeaderBits2;
}
else
{
FieldQPBuffer=m_Qc;
FieldAveHeaderBits=PAveHeaderBits2;
}
}这个if---else--假设我不理解怎么个意思
(3)Pm_Qp=m_Qc;
TotalFrameQP +=m_Qc; //这难道就为了计算这个GOP的总的QP 么???
return m_Qc;
总是计算总的量化参数有什么用处啊?
十分感谢你的指点!
我想你一定没有仔细认真地学习过JVT-G012 吧?如果你仔细认真地学习过你就会知道整个代码的功
能。“总是计算总的量化参数有什么用处啊?”——计算量化参数总数当然是为了求平均。至于为什么
求平均:1、JVT-G012 里说得很清楚;2、你可以在代码中查找相关代码;
所以我建议你:1、仔细认真地学习JVT-G012。虽然里面的公式初看起来让人有点不舒服;2、用一个 QCIF
的测试序列,分成 3 个Basic Unit,然后用JM 来编码,看看每个RC 流程是怎么走的,看看每个变
量的值是怎么变化的。
呵~~被樓上有經驗的人提醒了一下
我是覺得你應該把每個參數背後的物理意義弄懂(對應到spec去),
畢竟 spec 都是用數學包裝的很好看, 程式就很長很不好
(假如你又不花時間去看的話!!)
針對你的問題回答你~~
(1) img->NumberofBasicUnitHeaderBits=0;
img->NumberofBasicUnitTextureBits=0;
NumberofBasicUnit--;
ANS : RC 分兩部份frame layer and MB Layer, 計算出qp後會實際去算出
Headerbits 跟texturebits, 歸零只是要計算下一個basic unit, 所以最後還要
有#ofBU--
(2) 一般分frame, field 跟adaptive f/f , 在field case, 計算bitrate 也要分
前後 picture, 所以你會看到PAveHeaderBits3,PAveHeaderBits2 等...
(3)那是要算整張p-frame 的平均qp 值, 因為下一張p-frame 的第一個basic unit 以
QPavg 來當量化值
对于 PAveHeaderBits1、PAveHeaderBits2、PAveHeaderBits3,从我跟踪的情况是这样的
(可能只是片面情况,请大家只做参考,也欢迎大家校正补充):
PAveHeaderBits1 表示当前帧图像至前一个basic unit 为止的平均头信息bit数;
PAveHeaderBits2 表示当前basic unit 平均头信息bit 数的估计值;
PAveHeaderBits3 表示前一帧图像的平均头信息bit 数。
11 Rate-distortion curve 怎么绘制出来?
视频的Rate-distortion curve怎么绘制出来。
对于一段视频来说,在不同码率的情况下绘制RD curve,是采用一个固定帧的PSNR 呢还是
采用整个视频段的PSNR 的平均呢,谢谢。
如果一个视频转码器转码完成MPEG2视频流到H.264视频流的转换,
那么,绘画率失真曲线的时候采用哪里的比特率(mpeg2 解码器的呢还是H.264 编码器的)
呢。
例如这样的曲线
大概分成固定QP 跟Rate Control 兩種皆可畫出RD Curve
去比較一段video sequence 的平均psnr及bitrate
1.如固定qp=20, 25,30, 35, 下跑模擬的平均psnr 及bitrate 結果
2.打開RATECONTROL, 在不同target bitrate下比較其平均psnr 及actual bitrate
transcoding 部分比較不懂, 但應該以編碼端產生bit stream 為主
12 [原创]新手的码率控制学习笔记(一)
一、阅读《JVT-D030:Rate Control on JVT Standard》
1、码率控制的大概步骤
1) 利用上一宏块的量化系数,通过率失真模型计算选择最优的编码模式。
2) 用上述步骤所得的模式进行编码,计算模块的运动剧烈程度。
3) 通过上述步骤所得的模块运动剧烈程度,以及当前缓冲区占有率,用类似于TM5 的算法计算当前宏
块的量化系数。
4) 利用新的量化系数,再次通过率失真模型选择最优的编码模式。
5) 利用所得模式进行编码即可。
2、Step1 中式子的意义(只对I 帧的进行分析,猜的)
1) bit_rate/8×picture_rate:由式子所得结果的单位(bit/picture)考虑,其意思是每张图片帧
所需的位大小。
2) R:存储GOP 的空间中仍剩下的空间大小,以位为单位。
3) 1+NpXp/KpXi+NbXb/KbXi:可以粗略认为该式是GOP 中I 帧的总个数。需要知道的是,每个GOP 中
只有一个I 帧,且位于第一帧。通过加权(Xp/KpXi 和Xb/KbXi),可以把P 帧和B 帧的个数转换成I
帧的个数。明显,Xp/KpX 和Xb/KbXi 均小于1。
另外,Rprev是偏移量。假设有两个图像组:GOP1 和GOP2,GOP2 的存储空间大小由式子R2 = G + Rprev
计算可得。Rprev 的值与GOP1其存储空间的使用情况相关。猜测:若GOP1 未使用完其空间,Rprev 为负;
若GOP1 使用的空间超出其大小,Rprev为正。
3、Step2 率失真模型的计算
参考袁春的《H264AVC 中多参考帧下的失真度估算算法》。仍需要学习。
4、Step3 重新计算量化系数
懂式子的意义,但不懂各变量的物理意义。仍需要学习。
5、实验所得结论
1) 此码率控制方法能够精确控制不同方案、帧率下的码率;
2) 此码率控制方法比TM5 中的好(在编码效率方面);
3) 在高码率下,此码率控制方法所得图像的信噪比比没有码率控制的好;
4) 为了减少编码的复杂度,只需一次迭代过程就足够了。
二、阅读《JVT-F086:Proposed draft description of rate control on JVT standard》
1、与JVT-D030 的不同之处
1)增加JVT-D030 中四个步骤的概括介绍
2)Step1 中Xi, Xp, Xb 的值被修改
3)Qpred 的选取考虑了CBP 为0 时的情况
4)改变了量化系数的计算方法
5)增加了对迭代必要性的判断
2、量化系数的计算方法
这个…暂时不细看。
13 [转贴] JVT-O016 中公式(13)(14)的理解——随意
JVT-O016 是码率控制方面公式比较复杂的一个提案,特别是公式(12)~(15),我推导了一下,希望
能对大家有所帮助,如有错误请批评指正,thank you^_^
我推导的结果与公式(15)差了个系数4,若大家发现我的错误,望回帖:
Qstep1*,…QstepN*=argmin(1/N)ΣXi(Qstepi-1)/2 …….(12)
此式指在ΣTi=T 成立的约束条件下使(1/N)ΣXi(Qstepi-1)/2 最小的一组Qstepi 值
由约束条件和公式(12)利用拉格朗日乘数法构造公式(13),如下:
Qstep1*,…QstepN*,λ*=argmin(1/N) ΣXi(Qstepi-1)/2+λ(ΣTi-T)
把 Ti 代入上式得:
Qstep1*,…QstepN*,λ*=argmin(1/N) ΣXi(Qstepi-1)/2+
λ(Σ(AiQstepi2+BiQstep+Ci+Hi)-T)…………….(13)
对(13)式分别对Qstepi 和λ求导得
Xi/2+λ(2AiQstepi+Bi)=0, i=1,…,N
T=Σ(AiQstepi2+BiQstepi+Ci+Hi)………………(14)
解方程组(14)得:
Qi*=-Bi/(2Ai)-Xi/(2Ai)*sqrt((4T-4ΣHk+Σ(Bk2/Ak)-4ΣCk)/ΣX2/Ai)
我算得的结果和JVT-O016 的在ΣHk 项上差个系数4,我觉得JVT-O016 的应该不会错,但我算的好像也
没错啊。。。不知道了。。相信自己了。
关于JVT-O016 的公式15中在ΣHk 项上差个系数4的问题,可能确实是文档的疏忽,因为在后面的步骤
Step5 中是有系数4的。
感谢kevin细心指出。
14 转]码率控制论文一篇
本文详细讨论了H.264 编码标准的码率控制结构,与MPEG-2 的TM5 模型进行了比较;并对JVT-G012 提
出的流量往返控制模型进行了探讨;最后对H.264 码率控制提出了一些改进意见。
关键词:H.264 码率控制VBR CBR
一、引言
到目前为止,视频编码标准通常采用去除时空域相关性的帧内/帧间预测、离散余弦变换量化和
熵编码技术,以达到较高的编码效率。对视频通信而言,由于通信信道带宽有限,需对视频编码码率进
行控制,来保证编码码流的顺利传输和信道带宽的充分利用。针对不同的应用场合,学者们提出了多种
码率控制(Rate Control)策略。其中,实时编码码率控制方法主要有两种:用先前宏块编码产生的比
特数来预测当前宏块编码产生比特数,或者通过视频编码率失真函数来预测当前宏块编码产生的比特数。
码率控制算法[1]就是动态调整编码器参数,得到目标比特数。它为视频序列中的图像组GOP、
图像或者子图像分配一定的比特。现有的码率控制算法主要是通过调整离散余弦变换的量化参数大小输
出目标码率。实际上,量化参数(QP)反映了空间细节压缩情况,如QP 小,大部分的细节都会被保留;
QP 增大,一些细节丢失,码率降低,但图像失真加强和质量下降。也就是说,QP 和比特率成反比的关系,
而且随着视频源复杂度的提高,这种反比关系会更明显。
码率控制有两种模式:
VBR和CBR,即可变比特控制和固定比特控制。VBR 模式是一种开环处理,输入为视频源和一个
QP 值。由于实际视频序列中的图像复杂度是不断变化的,细节多少、运动快慢等等,比特率也相应变化,
不稳定。CBR 模式是一种闭环处理,输入为视频源和目标比特。它根据对源复杂度估计、解码缓冲的大
小及网络带宽估计动态调整QP,得到符合要求的码率。
二、H.264 码率控制结构
作为新一代的视频压缩编码标准,H.264 对多编码模式、编码参数自适应选择、上下文自适应
熵编码、多参考帧的灵活选择、高精度预测、去方块滤波以及抗误码能力等方面进行了精雕细刻,采取
了一系列切合实际的技术措施,大大提高了编码效率和网络自适应能力。
但 H.264 标准草案并没有很好地研究RC,主要精力放在了编码码流及解码方法上。它将QP 同
时用于码率控制算法和率失真优化,导致了蛋鸡悖论:为了计算当前帧中宏块的RDO,需利用当前帧或
宏块的MAD预测每个宏块的QP,而每个当前帧或宏块的MAD 只有在RDO 后才能计算出。
H.264 码率控制方法的提案主要有两个[2]:JVT-F086 中MPEG-2TM5 改进版本及JVT-G012 中提
出用流量往返模型来分配每个基本单元目标比特数,并在宏块层编码采用二次率失真函数计算量化参数
的算法。JVT-G012 还比较了这两种算法,认为其算法优于F086 算法。
本节主要介绍H.264的码率控制结构,并与MPEG-2 的控制模型相比较。
H.264 码率控制的主要部分类似于其他RC 方案[1]。图2 只是一个概念性的结构,并不是其软
件的实际反映,如P帧和B 帧需分别处理,一些估计是前面值的平均等等。
*1. 码率量化模型 Rate-Quantization Model*
RC 算法的核心是一个定量的描述QP、实际比特率和编码复杂度代理的关系的模型。比特率和
复杂度与残差有关,QP只能影响变换残差信息的细节,对包含头信息、预测数据、运动矢量信息的比特
流没有直接影响。预测误差的平均残差绝对值(Mean Average Difference ,MAD)被引用,用来估计复
杂度。
*2. 复杂度估计Complexity Estimation*
MAD是预测器精度和帧内预测情形下临近图像时间相似度的逆操作。MAD 可以在对当前图像编码
完以后进行估计,但是,在QP选择以后再编码一次,负荷太重。相反可以假设MAD 随图像变化而变化,
可根据前一图像的实际值估计而得。但该假设在场景切换时失效。
*3. QP 限制QP-Limiter*
闭环控制系统须能够保证稳定性和视觉变化最小。对一些复杂度快速改变的序列,QP变化显著,
须设置以码率限制器来限制图像的QP 变化不超过±2。
*4. 虚拟缓存模型Virtual Buffer Model*
解码器都有一个缓存来平滑码率变换和数据的到达时间。相应编码器产生的比特流须满足解码
器的限制,所以用一个虚拟缓存模型来仿真实际解码器的满度。
虚拟缓存满度的改变即编码成流的总比特数的差异。缓存满度的下届为0,上界为缓存容量。用
户需根据解码器支持的级别设置缓存容量和初始值。
*5. QP 初始化QP Initializer*
QP 须在视频序列的开始初始化,并人为输入初值,但更好的方法是根据每个像素的比特数估计,
并可根据QP和DemandedBitsPerPixel 表查找。
*6. GOP比特分配GOP Bit Allocation *
根据需求的比特率和虚拟缓存的当前满度,计算GOP 的目标码率,I 图像和第一个P 图像的QP。
*7. 基本单元比特分配Basic Unit Bit Allocation*
如果基本单元小于图像,图2 则分为两层:图像层和基本单元层。对H.264 而言,重点是计算每
个存储图像(通常为P 图像)的QP。严格地讲H.264是允许B 图像用作参考的,只是通常不用。非存储
图像(通常为B 图像)则通过邻近P图像的QP 内插或偏移得出。首先,考虑到图像的MAD,可为缓存满
度设置一目标级。接着,利用该级别,计算图像的目标比特数。
与 MPEG-2的TM5 模型相比,类似之处有:虚拟缓存的设立,GOP 和图像层的目标比特的计算,
为每个基本单元生成QP 等。不同之处有:基本单元是宏块,且同一图像中的不同宏块的QP可能相差很
大;I/P/B 三帧之间只是目标比特分配的不同,其余处理类似;MPEG-2 预测模式没有H.264的多样性。
由于其没有高级的帧内预测,也没有必要对关联QP 和残差时那么严格;宏块级的空间复杂度由源活动性
估计而得。忽略复杂度是否由MV 和残差数据体现;对图像分配比特,需考虑图像类型、GOP 结构、需要
的比特率,而非图像的复杂度。但在图像中,缓存满度和相关的空间活动性用来
分配图像比特等。
三、H.264 码率控制算法
如上所述,H.264 码率控制方案主要有JVT-F086 和JVT-G012 提出的两种。JVT-G012通过引入
基本单元和线性模型的概念,提出一种自适应基本单元层码率控制方案。基本单元可能是一帧、片或者
一个宏块。线性模型用于预测当前基本单元的MAD,它是通过前一帧相应位置的基本单元得到。
蛋鸡悖论解决如下:当前帧的目标比特率根据预先定义的帧率、当前缓冲容量、目标缓冲级别
和可利用信道带宽,利用漏斗模型和线性跟踪理论计算得出。剩余比特分配给当前帧未编码基本单元。
当前基本单元的MAD利用前一帧相同位置基本单元的MAD 实际值线性预测而得。相应的QP 通过一个二次
RD 模型获得。该方案同样适用于VBR 情形。该方案利用一个虚拟缓存,根据信道带宽的动态特征,来帮
助调节编码操作。该缓存既不上溢也不下溢。由于该模型类似于漏斗模型,该RC 算法与HRD 是一致的。
为了验证该方案,JVT-G012 在VBR 和CBR 两种情形下进行实验。
VBR 的比特率曲线是一预先确定的曲线,即实际产生的比特接近于比特率曲线且缓存不上溢和
下溢。CBR 情形下,与QP 固定的编码器比较了编码效率。目标比特率由以固定QP 编码测试序列产生。
计算出的码率由该方案编码产生。该方案编码效率上升1.02dB,所有测试序列的平均PSNR 改善2dB。并
利用软件AHM2.0 和F086 提出的方案进行了比较。PSNR 改善了最高达1.73dB,平均达0.5dB。且该方案
只一个通道而F086 是两个通道。
四、结束语
随着H.264 的不断改进和推广,其码率控制的算法也在不断改进更新。比如HeZhihai 等[3]提
出线性率失真函数,通过变换量化后零值在变换系数中的比例(认为这对编码码率的影响最大)来选取
量化参数,可避免蛋鸡悖论;陈川等[4]提出联合编码模式选择、信源的码率控制算法;Xue Jinzhu[5]
等提出基于块活动性和缓冲状态的算法;MaSiwei 等[6]提出结合HRD 的控制算法,并被H.264 采用等等。
还有学者提出考虑解码端(通过其反馈信息控制码率)的控制模型。上述的算法都在其实验范围内体现
出了编码效率的改进。可见,H.264 码率控制的改进有许多方向,主要有:考虑编码器端的编码参数(如
量化参数、编码模式或直接影响比特流的参数等)的率失真控制模型,结合信源信道失真和缓冲状态的
码率控制模型,考虑解码端反馈信息的控制模型等。
H.264 采用了多种改进编码效率的技术,针对不同的应用可以选择不同的技术,其码率控制模
型的建立也应该结合实际应用做出调整,而不是一定要建立一个适应各种场合的控制模型。
■ 参考文献
[1]Wiegand T,Schwarz H,Joch A,Sullivan G.Rate Constrained Coder Control and Comparison of
Video Coding Standards.IEEE Trans,Circuits Syst,Video Technol,2003,13(7)
[2] Li Z,et al.Adaptive Basic Unit Layer Rate Control for JVT.JVT-G012, 7th Meeting:Pattaya,
Thailand,2003(3)
[3] He Zhihai.A Unified Approach to Rate-Distortion Analysis and Rate Control for Visual Coding
And Communication.PHD Thesis UCSB,2001
[4] 陈川等.联合编码模式选择的码率控制算法.电子学报,2004(5)
[5] Xue Jinzhu,Shen Lansun.Rate Control Algorithm for H.264 Video Encoding,Journal of
Electronics(China),2003,20(6)
[6] Ma Siwei,WenGao.Rate Control For JVT Video Coding Scheme
关于RC 中一些疑问的总结
最近在看JVT-G012和JVT-H017r3,没看一遍都会产生一些不同的想法,同时也会更加的迷惑,现将自己
的一些迷惑列在这里,希望对RC 这块熟悉的牛人给予一些指点
(1)JVT-G012 和JVT-H017 的算法,具体是在JM 的哪个版本中实现的?
(2)在上述JM 版本的实现中,GOP 是一个什么样的结构,IPPP还是IPBPB 或者IPBBPBB?
(3)我如果想进行一下RC,比如说我想设定编码后的目标比特率(码率)为158Kbits/s,该如何在编
码配置文件中进行设定?
(4)JVT-H017r3 中公式(12)的4 个等式为存储图像(P 帧)和非存储图像(B 帧)的复杂度权重平均
值计算公式,不知当GOP 结构为IPBBPBB时存储图像和非存储图像的复杂度权重平均值计算公式(公式
(12)的前两个式子)该如何理解?
(5)JVT-G012文档中后面VBR下的RC实验结果表格Table 2 Experimental Results for sequences with
QCIF size under VBR中Bandwidth(kb/s)一栏为什么和前面的设定不同(Bandwidth: 128000 bits/s (1
至60 帧), 192000 bits/s (61 至150 帧),既然是VBR,为什么Table 2 中Bandwidth 一栏是一
个固定值
(6)在JVT-H017r3中为什么在计算P帧的目标比特时要取式(14)和式(15)的加权组合
(7)我的QQ 号是1034943855,欢迎研究RC 的同仁加我,共同讨论问题
1、JM86、JM90、JM96 都是;
2、任意;
3、自己到编码配置文件中去找找,除非你不懂英文,否则你一定很容易找到的;
4、这些公式跟序列结构没有关系;
5、......
6、这就是算法设计,你也可以不取加权值,而只用其中之一。但加权的效果应该是最好的;
7、我根本没分析过这两个提案的试验结果。呵呵~~~
也许自己太多的纠缠于算法本身的公式的理解上,说句心里话,这些公式的确不好理解
我认为JVT-G012 和JVT-H017r3 算法的基本思想是流入缓存的比特和流出缓存的比特基本相等,使缓存
占用量保持在一个恒定的水平(JVT-G012 为Bs/8,而JVT-H017r3 为0)不知对否?
公式当然是要理解才行。公式(12)跟序列结构没有关系,实质就是把所有已编码图像的复杂度进行加
权作为当前图像复杂度,P 和B 各算各的,这个有什么不能理解的地方呢?
版主的意思我明白,从公式(12)本身的表达式中也能看出来,我的疑问在于:
(1)当j=2 时,公式(12)的第一个式子等式右边第二项为7*Wp,i(1)/8,Wp,i(1)上面还有一横因为无
法编辑所以我省略了,而Wp,i(1)如何计算,是按照Wp,i(1)=Wp,i(1)/8+7*Wp,i(0)/8 来计算吗?如果是这
样,那么Wp,i(0)(上面还有一横)是否为0,Wp,i(1)(上面还有一横)为Wp,i(1)/8,Wp,i(1)有公式(12)
的第三个等式求得;我的另一种理解是这里的Wp,i(1)(上面还有一横)就是第一个已编码P 帧的复杂度
权重,即用公式(12)的第三个等式求得的Wp,i(1),不知那种理解对
(2)版主一再提及公式(12)跟序列结构没有关系,我这里举个例子来说明公式(12)与序列结构的一
些关联
当 GOP结构为IPBBPBB时,
j=2 时,公式(12)的第二个等式就是Wb,i(2)(上面还有一横)=Wb,i(2)/8+7*Wb,i(1)/8,不知版主是如何
理解Wb,i(2)/8 的含义的,它是指第i 个GOP 中的第2 个B 帧还是第1 个B 帧或者是其他的含义,此外
7*Wb,i(1)/8 中Wb,i(1)(上面还有一横)的应理解为第i个GOP中的第1 个B 帧的复杂度权重(由第三
个等式计算出来)还是把Wb,i(1)(上面还有一横)代入公式(12)的第一个等式中,与Wp,i(1)(上面
还有一横)的计算类似
j=3 时,公式(12)的第二个等式就是Wb,i(3)(上面还有一横)=Wb,i(3)/8+7*Wb,i(2)/8,此时的Wb,i(3)/8
又该如何理解呢,是理解成第i 个GOP 中的第3 个B 帧还是理解为第4 个B 帧或是有别的理解?在
Wb,i(3)(上面还有一横)=Wb,i(3)/8+7*Wb,i(2)/8 的计算中,因为7*Wb,i(2)/8 中Wb,i(2)(上面还有一横)
已经有前面计算出来了,Wb,i(3)/8 无论是理解为第i 个GOP 中的第3 个B 帧还是理解为第4 个B 帧都
将会丢掉一个已编码B 帧的复杂度权重的影响(理解为第i 个GOP 中的第3 个B 帧时丢掉的是第4 个
已编码B 帧复杂度权重的影响,理解为理解为第i 个GOP 中的第4 个B 帧时丢掉的是第3 个已编码B
帧复杂度权重的影响),顺便提一句j=3 时我们要计算的是第3 个P帧编码后的目标缓存水平
你把 rc_init_pict 函数(JM86)中的那个switch 语句里的代码看懂后,一切就都明白了。例如你的第一
个问题,代码中写得很清楚:
if(img->NumberofCodedPFrame==1)
AWp=Wp;
至于你的第二个问题,从提案的公式上看参与计算的P 和B 具有相同的下标,但是你看了JM 代码后
就会知道,其实参与计算的P 和B 的下标并不相同。而各个P 和B 的值是各算各的,P 和B 之间
完全没有联系,所以我才说跟序列结构没有关系。
学习的方法很重要。我学习JVT-H017r3 没有跟任何人交流过,全都是自己把JM 跑起来一步步跟踪,
然后与提案对照,根据JM 的执行流程来理解提案。我并不是说大家不需要交流,请不要误会。我的意
思是:除了交流之外,跟踪代码也是一种很有效的方法。等你看过代码之后,如果还有什么问题我们再
讨论吧。
请教关于率失真代价函数的问题
(1)J = Distortion + λmotion * Rate
上述公式中的Rate 是对什么编码以后的码率?我认为是对MVD编码的码率,不知道对否?
(2)J(s,c,mode|QP)=D(s,c,mode|QP)+ λmode*R(s,c,mode|QP)
这个公式中的R(s,c,mode|QP)又是对什么编码以后的码率呢?我认为是对MVD,编码模式以及残差编
码的码率,不知道对否?
以上两个问题还请清楚的人指点,谢谢!
下去查了查毕厚杰的书“基于Lagrangian 优化算法的H.264 编码控制模型”这部分,对帧内编码和帧
间编码模式所指的码率均指熵编码后比特流的比特率,还是觉得说的太模糊,
(1)帧间模式熵编码是对那些东西进行编码
(2)帧内模式熵编码又是对那些东西进行编码呢
帧间模式下宏块分割模式的判决与帧间模式运动估计的最佳比特分配分别对应我第一次提问的两个公
式的(2)和(1),对公式中的比特率还是不太清楚是指对什么编码以后的码率,烦请版主指教
1、(1)帧间模式熵编码是对那些东西进行编码,(2)帧内模式熵编码又是对那些东西进行编码呢
——帧内、帧间MB 解码时候需要什么信息就是对什么信息进行编码;
2、我认为是对MVD 编码的码率,不知道对否?
——毕厚杰的书上134 页,公式6.49 下面一行字写得清清楚楚,不明白为什么你会看不懂;
3、这个公式中的R(s,c,mode|QP)又是对什么编码以后的码率呢?
——解码某个MB 所需要的所有MB 级信息的编码比特数的总和。
0 0
原创粉丝点击