当前位置: 首页 > java >正文

剥开 MP4 的 千层 “数字洋葱”:从外到内拆解通用媒体容器的核心

在当今数字化时代,MP4 格式随处可见,无论是在线视频、手机拍摄的短片,还是从各种渠道获取的音频视频文件,MP4 都占据着主流地位。它就像一个万能的 “数字媒体集装箱”,高效地整合和传输着各种视听内容。接下来,让我们深入探索 MP4 封装格式的奇妙世界。

一、MP4 封装格式初印象

MP4,全称为 MPEG-4 Part 14,出⾃MPEG-4标准第14部分,是一种基于 MPEG-4 标准的多媒体容器格式。简单来说,它是一种用于存储音频、视频、字幕和图像等多种媒体数据的文件格式。就好比一个大行李箱,能把不同的物品(各类媒体数据)有条不紊地装在一起,方便携带和使用。MP4 格式具有很强的适应性,能在多种设备上播放,从电脑、手机到智能电视,都对它 “友好相待”,这也是它广受欢迎的重要原因之一。

二、MP4 的核心结构解析

MP4 文件的结构就像一座精心建造的大厦,由多个重要部分组成,其中最关键的是 “Box”(盒子)。可以把 MP4 文件想象成一个装满盒子的大仓库,每个盒子都有特定的用途和规则。每个box分为Header和Data。其中Header部分包含了box的类型和⼤⼩,Data包含子box或者数据,box可以嵌套⼦box。

(一)File Type Box(ftyp)

FileType Box 就像是 MP4 文件的 “身份证”,它存储了文件的基本信息,如使用的 MPEG-4 规范版本、兼容的品牌等。这个盒子是 MP4 文件的起始部分,不可或缺。通过它,播放器能快速识别文件是否符合 MP4 格式规范,以及该文件与哪些设备或软件兼容。例如,当你在不同设备上播放同一个 MP4 视频时,设备首先会读取 ftyp 盒子里的信息,判断能否顺利播放该视频。

(二)Media Data Box(mdat)

Media Data Box 是真正存放音频和视频数据的 “宝库”。如果把 MP4 文件比作一个装满宝藏的箱子,mdat 盒子就是里面最珍贵的宝物。它包含了经过编码压缩后的视频帧和音频样本,是我们最终看到的画面和听到的声音的来源。不同的编码格式,如 H.264、H.265 用于视频,AAC 用于音频,它们的数据都被存储在这个盒子里。

(三)Movie Box(moov)

Movie Box 是 MP4 文件的核心 “大脑”,它包含了描述整个视频和音频内容的元数据,包含本⽂件中所有媒体数据的宏观描述信息以及每路媒体轨道的具体信息。这就好比是一份详细的项目计划书,涵盖了视频的时长、帧率、分辨率、音频的采样率、声道数等关键信息。此外,moov 盒子还包含了时间和空间上如何同步音视频数据的信息,确保我们在观看视频时,声音和画面能够完美匹配,不会出现声画不同步的情况。我们下文所进一步讲解的都是moov中的子box。

三、moov 的 “五脏六腑”

moov 容器并非是一个混沌的整体,而是由多个有序的子结构(子原子)组成,这些子结构各司其职,共同构建起视频播放的 “指挥中心”。

(一)mvhd:视频的 “总导演”

mvhd(Movie Header Box)是 moov 容器中的 “总导演”,它掌控着整个视频文件的全局信息。在 mvhd 中,我们能找到视频的创建时间、修改时间、时间尺度(time scale)等关键参数。

时间尺度是一个非常重要的概念,它定义了时间的基本单位。例如,时间尺度为 90000,表示每一秒被划分为 90000 个时间单位。结合这个参数,播放器就能精确计算出每一帧画面应该在何时播放,从而实现视频的流畅播放。此外,mvhd 还包含了视频的时长信息,它以时间尺度为基础,告诉播放器这段视频总共持续多少个时间单位。

mvhd(Movie Header Box)作为 moov 的首个子结构,其内部结构如下:

  • 版本与标志位

    • 版本(version):占 4 字节,指示 mvhd 结构的版本(通常为 0 或 1)。若版本为 1,部分时间戳字段将扩展为 64 位。

    • 标志位(flags):占 3 字节,用于标识特殊属性。例如,标志位 0x000100 表示该视频支持预览播放。

  • 创建时间(creation_time):占 4 字节(或 64 位,版本为 1 时),记录文件创建的时间戳,以秒为单位(需结合 time_scale 换算实际时间)。

  • 修改时间(modification_time):与创建时间类似,记录文件最后一次修改的时间。

  • 时间尺度(time_scale):占 4 字节,定义时间的基本单位。如 time_scale 为 30,表示 1 秒被划分为 30 个时间单位,常用于计算帧率(若帧率为 30fps,每帧持续 1 个时间单位)。

  • 持续时间(duration):占 4 字节(或 64 位),表示视频总时长,以 time_scale 为基准单位。

  • 速率(rate):占 4 字节,默认为 1.0(正常播放速度),0.5 表示慢放,2.0 表示快进。

  • 音量(volume):占 2 字节,范围 0 - 256(0 为静音,256 为最大音量)。

(二)trak:音视频的 “轨道指挥官”

trak(Track Box)就像是铁路系统中的轨道指挥官,在 MP4 文件中,每一个 trak 对应一条音视频轨道。一个 MP4 文件通常包含至少一条视频轨道和一条音频轨道,也可能包含多条音频轨道(如多语言配音)或字幕轨道。

每个 trak 内部又包含了多个子原子,其中最重要的是 tkhd(Track Header Box)和 mdia(Media Box)。tkhd 记录了轨道的基本属性,如轨道的 ID、轨道在视频中的位置、轨道的宽度和高度(对于视频轨道)等信息。而 mdia 则进一步细化,它描述了轨道的数据格式和编码信息。

每个 trak关键子结构如下:

1. tkhd:轨道属性的 “基础档案”

  • 版本与标志位:与 mvhd 类似,定义结构版本和轨道特殊属性(如是否为隐藏轨道)。

  • 创建 / 修改时间:记录轨道创建和修改的时间戳。

  • 轨道 ID(track_ID):占 4 字节,唯一标识当前轨道(如 1 代表视频轨道,2 代表音频轨道)。

  • 图层(layer):占 2 字节,用于多层轨道叠加时的层级顺序(数值越小越靠前)。

  • 宽度与高度:对于视频轨道,存储画面的像素宽度和高度;音频轨道则为 0。

2. mdia:媒体数据的 “格式说明书”

mdia(Media Box)如同音视频的 “格式说明书”,它包含了 minf(Media Information Box)和 mdhd(Media Header Box)等子box。mdhd 主要记录与媒体相关的时间信息,比如媒体的创建时间、修改时间等。

minf 则更加关键,它详细描述了媒体数据的格式。以视频轨道为例,minf 中的 vmhd(Video Media Header Box)会说明视频的图形模式、不透明度等属性;而 dinf(Data Information Box)则指向实际存储视频数据的位置,它包含了 stbl(Sample Table Box),stbl 是一个非常核心的子结构,它记录了每一个视频帧(样本)在文件中的偏移位置、样本的时长、样本的大小等信息。播放器正是通过这些信息,能够精准地定位到每一帧视频数据,进行解码和播放。

对于音频轨道,minf 中的音频相关子原子会说明音频的采样率、声道数、样本格式等信息,同样通过 stbl 来定位音频样本在文件中的位置,确保音频能够准确播放。

mdia(Media Box)进一步拆解为多个子结构:

  • mdhd:媒体时间信息:记录媒体的创建 / 修改时间、时间尺度(可能与 mvhd 不同,用于单独控制轨道时间,要注意Time scale,我们在计算时间戳的时候都要使⽤该Time scale,对应我们流⾥⾯的AVStream->time_base)。

  • minf:媒体格式核心

    • vmhd(视频媒体头):存在于视频轨道中,包含图形模式(如 YUV 4:2:0)、不透明度等属性。

    • smhd(音频媒体头):存在于音频轨道中,定义音频混合模式、声道布局等。

    • stbl(Sample Table Box):stbl包含了媒体流每⼀个sample在⽂件中的offset,pts,duration等信息。想要播放⼀个mp4⽂件,必须根据stbl正确找到每个sample并送给解码器。详细见下文。

    • dinf(数据信息)

  • hdlr(Handler Reference Box):媒体的播放过程信息。

3. stbl:样本索引的 “精密地图”

stbl 是 trak 中最复杂的部分,它如同一个精密的导航系统,记录每个音视频样本的位置和属性:

  • stsd(Sample Description Box):存储样本的格式信息,如视频的编码格式(H.264)、音频的采样率和位深度。对于 H.264 视频,⾥⾯包含了avc1,avc1⾥⾯⼜包含了avcC,avc1包含了视频Width、Height;avcC:包含了视频编码器相关的信息,包括sps、pps等信息。对于音频,包含采样率和位深度,通道数等。

  • stts(Time to Sample Box):建立时间戳与样本的映射关系。例如,若某段视频前 10 帧每帧持续 1 个时间单位,接下来 5 帧每帧持续 2 个时间单位,stts 会记录这些变化。Time-To-Sample的table entry布局如下:

sample count:sample个数,sample duration:sample持续时间,持续时间相同的连续sample可以放到⼀个entry⾥达到节省空间的⽬的。

  • stsc(Sample to Chunk Box):将样本分组为 “数据块(Chunk)”,每个 Chunk 包含多个样本。这有助于播放器批量读取数据,提升效率。

 其table entry布局如下图所示:

First chunk:使⽤该表项的第⼀个chunk序号,Samples per chunk:使⽤该表项的chunk中包含有⼏个sample ,Sample description ID:使⽤该表项的chunk参考的stsd表项序号

  • stsz(Sample Size Box):记录每个样本的大小(字节数),方便播放器计算数据读取长度。

  • stss(Sync Sample Box) :同步sample表,存放关键帧列表,关键帧是为了⽀持随机访问。

  • stco(Chunk Offset Box):存储每个 Chunk 在文件中的偏移位置,是播放器定位数据的核心索引。若采用 64 位偏移(co64 子结构),则可支持超大文件。需要注意,这⾥stco只是指定的每个chunk在⽂件中的偏移位置,并没有给出每个sample在⽂件中的偏移。想要获得每个sample的偏移位置,需要结合 Sample Size box(stsz)和Sample-To-Chunk(stsc) 计算后取得。

上⽂提到通过stco并不能直接获取某个sample的偏移位置,下⾯举例说明如何获取某⼀个pts对应的sample在⽂件中的位置。

1.将pts转换到媒体对应的时间坐标系

2.根据stts计算某个pts对应的sample序号

3.根据stsc计算sample序号存放在哪个chunk中

4.根据stco获取对应chunk在⽂件中的偏移位置

5.根据stsz获取sample在chunk内的偏移位置并加上第4步获取的偏移,计算出sample在⽂件中的偏移

(三)udta内的meta:元数据的 “百宝箱”

meta(Metadata Box)是 moov 容器中的 “百宝箱”,它存储着一些额外的元数据信息,比如视频的版权信息、作者信息、章节信息等。虽然这些信息对于视频的基础播放不是必需的,但它们能为视频增加更多的附加值。

例如,一些视频文件的 meta 中会包含章节信息,这样用户在播放视频时,就能方便地在不同章节之间跳转;版权信息则能明确视频的归属权,保护创作者的权益。

  • ilst(iTunes 元数据):包含标题、艺术家、专辑等信息,常用于音乐视频。
  • hdlr(Handler Reference Box):指定轨道的处理方式(如 “vide” 表示视频轨道,“soun” 表示音频轨道)。

四、MP4 封装格式的优势

(一)良好的兼容性

MP4 格式具有广泛的兼容性,几乎所有的媒体播放器和移动设备都支持它。无论是在 Windows 系统的电脑上用 Windows Media Player 播放,还是在 iPhone 上用自带的视频播放器观看,MP4 文件都能轻松应对。这得益于它的标准化设计,使得各种设备和软件都能按照统一的规则解析和播放 MP4 文件,大大方便了用户在不同设备间分享和播放视频。

(二)高效的压缩与存储

MP4 格式支持多种先进的编码标准,如 H.264、H.265 视频编码和 AAC 音频编码。这些编码标准就像优秀的压缩大师,能在保证视频和音频质量的前提下,大幅减小文件的大小。比如,一部原本体积较大的高清电影,经过 H.264 编码封装成 MP4 格式后,文件大小可能会缩小到原来的几分之一,同时画面质量依然能保持较高水准,既节省了存储空间,又便于在网络上传输。

(三)丰富的媒体支持

MP4 不仅能存储视频和音频数据,还能包含字幕、章节信息、3D 信息等多种媒体元素。以在线学习视频为例,MP4 文件可以同时嵌入视频讲解、老师的声音、课程字幕,甚至还能设置章节标记,方便学习者快速定位到特定的知识点。这种丰富的媒体支持特性,让 MP4 成为一种功能强大的多媒体存储格式。

五、MP4 在实际中的应用场景

(一)在线视频平台

如今,几乎所有的主流在线视频平台,如腾讯视频、爱奇艺、YouTube 等,都将 MP4 作为主要的视频存储和播放格式。这是因为 MP4 格式在兼容性、压缩效率和媒体支持方面的优势,能满足平台对大量视频内容存储、传输和播放的需求。用户在这些平台上观看视频时,流畅的播放体验、清晰的画质和准确的声音,都离不开 MP4 格式的功劳。

(二)移动设备

我们日常使用手机拍摄的照片和视频,很多默认保存为 MP4 格式。这是因为 MP4 格式在移动设备上具有良好的兼容性和高效的存储特性。一方面,MP4 文件较小的体积能节省手机的存储空间;另一方面,无论在手机自带的相册中播放,还是分享到社交媒体上,MP4 格式都能确保视频顺利播放,让我们可以轻松记录和分享生活中的精彩瞬间。

(三)数字媒体创作

在影视制作、动画设计等数字媒体创作领域,MP4 也是常用的格式之一。制作人员可以将各种特效、音频、视频片段等整合封装成 MP4 文件,方便在不同的软件和设备上进行后期编辑、预览和展示。例如,动画工作室在制作动画短片时,各个环节生成的中间文件可能会以 MP4 格式保存,便于团队成员之间共享和协作。

六、MP4 格式的未来展望

随着技术的不断发展,MP4 格式也在持续演进。未来,它将更好地适应高清、超高清视频以及虚拟现实(VR)、增强现实(AR)等新兴媒体技术的需求。例如,在 8K 超高清视频时代,MP4 格式通过与更先进的编码技术结合,能更高效地存储和传输海量的视频数据。同时,在 VR 和 AR 领域,MP4 格式也在不断拓展,以支持 360 度全景视频、多声道音频等特殊媒体元素的封装和播放,为用户带来更加沉浸式的体验。

MP4 封装格式作为数字媒体领域的重要组成部分,凭借其独特的结构和诸多优势,在各个方面都发挥着重要作用。希望通过本文的介绍,你能对 MP4 封装格式有更深入的理解,在日常生活和工作中更好地运用它。

http://www.xdnf.cn/news/4020.html

相关文章:

  • Vue3从入门到精通
  • GJOI 4.29 题解
  • 利用 Python pyttsx3实现文字转语音(TTS)
  • 9.进程控制(上)
  • linux 历史记录命令
  • Python爬虫(18)反爬攻防战:动态IP池构建与代理IP实战指南(突破95%反爬封禁率)
  • 全局过滤器与局部过滤器: Vue中的文本格式化工具
  • Python中的JSON库,详细介绍与代码示例
  • STC单片机与淘晶驰串口屏通讯例程之01【新建HDMI工程】
  • 计算机视觉与深度学习 | 图像匹配算法综述
  • Spring Boot 加载application.properties或application.yml配置文件的位置顺序。
  • Qwen3 性价比新王 Qwen3-30B-A3B 本地私有化部署,可灵活切换思考模式
  • 信息系统项目管理师-软考高级(软考高项)​​​​​​​​​​​2025最新(九)
  • Qml组件之AnimatedImage
  • 牛客1018逆序数-归并排序
  • 从入门到登峰-嵌入式Tracker定位算法全景之旅 Part 5 |地图匹配与轻量 SLAM:HMM/Viterbi 与简化图优化
  • 【PaaS与AI融合】MLOps平台的架构设计
  • DHCP服务器配置
  • PHP的现代复兴:从脚本语言到企业级服务端引擎的演进之路-优雅草卓伊凡
  • HTTP协议
  • 如何判断node节点是否启用cgroup?
  • 深入浅出数据库规范化的三大范式
  • 网络传输中字节序
  • 线程局部存储----TLS
  • seaborn
  • suna工具调用可视化界面实现原理分析(二)
  • 黑马点评day02(缓存)
  • 五一の自言自语 2025/5/5
  • 基于python的哈希查表搜索特定文件
  • 【C/C++】各种概念联系及辨析