mp4(mov.c)
ffmpeg对应ff_mov_demuxer - "mov,mp4,m4a,3gp,3g2,mj2"
mp4文件由一系列box组成,box 结构如下:
box 脉络 (蓝色 - containter box, * - full box)
ftyp | stsd | ||||
mdat | stts | ||||
stss | |||||
mdhd | stsz | ||||
tkhd | hdlr | stsc | |||
mvhd | mdia | minf | stbl | stco | |
moov | trak | edts | elst * |
box 详情
ftyp - size:32 type:ftyp; (isom - iso base media file)
major_brand:isom - 4字节编码表示格式,"qt ",mp41,mp42等
minor_version:512 - 表示major_brand 的版本号说明信息;
compatible_brands: isomiso2avc1mp41,具体如下:
00000000: 0000 0020 6674 7970 6973 6f6d 0000 0200 ... ftypisom....
00000010: 6973 6f6d 6973 6f32 6176 6331 6d70 3431 isomiso2avc1mp41
stsd - full box, data=entry个数(4字节)+多个entry实体;
avcC box(通常size为49=6+2+34+1+2+4,ffmpeg内没有具体解析,nalu大小一般占两个字节,实际(lengthSizeMinusOne & 3)+1)
configurationVersion(8) AVCProfileIndication(8) profile_compatibility(8) AVCLevelIndication(8)
reserved(6 ‘111111’b) lengthSizeMinusOne(2) reserved(3 ‘111’b) numOfSequenceParameterSets(低5位)
spsSize(大端存放) sps numOfPictureParameterSets(8) ppsSize(大端存放) pps
avcC格式打包的h264是用1、2或4字节NALU长度分割NALU单元,区别AnnexB起始码分割。
stss - full box - entry_count表示多少个关键帧,numberX表示关键帧序号
size type(0x73747373) + version(1) flags(3) entry_count(4) number1(4) number2(4) ...
stsz - full box - sample_size表示采样大小,用于大小一致的音频,否则为0,sample_count表示表示多少个采样,entry_sizeX表示采样的大小
size type(0x7374737A) + version(1) flags(3) sample_size(4) sample_count(4) entry_size1(4) entry_size2(4)...
ts(mpegts.c)
ffmpeg对应ff_mpegts_demuxer - "mpegts"
PSI 是节目特定信息,包括节目关联表(PAT,Program Association Table)、节目映射表(PMT,Program Map Table)、条件接收表(CAT)、网络信息表(NIT)
m3u8(hls.c)
ffmpeg对应ff_hls_demuxer - "hls"
#EXTM3U // 开始
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:YES
#EXT-X-TARGETDURATION:16
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-KEY:METHOD=AES-128,URI="",IV=0x00000000000000000000000000000000
#EXTINF:11.000000,
news-0.ts
#EXT-X-STREAM-INF:BANDWIDTH=150000,RESOLUTION=416x234,CODECS=“avc1.42e00a,mp4a.40.2”
http://example.com/low/index.m3u8
#EXT-X-ENDLIST // 结束
flv
flv header:F(1byte)+L(1byte)+V(1byte)+Version(1byte通常为1)+(5bit为0+1bit音频存在+1bit为0+1bit视频存在)+文件大小(4byte)
flv body:多个pre tagsize + tag 单元(tag header+tag body)
tag header:
tag类型 | 1byte | 8:audio,9:video,18:script data |
数据区大小 | 3byte | |
时间戳 | 3byte | |
时间扩展字段 | 1byte | |
StreamID | 3byte |
tag body:
meta data tag
audio data tag
video data Tag
dav(dhav.c)
DAHUA或者DHAV0xfd(0x44\0x48\0x41\0x56\0xfd)开始
最后dhav(0x64\0x68\0x61\0x76\0xfd),结尾偏移长度(小端)