我们常说的视频文件格局常常仅仅多媒体封装格局,里面不只包括了视频,还有音频、字幕等媒体信息。而纯视频码流的格局更多运用运用编码格局表达。
多媒体封装格局(Multimedia Container Format,简称MCF、多媒体容器),是一种开放(没有身份规限,免费)、自在的数据格局。
多媒体文件是个容器。容器里面存在多个流(stream/track) 。每种流是由不同的编码器编程生成的。从流中读出的数据称为包。在一个包中包括一个或多个帧。
容器格局内部对音视频数据的处理都是迥然不同,差异点并不大。更多的距离在于它们关于不同编码格局的支撑程度、元数据的详细程度以及关所以否能够支撑音视频以外的数据。
不同的容器具有不同的特点,下面简略介绍常用的多媒体容器。
AVI
AVI,Audio Video Interleave。
- 安排:Mircrosoft
- 不支撑流媒体
- 支撑编解码器:简直一切
- BT下载视频
一种RIFF(Resource Interchange File Format)文件格局。同样运用RIFF文件格局还有WAV格局文件。RIFF运用小端序存储。
主体中的图画数据和声音数据是穿插寄存的,以此到达音视频同步。从尾部的索引能够跳转到要播映的方位。
播映时刻没有直接的字段由读取的帧数和帧率计算得出。
缺陷:
- 因为索引在文件尾部,所以不适合用来流传输。
- 容器中我没有时刻戳,只能经过帧数和帧率计算得出。在索引中也没有写明时刻戳和媒体方位的信息,所以在播映AVI时seek操作还需要额外的技术手段。
- 因为媒体数据分块寄存,使得它对很多运用运动猜测特定的视频编码的支撑不是很好,因为猜测帧需要访问帧外的数据。
二进制构成
AVI文件是一个类型为AVI
的RIFF块,主要有三个subchunk构成:
-
hdrl
LIST,信息块:元数据 -
movi
LIST,数据块:保存音视频序列数据 -
idxl
LIST,索引块(可选)
结构暗示:
RIFF (‘AVI ’
LIST (‘hdrl’
‘avih’(主AVI信息头数据)
LIST (‘strl’
‘strh’ (流的头信息数据)
‘strf’ (流的格局信息数据)
[‘strd’ (可选的额外的头信息数据) ]
[‘strn’ (可选的流的名字) ]
...
)
...
)
LIST (‘movi’
{ SubChunk | LIST (‘rec ’
SubChunk1
SubChunk2
...
)
...
}
...
)
[‘idx1’ (可选的AVI索引块数据) ]
)
参阅:
- 多媒体文件格局之AVI – Tocy – 博客园
- AVI文件格局剖析 | Sp4n9x’s Blog
MOV
MOV,QuickTime File Format(QTFF)
-
安排:Apple
-
支撑流媒体
-
支撑编解码器:
- 音:AAC、MPEG-1 Layers I/II/III、AC-3等
- 视:MPEG-2/4、H.264等
-
点播、直播
相关概念
atom:QTFF的根本数据单元,能够来包容实践的音视频数据,也能够放置元数据和字幕等信息,经过层层嵌套方法形成树状结构。atom包容的数据类型和巨细在atom头部进行描绘。
MP4
MP4,MPEG-4 Part14
-
安排:MPEG
-
支撑流媒体
-
支撑编解码器:
- 音:AAC、MPEG-1 Layers I/II/III、AC-3等
- 视:MPEG-2/4、H.264、H.263等
-
互联网视频网站
MP4由多个包括不同信息的box,以树方式安排构成,与MOV的atom简直共同。
根结点下包括三个box:
-
ftyp
:文件类型 -
moov
:元数据 -
mdat
:媒体数据
把moov放到mdat前面能够更快预备播映。
box结构
构成:
-
header:指明box巨细和类型;
- 增加了
version
(8位)和flags
(24位)字段的成为FullBox。 - 当size等于0时,代表这个box是文件最后一个box。当size等于1时,阐明box长度需要更多的位来描绘,在后面会定义一个64位的largesize来描绘box的长度。
- 增加了
-
body:数据或box
常用容器
-
moov,音视频数据的元数据信息
-
mvhd,影片文件头信息,未紧缩过的影片信息的头容器
-
trak,多个,各轨迹信息容器
-
tkhd,轨迹元数据(TrackID、Duration、音量等等)
-
edts
- 假如没有该表,那么这个轨迹会当即开端播映,一个空的 edts 数据用来定位对轨迹的开端时刻偏移方位
-
mdia
-
mdhd,媒体头
-
hdlr,句柄参阅
-
minf,媒体信息
- vmhd,视频信息头
- smhd,音频信息头
- dinf,数据信息
- stdl,采样表
-
-
-
mdat
box中的多媒体数据是没有结构的,是参阅moov
的track
box解析。moov
包括了整个多媒体文件的元数据,seek也是经过该box完成,经过其间的各个表查到数据偏移方位。
FLV
FLV,FLash Video。
-
安排:Adobe
-
支撑流媒体
-
支撑编解码器:
- 音:MP3、ADPCM、Linear PCM、AAC等
- 视:Sorenson、VP6、H.264
-
互联网视频
FLV常用做流媒体。
结构:
-
FLV Header
- 字符 FLV 签名字段
- 版本
- 保存标记
- 音视频标记
- 数据偏移
-
FLV Body,这里body仅仅一个概念,详细直接便是PreviousTagSize和Tag
-
PreviousTagSize #0:0
-
TAG #1
-
TAG Header
- Type
- DataSize
- TimeStamp
-
TAG Data
-
Audio Tag Data
- 第一个字节包括音频数据的参数信息
- 第二个字节开端为音频流数据
-
Video Tag Data(同上)
-
Script Tag Data
- 常用于展现元数据,存储的数据格局一般为 AMF 格局
-
-
-
PreviousTagSize #1:上一个TAG巨细。
-
TAG #2
-
PreviousTagSize #2
-
…
-
参阅:
- Flv格局解析 –
TS
TS,MPEG2-TS
-
安排:MPEG
-
支撑流媒体
-
支撑编解码器:
- 音:MPEG-1 Layers I/II/III、AAC
- 视:MPEG-1/2/4、H.264
-
IPTV,低延时直播
TS文件为传输流文件,其特点是要求从视频流的恣意片段开端都是能够独立解码的。TS容器是为了流传输而规划的。
在MPEG-2规范中,有两种不同类型的码流输出到信道:一种是节目码流(Program Stream, PS),适用于没有误差发生的媒体存储,如DVD等存储介质(.vob)。另一种是传送流(Transport stream, TS),适用于有信道噪声发生的传输,现在TS流广泛应用于广播电视中,如机顶盒等。
TS文件分层:
- ES,Elementary Stream:原始流,直接从编码器出来的裸数据。
- PES,Packet Elemental Stream:切割打包的ES流,参加了PES头(PTS、DTS等)。PES由包头和playload组成。
- TS层,Transport Stream:传输流。是在PES层的基础上参加数据流的辨认和传输有必要的信息。固定包长度为188字节,以便于找到帧的开端方位,易于从丢包中恢复。
为了便于传输,完成时分复用,根本流ES有必要打包,便是将顺序连续、连续传输的数据流按必定的时刻长度进行切割,切割的小段叫包,因而打包也称为分组。
参阅:TS流根本概念、ts流格局详解
MKV
MKV,Matroska Video File
- 安排:Matroska
- 支撑流媒体
- 支撑编解码器:简直一切
- 点播、直播
开放规范、免费运用,可放入多种媒体信息,且不限数量。并且是现在唯一一个支撑封装ASS字幕的格局。
参阅
- Comparison of video container formats – Wikipedia
- mp4文件格局解析 – 简书
- 多媒体容器格局变迁史 | 随写 – XinoAssassin’s Blog