主要描述在文件:ISO14496-12中
1.1 video的track如下图所示
1.2 vidoe的track
trak-->tkhd
-
6097020: 0005 bf9d 7472 ....tr
-
6097030: 616b 0000 005c 746b 6864 0000 000f 7c25 ak...\tkhd....|%
-
6097040: b080 7c25 b080 0000 0001 0000 0000 0014 ..|%............
-
6097050: 6595 0000 0000 0000 0000 0000 0000 0000 e...............
-
6097060: 0000 0001 0000 0000 0000 0000 0000 0000 ................
-
6097070: 0000 0001 0000 0000 0000 0000 0000 0000 ................
-
6097080: 0000 4000 0000 01d6 0000 0160 0000 0000 ..@........`....
-
-
0005 bf9d 7472 616b --> track的长度是0x5bf9d,type=trak
-
0000 005c 746b 6864 --> tkhd的长度是0x5c, type=tkhd
-
0000 000F -->tkhd的version与flag
-
7c25 b080 7c25 b080 -->create_time=modify_time=0x7c25b080
-
0000 0001 --> trackID=1
-
0000 0000 --> reserve
-
0014 6595 --> duration=0x146595
-
0000 0000 --> reserved
-
0000 0000 --> reserved
-
0000 0000 --> layer+group
-
0000 0000 --> volum+resever
-
0001 0000 0000 0000 0000 0000 --> matrix
-
0000 0000 0001 0000 0000 0000
-
0000 0000 0000 0000 4000 0000
- 01d6 0000 0160 0000 --> width=0x1d6 height=0x160(这儿都需要向右移16位)
-
6097080: 0000 ..
-
6097090: 0024 6564 7473 0000 001c 656c 7374 0000 .$edts....elst..
-
60970a0: 0000 0000 0001 0014 6595 0000 03e9 0001 ........e.......
-
60970b0: 0000
-
0000 0024 6564 7473 --> edts的长度为0x24,type=edts
-
0000 001c 656c 7374 --> elst的长度为0x1c,type=elst
-
0000 -->version
-
0000 0000 -->flag
-
0000 0001 -->elst_count=1
-
0014 6595 -->segment duration=0x146595
-
0000 03e9 -->media time=0x3e9=1001 ;;video的开始时间
- 0001 0000 -->rate=0x1000,rate/65536=1.0
以后的时间再累加stts中的sample_duration,就是所有的dts
1.3 mdia-->mdhd
-
60970b0: 0005 bf15 6d64 6961 0000 0020 6d64 ....mdia... md
-
60970c0: 6864 0000 0000 7c25 b080 7c25 b080 0000 hd....|%..|%....
-
60970d0: 5dc2 01e9 9054 15c7 0000
-
0005 bf15 6d64 6961 -->mdia的长度=0x5bf15,type=mdia
-
0000 0020 6d64 6864 -->mdhd的长度=0x20,type=mdhd
-
0000 -->version=0
-
0000 -->flag=0
-
7c25 b080 7c25 b080 -->create_time与modify_time
-
0000 5dc2 -->timescale=0x5dc2
-
01e9 9054 -->duration=0x1e99054
-
15c7 --->language
- 0000 --> quality
-
60970d0: 0000 002d 6864 .-hd
-
60970e0: 6c72 0000 0000 0000 0000 7669 6465 0000 lr........vide..
-
60970f0: 0000 0000 0000 0000 0000 5669 6465 6f48 ..........VideoH
-
6097100: 616e 646c 6572 00 andler.
-
0000 002d 6864 6c72 -->hdlr的长度=0x2d,type=hdlr
-
0000 0000 -->version 与 flags
-
0000 0000 -->pre_defined,即现在不用了
-
7669 6465 -->type="vide",说明这是一个video的track::ffmpeg中st->codec->codec_type=AVMEDIA_TYPE_VIDEO
-
0000 0000 -->reserved
-
0000 0000 -->reserved
-
0000 0000 -->reserved
- 5669 6465 6f48 616e 646c 6572 00 -->name="VideoHandler"
mdia-->minf-->dinf
-
6097100: 00 05be c06d 696e 6600 .....minf.
-
6097110: 0000 1476 6d68 6400 0000 0100 0000 0000 ...vmhd.........
-
6097120: 0000 0000 0000 2464 696e 6600 0000 1c64 ......$dinf....d
-
6097130: 7265 6600 0000 0000 0000 0100 0000 0c75 ref............u
- 6097140: 726c 2000 0000 01 rl ....
-
00 05be c06d 696e 66 -->minf的长度=0x5bec0,type=minf
-
00 0000 1476 6d68 64 -->vmhd的长度=0x14,type=vmhd
-
00 0000 01 -->version与flag
-
00 00 -->graphicsmode
-
00 0000 0000 00 -->opcolor
-
00 0000 2464 696e 66 -->dinf的长度=0x24,type=dinf
-
00 0000 1c64 7265 66 -->dref的长度=0x1c,type=dref
-
00 0000 00 -->version与flag
-
00 0000 01 -->entriy=1
-
00 0000 0c -->size=0xc
-
75 726c 20 -->type=url
- 00 0000 01 -->url的version与flag
-->stts
-
6097140: 00 05be 8073 7462 6c00 ....stbl.
-
6097150: 0000 9473 7473 6400 0000 0000 0000 0100 ...stsd.........
-
6097160: 0000 8461 7663 3100 0000 0000 0000 0100 ...avc1.........
-
6097170: 0000 0000 0000 0000 0000 0000 0000 0001 ................
-
6097180: d601 6000 4800 0000 4800 0000 0000 0000 ..`.H...H.......
-
6097190: 0100 0000 0000 0000 0000 0000 0000 0000 ................
-
60971a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
-
60971b0: 0000 18ff ff00 0000 2e61 7663 4301 4d40 .........avcC.M@
-
60971c0: 15ff e100 1767 4d40 159a 760f 05bc de02 .....gM@..v.....
-
60971d0: 2000 000b 6000 0221 81e2 c5a7 0100 0468 ...`..!.......h
-
60971e0: ea8c b200 020b a873 7474 7300 0000 0000 .......stts.....
-
60971f0: 0041 7300 0000 0100 0003 e900 0000 0100 .As.............
-
6097200: 000b bb ......
-
-
00 05be 8073 7462 6c -->stbl的长度=0x5be80,type=stbl
-
00 0000 9473 7473 64 -->stsd的长度=0x94,type=stsd
-
00 0000 00 -->stsd的version与flag
-
00 0000 01 -->stsd的entries
-
00 0000 84 -->size=0x84
-
61 7663 31 -->format=avc1 ::ffmpeg根据这个format寻找解码器::ffmpeg中st->codec->codec_tag及codec_id
-
00 0000 00 -->reserved
-
00 00 -->reserved
-
00 01 -->dref_id=0x01
-
00 00 -->version
-
00 00 -->version_level
-
00 0000 00 -->vendor
-
00 0000 00 -->temporal
-
00 0000 00 -->spatioal
-
01 d601 60 -->width=0x1d6=470,height=0x160=352 ::ffmpeg中st->codec->width与height
-
00 4800 00 -->72dpi
-
00 4800 00 -->72dpi
-
00 0000 00 -->reserved
-
00 01 -->frame_count=1
-
32个00 -->string
-
00 18 -->depth=0x0018 ::ffmpeg中st->codec->bits_per_coded_sample=0x18=24
- ff ff -->pre_defined=-1
-
avcC的读取是在函数mov_read_glbl中
00 0000 2e61 7663 43 -->avcC的长度=0x2e,type=avcC
01 4d40 15 -->将剩余的字节放进extradata中,调用的是:ff_get_extradata
00 020b a873 7474 73 -->stts的长度=0x20ba8,type=stts
00 0000 00 -->stts的version与flag
00 0041 73 -->entries=0x4173=16755 ::剩下的就是sample_count与sample_duration的entry
00 0000 01 -->sample_count=0x01 ::sample_count=1, sample_duration=1001
00 0003 e9 -->sample_duration=0x3e9
00 0000 01 -->sample_count=0x1 ::sample_count=1, sample_duration=3003
00 000b bb -->sample_duration=0xbbb
sample_count*sample_duration这样连加起来就是druation媒体文件的长度
mov_read_stts中有对duration的连加正好是32084052=0x1E99054,total_sam_c=20054
timescale=0x5dc2=24002
注意: audio trak中也有一个stts,但是audio中只有一个entry
mov_read_stsd
-->ff_mov_read_stsd_entries
a. 先读取format=0x31637661="avc1"
b. mov_code_id中查表ff_codec_movvideo_tags发现avc1对应AV_CODEC_ID_H264
c. 最后把AV_CODEC_ID_H264做为st->codec->codec_id
1.4mdia-->minf-->stbl-->stss
-
60b7d80: 00 0002 0473 ...............s
-
60b7d90: 7473 7300 0000 0000 0000 7d00 0000 0100 tss.......}.....
-
60b7da0: 0000 2100 0000 4000 0001 3600 0002 3000 ..!...@...6...0.
-
00 0002 0473 7473 -->stss的长度=0x204,type=stss
-
00 0000 00 -->stss的version与flag
-
00 0000 7d -->stss的entries=0x7d
-
00 0000 01 -->keyframes[0]=1
- 00 0000 21 -->keyframes[1]=0x21=33
1.4mdia-->minf-->stbl-->ctts
-
60b7f80: 00 .
-
60b7f90: 013d 4863 7474 7300 0000 0000 0027 a700 .=Hctts......'..
-
60b7fa0: 0000 0100 0003 e900 0000 0100 001f 4800 ..............H.
-
60b7fb0: 0000 0300 0000 0000 0000 0100 0017 7600 ..............v.
-
00 013d 4863 7474 73 -->ctts的长度=0x204,type=ctts
-
00 0000 00 -->ctts的version与flag
-
00 0027 a7 -->ctts的entries=0x27a7=10151 ::一共10151个
-
00 0000 01 -->count=0x01
-
00 0003 e9 -->duration=0x3e9
-
00 0000 01 -->count=0x1
- 00 001f 48 -->duration=0x1f48
- ....
-
60cbcd0: 00 0000 1c73 7473 6300 ....stsc.
-
60cbce0: 0000 0000 0000 0100 0000 0100 0000 0100 ................
-
60cbcf0: 0000 0100 0139 6c73 7473 7a00 0000 0000 .....9lstsz.....
-
60cbd00: 0000 0000 004e 5600 0013 3300 000f 6f00 .....NV...3...o.
-
60cbd10: 0009 9100 0009 ab00 0008 e400 0015 0200 ................
-
60cbd20: 0007 af00 000a a800 0008 8000 001d 2000 .............. .
-
00 0000 1c73 7473 63 -->stsc的长度=0x1c,type=stsc
-
00 0000 00 -->stsc的version与flag
-
00 0000 01 -->stsc的entries=0x01
-
00 0000 01 -->first=0x01
-
00 0000 01 -->count=0x01
-
00 0000 01 -->id=0x01
-
00 0139 6c73 7473 7a -->stsz的长度=0x1396c,type=stsz
-
00 0000 00 -->stsz的version与flag
-
00 0000 00 -->stsc的sample_size=0x0
- 00 004e 56 -->stsc的sample_count=0x4e56=20054
- 00 0013 33 -->sample_sizes[0]=0x1333
-
00 000f 6f -->sample_sizes[1]=0xf6f
- ...
例如:sample_sizes[0]=0x1333,即视频的第0个sample的长度=0x1333(byte)
1.4 mdia-->minf-->stbl-->stco
-
60df650: 00 .
-
60df660: 0139 6873 7463 6f00 0000 0000 004e 5600 .9hstco......NV.
-
60df670: 0000 3000 0013 7d00 0025 3c00 0031 4300 ..0...}..%<..1C.
- 00 0139 6873 7463 6f -->stco的长度=0x13968,type=stco
-
00 0000 00 -->stco的version与flag
- 00 004e 56 -->stco的entries=0x4e56
- 00 0000 30 -->chunk_offsets[0]=0x30
- 00 0013 7d -->chunk_offsets[1]=0x137d
- ....
这儿是video的stco,里面的内容是chunk_offsets,即每个视频sample在文件中的偏移
例如:chunk_offsets[0]=0x30,长度通过stsz中的sample_sizes[0]=0x1333确定。
也就是说从san.mp4这个文件的0x30处读取0x1333个字节的数据,就是视频的第0个sample的数据