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 00 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 ??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語義: ?creation_time:2082844800?????modification_time:2082844800??? ?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:聲頻 ?creation_time:2082844800???modification_time:2082844800??? ?timescale:44100? ?duration:68608 ?pad:0?//這個位無意義,是為了將后面language湊夠16位之用 ?Language[0]:21??????Language[1]:14??????Language[2]:4 ?pre_defined:0 hdlr:?handler ?例1:視頻 ?pre_defined:0 handler_type:vide //似乎除了handler_type以外,其余的屬性無意義 ?reserved0??????reserved:0??????reserved:0 ?例2:聲頻 ?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 ?例1: 視頻 ?entry_count:1 ?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:視頻? ?entry_count:1 ?first chunk: 1, sample per chunk: 1, sample description index 1 ?例2:音頻 ?entry_count:1 ?first chunk: 1, sample per chunk: 1, sample description index 1 ? |
moov:trak: mdia: minf: stbl: stsz | stsz: Sample Size Box, 這個box乃重中之重, 指示了每個sample的大小 ?例1:視頻 ?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 ?例2:音頻 ?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的開始位置 ?例1: 視頻 ?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 ? ?例2:音頻 ?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 | 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];? } ? ? |