MKV文件格式详解

分类: 多媒体中间件平台 |
所有内容来自于MKV的官方spec。
MKV是基于EBML(extensible Binary Meta language,一种类似于XML的语言)语法定义的一种多媒体容器格式.
MKV文件格式现在被广泛的使用,包括VP8的webm其实也是基于MKV格式http://www.webmproject.org/docs/container/。
EBML语法中的element结构如下:
包括ID/size/data.至于vint这些数据类型的具体含义请参考文档。
需要注意的是一个EBML element中可以包含其它的elements(在data中),这种element称为EBML master element.甚至于Master element还可以包含其他的master element,形成了多层的嵌套。比如MKV中的track 就是这种情况。
MKV就是完全根据EBML的element来组织的文件格式,对于这种基于EBML的文件格式是非常容易扩展的,比如某个公司想设计自己的文件格式,那么可以增加新的EBML element(master element)来进行扩展。比如google定义的webm其实就是基于MKV来定制的格式:http://www.webmproject.org/docs/container/。另外,google为了增加对security的支持,还增加了部分新的elements来存储和encryption相关的信息:http://wiki.webmproject.org/encryption/webm-encryption-rfc。对于security部分的扩展,可以参考W3C:https://dvcs.w3.org/hg/html-media/raw-file/tip/encrypted-media/encrypted-media.html
MKV文件从最顶层来看,只包含2个elements: EBML 和segment。
每一个MKV文件只能有一个EBML element.
MKV中的EBML数据:
从上面的图中可以看到,在MKV中EBML段描述了EBML版本,长度等信息,具体见下图:
在上表中可以看到,MKV为EBMLelement中的每一个元素都提供了default值,这表示MKV可以允许提供一个空的EBML element,值都使用default值。
SEGMENT:
http://s16/mw690/80ce3a55g7b89da370a1f&690
segment中包含了很多的master elements:
http://s12/mw690/80ce3a55gd3628f68ee3b&690
1. SegmentInfo
这个EBML master Element主要描述了这个segment中的基本信息:
http://s16/mw690/80ce3a55gd362a681950f&690
http://s1/mw690/80ce3a55gd362aa851230&690
.....
从上面的表中可以看到,在segmentInfo这个master element下面包含了很多的element,每一个element都符合EBML element的定义(包括ID,SIZE,DATA)。
具体的内容请参考MKV的spec。
下面主要介绍一下track/cluster。
Track和cluster的差别:
比如video track、audio track等,但是track里面包含的是header信息而没有实际的sample data,实际的sample data是包含在cluster中的。
MKV中的track是一个多层嵌套的master element,下面还包含了其他的子master element比如video、audio等header信息。
下图就是track中包含的video master element下面的element的情况:
http://s2/mw690/80ce3a55g041dc36da5a1&690
....
从上图中可以看到,video master element中主要描述图像的size等信息。
Cluster: 包含sample block等实际的sample数据
http://s10/mw690/80ce3a55gd362d8f93e19&690
http://s1/mw690/80ce3a55gd362df427e50&690
其中blockGroup master element的定义如下:
http://s14/mw690/80ce3a55gd362e55ec87d&690
注意到sample block等都是以BLOCK的方式来存储数据:
http://s3/mw690/80ce3a55gd362eafc41c2&690
其中lacing的定义如下:
http://s11/mw690/80ce3a55gd362f567038a&690
问题1: MKV中的一个sample 是否要求必须是一个video frame(假设是video track)?
从xipH/EBML Lacing的结构可以看出,一个block中可以包含多个frame,并且在lacing中描述每一个frame的size。