http://blog.csdn.net/tx3344/article/details/8162656#

http://blog.csdn.net/tx3344/article/details/8176288

Matroska 开源多媒体容器标准。MKV属于其中的一部分。
Matroska常见的有.MKV视频格式、MKA音频格式、.MKS字幕格式、.MK3D files (stereoscopic/3D video).

官方介绍文档:

http://www.matroska.org/technical/diagram/index.html#detailed

  • 拆Blocks, seek及错误保护
  • 没有限制可包含多少或多长时间的数据(开发者通常限制在5s或5m之内)
  • 每一个Cluster的开头是一个时间戳(通常是Cluster中第一个block的播放时间,but it doesn't have to be.)
  • 每一个Cluster含有一个或多个BlockGroups
  • 每个BlockGroup包含一个block data和与该block相关的任何信息
  • The ReferenceBlock shown above, in the BlockGroup, is what we use instead of the basic "P-frame"/"B-frame" description.
  • Cues:

  • 用于seek
  • 十分灵活, 可以为每一个block建立索引. 对于视频文件, 也可以仅对关键帧建立索引
  • 有两个时间戳需要注意:

  • Cluster中的时间戳  =>相对于整个文件
  • Block 结构中的时间戳=>相对于该Cluster中的时间戳
  • data部分为ID所标识属性的实际数据

    上面可以看到ID和size的类型都是vint,vint(Unsigned Integer Values of Variable Length)可变长度无符号整型,比传统32/64位整型更加节省空间。

    长度计算方法为

    长度 = 1 +整数前缀0比特的个数.

    从MKV文件中简单接一段来举个例子。这是16进制表示方式

    因为每个EBML元素都是由ID size data 三部分组成,我们就按照这些来分析。

    将0x428 转成2进制 为 按照上面规则  前面有1个0 所以知道ID的长度为2,也就是0x4282为ID值。

    将0x88 转成2进制为 10001000 1为开头 长度就是1,去掉前缀1变成了00001000 ,也就是 size的值为

    DocType 也就是说data的内容是string格式,所以转成askII码 data值就是“matroska” 和后面显示的一致。

    DocType = matroska。

    yingc@yingc:~/download$ hexdump  -n 128 -C V5003\[[email protected].\ 1080P\(1840x1000\).\ AAC\ 1.14M\ \]\ Mobile.Gundam.mkv 
    00000000  1a 45 df a3 93 42 82 88  6d 61 74 72 6f 73 6b 61  |.E...B..matroska|
    00000010  42 87 81 01 42 85 81 01  18 53 80 67 01 00 00 01  |B...B....S.g....|
    00000020  36 d7 f2 4a 11 4d 9b 74  d1 4d bb 8c 53 ab 84 15  |6..J.M.t.M..S...|
    00000030  49 a9 66 53 ac 82 10 03  4d bb 8c 53 ab 84 16 54  |I.fS....M..S...T|
    00000040  ae 6b 53 ac 82 10 ce 4d  bb 8f 53 ab 84 11 4d 9b  |.kS....M..S...M.|
    00000050  74 53 ac 85 01 36 d6 d0  d8 4d bb 8f 53 ab 84 1c  |tS...6...M..S...|
    00000060  53 bb 6b 53 ac 85 01 36  d6 04 cf 4d bb 8c 53 ab  |S.kS...6...M..S.|
    00000070  84 10 43 a7 70 53 ac 82  15 ca ec 4f aa 00 00 00  |..C.pS.....O....|
    00000080
    yingc@yingc:~/download$