h.264的碼流傳輸是基於目前有限的網路頻寬來進行的,以目前的壓縮效率來說,運動不算劇烈、細節不多的影像,在720p的情況下,1000kbps壓縮損耗較少(psnr較大),能達到比較好的觀賞效果,1080p則需要2000kbps。當然,隨著影象運動劇烈程度加大,細節增多的情況,則需要更大的bps來保證影象效果。
另外由於影象序列中,並非所有的影象都有相同的細節,因此應該在細節多的影象上分配更多的bit,而細節少的影象則分配更少的bit。同一道理,在一張影象上,可能某些位置的細節較多,那就應該在那裡分配跟多的bit,否則分配更少的bit。
h.264的編碼位元速率控制就是考慮到以上的這些情況,制定了位元速率控制標準。以下以jvt-h017r3為例,分析h.264位元速率控制模組。
如前面所說,h.264位元速率控制可以分為三個階段:
gop級位元速率控制
picture級位元速率控制
basic unit級位元速率控制
可以通過上圖加以理解,途中為某個gop在某一時刻的編碼狀態,not coded 為未編碼影象,coded為已編碼影象,影象編碼後會以bit stream(碼流)的形式輸出到virtual buffer中,這裡的virtual buffer 並不一定實際存在於實際編碼器中,而是演算法虛擬出來的快取區,主要是維護碼流的輸入與輸出,在緩衝區中的碼流會以某一速率進行輸出(outflow)。
1. virtual buffer
對於virtual buffer的大小,是可計算的
vi(1)=}}
qpi(1)=max}}
平滑處理:
qpi(1)=qpi(1)−1ifqpi(1)>qpi−1(ni−1−l)−2
qpi(1)=qpi(1)−1ifqpi(1)>qpi−1(ni−1−l)−2
1. 設定b幀qp
對於b幀,都是以b幀兩端的參考幀的qp來計算當前b幀qp值。分兩種情況,假設兩個參考幀間的b幀數為l
l。當l=1
l=1,
qpi(j+1)=,−2×(k−1)}
qpi(j+k)=qpi(j)+α+max,−2×(k−1)}
α=⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪−3−2−1012qpi(j+l+1)−qpi(j)⩽qpi(j+l+1)−qpi(j)⩽qpi(j+l+1)−qpi(j)⩽qpi(j+l+1)−qpi(j)⩽qpi(j+l+1)−qpi(j)⩽otherwise−2×l−3−2×l−2−2×l−1−2×l−2×l+1
α={−3qpi(j+l+1)−qpi(j)⩽−2×l−3−2qpi(j+l+1)−qpi(j)⩽−2×l−2−1qpi(j+l+1)−qpi(j)⩽−2×l−10qpi(j+l+1)−qpi(j)⩽−2×l1qpi(j+l+1)−qpi(j)⩽−2×l+12otherwise
2. 設定p幀qp
p幀位元速率控制主要分為三步:
算出當前p幀的目標bit
通過目標bit算出當前幀pq
把當前幀pq與前面幀的pq進行對比,做平滑處理
為了算出當前p幀的目標bit,需要的引數有三個:virtual buffer,remain picture bit,target buffer level。其中前兩個引數在前面的gop級的位元速率控制中已經獲得,下面來引入討論乙個新的概念,目標快取級別(target buffer level)。
這個級別(level)用來修正待編碼影象對清空快取區的貢獻,基本思想是清空快取區的工作應該更多由非參考影象來承擔,由於b幀的qp普遍會比兩端的p幀大,也就是相對來說會占用更小的快取區域,那麼p幀就可以降低qp來提高影象編碼質量,那麼p幀編碼為碼流後占用的快取區會更大。target buffer level 代表的就是p幀在快取區的占用情況,當有b幀時的target buffer level 會比沒有b幀時的大。
計算方式如下:
si(2)=vi(2)
si(2)=vi(2)
si(j+1)=si(j)−si(2)np(i)−1+w¯p,i(j)×(l+1)×ri(j)f×(w¯p,i(j)+w¯b,i(j)×l)−ri(j)f
si(j+1)=si(j)−si(2)np(i)−1+w¯p,i(j)×(l+1)×ri(j)f×(w¯p,i(j)+w¯b,i(j)×l)−ri(j)f
w¯p,i(j)w¯b,i(j)wp,i(j)wb,i(j)=wp,i(j)8+7×w¯p,i(j−1)8=wb,i(j)8+7×w¯b,i(j−1)8=bi(j)×qpp,i(j)=bi(j)×qpb,i(j)1.3636
w¯p,i(j)=wp,i(j)8+7×w¯p,i(j−1)8w¯b,i(j)=wb,i(j)8+7×w¯b,i(j−1)8wp,i(j)=bi(j)×qpp,i(j)wb,i(j)=bi(j)×qpb,i(j)1.3636
wpwp是p幀的權重,wb
wb是b幀的權重。
當沒有b幀時,可以簡化為:
si(j+1)=si(j)−si(2)np(i)−1
si(j+1)=si(j)−si(2)np(i)−1
這表明target buffer level會越來越小,在當前gop末尾會趨向於0
0。最後結合virtual buffer,remain picture bit,target buffer level三者求出當前p幀的目標bit。
t~i(j)t^i(j)ti(j)=ri(j)f+γ×(si(j)−vi(j))=wp,i(j−1)×bi(j)wp,i(j−1)×np,γ+wb,i(j−1)×nb,γ=β×t^i(j)+(1−β)×t~i(j)
t~i(j)=ri(j)f+γ×(si(j)−vi(j))t^i(j)=wp,i(j−1)×bi(j)wp,i(j−1)×np,γ+wb,i(j−1)×nb,γti(j)=β×t^i(j)+(1−β)×t~i(j)
當然還有上下界判斷(略)。
得到目標bit後就可以求當前p幀的量化步長(求解下面一元二次方程),然後通過量化步長得到量化引數,
ti(j)=c1×σ~i(j)qstep,i(j)+c2×σ~i(j)q2step,i(j)−mh,i(j)
ti(j)=c1×σ~i(j)qstep,i(j)+c2×σ~i(j)qstep,i2(j)−mh,i(j)
σ~i(j)=a1×σi(j−1−l)+a2
σ~i(j)=a1×σi(j−1−l)+a2
其中,σi(j−l−l)
σi(j−l−l)為上一p幀的複雜度,σ~i(j)
σ~i(j)為當前p幀複雜度的**值,mh,i(j)
mh,i(j)則是當前p幀的運動向量以及頭部大小。
最後也少不了對比上一p幀進行平滑qp的處理(略)。
這個其實跟「設定p幀qp」有同樣的三個步驟,只是把picture分開了成basic unit然後再一一計算,對當前basic unit進行位元速率控制、編碼,然後輪到下乙個basic unit。
首先需要求當前basic unit的目標bit數,
bl~=tr×σ~2l,i(l)∑k=lnunitσ~2l,i(k)
bl~=tr×σ~l,i2(l)∑k=lnunitσ~l,i2(k)
其中,σ~i(j)
σ~i(j)為當前basic unit複雜度的**值,該**值是通過上一p幀的對應basic unit位置來進行**的,**方法同上方p幀,採用線性**,tr
tr則是用當前幀的目標bit數ti(j)
ti(j)。
第二步要**當前p幀的basic unit平均的頭部大小(包括mv等)。
m~hdr,lmhdr,l=m~hdr,l−1×(1−1l)+m^hdr,ll=m~hdr,l×lnunit+mhdr,1×(1−lnunit);1⩽l⩽nunit
m~hdr,l=m~hdr,l−1×(1−1l)+m^hdr,llmhdr,l=m~hdr,l×lnunit+mhdr,1×(1−lnunit);1⩽l⩽nunit
其中,m~hdr,l
m~hdr,l是序號為l
l的basic unit的header bit初步**值,m^hdr,l
m^hdr,l是當前basic unit已經產生的header bit數,mhdr,1
mhdr,1是上乙個p幀的basic unit的header bit的平均值。那麼上面的式子可以這樣理解:等式1是用前乙個basic unit的header bit初步**值與當前basic unit已產生的header bit來**當前basic unit的初步**值;等式2是用上一張p幀的basic unit的header bit平均值對當前basic unit初步**值進行修正。
然後用目標bit減去header bit得到**的紋理bit數。
b^l=b~l−mhdr,l
b^l=b~l−mhdr,l
最後就是求量化引數了,這個跟上面picture級的一樣,只是把複雜度換成了以basic unit為單位。
還有就是平滑(略)。
h 264位元速率控制
h.264的碼流傳輸是基於目前有限的網路頻寬來進行的,以目前的壓縮效率來說,運動不算劇烈 細節不多的影像,在720p的情況下,1000kbps壓縮損耗較少 psnr較大 能達到比較好的觀賞效果,1080p則需要2000kbps。當然,隨著影象運動劇烈程度加大,細節增多的情況,則需要更大的bps來保證...
h 264位元速率控制
h.264的碼流傳輸是基於目前有限的網路頻寬來進行的,以目前的壓縮效率來說,運動不算劇烈 細節不多的影像,在720p的情況下,1000kbps壓縮損耗較少 psnr較大 能達到比較好的觀賞效果,1080p則需要2000kbps。當然,隨著影象運動劇烈程度加大,細節增多的情況,則需要更大的bps來保證...
H 264位元速率控制機制
h 264標準位元速率控制演算法步驟如下 1 計算當前幀的目標碼字,並將其限定到hrd的邊界中。2 通過線性模型 式4 5 當前幀中基本單元的mad。3 為未編碼基本單元分配碼字。4 通過二次r d模型計算相應的量化步長。5 對基本單元中每個巨集塊進行rdo。其中a1和a2是該 模型中的兩個引數。a...