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

news2025/5/9 15:37:40

在当今数字化时代,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.coloradmin.cn/o/2371585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从彼得·蒂尔四象限看 Crypto「情绪变迁」:从密码朋克转向「标准化追求者」

作者:Techub 精选编译 撰文:Matti,Zee Prime Capital 编译:Yangz,Techub News 我又带着一篇受彼得蒂尔(Peter Thiel)启发的思想杂烩回来了。作为自封的「蒂尔学派」信徒,我常透过他…

Java线程安全问题深度解析与解决方案

一、线程安全问题的本质 并发编程的核心挑战:当多个线程同时访问共享资源时,由于操作系统的抢占式调度特性,可能导致不可预期的结果。这种因非原子操作和竞态条件引发的数据不一致问题,称为线程安全问题。 二、经典线程安全问题案…

Mybatis解决以某个字段存在,批量更新,不存在批量插入(高效)(一)

背景 在开发企业级应用时,我们经常需要处理批量数据的插入和更新操作。传统的逐条处理方式性能低下,而简单的REPLACE INTO或INSERT ... ON DUPLICATE KEY UPDATE在某些场景下又不够灵活。本文将介绍一种基于临时表的高效批量插入/更新方案,解…

【时时三省】(C语言基础)怎样定义和引用二维数组

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 有的问题需要用二维数组来处理。例如,有3个小分队,每队有6名队员,要把这些队员的工资用数组保存起来以备查。这就需要用到二维数组,如下图&…

杨校老师竞赛课之C++备战蓝桥杯初级组省赛

目录 1. 灯塔 题目描述 输入描述 输出描述 输入样例1 输出样例1 输入样例2 输出样例2 数据说明 2. 子区间 题目描述 输入描述 输出描述 输入样例 输出样例 数据说明 3. 染色 题目描述 输入描述 输出描述 输入样例1 输出样例1 输入样例2 输出样例2 数据…

Matlab 基于Hough变换的人眼虹膜定位方法

1、内容简介 Matlab220-基于Hough变换的人眼虹膜定位方法 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

vfrom表单设计器使用事件机制控制字段显示隐藏

1. 使用表单设计器进行debug调试 依据 vform3.0开发者文档 https://www.ganweicloud.com/docs/6.1.0/pages/d3e6d9/ 对switch组件设置事件逻辑 调试中

【Redis篇】linux 7.6安装单机Redis7.0(参数优化详解)

💫《博主主页》: 🔎 CSDN主页 🔎 IF Club社区主页 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了…

信号的概念及产生

信号的概念 信号(signal)是一种软件中断机制,用于通知进程发生了特定的事件。信号可以由系统、其他进程或进程自身发送。 在现实生活中,也有许多的信号,比如说:红绿灯、闹钟、上课铃、父母喊你回家吃饭等等…

巧用python之--模仿PLC(PLC模拟器)

工作中用到了VM(VisionMaster4.3)有时候需要和PLC打交道,但是PLC毕竟是别人的,不方便修改别人的程序,这时候需要一个灵活的PLC模拟器是多么好呀! 先说背景: PLC型号 汇川Easy521: Modbus TCP 192.168.1.10:502 在汇川Easy521中Modbus保持寄存器D寄存器 ,在modbus协议中 0-4区…

【计算机网络】用户从输入网址到网页显示,期间发生了什么?

1.URL解析 浏览器分解URL:https://www.example.com/page 协议:https域名:www.example.com路径:/page 2.DNS查询: 浏览器向DNS服务器发送查询请求,将域名解析为对应的IP地址。 3.CDN检查(如果有)&#…

C++ 算法学习之旅:从入门到精通的秘籍

在编程的浩瀚宇宙中,C 算法宛如璀璨的星辰,照亮我们前行的道路。作为一名 C 算法小白,或许你和我一样,怀揣着对算法的好奇与憧憬,却又在学习的道路上感到迷茫。别担心,今天我就和大家分享一下如何学习各种基…

计算机网络常识:缓存、长短连接 网络初探、URL、客户端与服务端、域名操作 tcp 三次握手 四次挥手

缓存: 缓存是对cpu,内存的一个节约:节约的是网络带宽资源 节约服务器的性能 资源的每次下载和请求都会造成服务器的一个压力 减少网络对资源拉取的延迟 这个就是浏览器缓存的一个好处 表示这个html页面的返回是不要缓存的 忽略缓存 需要每次…

软件逆向工程核心技术:脱壳原理与实战分析

目录 一、脱壳技术概述:从保护到还原的逆向之旅 1.1 脱壳技术的本质与核心价值 1.2 壳的分类与核心技术解析 1.3 学习路径:从压缩壳到加密壳的渐进式突破 二、脱壳三步法:系统化逆向工程框架 2.1 核心流程总览 2.2 实战案例&#xff1…

华为OD机试真题——荒岛求生(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 200分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录…

【CTFer成长之路】举足轻重的信息搜集

举足轻重的信息搜集 信息搜集 常见的搜集 题目描述: 一共3部分flag docker-compose.yml version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-information-backk:latestports:- 80:80启动方式 docker-compose up -d 题目Flag n1book{info_…

Linux开发工具【中】

目录 一、vim 1.1 插入模式 1.2 底行模式 1)set nu 2)set nonu 3) /XXX n 4)!command 5)vs other 1.3 补充 1) 批量化操作 2)批量化替换 : 3)快速定位&am…

MySQL OCP 认证限时免费活动​ 7 月 31 日 前截止!!!

为庆祝 MySQL 数据库发布 30 周年,Oracle 官方推出限时福利:2025 年 4 月 20 日至 7 月 31 日期间,所有人均可免费报考 MySQL OCP(Oracle Certified Professional)认证考试。该认证验证持证者在 MySQL 数据库管理、优化…

学习笔记:数据库——事务

1.内容: 基于现有数据库设计检查点实验,观察比较提交前后执行结果并分析。 2.实现 源码 -- 开启事务 START TRANSACTION;-- 插入一条订单记录(客户ID为10002) INSERT INTO orders (o_date, c_id) VALUES (NOW(), 10002);-- 获…

UE5 Daz头发转Blender曲线再导出ABC成为Groom

先安装Daz to Blender Import插件 【神器】 --DAZ一键导入blender插件的详细安装和使用,自带骨骼绑定和控制器,多姿势动画,Importer桥接插件_哔哩哔哩_bilibili 然后安装DAZHairConverter插件 一分钟将DAZ头发转化成Blender粒子毛发_哔哩哔…