以一個長度為10秒的MP4為例,其結構可能如下:
type: ftyp, size: 24
type: mdat, size: 8884701
type: mdat, size: 136125
type: moov, size: 4656 1. ftyp
一個ftyp對檔案的類型進行描述,指明其符合哪些格式。一般就是mp4格式了。符合本文檔的媒體類型有很多種,box條目的種類也不同,所以需要brand與compatible_brands的來說明此檔案內的box的種類。文檔中定義了isom, avc1, iso2, mp71, iso3這些brand應有的格式,當解碼器在讀出其brand後,就知道該檔案的格式了。
aligned(8) class FileTypeBox extends Box(‘ftyp’) { unsigned int(32) major_brand; unsigned int(32) minor_version; unsigned int(32) compatible_brands[]; // to end of the box}
2. mdat
上例中有2個mdat,一個是視頻內容、另一個音頻內容。對於h264, aac編碼的媒體來說,其視頻mdat中內容是nal,對於音頻來說,其內容為aac的一幀。mdat中的幀依次存放,每個幀的位置、時間、長度都由moov中的資訊指定。可以看出,mdat是很好組建的,這種Box只含有資料。
aligned(8) class MediaDataBox extends Box(‘mdat’) { bit(8) data[];}
3. moov
moov存放影片的所有資訊,一個moov含有多個trak。通常對於一個片子來說,就是一個視頻trak,一個音頻trak。MP4檔案的重點也在於此。
(1) trak / tkhd
對於視頻trak,存寬、高資訊;對於音頻trak,存音量資訊。並不是太重要,真正初始化解碼器要靠 stsd中的資訊。
(2) trak / mdia / hdlr
標明該trak是視頻還是音頻
(3) trak / mdia / minf / stbl
所有重要的表都在這裡。其中,
- stsd: 編碼器CODEC資訊
- stsz: 用於sample的劃分,通常一個sample可以對應於frame。
- stsc: 多個sample組成一個trunk,不過實際操作中可以讓一個sample直接構成一個trunk
- stco: trunk在檔案中的位置,用於定位。
- stts / ctts: 指定每個sample的PTS, DTS
(4) trak / edts / elst
把視頻分為多段segment, 每個的起始時間和時間長度