avi音視頻格式及mpeg4視頻中,I幀、p幀、B幀的判定

AVI的音頻視頻幀的開頭

  Avi中視頻音頻交叉存放,每一幀視頻都有一個視頻幀頭:30 30 64 63(這時二進制編碼,字符是00dc),然後接着就是四個字節的幀長度,例如00 00 10 00,再往下就是幀的內容。

  Avi的音頻也有一個音頻頭:30 31 77 6201wb),接着就是音頻的長度,例如00 10 00 00,就是4096字節,接着就是音頻的內容了。

AVI的音頻視頻交叉規律

經過對avi視頻的詳細分析,發現音頻視頻的交叉有如下規律:

15 vedio

1段          audio

15vedio

1段          audio

16 vedio

1段          audio

15vedio

1段   audio

15vedio

1段   audio

16 vedio

1 audio

      也就是基本上是每15vedio就有一段的audio,可是每經過兩個15段的vedio循環,就要有16段的vedio纔能有一段audio

      另外還有一個規律就是,每一段audio大小都是一定的4096字節。

      這是某個特定文件的交叉規律,個人認爲音視頻交叉的頻率跟幀率和音頻頻率有關,只要是按一定的比率來交叉就行,例如上面按每30幀視頻放一段音頻,然後音頻的長度變爲8192應該可以.

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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的對應關係,是不是符合了呢?

下面給出一段c++代碼供大家參考:

複製代碼
switch(buf[i] & (BYTE)0xc0)
{
case 0x00:
    
//I Frame
    break;
case 0x40:
    
//P Frame
    break;
case 0x80:
    
//B Frame
    break;
default:
    
break;
}
複製代碼
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章