视频封装格式之mkv--1
Matroska是一种多媒体封装格式,这个封装格式可把多种不同编码的视频及16条或以上不同格式的音频和语言不同的字幕封装到一个Matroska Media档内。它也是其中一种开放原始码的多媒体封装格式。很多人把Matroska当作为mkv,其实mkv只是Matroska媒体系列的其中一种档案格式。
Matroska媒体定义了三种类型的档:MKV(Matroska Video File,视讯档,可以包含音讯和字幕)、MKA(Matroska Audio File,单一的音讯档,可以有多条及多种类型的音轨)和MKS(Matroska Subtitles,字幕文件),这三种文件中以MKV最为常见,是一种万能的封装容器。
2002年12月7日开始开发,是多媒体封装格式科研计划之一,其采用EBML(Extensible Binary Meta Language,可扩展的二进制语言)取代其他的二进制格式,其有很多优点,节省空间,容易扩展等。
1. EBML可扩展的二进制语言
EBML是一种类似于XML格式的可扩展二进制语言,是用可变长度的整数存储,以节省空间每个EBML元素都有ID(属性类型)、size(后面data部分的大小)和data(实际的数据)三部分组成,
typedef struct EBML{
vint ID; //ID的类型长度是可变的
vint size; //size的类型长度是可变的
char[size] data;///数据
};
ID和size的长度是不固定的,需要通过计算得到,长度=1+整数前缀0比特的个数,举例如下,mkv文件中一段16进制表示的数据:
.....42 82 88 6D 61 74 72 6F 73 6B 61 42 87 81 01......
1. 将0x42转成二进制为01000010,按照上面规则前面有1个0 所以知道ID的长度为2个字节,也就是0x4282为ID值;
2. 将0x88 转成2进制为10001000,1为开头,长度就是1,去掉前缀1变成了00001000,也就是size的值为 8;
3. 接下来的8个字节就是data值:6D 61 74 72 6F 73 6B 61,根据上面ID值查表得知这个EMBL名称为DocType,也就是说data的内容是string格式,所以转成ASKII码data值就是“matroska” 和后面显示的一致。