代码改变世界

FFMpeg笔记(十二)MP4 box解析

2023-05-27 12:38  jiayayao  阅读(1122)  评论(0编辑  收藏  举报

    mp4是MPEG-4 Part 14的实现,包含3大box。

一、ftyp

file type box,包含视频文件使用的mp4标准,也作为probe mp4的标志;

二、moov

包含媒体的元数据信息,包含一个mvhd(也就是header box)和若干个trak(track)。trak包含一条音/视频轨道信息和音视频数据的编码格式、音视频数据样本、chunks的大小,存储位置,PTS等。

1、mvhd

movie header box,包含duration和timescale,duration是媒体时长,timescale是单位为秒的媒体时长,可以理解为每秒经历的时间刻度。

2、tkhd

track header box,如果是视频track,会包含宽高信息;

三、mdat

media data box,moov box记录的每帧音视频数据位置信息,实际都存储在mdat box中,通过解析moov box可以获取到每帧音视频数据具体位置,方便播放器进行seek操作。

四、表格总结

Box        含义 备注 
ftyp       file type box  作为probe标识 
moov          
  mvhd     movie header  duration和timescale 
  meta        
  trak     track  每读到一个track,新增一个AVStream 
    tkhd   track header  视频宽高 
    tref      
    trgr      
    edts      
      elst    
    meta      
    mdia      
      mdhd    
      hdlr   指定流类型
     ......      
     stbl    sample table box  
       stsd  sample descriptions  采样描述容器:包含codec type,extradata(即SPS、PPS)
      stts (decoding)time-to-sample

stts stss ctts三个box用于保存媒体数据和时间戳的对应关系。

采样时间容器:stts可以计算每个sample的dts

      ctts

(composition) time to sample 

pts
      stsc

sample-to-chunk, patial data-offset

infomation

stsc stsz stco三个box用于保存每帧视频或音频数据在文件中的保存位置。
       stsz sample sizes   样本大小
      stss

sync sample table

采样时间容器:存放了关键字的序号(I帧),seek时需从关键帧开始解码。
       stco  chunk offset  chunk偏移容器
mdat          

五、fmp4与mp4的区别

    fmp4是MPEG-4 Part 12标准的扩展。与传统mp4不同,fmp4格式将媒体文件分成若干片段(fragment),每个片段都是一个完整的mp4文件(不同于CMAF,需要init文件进行保存流格式信息)。fmp4不需要moov box来进行initialization,fmp4的moov box只包含一些track信息,其音视频的metadata信息与数据都存在一个个moof、mdat中。

    可以使用FFmpeg 命令生成fmp4 文件,其中frag_keyframe表示要根据关键帧将输出文件分成多个片段,empty_moov表示要在文件的开头添加一个空的moov原子,以便在播放器加载文件时更快地解析它。

ffmpeg -i input.mp4 -movflags frag_keyframe+empty_moov output.mp4