视频封装格式之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(实际的数据)三部分组成,
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]
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]
相关文章推荐
- java native关键字
- 20145236 《Java程序设计》实验二实验报告
- 进程间的通信方式与进程间同步方式
- php session和cookie
- IE请求和响应报文解释
- BestCoder Round #80(B)高精度
- 一些linux的基本操作
- Oracle 11g standby主从配置
- Oracle笔记(三) Scott用户的表结构
- 水仙花数的输出
- 武器游戏
- 多文件游戏
- Android开发之开发者头条(一)启动页实现
- 一个字符串反转的小例子
- Oracle笔记(二) SQLPlus命令
- http2.0 相对于 http1.1的优势
- 剑指offer(八)之斐波那契数列
- 201301 JAVA题目0-1级
- c++搜索二叉树的基本操作
- 设计模式-可复用面向对象软件的基础 [读书笔记]