内容简介:一般情况下,一个完整的视频文件是由音频和视频两部分组成的。常见的 AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV 等文件只能算是一种封装格式。H.264,HEVC,VP9 和 AV1 等就是视频编码格式,MP3、AAC 和 Opus 等就是音频编码格式。比如:将一个 H.264 视频编码文件和一个 AAC 音频编码文件按 MP4 封装标准封装以后,就得到一个 MP4 后缀的视频文件,也就是我们常见的 MP4 视频文件了。音视频编码的主要目的是压缩原始数据的体积。而封装格式(也称为多媒体容器
一般情况下,一个完整的视频文件是由音频和视频两部分组成的。常见的 AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV 等文件只能算是一种封装格式。H.264,HEVC,VP9 和 AV1 等就是视频编码格式,MP3、AAC 和 Opus 等就是音频编码格式。
比如:将一个 H.264 视频编码文件和一个 AAC 音频编码文件按 MP4 封装标准封装以后,就得到一个 MP4 后缀的视频文件,也就是我们常见的 MP4 视频文件了。
音视频编码的主要目的是压缩原始数据的体积。而封装格式(也称为多媒体容器),比如 MP4,MKV,是用来存储/传输编码数据,并按一定规则把音视频、字幕等数据组织起来,同时还会包含一些元信息,比如当前流中包含哪些编码类型、时间戳等,播放器可以按照这些信息来匹配解码器、同步音视频。
接下来,本文我们将重点介绍 MP4、Fragmented MP4 和 FLV 这三种封装格式。不过在介绍封装格式前,我们先来了解一下视频播放器的原理。
一、视频播放器原理
视频播放器是指能播放以数字信号形式存储的视频的软件,也指具有播放视频功能的电子器件产品。大多数视频播放器(除了少数波形文件外)携带解码器以还原经过压缩的媒体文件,视频播放器还要内置一整套转换频率以及缓冲的算法。此外,大多数的视频播放器还能支持播放音频文件。
视频播放基本处理流程大致包括以下几个阶段:
(1)解协议
从原始的流媒体协议数据中删除信令数据,只保留音视频数据,如采用 RTMP 协议传输的数据,经过解协议后输出 FLV 格式的数据。
(2)解封装
分离音频和视频压缩编码数据,常见的封装格式 MP4,MKV,RMVB,FLV,AVI 这些格式。从而将已经压缩编码的视频、音频数据放到一起。例如 FLV 格式的数据经过解封装后输出 H.264 编码的视频码流和 AAC 编码的音频码流。
(3)解码
视频,音频压缩编码数据,还原成非压缩的视频,音频原始数据,音频的压缩编码标准包括 AAC,MP3,AC-3等,视频压缩编码标准包含 H.264,MPEG2,VC-1 等经过解码得到非压缩的视频颜色数据如 YUV420P,RGB 和非压缩的音频数据如 PCM 等。
(4)音视频同步
将同步解码出来的音频和视频数据分别送至系统声卡和显卡播放。
介绍完视频播放器的原理,我们开始进入正题 —— 多媒体容器格式。
二、多媒体容器格式
对于数字媒体数据来说,容器就是一个可以将多媒体数据混在一起存放的东西,就像是一个包装箱,它可以对音、视频数据进行打包装箱,将原来的两块独立的媒体数据整合到一起,当然也可以单单只存放一种类型的媒体数据。
有时候,多媒体容器也称封装格式,它只是为编码后的多媒体数据提供了一个 “外壳”,也就是将所有的处理好的音频、视频或字幕都包装到一个文件容器内呈现给观众,这个包装的过程就叫封装。常用的封装格式有:MP4,MOV,TS,FLV,MKV 等。
2.1 MP4 容器格式
MPEG-4 Part 14(MP4)是最常用的容器格式之一,通常以 .mp4 文件结尾。它用于 HTTP(DASH)上的动态自适应流,也可以用于 Apple 的 HLS 流。MP4 基于 ISO 基本媒体文件格式(MPEG-4 Part 12),该格式基于 QuickTime 文件格式。MPEG 代表动态图像专家组,是国际标准化组织(ISO)和国际电工委员会(IEC)的合作。MPEG 的成立是为了设置音频和视频压缩与传输的标准。
MP4 支持多种编解码器,常用的视频编解码器是 H.264 和 HEVC,而常用的音频编解码器是 AAC,AAC 是著名的 MP3 音频编解码器的后继产品。
MP4 是由一系列的 box 组成,它的最小组成单元是 box。 MP4 文件中的所有数据都装在 box 中,即 MP4 文件由若干个 box 组成,每个 box 有类型和长度,可以将 box 理解为一个数据对象块。box 中可以包含另一个 box,这种 box 称为 container box。
一个 MP4 文件首先会有且仅有 一个 ftyp
类型的 box,作为 MP4 格式的标志并包含关于文件的一些信息,之后会有且只有一个 moov
类型的 box(movie box),它是一种 container box,可以有多个,也可以没有,媒体数据的结构由 metadata 进行描述。
好的,介绍完 MP4 容器的相关知识,现在让我们来看一下 MP4 文件的结构图:
看完上述的 MP4 文件的结构图,相信有些读者会有疑问 —— 实际的 MP4 文件结构是怎么样的?通过使用 mp4box.js 提供的在线服务,我们可以方便的查看本地或在线 MP4 文件内部的结构:
mp4box.js 在线地址:https://gpac.github.io/mp4box.js/test/filereader.html
由于 MP4 文件结构比较复杂(不信请看下图),这里我们就不继续展开,有兴趣的读者,可以自行阅读相关文章。
接下来,我们来介绍 Fragmented MP4 容器格式。
2.2 Fragmented MP4 容器格式
MP4 ISO Base Media 文件格式标准允许以 fragmented 方式组织 box,这也就意味着 MP4 文件可以组织成这样的结构,由一系列的短的 metadata/data box 对组成,而不是一个长的 metadata/data 对。Fragmented MP4 文件结构如下图所示,图中只包含了两个 fragments:
(图片来源 —— https://alexzambelli.com/blog/2009/02/10/smooth-streaming-architecture/)
在 Fragmented MP4 文件中含有三个非常关键的 boxes: moov
、 moof
和 mdat
。
-
moov(movie metadata box):用于存放多媒体 file-level 的元信息。
-
mdat mdat mdat
-
moof(movie fragment box):用于存放 fragment-level 的元信息。该类型的 box 在普通的 MP4 文件中是不存在的,而在 Fragmented MP4 文件中,每个 fragment 都会有一个
moof
类型的 box。
Fragmented MP4 文件中的 fragment 由 moof
和 mdat
两部分组成,每个 fragment 可以包含一个音频轨或视频轨,并且也会包含足够的元信息,以保证这部分数据可以单独解码。Fragment 的结构如下图所示:
(图片来源 —— https://alexzambelli.com/blog/2009/02/10/smooth-streaming-architecture/)
同样,利用 mp4box.js 提供的在线服务,我们也可以清晰的查看 Fragmented MP4 文件的内部结构:
我们已经介绍了 MP4 和 Fragmented MP4 这两种容器格式,我们用一张图来总结一下它们之间的主要区别:
2.3 FLV 容器格式
FLV 是 FLASH Video 的简称,FLV 流媒体格式是随着 Flash MX 的推出发展而来的视频格式。由于它形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,它的出现有效地解决了视频文件导入 Flash 后,使导出的SWF 文件体积庞大,不能在网络上很好的使用等问题。
FLV 文件由 FLV Header 和 FLV Body 两部分构成,而 FLV Body 由一系列的 Tag 构成:
2.3.1 FLV 头文件
FLV 头文件:(9 字节)
-
1-3:前 3 个字节是文件格式标识(FLV 0x46 0x4C 0x56)。
-
4-4:第 4 个字节是版本(0x01)。
-
5-5:第 5 个字节的前 5 个 bit 是保留的必须是 0。
-
第 5 个字节的第 6 个 bit 音频类型标志(TypeFlagsAudio)。
-
第 5 个字节的第 7 个 bit 也是保留的必须是 0。
-
第5个字节的第8个bit视频类型标志(TypeFlagsVideo)。
-
6-9: 第 6-9 的四个字节还是保留的,其数据为 00000009。
-
整个文件头的长度,一般是 9(3+1+1+4)。
2.3.2 tag 基本格式
tag 类型信息,固定长度为 15 字节:
-
1-4:前一个 tag 长度(4字节),第一个 tag 就是 0。
-
5-5:tag 类型(1 字节);0x8 音频;0x9 视频;0x12 脚本数据。
-
6-8:tag 内容大小(3 字节)。
-
9-11:时间戳(3 字节,毫秒)(第 1 个 tag 的时候总是为 0,如果是脚本 tag 就是 0)。
-
12-12:时间戳扩展(1 字节)让时间戳变成 4 字节(以存储更长时间的 flv 时间信息),本字节作为时间戳的最高位。
在 flv 回放过程中,播放顺序是按照 tag 的时间戳顺序播放。任何加入到文件中时间设置数据格式都将被忽略。
-
13-15:streamID(3 字节)总是 0。
最后,我们再来回顾一下 FLV 文件的结构图:
看完 FLV 文件的结构图是不是觉得晕乎乎的或没啥感觉,如果这样的话,建议感兴趣的读者了解一下由 Bilibli 大佬开源的 flv.js 项目,它可是 HTTP + FLV 直播协议的幕后功臣哟。
flv.js 是来自 Bilibli 的开源项目。它解析 FLV 格式文件喂给原生 HTML5 Video 标签播放音视频数据,使浏览器在不借助 Flash 的情况下播放 FLV 成为可能。
继续阅读:为流媒体而生的 MSE API
三、参考资源
-
baike - 视频播放器
-
wiki - Flash Video
▼
往期精彩回顾
▼
一文读懂 TS 中 Object, object, {} 类型之间的区别
一文读懂 TS 中 Object, object, {} 类型之间的区别
聚焦全栈,专注分享 Angular、TypeScript、Node.js 、Spring 技术栈等全栈干货。
回复 0 进入 重学TypeScript 学习群
回复 1 获取 全栈修仙之路 博客地址
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Java播放多媒体
- Java处理多媒体文件
- 07.Android之多媒体问题
- FFmpeg 3.3.4 发布,多媒体处理工具
- FFmpeg 3.4 发布,多媒体处理工具合集
- GStreamer 1.14 发布,多媒体开发框架
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
计算机图形学原理及实践:C语言描述(原书第2版) (平装)
福利 / 唐泽圣 / 机械工业出版社 / 2004-3 / 95.0
《计算机图形学原理及实践:C语言描述(原书第2版)》:这是计算机图形学领域的一部经典之作,作者Fley、va Dam等是国际图形学界的著名学者、学术带头人,而且《计算机图形学原理及实践:C语言描述(原书第2版)》英文版自出版以来,一直是各国大学计算机图形学课程的主要教科书。来自清华大学、北京大学、中国科学院计算技术研究所、中国科学院软件研究所的多位图形学领域的专家和精英花费了大量的时间和精力进行翻......一起来看看 《计算机图形学原理及实践:C语言描述(原书第2版) (平装)》 这本书的介绍吧!