1 概述

日常生活中,看到的视频文件的后缀名如 .mp4、.avi、.rmvb 都是属于视频文件的封装格式。所谓封装格式,就是以怎样的方式将视频轨、音频轨、字幕轨等信息组合在一起。说得通俗点,视频轨相当于饭,而音频轨相当于菜,封装格式就是一个碗或者一个锅,是用来盛放饭菜的容器。

视频文件的封装格式并不影响视频的画质,影响视频画面质量的是视频的编码格式。

下面介绍常见的视频封装格式 - MP4

MP4(MPEG-4 Part 14)是一种常见的多媒体容器格式,它是在 “ISO/IEC 14496-14” 标准文件中定义的,属于 MPEG-4 的一部分。

MP4 是一种较为全面的容器格式,被认为可以在其中嵌入任何形式的数据,,不过我们常见的大部分的 MP4 文件存放的 AVC(H.264) 或 MPEG-4(Part 2) 编码的视频和 AAC 编码的音频。MP4 格式的官方文件后缀名是 “.mp4”,还有其他的以 mp4 为基础进行的扩展或者是阉割版的格式,如 M4V、 3GP、F4V 等。

2 box 结构树

MP4 文件中所有数据都装在 box 中,也就是说 MP4 由若干个 box 组成,每个 box 有类型和长度,包含不同的信息,可以将 box 理解为一个数据对象块。box 中可以嵌套另一个 box,这种 box 称为 container box。

MP4 文件 box 以树形结构的方式组织, 一个简单的 MP4 文件由以下 box 结构数组成(mp4info 工具查看 MP4 文件结构):

根节点之下,主要包含以下三个 box 节点:

  1. ftyp:File Type Box,文件类型
  2. moov:Movie Box,文件媒体的 metadata 信息
  3. mdat:Media Data Box,具体的媒体数据
  • 一个 MP4 文件有且仅有一个 “ftyp” 类型的 box,作为 MP4 格式的标识并包含一些关于文件的一些信息;
  • ftyp box 之后会有一个 “moov” 类型的 box(Movie Box),它是一种 container box,子 box 中包含了媒体的 metadata 信息;
  • MP4文件的媒体数据包含在 “mdat” 类型的 box(Midia Data Box)中,该类型的 box 也是 container box,可以有多个,也可以没有(当媒体数据全部引用其他文件时),媒体数据的结构由 metadata 进行描述;

要更深入的了解 MP4 封装格式,首先需要理解几个基本概念:

  1. track:表示一些 sample 的集合,对于媒体数据来说,track 表示一个视频或音频序列
  2. sample:video sample 即为一帧视频或一组连续视频帧,audio sample 即为一段连续的压缩音频,它们统称 sample
  3. chunk:一个 track 中连续几个 sample 组成的单元

3 MP4 重要 box 详解

3.1 box

mp4 文件由若干个 box 组成。下面是 box 结构示意图:

  1. box 由 header 和 body 组成,其中 header 指明 box 的 size 和 type。size 是指包含 box header 的整个 box 的大小。
  2. box type,通常是 4 个 ASCII 码的字符如 “ftyp”、“moov” 等。
  3. 如果 header size 为 1,则表示 box 长度需要更多的 bits 来描述,在后面会有一个 64 bit 位的 largesize 用来描述 box 的长度。如果 size 为 0,表示该 box 为文件的最后一个 box,文件结尾(存在于 “mdat” 类型的 box 中)。
  4. container box 可以包含 box
  5. box 分为两种,Box 和 Fullbox。FullBox 是 Box 的扩展,Header 中增加了version 和 flags 字段。

3.2 File Type Box(ftyp)

File Type Box 有且只有 1 个,并且只能被包含在文件层,不能被其他 box 包含。该 box 应该被放在文件的最开始,指示该 MP4 文件应用的相关信息。

“ftyp” body 部分依次包括 1 个 32 位的 major brand(4个字符),1 个 32 位的 minor version(整数)和 1 个以 32 位(4个字符)为单位元素的数组 compatible brands。这些都是用来指示文件应用级别的信息。

截取一个 MP4 文件最开头的 File Type Box:

00 00 00 14 66 74 79 70 69 73 6F 6D 00 00 00 01
69 73 6F 6D

可以看出,前面 8 个字节是 box header,其中前 4 个字节为 box size 为 0x14 = 20,后 4 个字节为 box type(ftyp),box body 包含 (20- 8) = 12 个字节。

3.3 Movie Box(moov)

Movie Box 中包含了文件媒体的 metadata 信息,“moov” 是一个 container box,具体的内容信息在其子 box 中。

“moov” 中包含1个 “mvhd” 和若干个 “trak”。其中 “mvhd” 是 header box,一般作为 "moov " box 的第一个子 box 出现。“trak” 包含了一个 track 也就是一个媒体流序列的相关信息,是一个 container box。下图是 “moov” 的一个字节实例,其中红色部分为 box header,绿色为 “mvhd”,黄色为一部分的 “track”。

可以看到,该 moov box header 占 8 个字节,整个 box size 为 0x5AEB = 23272 字节

3.4 Movie Header Box(mvhd)

mvhd 结构如下表,具体值以上面的 mvhd 字节举例:

字段 字节数 说明
box size 4 mvhd box size,0xC8 = 108 字节
box type 4 box type,固定为 “mvhd”
box version 1 box 版本,一般为 0
flags 3 flag
creation time 4 创建时间(相对于 UTC 时间 1904-01-01 零点的秒数)
modification time 4 修改时间
time scale 4 文件媒体在 1 秒时间内的刻度值,可以理解为 1 秒长度的时间单元数。值 0x0258 = 600
duration 4 媒体流时间长度,用 duration + time scale 计算时长,如实例值 0xA410 = 42000 video track->time scale = 600,则时长 = duration / scale = 88 秒
rate 4 推荐播放速率,高 16 位和低 16 位分别为小数点整数部分和小数部分,即 [16.16] 格式,该值为 1.0 表示正常前向播放
volume 2 与 rate 类似,[8.8] 格式,1.0(0x0100)表示最大音量
reserved 10 保留位,固定全设为 0
matrix 36 视频变换矩阵
pre-defined 24
next track id 4 下一个 track 使用的 id 号

3.5 Track Box(trak)

Track Box 是一个 container box,其子 box 包含了该 track 的媒体数据引用和描述。一个 mp4 文件可以包含多个 track 且至少有一个 track,track 之间是独立,有自己的时间和空间信息。Track Box 必须包含一个 “tkhd” 和一个 “mdia”,此外还有很多可选的 box。其中 “tkhd” 为 track header box,“mdia” 为 media box,该 box 包含一些 track 媒体数据信息,也是一个 container box。

“trak” box 的字节实例如下图,其中黄色为 “trak” box 头,绿色为 “tkhd”,蓝色为 “edts”(一个可选 box),红色为一部分 “mdia”。

1)Track Header Box(tkhd)

“tkhd” 结构如下表,具体值以上面的 tkhd 字节举例:

字段 字节数 说明
box size 4 tkhd box size,0x5C = 92 字节
box type 4 box type,固定为 “tkhd”
box version 1 box 版本,一般为 0
flags 3 flag,按位或操作结果值,定义见表格后说明
creation time 4 创建时间(相对于 UTC 时间 1904-01-01 零点的秒数)
modification time 4 修改时间
track id 4 track id 号,不能重复且不能为 0,字节实例中值为 1
reserved 4 保留位
duration 4 track 时间长度,用 duration + time scale 计算时长,如实例值 0xA410 = 42000 video track->time scale = 600,则时长 = duration / scale = 88 秒
reserved 8 保留位
layer 2 视频层,默认为 0,值小的在上层
alternate group 2 track 分组信息,默认为 0 表示该 track 未与其他 track 有群组关系
volume 2 [8.8] 格式,1.0(0x0100)表示最大音量
reserved 2 保留位
matrix 36 视频变换矩阵
width 4 宽,字节势力中值为:
height 4 高,均为 [16.16] 格式值,用于播放时的展示宽高

表中 flag 为按位或操作结果值,预定义如下:

  1. 0x000001 track_enabled,表示该 track 是否可用
  2. 0x000002 track_in_movie,表示该 track 是否在播放中被引用;
  3. 0x000004 track_in_preview,表示该 track 是否在预览时被引用;

一般该值为 7,如果一个媒体所有 track 均未设置 track_in_movie 和 track_in_preview,将被理解为所有 track 均设置了这两项。

2)Media Box(mdia)

“mdia” 也是个 container box,其子 box 的结构和种类还是比较复杂的。先来看一个 “mdia” 的实例结构树图。

总体来说,“mdia” 定义了 track 媒体类型以及 sample 数据,描述 sample 信息。一般 “mdia” 包含一个 “mdhd”、一个 “hdlr” 和一个 “minf”,其中 “mdhd” 为 media header box,“hdlr” 为 handler reference box,“minf” 为 media information box。

3.6 Free Space Box(free)

“free” 中的内容是无关紧要的,可以被忽略。该 box 被删除后,不会对播放产生任何影响

3.7 Meida Data Box(mdat)

该 box 包含于文件层,可以有多个,也可以没有(当媒体数据全部为外部文件引用时),用来存储媒体数据。数据直接跟在 box type 字段后面,具体数据结构的意义需要参考 metadata(主要在sample table中描述)。

可参考资料

在线 mp4box 解析工具

常见视频封装格式(3) — MP4相关推荐

  1. 详解视频封装格式之MP4

    在我之前的一篇文章(什么是视频封装格式和编码格式)中有整理了一下常见的视频封装格式.在上一篇文章(详解视频封装格式之FLV)中重点剖析了FLV格式.在这篇文章中,我们重点剖析一下MP4这种视频封装格式 ...

  2. 在直播软件开发过程中,常用的几种视频封装格式

    1.AVI格式 AVI(Audio Video Interleaved).此格式的中文译名为音频视频交错格式,这种视频格式的优点是图像质量好,无损AVI可以保存alpha通道.缺点也不少,体积过于庞大 ...

  3. 音视频入门系列-视频封装格式篇(MP4)

    接上文,本篇介绍下MP4的封装格式. 1.MP4(MPEG-4) ◆ MP4是一套用于音频.视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的"动态图像专家组 ...

  4. 走进音视频的世界——视频封装格式

    音视频的时长怎么获取,音视频的封面怎么获取,音视频的格式怎么获取呢?这些信息都以特定格式存储在文件开头或者结尾,称为多媒体信息或者多媒体元数据.通用的封装格式由:文件标识头+多媒体信息+音视频(字幕) ...

  5. FFmpeg之视频封装格式、流媒体协议、视频编解码协议和传输流格式、时间戳和时间基、视频像素数据

    通用视频分析工具:Mediainfo.Elecard StreamEye(视频编码分析工具); 视频封装格式: ********************MP4****************** MP ...

  6. 音视频封装格式、编码格式

    音视频封装格式.编码格式 概述 常见的AVI.RMVB.MKV.ASF.WMV.MP4.3GP.FLV等文件其实只能算是一种封装标准. 一个完整的视频文件是由音频和视频2部分组成的.H264.Xvid ...

  7. OpenCV视频篇——视频文件格式--视频封装格式--视频编码格式区分

    目录 一.前言 二.视频文件格式(文件格式) 三.视频封装格式(视频格式) 1.AVI 2.QuickTime 3.高级流格式文件 4.RealVideo 5.NAVI 6.DivX 7.MPEG 四 ...

  8. 详解视频封装格式之FLV

    在我之前的一篇文章(什么是视频封装格式和编码格式)中有整理了一下常见的视频封装格式,在这篇文章中,我们重点剖析一下FLV这种视频封装格式的具体情况. 一.FLV 的总体结构 FLV 是一种非常常见的音 ...

  9. 音视频封装格式转换器(支持avi格式转换),基于FFmpeg4.1实现(音视频学习笔记二)

    之前参照雷霄骅博士的最简单的基于FFMPEG的封装格式转换器(无编解码)的博客和FFmpeg官网的example,实现一个简单的封装格式转换器.但是后来我发现我想从mp4格式转换成avi格式的时候会报 ...

  10. 腾讯视频QLV格式转换mp4的方法

    腾讯视频QLV格式转换mp4的方法不知道大家知不知道用?喜欢用腾讯视频的朋友应该都知道腾讯视频单独搞出了个QLV格式文件,只能用腾讯独有的腾讯视频软件才能播放,就算用格式工厂转换也不行,那么腾讯视频的 ...

最新文章

  1. 干货 | 携程度假无线前端架构演进之路
  2. 微信小程序------MD5加密(支持中文和不支持中文)和网络请求(get和post)
  3. Linux表空间扩容,linux下oracle表空间导致磁盘空间不足
  4. python的随机种子实例
  5. Leetcode每日一题:100.same-tree(相同的树)
  6. Java十进制转二、八、十六进制方法
  7. 循环链表,约瑟夫环问题
  8. replace()替换文字
  9. [20150228]Delayed Block Cleanout 2.txt
  10. java 球弹跳的高度_关于皮球弹跳高度的几个问题
  11. 推荐几个浏览器插件帮助你查论文显示期刊等级(分区及影响因子),sci文章便捷下载
  12. html打印文字不显示图片,word打印预览时候没问题但是打印出来时候有些文字却不显示...
  13. Kubernetes基础:Pause镜像源码解读
  14. Stanford Large-Scale 3D Indoor Spaces Dataset (S3DIS)
  15. OpenStack和Open Source MANO:NFV部署两大支柱
  16. python练习-给数组去重后元素的加序号
  17. R语言(R studio)画各类统计图形
  18. 西邮Linux兴趣小组纳新笔试试题
  19. 轻松捕捉85点策略:欧元/日元经典交易策略全公开
  20. 来自一个入行三年半的大数据练习生自述

热门文章

  1. 【ESD专题】1.ESD基础及IEC61000-4-2标准
  2. 51单片机用c语言在液晶1602上显示汉字,51单片机LCD1602显示汉字(中文)源程序...
  3. c语言怎么写注释,C语言注释
  4. 超实用:本科生如何发论文?
  5. 时间序列相似性度量-DTW
  6. android客户端跟服务器交换数据,Android客户端和服务器端数据交互的第一种方法...
  7. PCIE原理-002:PCIE地址是如何映射的
  8. [极客时间] 时间复杂度和空间复杂度分析
  9. 如何更改Win8,8.1中文版到英文版,亲测!
  10. cad画直线长度与实际不符_cad画规定长度直线的方法步骤图