mp4文件格式之fragment mp4 简称为FMP4 与常见mp4有区别
ffmpeg -formats
DE mp3 MP3 (MPEG audio layer 3)
E mp4 MP4 (MPEG-4 Part 14) //mp4中的视频封装有多种,解封装应该交给具体的demux,例如h264、mpeg4等demux👉没有D???
ffmpeg -h demuxer=mp4 查看 MP4 文件的 Demuxer 信息:
Demuxer mov,mp4,m4a,3gp,3g2,mj2 (QuickTime I MOV):
Common extensions: mov,mp4,m钮, 3gp, 3g2 ,mj2.
可以 看到 MP4 的 Demuxer 与mov 、 3gp 、 m4 a 、 3g2 、 mj2 的 Demuxer 相同
1、 MP4基本单元box(又称atom)
box = box_header + box_data
box_header{
UINT32 size; //包括 box header 和 box body 整个 box 的大小,这样我 们就可以在文件中定位各个 box。
==1👉box长度需要更多位才能表示👉用64位的largesize表示
==0👉这是文件最后一个box(不再需要以size定位)
UINT32 type; //一般是 4 个字符,如“ftyp”、“moov”等,这 些 box type 都是已经预定义好的,分别表示固定的意义。
=uuid👉用户自定义扩展类型的box
UINT64 largesize; if(size==1) //如果box很大超过了uint32的最大数值,size就被设置为1,并用接下来的 largesize来存放大小。
}
fullbox
是Box的扩展,Box结构的基础上在Header中增加8bits version和24bits flags
box_data{
情况A、实际数据
情况B、包含更多子box(此时这个box又称为Container容器) 即box可以嵌套
}
box(又称atom)格式:
ftyp file type and compatibility
moov container for all the metadata
mvhd movie header, overall declarations
trak container for an individual track or stream
tkhd track header, overall information about the track
tref track reference container
mdia container for the media information in a track
mdhd media header, overall information about the media
hdlr handler, declares the media (handler) type
minf media information container
vmhd video media header, overall information (video track only)
… sound/hint/Null media header
dinf data information box, container
dref data reference box, declares source(s) of media data in track
stbl sample table box, container for the time/space map
stsd sample descriptions (codec types, initialization etc.)
stts (decoding) time-to-sample
stsc sample-to-chunk, partial data-offset information
stco chunk offset, partial data-offset information
moof movie fragment
…
mdat media data container
2、mp4中的容器
MP4文件的3个顶级atom(不能被其他atom嵌套):
1、ftyp:标示了MP4文件,必须出现在第一个。
2、moov:保存了视频的基本信息
3、mdat:保存视频和音频数据
moov和人mdat的相对前后没有强制要求
1、在互联网视频中,若希望mp4文件被快速打开👉moov放在mdat前;
2、若需要将mp4文件下载完成后才可以进行播放👉moov放在后面;
3、分摄像设备生成的MP4文件中,moov在mdat之前,两者之间可能还存在一个Atom free,即moov-free-mdat。free中为全0,只是用于占位。
mp4中的一些重要容器:
0 FREE
free是可选的,如果存在,则通常出现在moov与mdat之间,即moov-free-mdat。
free中的数据通常为全0,其作用相当于占位符,在实时拍摄视频,moov数据增多时分配给moov使用。
因为设备录制视频时并不能预先知道视频数据大小,如果moov在mdat之前,随着拍摄mdat的数据会增加,moov数据也会增多,如果没有free预留的空间,则要不停的向后移动mdat数据以腾出moov空间。
1 ftyp—File Type Box
{
32位size 一般为一个固定值
32位type = “0x66 74 79 70 = ftyp”
32 位的 major brand(4 个字符) 例如“0x6D 70 34 32 = mp42”
32 位的 minor version