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. 用MySQL log调试程序

    打开my.ini文件 在[mysqld]的下面加上log = c:/mysql_query.log.txt重启mysql 以后你用可以用editplus查看你运行的sql了,不用在程序里一句句的用lo ...

  2. Python开发【第一篇】Python基础之函数递归

    函数递归 递归的本质: 就是一个函数调用另外一个函数. def d(): return '123' def c(): r = d() return r def b(): r = c() return ...

  3. 通过替换frm文件方式修改表结构

    版本:5.6.16 在自己的虚拟环境中,测试创建一个表,表结构如下:mysql> drop table yoon_temp;Query OK, 0 rows affected (0.09 sec ...

  4. php用户注册

    前言 网站用户注册与登录是很常用的一个功能,本节教材就以此来演示一下 PHP 中如何开发用户注册与登录模块. 本节需要用到的重点 PHP 基础知识: PHP 中预定义 $_POST 和 $_GET 全 ...

  5. cocos2dx中的假动作,又称动作回调函数

    1.动作与动画的区别 动作是:定时器+属性的改变,是帧循环的累积效应 动画是:帧图片的播放效果,我们知道电影的播放就是快速播放的胶片,这就是动画的原理 2.假动作:又称动作回调函数 四大类假动作: c ...

  6. SQL Server数据库事务日志存储序列

    原文 原文:http://blog.csdn.net/tjvictor/article/details/5251351   如果你的数据库运行在完整或是批量日志恢复模式下,那么你就需要使用作业(job ...

  7. dbutils报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表

    今天用dbutils操作数据库,莫名地报错:com.microsoft.sqlserver.jdbc.SQLServerException: 无法识别元数据的表 检查了sql语句没有问题.经过仔细排查 ...

  8. AngularJs遇到的小坑与技巧

    1. templateURL和路由之类的要在web server下运行. 2. 使用模板replace设为true,模板里也要有相应的标签,否则不出现任何数据. 3. 1.2版本之后,ngRoute模 ...

  9. 修改tomcat 启动45秒

    当我们需要增加Tomcat的启动时间,修改方法如下:

  10. 垃圾回收 GC

    垃圾回收器的回收的对象: 垃圾回收只回收托管堆中的内存   什么样的对象才会被回收? 没有变量引用的对象.没有变量引用的对象,表示可以被回收了(null.   什么时间回收? 不确定,当程序需要新内存 ...