您的位置:首页 > 其它

视频封装格式之mkv--1

2016-04-17 10:30 281 查看
视频封装格式之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” 和后面显示的一致。

[align=left]  所以这个EBML元素就解析出来了ID=0x4282;size=8;data=“matroska” ;后面的数据,同理得知42 87是ID值,长度是81(一个字节),后面是其值01,查表可知4287代表DocTypeVersion,值类型是整数,于是解析后的结果是ID=0x42 87,size=1,data=1。[/align]
[align=left] 综上,此段EBML码解析后的结果是:DocType=matroska,DocTypeVersion=1。[/align]
[align=left]2. MKV文件的整体框架[/align]
[align=left] 框架主要有两部分构成EBML Header和Segment。每个EBML元素都有自己的级别,每个高一级别的元素由若干个次一级的元素组成。[/align]
[align=left] EBML Header主要有EBMLVersion、DocType等子元素组成,包含了文件的版本、文档类型等相关信息;[/align]
[align=left] Segment是音频相关信息的保存地方,其有次一级的Track、Clusters、Cueing Data等组成:[/align]
[align=left] [/align]
[align=left] [/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: