【多媒体封装格式详解】---MKV

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

 

Header
Meta Seek Information
Segment Information
Track
Chapters
Clusters
Cueing Data
Attachment
Tagging

 官方介绍文档部分翻译:

Header:

  1. 该文件所使用的EBML版本及类型

Metaseek:

  1. 其包含其他组在文件中的位置,如:Track information, Chapters, Tags, Cues, Attachments等.
  2. 该元素不是必要的,如果没有该元素,要找到其他的Level 1 elements需要搜索整个文件.这是因为其他items可已任意顺序排列,如Chapters可能在Clusters的中间, 这是EBML和Matroska的灵活性的一部分

Segment Information:

  1. 包含文件的基本信息.包括文件title一个唯一的ID,使得该文件可以在世界各地被识别(可能是一系列文件的一部分)

Track:

  1. 包含关于每个轨道的基本信息, 如音视频标识, 分辨率, 采样率, 编码类型及编码私有数据(private data)

Chapters:

  1. 其包含所有的章节(是jump到音视频的一种方式(通过设置预定义的点))

Clusters:

  1. 包含所有的Clusters(包含所有轨道的视频/音频帧)

Cueing Data:

  1. 包含每一个轨道的索引. 很像MetaSeek, 但其用于seek到指定的播放时间. 如果没有该section也可以seek, 但是会非常麻烦(播放器必须搜索整个文件去获取正确的时间戳)

Attachment:

  1. 可以附加任何类型的文件(What you attach is up to you.)

Tags:

  1. 包含该文件及所有轨道的标签(类似ID3中的tags, 包含视频制作者, 签发者, 演员信息等)

 注:ebml中同级别的元素没有特定的顺序

Level 0
Grouping
Level 1
Level 2 Level 3
EBML
Header
EBMLVersion
   
DocType
   
Segment
Meta Seek Information
SeekHead
Seek
SeekID
SeekPosition
Seek
SeekID
SeekPosition
Segment Information
Info
Title  
SegmentUID  
Track
Tracks
TrackEntry
Name
TrackNumber
TrackType
TrackEntry
Name
TrackNumber
TrackType
Chapters
Chapters
Edition Entry  
Clusters
Cluster
Timecode  
BlockGroup Block
BlockGroup
Block
ReferenceBlock
BlockGroup Block
Cluster
Timecode  
BlockGroup Block
BlockGroup Block
BlockGroup Block
BlockGroup
Block
BlockDuration
Cueing Data
Cues
CuePoint
CueTime
CuePosition
CuePoint
CueTime
CuePosition
Attachment
Attachments
AttachedFile
FileName
FileData
AttachedFile
FileName
FileData
Tagging
Tags
Tag
MultiTitle
Language
Tag
MultiTitle
Language

 complex representation:

Header:

  1. 必须放在文件头部, 这样库才能知道是否能读取该文件
  2. EBML是非常简单的, 其并不只是用于Matroska, 同样也用于其他一些潜在的应用.正因为如此, 其才有版本更新的可能性.EBMLVersion元素可以让解析器知道是否该读取该文件

DocType:

  1. 其指明这是一个Matroska文件
  2. 如果是其他类型的ebml文件, 那Matroska的解析器虽然可以解析ebml, 但其无法处理文件内部的数据

 Meta Seek:

  1. 让parser知道文件中主要部分的位置.
  2. 仅有一个SeekHead
  3. 通常用来获取文件的信息
  4. 当回放文件seek时, 使用的是Cues

Segment Information:

  1. 提供识别该文件的信息.包含title和SegmentUID(一个随机数)

 Track:

  1. 由Name + TrackNumber + TrackType组成
  2. 同时包含语言类型, 编码类型, TrackUID等

 Clusters:

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

Cues:

  1. 用于seek
  2. 十分灵活, 可以为每一个block建立索引. 对于视频文件, 也可以仅对关键帧建立索引

 

有两个时间戳需要注意:

  1. Cluster中的时间戳  =>相对于整个文件
  2. Block 结构中的时间戳=>相对于该Cluster中的时间戳

 

 

Libs

NameVersionUpdated
(on this page)
Link
libebml 1.3.3 2015-10-21 Download
Comment:
libmatroska 1.4.4 2015-10-20 Download
Comment:
yamka   2010-04-21 Homepage
Comment:

 

http://www.matroska.org/downloads/windows.html

1.EBML(Extensible Binary Meta Language)


MKV是建立在EBML这种语言的基础上,所以要了解MKV格式需要先了解EBML这种语言。

EBML是一种类似于XML格式的可扩展二进制元语言,使用可变长度的整数存储,以节省空间。

EBML基本元素结构:

 

typedef struct {
vint ID // EBML-ID
vint size // size of element
char[size] data // data
} EBML_ELEMENT;

ID标志属性类型

size为后面data部分的大小

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的值为 8.

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

DocType = matroska。

yingc@yingc:~/download$ hexdump  -n 128 -C V5003\[HP@L4.1.\ 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$ 

 

#define EBML_ID_HEADER             0x1A45DFA3
1090 static int matroska_probe(AVProbeData *p)
1091 {
1092     uint64_t total = 0;
1093     int len_mask = 0x80, size = 1, n = 1, i;
1094
1095     /* EBML header? */
1096     if (AV_RB32(p->buf) != EBML_ID_HEADER)
1097         return 0;

 

 

aa

posted @ 2014-07-09 13:19  静之深  阅读(1911)  评论(0编辑  收藏  举报