mpeg4 码流格式及判断关键帧
mpeg4 碼流格式及判斷關鍵幀
MPEG4碼流視頻關鍵幀頭部16個字節,非關鍵幀8個字節(均包含四字節ID),說明如下:
關鍵幀:
| 字節 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
| 值 | 0 | 0 | 1 | FB | XX | R | W&H | Date time | Length | |||||||
| 含義 | ID |
|
| 圖像大小 | 時間戳 | 幀長度 | ||||||||||
非關鍵幀
| 字節 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 值 | 0 | 0 | 1 | FA | Length | |||
| 含義 | ID | 幀長度 | ||||||
-
XX:保留。
-
RATE:幀率,低5位表示幀率,目前取值從1到30,高三位表示解交錯,可選0,1,2其中0做解交錯,2不做解交錯。
-
WIDTH和HEIGHT表示視頻數據高度和寬度,一個字節最大256,所以存儲的信息為真實高度和寬度的1/8。
-
TIMESTAMP:幀時間戳:
struct DateTime
{
DWORDsecond :6; //秒?1-60
DWORDminute :6; //分?1-60
DWORDhour :5; //時?1-24
DWORDday :5; //日?1-31
DWORDmonth :4; //月?1-12
DWORDyear :6; //年?2000-2063
};
非關鍵幀的時間戳是根據幀率和對關鍵幀的偏移計數計算出來的。
-
LENGTH:幀長度,低字節優先,不包括幀頭長度(16字節或者8字節,這個需要注意)
-
H.264碼流跟MPEG4的最大不同在于ID,關鍵幀ID為000001FD,非關鍵幀ID為000001FC。
給一個例子:
測試解碼器測試了很久,由于需要將H264和MPEG4的碼流進行分析和判斷,并逐幀輸入解碼器進行測試,如何正確的分析碼流,并將Video送給我們的解碼器做Decode的呢?耐著性子找了很多資料,主要也因為我本身對MPEG4和H264的碼流的格式并不懂,自己在視頻編碼方面的積累也實在是太少了,所以也確實挺頭疼的。后來就直接在網上找是否有對碼流的各個部分意義的解釋,開始搜索碼流中的的StartCode。高興的是,最終找到了一些有用的訊息,得以繼續進行測試代碼的撰寫。
今天就把MPEG4碼流的分析和它的I,P,B Frame的判定方法在這里簡要記錄一下吧,供日后的翻看和大家的參考。!
MPEG4碼流分析:
0x00, 0x00, 0x01, 0xB0作為一個VOS的開始;
0x00, 0x00, 0x01, 0xB6作為一個VOP的開始,緊跟著VOP開始的,有一個2bit 的標志,用來表示這個Frame到底是一個 I Frame,P Frame,B Frame抑或是S Frame(GMS-VOP)
標志如下:
00: I Frame
01: P Frame
10: B Frame
11: S Frame
但是,有關這 2bit 是在0xB6的后面字節的高位還是低位,卻沒有很明確的描述。
于是又回頭開始針對某個MPEG4編碼好的文件開始分析,結果終于發現,判定方法如下:
1.可以寫一個判定VOP,或者VOS開頭的函數:
2. 讀一個MPEG4碼流文件,然后利用剛才寫的函數搜索StartCode:
可以簡單拿個圖說明一下,下圖中,第一個VOS的開頭,第二個是一個I Frame:
?
by lydia
本文地址:http://www.rosoo.net/a/201111/15315.html
總結
以上是生活随笔為你收集整理的mpeg4 码流格式及判断关键帧的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文本分析-全角字符串与半角字符串的转换
- 下一篇: Cocoa编码规范