2.多媒体封装格式(容器)介绍
封装格式:在观看已经下载好的视频的时候,经常会看到一些视频文件后缀,如.mp4,.flv,.avi,.mkv等等,这些扩展名就可以简单理解为视频的封装格式或者视频的容器格式。
封装:所谓视频的封装,就是将已经编码好的音频,视频,还可能有字幕,脚本之类的文件按照一定的规范放到一起,形成一个封装格式的文件(封装和编码是两个不同的概念,封装是在“视频流水线”上,编码以后的一个过程,一个容器可以封装多种编码格式的文件,但是只支持特定的编码格式)。封装格式有很多,比如flv,mp4,ts,avi ,mkv等等。
几种常见的封装格式:
1.TS封装格式
TS流最早应用于数字电视领域,视频格式主要是mpeg2。后来,苹果公司发明HLS协议也是基于TS文件的。hls流媒体视频编码的主要格式为h264/mpeg4,音频为aac/mp3。
TS文件分为三层:ts层(如下图)pes(Packet Elemental Stream)层,es层(Elementary Stream)。
es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层是在pes层上加入了数据流识别和传输的必要信息。
文章图片
ts流结构 由上图可以看出,ts流是由一个个固定大小的包组成的,每个packet大小固定188个字节。
在这里说一下TS流的生产,就不再画深一层的结构图了,深一层结构图自行脑补:
TS流的形成过程:
1、 将原始音视频数据压缩之后,压缩结果组成一个基本码流(ES)。
2、 对ES(基本码流)进行打包形成PES。
3、 在PES包中加入时间戳信息(PTS/DTS)。
4、 将PES包内容分配到一系列固定长度的传输包(TS Packet)中。
5、 在传输包中加入定时信息(PCR)。
6、 在传输包中加入节目专用信息(PSI) 。
7、 连续输出传输包形成具有恒定比特率的MPEG-TS流。
2.MP4封装格式
MP4,全称MPEG-4 Part 14,是一种使用MPEG-4的多媒体电脑档案格式,其基本存储结构是box,box可以理解为数据对象块,所有数据都必须保存在box中,而且必须包含一个File Type box(ftpy),作为MP4格式的标志并包含关于文件的一些信息。以下是MP4文件的结构树:
文章图片
MP4文件结构树 ftpy:通常放在文件的开始,作为MP4格式的标志包含关于文件的一些信息
moov:它是一种container box,子box包含了媒体的metadata信息
mdat:包含MP4文件的媒体数据
free:“free”中的内容是无关紧要的,可以被忽略。该box被删除后,不会对播放产生任何影响,只能是size+type,这样组成8个字节的头数据
mvhd:一般作为“moov”的第一个子box出现,相当于整个moov box的“header”
概念:
track表示一些sample的集合,对于媒体数据来说,track表示一个视频或音频序列。
hint track这个特殊的track并不包含媒体数据,而是包含了一些将其他数据track打包成流媒体的指示信息。
sample对于非hint track来说,video sample即为一帧视频,或一组连续视频帧,audio sample即为一段连续的压缩音频,它们统称sample。对于hint track,sample定义一个或多个流媒体包的格式。
sample table指明sampe时序和物理布局的表。
chunk一个track的几个sample组成的单元。
MP4文件结构:
1、 文件,由很多Box和FullBox组成。
2、 Box,每一个Box由Header和Data组成。
3、 FullBox,是Box的扩展,Box结构的基础上在Header中添加8bits version和24bits flags。
4、 Header,包括了整个Box的长度size和类型type。当size==0时,代表这是文件里最后一个Box;当size==1时,意味着Box长度须要很多其它bits来描写叙述,在后面会定义一个64bits的largesize描写叙述Box的长度;当type是uuid时,代表Box中的数据是用户自己定义扩展类型。
5、 Data,是Box的实际数据,可以是纯数据也可以是很多其它的子Boxes。
【2.多媒体封装格式(容器)介绍】6、 当一个Box的Data中是一系列子Box时,这个Box又可成为Container Box。
推荐阅读
- 2020-04-07vue中Axios的封装和API接口的管理
- 基于|基于 antd 风格的 element-table + pagination 的二次封装
- python自定义封装带颜色的logging模块
- 视频转换器哪种好用()
- jQuery插件
- 怎么将桌面上的CAD图纸添加到软件中进行BMP格式转换()
- 使用Promise对微信小程序wx.request请求方法进行封装
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- vue.js|vue中使用axios封装成request使用
- 微信小程序请求接口格式