h 264位元速率控制

2021-09-20 13:32:24 字數 4352 閱讀 4911

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...