有關碼率控制的FAQ


有關碼率控制的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 級信息的編碼比特數的總和。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章