加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MKV文件格式详解

(2013-01-16 14:46:24)
分类: 多媒体中间件平台

所有内容来自于MKV的官方spec。

MKV是基于EBML(extensible Binary Meta language,一种类似于XML的语言)语法定义的一种多媒体容器格式.

MKV文件格式现在被广泛的使用,包括VP8的webm其实也是基于MKV格式http://www.webmproject.org/docs/container/

                               EBML 语法

EBML语法中的element结构如下:

    http://s2/mw690/80ce3a55g7b89d632a661&690
包括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 顶层element

MKV文件从最顶层来看,只包含2个elements: EBML 和segment。

每一个MKV文件只能有一个EBML element.

   http://s1/mw690/80ce3a55gd36244b1d760&690

MKV中的EBML数据:

  http://s15/mw690/80ce3a55gd3626ca0787e&690

从上面的图中可以看到,在MKV中EBML段描述了EBML版本,长度等信息,具体见下图:

  http://s16/mw690/80ce3a55gd36276aa78bf&690

 

在上表中可以看到,MKV为EBMLelement中的每一个元素都提供了default值,这表示MKV可以允许提供一个空的EBML element,值都使用default值。

 

SEGMENT:

http://s16/mw690/80ce3a55g7b89da370a1f&690

segment中包含了很多的master elements:

http://s12/mw690/80ce3a55gd3628f68ee3b&690

                     Segment中的master elements

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。


 


 

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有