H264 編碼 打包 解碼相關知識

2021-08-20 15:21:36 字數 2353 閱讀 1585

本文**

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

5)p frame:前向**編碼幀又稱predictive-frame,通過充分將低於影象序列中前面已編碼幀的時間冗餘資訊來壓縮傳輸資料量的編碼影象,也叫**幀;

6)b frame:雙向**內插編碼幀又稱bi-directional interpolated predictionframe,既考慮與源影象序列前面已編碼幀,也顧及源影象序列後面已編碼幀之間的時間冗餘資訊來壓縮傳輸資料量的編碼影象,也叫雙向**幀;

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

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

9)兩個i frame之間形成乙個gop,在x264中同時可以通過引數來設定bf的大小,即:i和p或者兩個p之間b的數量。

通過上述基本可以說明如果有b frame存在的情況下,乙個gop的最後乙個frame一定是p.

(10)dts和pts的不同:

下面給出乙個gop為15的例子,其解碼的參照frame及其解碼的順序都在裡面:

如上圖:i frame 的解碼不依賴於任何的其它的幀.而p frame的解碼則依賴於其前面的i frame或者p frame.b frame的解碼則依賴於其前的最近的乙個i frame或者p frame及其後的最近的乙個p frame.

(12)pts的計算

方法一、根據前後幀的ipb型別,可以得知幀的實際顯示順序,使用前面獲取的sps資訊中的幀率,以及幀計數frame_count即可計算出pts。此方法需要做幾幀快取(一般快取乙個group的長度)。

i p  b  b  i  p  b  b  i p  b  …幀型別

1  2  3  4  5  6  7  8 9  10 11 …第幾幀

1  4 2  3  5  8  6  7  9  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  i  p b  …幀型別

1  2  3  4  5  6  7  8 9  10 11 …第幾幀

1  4 2  3  5  8  6  7  9  12 10 …幀顯示順序

0  6  2  4 0  6  2  4  0  6 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流.4 i frame 幀內編碼幀 又稱intra picture,i 幀通常是每個 gop mpeg i幀可以看成是乙個影象經...

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