天天看點

mp4格式

ftyp:

 這是一個筐,可以裝mdat等其他Box。 

例:00 00 00 14 66 74 79 70 69 73 6F 6D 00 00 02 00 6D 70 34 31

 語義為:ftyp: Major brand: isom

  Minor version: 512

  Compatible brand: mp41

free|skip

 空白Box.裝在ftyp等筐裡

 例:00 00 00 08 66 72 65

 語意為: free: (null)

moov:

 這是一個筐,裡面很豐富

 例:00 00 07 63 6D 6F 6F 76

 本身屬性沒有。但後面全是它的内容

moov:mvhd:

 這是moov的header.

 例: 00 00 00 6C 6D 76 68 64 00 00 00 00 7C 25 B0 80

  7C 25 B0 80 00 00 03 E8 00 00 06 14 00 01 00 00

  01 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00

  00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00

  00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00

  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  00 00 00 00 00 00 00 00 00 00 00 03           

 語義:

 creation_time:2082844800       modification_time:2082844800   

 timescale:1000 //一秒分多少份,這裡1000表示時間機關為1毫秒,這個設定很重要

 duration:1556 rate:10000 表示1.0 volume:100 表示最大聲

 reserved:0  reserved[0]:0   reserved[1]:0   

 Matric[0]:10000  Matric[1]:0  Matric[2]:0  Matric[3]:0  Matric[4]:10000 

 Matric[5]:0 Matric[6]:0  Matric[7]:0  Matric[8]:40000000

 Predefined[0]:0  Predefined[1]:0  Predefined[2]:0  Predefined[3]:0

 Predefined[4]:0  Predefined[5]:0  next_track_ID:3

moov:trak: tkhd:

 這是track header

 例1: 00 00 00 5C 74 6B 68 64 00 00 00 0F 7C 25 B0 80

  7C 25 B0 80 00 00 00 01 00 00 00 00 00 00 06 08

  00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00

  40 00 00 00 02 40 00 00 01 E0 00 00            

 creation_time:2082844800     modification_time:2082844800   

 track_ID:1 第一軌index, 這個值很重要, 直接決定了視訊和音頻是否能同時出現, 如果音頻和視訊的track_ID都是1, 則會導緻播放器無法播放.

 reserved_1:0  

 duration:1544 //這個值對播放器很重要, 具體時間還和mvhd的timescale相關,用來指定了時長,1544個時間機關,如果是毫秒為機關,則為1544毫秒,

 volume:0 //這是視訊軌,無音響 reserved_2[0]:0     reserved_2[1]:0        

 layer:0 //由于我們的視訊隻有一層,是以這裡總是0

 alternate_group:0 reserved_3:0   

 Matric[0]:10000    Matric[1]:0    Matric[2]:0    Matric[3]:0  Matric[4]:10000   

 Matric[5]:0    Matric[6]:0    Matric[7]:0    Matric[8]:40000000

 width:2400000 height:1e00000 //這兩個機關都要右移16位才靠譜

 例2語義:

 track_ID:2 reserved_1:0 duration:1556 //這個值對播放器很重要, 用來指定了時長,具體時間還和mvhd的timescale相關

 volume:100 //這是音頻軌,最大聲 reserved_2[0]:0   reserved_2[1]:0        

 layer:0 //隻對視訊有意義 alternate_group:0 //總是0

 reserved_3:0    Matric[0]:10000    Matric[1]:0    Matric[2]:0    Matric[3]:0

 Matric[4]:10000    Matric[5]:0    Matric[6]:0    Matric[7]:0    Matric[8]:40000000

 width:0 height:0

moov:trak: mdia:

 這個Box沒有屬性,是一個筐,裝在trak裡

moov:trak: mdia: mdhd

 例1:視訊

 creation_time:2082844800   modification_time:2082844800   

 timescale:24000 //這個位決定了播放的速度,不過他與duration的相乘後還是可以對應上面的mvhd設定

 duration:37037

 pad:0

 Language[0]:21      Language[1]:14      Language[2]:4

 pre_defined:0

 例2:聲頻

 timescale:44100 

 duration:68608

 pad:0 //這個位無意義,是為了将後面language湊夠16位之用

hdlr: handler

 pre_defined:0 handler_type:vide //似乎除了handler_type以外,其餘的屬性無意義

 reserved0      reserved:0      reserved:0

 pre_defined:0 handler_type:soun

 reserved:0      reserved:0      reserved:0

moov:trak: mdia: minf: vmhd

 Video media header

例: 

 graphicsmode:0 //Video軌的合成模式,未知語義

 opcolor:0        opcolor:0        opcolor:0 //同樣未知

moov:trak: mdia: minf: dinf: dref

 Data referrence

 例:

 entry_count:1 //隻有一條Entry

 url:  //即使有也是沒内容,測試檔案無論音視都沒有内容

moov:trak: mdia: minf: stbl: stsd

stsd: Sample Description box

 這是一個table, 裡面放有很多entry

 例:entry_count:1 //視訊,有一條entry

VisualSampleEntry: stsd裡裝的一條一條的視訊entry,

 data_reference_index:1

 pre_defined[0]:0

 pre_defined[1]:0 pre_defined[2]:0

 width:576 height:480

 horizresolution:480000 vertresolution:480000 //常數,即72dpi

 reserved:0 frame_count:1   compressorname://無

 depth:24 //顔色深度

 pre_defined:-1

AudioSampleEntry: stsd裡裝的一條一條音頻entry

 例:reserved[0]:0            reserved[1]:0

 channelcount:2 samplesize:16 pre_defined:0 reserved_2:0

 samplerate:ac440000 //顯然要右移16位才有意義

moov:trak: mdia: minf: stbl: stsd :mp4a

mp4a: aac box 這個box實際就是繼承了audio sample entry box

 reserved[0]:0            reserved[1]:0

 channelcount:2 samplesize:16

 pre_defined:0 reserved_2:0 samplerate:56220000

moov:trak: mdia: minf: stbl: stsd : esds

esds: 包含在mp4a裡,

 length:3

 ES_ID:6400

 streamDependenceFlag:0

 URL_Flag=0  reserved=0

 streamPriority:1 streamDependenceFlag:0

 dependsOn_ES_ID:52685

 m_iData_Size:23 //data的長度,算出來的

 Data[23] //這裡面有很一堆不知所雲的資料, 一直到stts,但這堆資料極度重要,直接決定了解碼器能否解碼,在14496-1裡有定義

   //實踐證明: 這組資料與采樣率有關,44100一組, 22050一組, 48000又是一組, 44100可以與48000共用一組

moov:trak: mdia: minf: stbl: stts

stts: Time to sample

 例1: 視訊

 entry_count:1

 sample_count:37 //上面已經有duration時間了,duration指整個mdat中video的時長,這裡37卻為chunks數目

 sample_delta:1001 //1001 * 37=37037 sample_delta*sample_count=duration

 例2: 音頻

 sentry_count:1

 sample_count:67 //音頻分了67個chunks

 sample_delta:1024 //同上

moov:trak: mdia: minf: stbl: stss

stss: syn Sample box

 sample_number:1

 但音頻裡沒有這個box,

 這個Box非常重要, 決定了整個mp4檔案是否可以拖拉, 如果這個box隻有一個entry,則拖拉時将cpu達到100%, 如果這個box不存在, 可以拖拉, 也不會達到100%, 但是會略等一會, 通常做法可以搞100條.

moov:trak: mdia: minf: stbl: stsc

stsc: Sample To Chunk Box 這個box非常重要,訓示了在某一個chunk開始後面的chunks裡每chunk有多少個sample, 一個sample就是一幀

 例1:視訊 

 first chunk: 1, sample per chunk: 1, sample description index 1

 例2:音頻

moov:trak: mdia: minf: stbl: stsz

stsz: Sample Size Box, 這個box乃重中之重, 訓示了每個sample的大小

 sample size: 0         sample count: 37

 5127    855     830     2327    2742    2373    2716    2365    3061

 2170    1888    2427    2578    2218    2084    2138    2319    2586   

 2728    2322    3505    2624    1551    2725    2502    2072    1720   

 1382    2653    2177    1323    1492    1801    1765    1985    5028   

 3467

 sample size: 0         sample count: 65

 219     205     207     182     213     194     195     194     212

 188     159     179     186     189     184     184     190     188

 190     186     195     196     182     197     182     186     182

 182     185     182     193     186     184     187     175     173

 170     185     171     181     178     178     185     192     188

 187     175     167     177     182     167     173     177     175

 176     174     170     168     169     180     164     167     176    

 170

 mdat Box中被劃分為很多個chunk,這裡指出了每個chunk的大小.

moov:trak: mdia: minf: stbl: stco

stco: Chunk Offset Box,這也是最重要的box, 訓示了每個chunk的開始位置

 entry_count:37

 0x24 0x15d3  0x1aaf  0x1f84  0x2a20  0x35aa  0x404a  0x4c53  0x5705

 0x6470  0x6da6  0x767c  0x8174  0x8d00  0x9725  0xa003  0xa9c9  0xb447 

 0xbfdc 0xcbf7  0xd5b8  0xe4c0  0xf064  0xf7da  0x103ea 0x10e70 0x117ff

 0x1200d 0x126da 0x1328b 0x13bbd 0x14247 0x14973 0x151cd 0x15a0a 0x16272

 0x17770

 entry_count:65

 0x142b 0x1506  0x192a  0x19f9  0x1ded  0x1ec2  0x289b  0x295e

 0x34d6  0x3eef  0x3fab  0x4ae6  0x4b99  0x5590  0x564d  0x62fa 

 0x63b2  0x6cea 0x7506  0x75be  0x7ff7  0x80b1  0x8b86  0x8c4a 

 0x95aa  0x966f  0x9f49  0xa85d 0xa913  0xb2d8  0xb391  0xbe61 

 0xbf22  0xca84  0xcb3c  0xd509  0xe369  0xe416 0xef00  0xefb9 

 0xf673  0xf728  0x1027f 0x10331 0x10db0 0x11688 0x11744 0x11eb7

 0x11f66 0x12573 0x12624 0x13137 0x131de 0x13b0c 0x140e8 0x14197

 0x1481b 0x148c9 0x1507c 0x15124 0x158b2 0x15966 0x161cb 0x17616

 0x176c6

moov:trak: mdia: minf: stbl: smhd

smhd: sound media header

 例:

 balance:0 reserved:0

 暫時未知語義

avcC: AVC descriptor box

avcC: AVC descriptor box非常重要, SPS PPS 都放這 在14496-15定義

 configurationVersion:1  AVCProfileIndication:66

 profile_compatibility:192 AVCLevelIndication;31

 reserved_1:63  lengthSizeMinusOne:3

 reserved_2:7

 numOfSequenceParameterSets:1 numOfPictureParameterSets:1

 SPS length: 24 //第一個SPS的長度, 多個SPS可以繼續往下

 PPS length: 4 //第一個PPS的長度, 多個PPS可以繼續往下

aligned(8) class AVCDecoderConfigurationRecord { 

 unsigned int(8) configurationVersion = 1; 

 unsigned int(8) AVCProfileIndication; 

 unsigned int(8) profile_compatibility; 

 unsigned int(8) AVCLevelIndication;  

 bit(6) reserved = ‘111111’b;

 unsigned int(2) lengthSizeMinusOne;  

 bit(3) reserved = ‘111’b;

 unsigned int(5) numOfSequenceParameterSets; 

 for (i=0; i< numOfSequenceParameterSets;  i++) { 

  unsigned int(16) sequenceParameterSetLength ; 

  bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit; 

 } 

 unsigned int(8) numOfPictureParameterSets; 

 for (i=0; i< numOfPictureParameterSets;  i++) { 

  unsigned int(16) pictureParameterSetLength; 

  bit(8*pictureParameterSetLength) pictureParameterSetNALUnit; 

}

見http://www.nhzjj.com/asp/admin/editor/newsfile/201011314552121.pdf

btrt: bit rate box

 bufferSizeDB:7858 //告訴decoder開辟緩沖區大小?

 maxBitrate:413432 //最大Bit rate

 avgBitrate:371960 //平均Bit rate

 avc1

 class AVCSampleEntry() extends VisualSampleEntry (‘avc1’){

 AVCConfigurationBox config; 

 MPEG4BitRateBox ();      // optional 

 MPEG4ExtensionDescriptorsBox (); // optional 

class AVCConfigurationBox extends Box(‘avcC’) { 

 AVCDecoderConfigurationRecord() AVCConfig; 

class MPEG4BitRateBox extends Box(‘btrt’){

 unsigned int(32) bufferSizeDB; 

 unsigned int(32) maxBitrate; 

 unsigned int(32) avgBitrate; 

class MPEG4ExtensionDescriptorsBox extends Box(‘m4ds’) { 

 Descriptor Descr[0 .. 255]; 

Trouble shooting

1, 播放速度不正常, 哪個參數可調?

 mdhd->timescale, 數字越大, 則播放速度越快

2, 拖拉不正常, 哪個Box可調?

 stss, 如果隻有一條entry, 則拖拉會産生cpu 100%的情況. 如果沒有entry, 則拖拉會略有停頓

3, 音頻,視訊分别整合成mp4檔案可以播放, 但音頻,視訊都整合進mp4檔案以後就無法播放.

 trak->track_id, 兩軌可能都用同一ID, 則不成. 視訊為1, 音頻為2,則可以解決這個問題

其實以上文章隻是個簡單的翻譯,詳細的文檔可參考:

ISO_IEC14496-12_2005(E)

Information technology — Coding of

audio-visual objects —

Part 12:

ISO base media file format

Technologies de l'information — Codage des objets audiovisuels —

Partie 12: Format ISO de base pour les fichiers médias

ISO_IEC14496-14_2003(E)

Part 14:

MP4 file format

Partie 14: Format de fichier MP4

網上比較難于下載下傳到,有需要的朋友可以email:[email protected] 找我索要。

繼續閱讀