1. 程式人生 > >從MP4頭資訊中提取sps和pps資料

從MP4頭資訊中提取sps和pps資料

一、MP4格式基本概念

MP4格式對應標準MPEG-4標準(ISO/IEC14496)

二、MP4封裝格式核心概念

1  MP4封裝格式對應標準為 ISO/IEC 14496-12(資訊科技 視聽物件編碼的第12部分: ISO 基本媒體檔案格式/Information technology Coding of audio-visual objects Part 12: ISO base media file format)

2  MP4封裝格式是基於QuickTime容器格式定義,媒體描述與媒體資料分開,目前被廣泛應用於封裝h.264視訊和ACC音訊,是高清視訊/HDV的代表。

 MP4檔案中所有資料都封裝在box中(對應QuickTime中的atom),即MP4檔案是由若干個box組成,每個box有長度和型別,每個box中還可以包含另外的子box(稱container box)。

 一個MP4檔案首先會有且只有一個“ftyp”型別的box,作為MP4格式的標誌幷包含關於檔案的一些資訊;之後會有且只有一個“moov”型別的box(Movie Box),它是一種container box,子box包含了媒體的metadata資訊;MP4檔案的媒體資料包含在“mdat”型別的box(Midia Data Box)中,該型別的box也是container box,可以有多個,也可以沒有(當媒體資料全部引用其他檔案時),媒體資料的結構由metadata進行描述。

4  MP4中box儲存方式為大端模式。一般,標準的box開頭會有四個位元組的box size。 好的,鋪墊做好了,下面直接進入正題! 近期本人在用自己的開發板對ffmpeg解碼做一些改進,目標是將ffmpeg的解碼部分交給硬體編解碼單元VPU(Video Processing Unit)去做,而ffmpeg用來讀取檔案,並解析檔案,以加快解碼速度,並釋放CPU資源(事實上單核ARM cotexA9解碼1920x1088的視訊,根本解不動啊...)。 這裡補充兩個概念: 解析:即解封裝,封裝格式有很多種,常見的如avi、mp4、rmvb等等。 解碼:將壓縮的多媒體資料格式還原,視訊資料壓縮格式也有很多,目前比較流行的有H.264、mpeg2、mpeg4等等。 使用VPU進行解碼的時候,交給VPU的資料必須是嚴格的H.264資料,否則VPU是不認的。本以為ffmpeg的解析工作可以和VPU的解碼完美配合,但事與願違,ffmpeg解析後的一個packet(即一個視訊幀)的格式為4byte的box大小+幀資料,而真正的H.264的資料為4byte的頭(00 00 00 01)+幀資料。因此,每一幀的資料在丟給VPU之前,需要將頭部的4bit用00 00 00 01替換。下圖為ffmpeg提取的packet資料(我打印出來每個packet的前5位,和packet size)。

可以看到,每一個packet的前4byte是幀大小(mp4是大端儲存),如第一組資料:0x14efa = 85754,即出去前4byte後的大小。 在使用VPU進行H.264解碼的時候,還需要sps和pps資料,第一幀的資料頭應當包含sps和pps。(至於這兩個引數是幹什麼的,這裡就不贅述了,網上的資料很多)。好的,下面來說如何找出sps和pps: 1、找到avcC,在mp4的包頭中,包含了avcC這4個字母的asic碼,對應的十六進位制數分別是61 76 63 43。因此,需要在mp4包頭中找出avcC。下圖為用altraedit檢視的mp4的包頭資料。
可以看到,61 76 63 43對應了avcC。至於前面的mp4包頭資訊,可以參考mp4官方文件給出的解釋,這裡不再解釋。 2、根據下表所示的資訊,找出對應的sps和pps位:
因此,對應上表,可以得出如下資訊:
avcC 61 76 63 43
版本號 1
AVCProfileIndication 64
profile_compatibility 0
AVCLevelIndication 29
reserved(6bit)+NALU長度(2bit) ff
reserver(3bit)+sps個數(5bit) E1
sps長度 00 0B
sps內容 67 64 00 29 AC CE C0 78 02 26 40
pps個數 01
pps長度 00 04
pps內容 68 EA 5B 83
好的,到此為止就在mp4的包頭中找到了sps和pps資料,可以根據此方法寫出你的code啦,很簡單吧!