多媒体封装协议之Matroska封装协议介绍

一、背景介绍

Matroska多媒体容器(Multimedia Container)是一种开放标准的自由的容器和文件格式,是一种多媒体封装格式,能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨道。所以其不是一种压缩格式,而是Matroska定义的一种多媒体容器文件。其目标是作为一种统一格式保存常见的电影、电视节目等多媒体内容。在概念上Matroska和其他容器,比如AVI、MP4或ASF(Advanced Sreaming Format,即高级流格式)比较类似,但其在技术规程上完全开放,在实现上包含很多开源软件。可将多种不同编码的视频及16条以上不同格式的音频和不同语言的字幕流封装到一个Matroska 媒体文件当中。最大的特点就是能容纳多种不同类型编码的视频、音频及字幕流。
(注:采用Matroska封装协议的文件有很多,如mkv,webm,为了便于描述,下文中的matroska与mkv等价)

二、语法组成

与MP4封装协议类似, Matroska文件是由一个个EBML elements组成(MP4是由一个个box/atom组成),
MP4的box的ID与size所占字节一般为4个字节,Matroska的element的ID和size所占的字节数是不定的,
根据实际情况来分配字节数。如下:

typedef struct {
vint ID // EBML-ID
vint size // size of element
char[size] data // data
} EBML_ELEMENT;
为了说明element的ID和size所占的字节数是变长的,我们使用vint(Unsigned Integer Values of Variable Length)来表示这种类型,
vint的len = 1 + [number_of_leading_zero_bits].
如mkv文件的第一个内容为0x1A,二进制位 0001 1010;
Leading_zero_bits的个数为3,故此ID的len = 1 + 3 = 4;
继续往后对三个字节,可知此ID为 1A 45 DF 43, 查表可知,此ID为 EBML Header。

三、文件结构

先整体看一下mkv的文件结构
多媒体封装协议之Matroska封装协议介绍_第1张图片
从图中可以看出,mkv文件整体由两部分组成,EBML 与Segment
EBML用于描述此文件采用了EBML这种方式编码,此部分里面的内容与解码不相关;
而Segment里面包含了各种与解码信息相关的内容

3.1 Segment组成

3.1.1 SEEKHEAD

此部分用于快速seek文件,里面包含了其他部分相对于Segment起始位置的偏移量(如:记载了TRACKS的偏移量),
方便快速找到其他部分,如果没有,也不影响解码;

多媒体封装协议之Matroska封装协议介绍_第2张图片
如:本文件记录了三处seek点,分别为 SEGMENTINFO, TRACKS和CUES部分相对于Segment起始位置的偏移量,便于快速seek至对应的部分;

3.1.2 Void

空的element,没有什么作用

3.1.3 SEGMENTINFO

记录一些SEGMENT的通用信息,如时间戳的基准单位TimeCodeScale等信息,

多媒体封装协议之Matroska封装协议介绍_第3张图片
TimeCodecScale:解码时间基础单位,计算duration时需要乘以此值获得对应的ns数;
MuxingApp与WritingApp表示如下:
多媒体封装协议之Matroska封装协议介绍_第4张图片
Duration:此segment的duration,注意duration的内容要以float形式来查看,如本文件的duration的内容为:44 89 84 45 11 D0 00,Duration为45 11 D0 00,转换为float数为2333.0000
故本segment的时长为 duration x TimeCodeScale = 2333.0000 x 1000000ns = 2.333s
由于本文件只有一个segment,故文件的duration也为2.333s
注意;mkv协议中可以运行一个文件中包含多个segment,但为了兼容性,请不要包含多个segment。
DateUTC表示创建时的日期,距离Jan 01, 2001, 0:00:00 GMT+0h的纳秒数
SegmentUID, Segment独一无二的标示符。

3.1.4 TRACKS

各路track的metaData,注意各路track的数据在Cluster里面,而不是位于TRACKS里面

多媒体封装协议之Matroska封装协议介绍_第5张图片
本文件中有两路track,
TrackNumber: cluster数据中对应track的number号,用于区分不用的track
TrackUID: 文件中此路track独一无二的标示
TrackType:track类型,如下:
多媒体封装协议之Matroska封装协议介绍_第6张图片
Flaglacing: 指示一个Block中是否存放多帧视频或音频(默认为0,存放一帧视频或者音频)
MinCache: 指示播放时需要最新的真存buffer数,一般为0或者没有这一部分
CodecID:字符串的形式来表示此路track的编码格式,如V_MPEG4/ISO/AVC,
可以参考https://matroska.org/technical/specs/codecid/index.html来查看具体CodeID信息
CodecPrivate:配置帧信息
DefaultDuration:每一帧的duration,以ns为单位,可以根据此计算帧率
Video:存放宽高,显示宽高信息
Audio:存放采样率,通道数等信息
Language:一般为und,代表Undetermined,可以查询ISO639-2 .标准获取对应信息
多媒体封装协议之Matroska封装协议介绍_第7张图片
TimeCode:当前Cluster的起锚时间,注意乘以TimeCodecScale来获取对应的值
SimpleBlock:不包含附件的Block,里面存放音频或者视频的数据包

3.1.5 CUES:里面存放视频关键帧的信息

多媒体封装协议之Matroska封装协议介绍_第8张图片
由一包包CuePoint组成,每个CuePoint由关键帧的时间戳和关键帧在Segment中的相对位置pos组成,便于快速seek

##附录:
mkv解析工具下载地址
http://download.csdn.net/detail/u012188065/9688209
浮点数与十六进制转换工具下载地址
http://download.csdn.net/detail/u012188065/9688211
mkv封装协议下载地址
http://download.csdn.net/detail/u012188065/9688213
ISO639-2 协议下载地址
http://download.csdn.net/detail/u012188065/9688217

你可能感兴趣的:(媒体解析协议)