Matroska 开源多媒体容器标准。MKV属于其中的一部分。
Matroska常见的有.MKV视频格式、MKA音频格式、.MKS字幕格式、.MK3D files (stereoscopic/3D video).
1.EBML(Extensible Binary Meta Language)
MKV是建立在EBML这种语言的基础上,所以要了解MKV格式需要先了解EBML这种语言。
EBML是一种类似于XML格式的可扩展二进制元语言,使用可变长度的整数存储,以节省空间。
EBML基本元素结构:
typedef struct {
vint ID // EBML-ID
vint size // size of element
char[size] data // data
} EBML_ELEMENT;
ID标志属性类型
size为后面data部分的大小
data部分为ID所标识属性的实际数据
上面可以看到ID和size的类型都是vint,vint(Unsigned Integer Values of Variable Length)可变长度无符号整型,比传统32/64位整型更加节省空间。
长度计算方法为
长度 = 1 +整数前缀0比特的个数.
(解释:由于ID和size是可变长度无符号整形,所以此处的长度是ID或size所占的字节数,对于ID,对应字节数的值就是ID的值;对于size,去掉前缀的值就是size的值,即其后data的size大小。)
从MKV文件中简单接一段来举个例子。这是16进制表示方式
因为每个EBML元素都是由ID size data 三部分组成,我们就按照这些来分析。
将0x42 转成2进制 为 01000010 (不满8位的拿0补齐)按照上面规则 前面有1个0 所以知道ID的长度为2,也就是0x4282为ID值。
将0x88 转成2进制为 10001000 1为开头 长度就是1,去掉前缀1变成了00001000 ,也就是 size的值为 8.
接下来的8个字节就是data值:6D 61 74 72 6F 73 6B 61 根据上面ID值查表得知 这个EMBL 名称为DocType 也就是说data的内容是string格式,所以转成askII码 data值就是“matroska” 和后面显示的一致。
所以这个EBML元素就解析出来了
ID=0x4282;
size=8;
data=“matroska” ;
得到的信息就是 DocType = matroska。
2.整体结构
让我们看看MKV的整体框架结构。
|
从整个MKV文件整体来看可分为2大部分:
EBML Header和Segment。
EBML Header由EBMLVersion、DocType等子元素组成,包含了文件的版本、文档类型等相关信息。
Segment部分保存了媒体文件的视频和音频的实际数据,其data部分又可以分为SeekHead、Tracks、Cluster等若干子元素。