MP4文件格式的解析,以及MP4文件的分割算法

📅 2026/7/5 4:38:04
MP4文件格式的解析,以及MP4文件的分割算法
mp4应该算是一种比较复杂的媒体格式了起源于QuickTime。以前研究的时候就花了一番的功夫尤其是如何把它完美的融入到视频点播应用中更是费尽了心思主要问题是处理mp4文件庞大的“媒体头”。当然流媒体点播也可以采用flv格式来做flv也可以封装H.264视频数据的不过Adobe却不推荐这么做人家说毕竟mp4才是H.264最佳的存储格式嘛。这几天整理并重构了一下mp4文件的解析程序融合了分解与合并的程序以前是c语言写的应用在linux上运行的服务器程序上现在改成c方便我在其他项目中使用它至于用不用移植一份c#的暂时用不到等有必要了再说吧。这篇文章先简单介绍一下mp4文件的大体结构以及它的分割算法之后再写文章介绍如何把mp4完美应用在点播项目中。一、MP4格式分析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,3GP,F4V等。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. 首先直接分析entry2. 然后通过stco或co64获知chunk总个数之后开始还原映射表读出stsc之后就可以综合stbl下的所有box推算出视频和音频帧列表时戳和偏移量等数据。下面截图展示获取到的关键帧列表有了关键帧列表之后就可以继续我们一下个题目就是mp4文件的分割。实现mp4的分割是把mp4应用到点播系统中最关键的技术环节做不到这个就无法实现点播播放mp4影片的“拖动”。二、MP4文件的分割算法所谓“分割”就是把大文件切成小文件要实现mp4的分割首先需要获取到关键帧列表然后选择要分割的时间段比如从关键帧开始