H264 編碼 打包 解碼相關知識

2021-08-10 19:50:04 字數 3477 閱讀 5433

2)pes流(packet elementary stream): 也叫打包的基本碼流, 是將基本的碼流es流根據需要分成長度不等的資料報, 並加上包頭就形成了打包的基本碼流pes流.

4)i frame 

:幀內編碼幀

又稱intra picture,i

幀通常是每個

gop(

mpeg

i幀可以看成是乙個影象經過壓縮後的產物。

5)p frame:

前向**編碼幀

又稱predictive-

frame

,通過充分將低於影象序列中前面已編碼幀的時間冗餘資訊來壓縮傳輸資料量的編碼影象,也叫**幀;

6)b frame:

雙向**內插編碼幀

又稱bi-directional interpolated predictionframe

,既考慮與源影象序列前面已編碼幀,也顧及源影象序列後面已編碼幀之間的時間冗餘資訊來壓縮傳輸資料量的編碼影象,也叫雙向**幀;

7)pts

:presentationtime stamp

。pts

8)dts

:decode timestamp

。dts

主要是標識讀入記憶體中的bit流在什麼時候開始送入解碼器中進行解碼。

在沒有b幀存在的情況下dts的順序和pts的順序應該是一樣的。 9)

i frame:

p frame

i frame

或者b frame

來生成一張完整的。

b frame:

則要參考其前乙個i或者

p幀及其後面的乙個

p幀來生成一張完整的。 兩個

i frame

之間形成乙個

gop,在

x264

中同時可以通過引數來設定

bf的大小,即:i和

p或者兩個p之間

b的數量。

通過上述基本可以說明如果有

b frame

存在的情況下,乙個

gop的最後乙個

frame

一定是p.

(10)dts

和pts

的不同:

dts,

在解碼階段使用

.pts.在

display

的時候使用

.在沒有

bframe

的情況下

.dts

和pts

的輸出順序是一樣的.

下面給出乙個

gop為

15的例子

,其解碼的參照

frame

及其解碼的順序都在裡面:

如上圖:

i frame 

的解碼不依賴於任何的其它的幀.而

p frame

的解碼則依賴於其前面的

i frame或者p

frame.b frame

的解碼則依賴於其前的最近的乙個

i frame

或者p frame

及其後的最近的乙個

(12)pts的計算

方法一、

根據前後幀的ipb型別,可以得知幀的實際顯示順序,使用前面獲取

的sps資訊中的幀率,以及

幀計數frame_count即可計算出pts。此方法需要做幾幀快取(一般快取乙個group的長度)。

i p  b  b  i  p  b  

bi p  b  ...

幀型別1  2  3  4  5  6  7  

89  10 11 ...

第幾幀1  4 2  3  5  8  6  

79  12 10...

幀顯示順序

乙個i幀與下乙個i幀之間,是乙個group。

從上圖可見,

p型別的幀的顯示順序,是排在後面最後乙個b幀之後。

所以要獲取第7幀的pts,起碼要知道他下一幀的型別,才能得知他的顯示順序。

第8幀的pts=1000(毫秒)*7(幀顯示順序)*幀率

方法二、每乙個slice的資訊裡面,都記錄有pic_order_cnt_lsb,當前幀在這個group

中的顯示順序。通過這個pic_order_cnt_lsb,可以直接計算出當前幀的pts。此方法不需要做幀快取。

計算公式:

pts=1000*(i_frame_counter+ pic_order_cnt_lsb)*(time_scale/num_units_in_tick)

i_frame_counter

是最近一次i幀位置的幀序,通過i幀計數+當前group中的幀序,得到幀實際顯示序列位置,乘上幀率,再乘上1000(毫秒)的base_clock(基本時鐘頻率),得到pts。

i p  b  b  i  p  b  b  ip 

b...

幀型別1  2  3  4  5  6  7  8 

910 

11...

第幾幀1  4 2  3  5  8  6  7  

912 

10...

幀顯示順序

0  6  2  4 0  6  2  4  06 

2...

pic_order_cnt_lsb

細心一點可以注意到,在上圖,slice裡面的pic_order_cnt_lsb是以2進行遞增。

通常h264裡面的sps中記錄的幀率,也是實際幀率的2倍time_scale/num_units_in_tick=fps*2

因此,實際的計算公式應該是這樣

pts=1000*(i_frame_counter*2+pic_order_cnt_lsb)*(time_scale/num_units_in_tick)

或者是pts=1000*(i_frame_counter+pic_order_cnt_lsb/2)*(time_scale/num_units_in_tick/2)

所以,第11幀的pts應該是這麼計算

1000*(9*2+2)*(time_scale/num_units_in_tick)

rtp打包h264的時間戳,由於h264標準說明是90000/幀率,這裡pts的base_clock都是按照1000(毫秒)計算,如果復用到ts裡,base_clock是90k,所以還應該再乘以90。

H264 編碼 打包 解碼相關知識

本文 2 pes流 packet elementary stream 也叫打包的基本碼流,是將基本的碼流es流根據需要分成長度不等的資料報,並加上包頭就形成了打包的基本碼流pes流.5 p frame 前向 編碼幀又稱predictive frame,通過充分將低於影象序列中前面已編碼幀的時間冗餘資...

H264相關知識

1 基本概念 p frame 前向 編碼幀又稱predictive frame,通過充分將低於影象序列中前面已編碼幀的時間冗餘資訊來壓縮傳輸資料量的編碼影象,也叫 幀 b frame 雙向 內插編碼幀 又稱bi directional interpolated prediction frame,既考...

H264編碼原理

條件 1.yuv格式為yuv420 2.解析度為640 480 3.幀率為15 建議碼流500kbps,通過計算可以得到h264壓縮比約為1 100。gop中幀與幀之間的差別小 有失真壓縮包括幀內壓縮和幀間壓縮,幀內壓縮解決的是空域資料冗餘問題,幀間壓縮解決的是時域資料冗餘的問題。無失真壓縮包括dc...