轉自:http://blog.csdn.net/lius1984/archive/2009/06/04/4241856.aspx
最近在做一個3gp/mp4播放器, 用ffmpeg從3gp/mp4文件中demux出mpeg4的raw data, 無法直接用來解碼,需要在第一幀之前加上vol header. 我照搬了ffmpeg的encode_vol_header的實現,很多文件(尤其是QVGA尺寸的文件)解碼不了。
最後得知,這個vol根本不用自己生成,只要把avctx->extradata裏面的長度爲avctx->extradata_size的數據copy到你的第一幀前面就可以了。
雖然ffmpeg有現成的vol header,還是順便總結一下mpeg4 sp的文件格式。參考文檔 《mpeg-4-14496-2》6.2節。 用UE打開一個.m4v文件,開頭44字節就是vol header. 比特流的句法如下:
a) 全局配置信息,表徵解碼器準備解碼的整個視頻對象組 VisualObjectSequence()
b) 對象配置信息,表徵單個視頻對象。VisualObject().
c) 對象層配置信息, 表徵一個視頻對象的層 VideoObjectLayer().
d) ES流數據,包含了整個視頻對象層裏的數據。
相關代碼在ffmpeg/libavcodec/h263.c的裏mpeg4_encode_visual_object_header和mpeg4_encode_vol_header。有幾個點需要注意。
-先寫vos和vo header, vos的起始碼是0x1B0, vo的起始碼是0x1B5
-profile_and_level_indication的值,simple profile一般值爲0x3
- vol的開頭是00 00 01 00 00 00 0120
-vol_width和vol_height與圖像尺寸一致,從=(*FormatCtx).streams[videoStream]->codec裏可得。
- 不到8位的需補零
順便推薦一個mp4ui的軟件,他可以從3GP和MP4文件中DUMP出音頻和視頻,很好用哦。 而且是開源的,對分析3GP格式很有幫助!