在哪個字段有判斷I,B,P幀的信息

在哪個字段有判斷I,B,P幀的信息?(MPEG2,H.264) ?

1.根據TS包頭中的PID找到TS流裏的PAT表,其TS的PID爲0x00;
2.找到PAT表後,根據其中攜帶的PMT表的TS包PID找到PMT表;
3.找到PMT表後,根據其中攜帶視頻的TS包PID就可以判斷出包含視頻數據的TS包;
4.對於mpeg-1和mpeg-2視頻,一般在TS複用時一個PES包包含一個picture,對於mpeg-2   video,picture可以是楨圖像(frame)或場圖像(field)
5.找到視頻TS包中一個包含PES頭的TS包(PID爲PMT中的視頻PID,TS包頭中payload_unit_start_indicator標誌爲1),這個包裏會包含picture   header信息
6.找到picture   header(以0x00000100開始)後,根據其中的picture_coding_type信息判斷其爲I,P,B或D楨,注意,D楨只在mpeg-1   video中使用

      有關TS,PES,PAT,PMT信息見13818-1,有關picture   header,picture_coding_type信息見13818-2和11176-2。

      我根據取得的ES包找到00000100,然後根據其後2個字節的第11-13位判斷,001是I幀,011是B幀,010是P幀。

如果視頻是h264呢,怎樣判斷i、b、p幀?

        H264的IPB幀判斷,要先解出來H264的es流數據,然後分析出每一個NAL,再解析出那些Nal爲一個Frame,再解析Slice類型,當fisrt_mb_in_slice=0時,表示一幀的開始,再根據Slice類型就可以判斷這個Frame的IPB類型。

 

MPEG4解析VOL和VOP
H.264解析PPS
MPEG2跟MPEG4一樣,只是頭的規定不一樣。

ffmpeg中獲取frame的type在:

mpeg1:mpeg1_decode_picture

mpeg2:mpeg_decode_picture_coding_extension

mpeg4:decode_vop_header

h263:   ff_intel_h263_decode_picture_header

              h263_decode_picture_header 

flv:       ff_flv_decode_picture_header

 

 mpeg4視頻中,I幀、p幀、B幀的判定

        mpeg4的每一幀開頭是固定的:00 00 01 b6,那麼我們如何判斷當前幀屬於什麼幀呢?

在接下來的2bit,將會告訴我們答案。注意:是2bit,不是byte,下面是各類型幀與2bit的對應關係:

  00: I Frame
  01: P Frame
  10: B Frame 

爲了更好地說明,我們舉幾個例子,以下是16進制顯示的視頻編碼:

  00 00 01 b6 10 34 78 97 09 87 06 57 87 ……                             I幀

  00 00 01 b6 50 78 34 20 cc 66 b3 89 ……                                 P幀

  00 00 01 b6 96 88 99 06 54 34 78 90 98 ……                             B幀

下面我們來分析一下爲什麼他們分別是I、P、B幀

  0x10 = 0001 0000

  0x50 = 0101 0000

  0x96 = 1001 0100 

大家看紅色的2bit,再對照開頭說的幀與2bit的對應關係,是不是符合了呢?

注:ffmpeg在decode完成後,輸出的AVFrame結構體中,字段key_frame表示是哪種幀類型。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章