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

Name Version Updated
(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

【多媒体封装格式详解】---MKV的更多相关文章

  1. 多媒体封装格式详解---MP4

    MP4文件格式详解——结构概述 http://blog.csdn.net/pirateleo/article/details/7061452 一.基本概念 1. 文件,由许多Box和FullBox组成 ...

  2. 【多媒体封装格式详解】--- AAC ADTS格式分析

    ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式. 记得第一次做demux的时候,把AAC音频的ES流从FLV封装格式中抽出来送给硬件解码器时 ...

  3. (转)【多媒体封装格式详解】--- AAC ADTS格式分析

     出自:http://blog.csdn.net/tx3344/article/details/7414543 http://www.it6655.com/2012/08/aac-adts-html ...

  4. 【多媒体封装格式详解】---MP4【4】

    前面介绍过的几种格式flv.mkv.asf等.他们音视频的数据包一般都是按照文件的顺序交叉安放.你解析完头部信息后.剩下的一般就按照文件顺序一个数据包一个数据包的解析就行了.但是MP4完全不是这种概念 ...

  5. FLV视频封装格式详解

    FLV视频封装格式详解 分类: FFMpeg编解码 2012-04-04 21:13 1378人阅读 评论(2) 收藏 举报 flvheaderaudiovideocodecfile 目录(?)[-] ...

  6. 【转】FLV视频封装格式详解

    Overview Flash Video(简称FLV),是一种流行的网络格式.目前国内外大部分视频分享网站都是采用的这种格式. File Structure 从整个文件上开看,FLV是由The FLV ...

  7. H.264标准(一)mp4封装格式详解

    在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...

  8. 以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解

    转载:http://www.cnblogs.com/lifan3a/articles/6649970.html 以太网帧格式.IP数据报格式.TCP段格式+UDP段格式 详解   1.ISO开放系统有 ...

  9. java分享第十五天(log4j 格式详解)

    log4j 格式详解  log4j.rootLogger=日志级别,appender1, appender2, -. 日志级别:ALL<DEBUG<INFO<WARN<ERRO ...

随机推荐

  1. Redis 一:安装篇

    .安装环境,虚拟机 + centos6. PS::前提已经安装了yum的情况下 第一步:安装 mkdir /usr/redis 新建redis目录 cd /usr/redis 进入目录 wget ht ...

  2. Xaml代码格式设置

    Xaml格式化后属性分行显示的设置方法为 找到Tools->Text Editor->Xaml->Formatting->Spacing,选择Position each att ...

  3. cadence 16.6 Pspice 仿真步骤

    从ADI官网下载后缀为 cir 的文件,AD8210 为例 进行仿真 1 打开 Cadence -> Release 16.6 -> PSpice Accessories -> Mo ...

  4. Fat-tree 胖树交换网络

    胖树架构下,网络带宽不收敛 传统的树形网络拓扑中,带宽是逐层收敛的,树根处的网络带宽要远小于各个叶子处所有带宽的总和. 而胖树网络则更像是真实的树,越到树根,枝干越粗,即:从叶子到树根,网络带宽不收敛 ...

  5. 【Nhibernate】入门 踩雷篇

    总结(喜欢写在前面,记性不好老忘记解决问题时的思路): 使用框架一般不会完整的看文档,直接上来就搞,踩雷是必须的,重要的是遇到雷的时候要快速变换思路,是不是姿势不对(文件位置不对) 提高解决问题的速度 ...

  6. 【iis错误码】IIS 服务 这些年遇到的错误码

      II 发生错误,客户端似乎有问题.例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息. 400 - 错误的请求. 401 - 访问被拒绝.   -- 暴力添加everyone用户,  i ...

  7. 关于php框架

    最近学习yii2.0 强哥原班人马开发,不得不看 同时也需要关注一下drupal8和symfony2

  8. Android开发笔记一(hello world)

    UI: <Button android:layout_width="wrap_content" android:layout_height="wrap_conten ...

  9. iOS 进阶 第五天(0330)

    0330 cell的一些常见属性 设置cell右边指示器的类型 设置cell右边指示器的view cell的backgroundView和selectedBackgroundView cell的bac ...

  10. fawef

    欢迎使用马克飞象 @(示例笔记本)[马克飞象|帮助|Markdown] 马克飞象是一款专为印象笔记(Evernote)打造的Markdown编辑器,通过精心的设计与技术实现,配合印象笔记强大的存储和同 ...