天天看點

Mp4檔案解析

MP4可以說是目前最流行的視訊格式,要播放一個MP4檔案需要首先将其結構給解析出來。MP4的結構往簡單了說就是類似于俄羅斯套娃一樣的很多box套box,往複雜了說就是很多種類的box,而且還需要做一些解析和計算的操作,下面就按照其結構來分析一下MP4檔案裡的主要的box.左側的目錄可以清晰地展示出各種box之間的關系。需要注意的是在ISO标準中box的種類非常多,這裡隻是列舉分析了一些比較重要的box.

Mp4Box

首先我們需要先了解一下box的結構。在Mp4中所有的box都包含了一個BoxHeader和BoxData.其中BoxHeader包含了box的類型和整個box的長度,BoxData裡面包含了子box或者各種資料。基于這種結構的考慮,我就可以設計出所有box的父類,還需要注意的是Media Data Box的長度有可能超出32位int的範圍,在這種情況下,size的大小就被設定為1,然後使用接下來的64位來存儲其長度。如果box的type為”uuid”的話,那接下來的16byte就用來存儲uuid.

在上面我們定義了父類Mp4box,一般情況下box頭部的長度都是8byte, 但是還有一種box在頭部還有1byte的version和3byte的flags。是以我們需要建立一個Fullbox父類,讓所有這種類型的box來繼承它。

ftyp

代表了File type box. 一般在檔案的開頭處(隻有固定大小的檔案簽名可以在其前面),主要包含了該檔案brand等,其定義方式如下:

moov

代表了Movie box,這個box包含了一個mvhd box 和多個trak box(如video,audio等),一般在檔案的開頭處僅次于ftyp,但是也有放在檔案末尾的。

代表了Movie Header box。 包含了整個媒體問題的資訊。

creationTime: 一個int型的資料代表了檔案的建立時間(從1904年1月1日淩晨開始的秒數)

modificationTime:修改時間,定義同上

timescale:1秒内包含的時間機關,和下面的duration結合可以得到媒體的時長。

duration:媒體的時長,以時長最長的track為準

rate:播放的速度,1.0為正常速度

volume:播放的音量

matrix:視訊的轉換矩陣

nextTrackId:下一個track的id

代表了 Track box。包含了一條track。通常情況下一個視訊會包含video和audio兩條track,還有一條hint track是為streaming準備的。

一個trak box内包含了tkdh和mdia兩種box。

代表了Track Header Box。每個trck box會包含一個tkhd box來存儲這條track的資訊。

creationTime: 這條track的建立時間(同mvhd)

modificationTime: 這條track的更改時間(同nvhd)

trackId: 目前track的id,不能為0

duration: 目前track的時長

layer: 播放時video track的前後順序,數字越小的越在上層。

alternateGroup: 對track進行分組,同一個組内同時隻能播放一個track

volume: 音量大小,對于video track 會是0

matrix:video的轉換矩陣

width/height 視訊的寬度和長度,以像素為機關

代表了Media Box, 用來包含目前track的資訊。mdia baox主要有三個子box,分别是hdlr、mdhd和minf,我們會在接下來分析這幾個子box。

其中componentName并不是mdia box需要解析的内容,在這裡我們用來存儲目前track的類型,如是vedio還是audio。

mdhd

代表了Media Header Box。包含了一些目前track的資訊,如creationTime等,在上文已經提過了,這裡将不再贅述。

language 目前媒體的語言代碼

hdlr

代表了Handler Refrence Box。包含了目前track類型的資訊,如這條track是video、sound還是hint。

minf

代表了Media Information Box。 内部主要包含了一個stbl box。

stbl

代表了Sample Table Box。 這個box包含了目前track中所有Samples的時間和資料索引,是以根據這些資訊就可以定位某個時間點的Sample及其大小等資訊。

這個box包含了很多子box,将各個子box的資訊結合起來就得得到Samples的詳細資訊了。具體怎麼計算将在最後做一下分析。

stts

代表了Decoding Time to Sample Box。這個box包含了一個表,從這個表裡可以根據解碼時間來定位sample的序号。

sampleCount: 一個時間段内連續的Sample個數

sampleDelta:一個時間段内sample的delta。

ctts

代表了Sample Table Box。包含了decoding time 和composition time之間的偏移量。

sampleCount: 特定偏移量内連續的Sample個數

sampleDelta: CT和DT之間的偏移量,如CT(n)=DT(n)+CTTS(n)

stsd

代表了Sample Description Box,裡面包含了一些子box,用來存儲編碼的資訊。根據目前track的類型來決定子box的類型。

####### VisualSampleEntry

//todo

MP4

繼續閱讀