MP4(MPEG-4 Part 14)是一种常见的多媒体容器格局,它是在“ISO/IEC 14496-14”标准文件中定义的,属于MPEG-4的一项目组,是“ISO/IEC 14496-12(MPEG-4 Part 12 ISO base media file format)”标准中所定义的媒体格局的一种实现,后者定义了一种通用的媒体文件布局标准。MP4是一种描述较为周全的容器格局,被认为可以在此中嵌入任何情势的数据,各类编码的视频、音频等都不在话下,不过我们常见的大项目组的MP4文件存放的 AVC(H.264)MPEG-4(Part 2)编码的视频和 AAC编码的音频。MP4格局的官方文件后缀名是“.mp4”,还有其他的以mp4为根蒂根基进行的扩大或者是缩水版本的格局,包含: M4V,   3GPF4V等。

  mp4是由一个个“box”构成的,大box中存放小box,一级嵌套一级来存放媒体信息。box的根蒂根基布局是:


  


  此中,size指了然全部box所占用的大小,包含header项目组。若是box很大(例如存放具体视频数据的mdat box),跨越了uint32的最大数值,size就被设置为1,并用接下来的8位uint64来存放大小。


  一个mp4文件有可能包含很是多的box,在很大程度上增长懂得析的错杂性,这个网页上http://mp4ra.org/atoms.html记录了一些当前注册过的box类型。看到这么多box,若是要全部支撑,一个个解析,怕是头都要爆了。还好,大项目组mp4文件没有那么多的box类型,下图就是一个简化了的,常见的mp4文件布局:


  


  一般来说,解析媒体文件,最关怀的项目组是视频文件的宽高、时长、码率、编码格局、帧列表、关键帧列表,以及所对应的时戳和在文件中的地位,这些信息,在mp4中,是以特定的算法分隔存放在stbl box部属的几个box中的,须要解析stbl下面所有的box,来还原媒体信息。下表是对于以上几个首要的box存放信息的申明:



  看吧,要获取到mp4文件的帧列表,还挺不轻易的,须要一层层解析,然后综合stts stsc stsz stss stco等这几个box的信息,才干还原出帧列表,每一帧的时戳和偏移量。并且,你要赐顾帮衬可能呈现或者可能不呈现的那些box。。。可以看的出来,mp4把帧sample进行了分组,也就是chunk,须要间接的经由过程chunk来描述帧,如许做的来由是可以紧缩存储空间,缩小媒体信息所占用的文件大小。这里面,stsc box的解析相对来说斗劲错杂,它用了一种奇妙的体式格式来申明sample和chunk的映射关系,希罕介绍一下。



  这是stsc box的布局,前几项的意义就不说了然,可以看到stsc box里每个entry布局体都存有三项数据,它们的意思是:“从first_chunk这个chunk序号开端,每个chunk都有samples_per_chunk个数的sample,并且每个sample都可以经由过程sample_description_index这个索引,在stsd box中找到描述信息”。也就是说,每个entry布局体描述的是一组chunk,它们有雷同的特点,那就是每个chunk包含samples_per_chunk个sample,好,那你要问,这组雷同特点的chunk有几许个?请经由过程下一个entry布局体来推算,用下一个entry的first_chunk减去本次的first_chunk,就获得了这组chunk的个数。最后一个entry布局体则注解从该first_chunk到最后一个chunk,每个chunk都有sampls_per_chunk个sample。很拗口吧,不过,就是这个意思:)。因为这种算法无法得知文件所有chunk的个数,所以你必须借助于stco或co64。直接上代码可能会清楚些:


  1. 起首直接解析entry



  2. 然后,经由过程stco或co64获知chunk总个数之后,开端还原映射表



  读出stsc之后,就可以综合stbl下的所有box,推算出视频和音频帧列表,时戳和偏移量等数据。下面截图显现获取到的关键帧列表:


     


  

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐