【多媒体封装格式详解】---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:
- 该文件所使用的EBML版本及类型
Metaseek:
- 其包含其他组在文件中的位置,如:Track information, Chapters, Tags, Cues, Attachments等.
- 该元素不是必要的,如果没有该元素,要找到其他的Level 1 elements需要搜索整个文件.这是因为其他items可已任意顺序排列,如Chapters可能在Clusters的中间, 这是EBML和Matroska的的灵活性的一部分.
Segment Information:
- 包含文件的基本信息.包括文件title,一个唯一的ID,使得该文件可以在世界各地被识别(可能是一系列文件的一部分)。
Track:
- 包含关于每个轨道的基本信息, 如音视频标识, 分辨率, 采样率, 编码类型及编码私有数据(private data)
Chapters:
- 其包含所有的章节(是jump到音视频的一种方式(通过设置预定义的点))
Clusters:
- 包含所有的Clusters(包含所有轨道的视频/音频帧)
Cueing Data:
- 包含每一个轨道的索引. 很像MetaSeek, 但其用于seek到指定的播放时间. 如果没有该section也可以seek, 但是会非常麻烦(播放器必须搜索整个文件去获取正确的时间戳)
Attachment:
- 可以附加任何类型的文件(What you attach is up to you.)
Tags:
- 包含该文件及所有轨道的标签(类似ID3中的tags, 包含视频制作者, 签发者, 演员信息等)
注:ebml中同级别的元素没有特定的顺序
|
complex representation:
Header:
- 必须放在文件头部, 这样库才能知道是否能读取该文件
- EBML是非常简单的, 其并不只是用于Matroska, 同样也用于其他一些潜在的应用.正因为如此, 其才有版本更新的可能性.EBMLVersion元素可以让解析器知道是否该读取该文件
DocType:
- 其指明这是一个Matroska文件
- 如果是其他类型的ebml文件, 那Matroska的解析器虽然可以解析ebml, 但其无法处理文件内部的数据
Meta Seek:
- 让parser知道文件中主要部分的位置.
- 仅有一个SeekHead
- 通常用来获取文件的信息
- 当回放文件seek时, 使用的是Cues
Segment Information:
- 提供识别该文件的信息.包含title和SegmentUID(一个随机数)
Track:
- 由Name + TrackNumber + TrackType组成
- 同时包含语言类型, 编码类型, TrackUID等
Clusters:
- 拆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中的时间戳
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的更多相关文章
- 多媒体封装格式详解---MP4
MP4文件格式详解——结构概述 http://blog.csdn.net/pirateleo/article/details/7061452 一.基本概念 1. 文件,由许多Box和FullBox组成 ...
- 【多媒体封装格式详解】--- AAC ADTS格式分析
ADTS全称是(Audio Data Transport Stream),是AAC的一种十分常见的传输格式. 记得第一次做demux的时候,把AAC音频的ES流从FLV封装格式中抽出来送给硬件解码器时 ...
- (转)【多媒体封装格式详解】--- AAC ADTS格式分析
出自:http://blog.csdn.net/tx3344/article/details/7414543 http://www.it6655.com/2012/08/aac-adts-html ...
- 【多媒体封装格式详解】---MP4【4】
前面介绍过的几种格式flv.mkv.asf等.他们音视频的数据包一般都是按照文件的顺序交叉安放.你解析完头部信息后.剩下的一般就按照文件顺序一个数据包一个数据包的解析就行了.但是MP4完全不是这种概念 ...
- FLV视频封装格式详解
FLV视频封装格式详解 分类: FFMpeg编解码 2012-04-04 21:13 1378人阅读 评论(2) 收藏 举报 flvheaderaudiovideocodecfile 目录(?)[-] ...
- 【转】FLV视频封装格式详解
Overview Flash Video(简称FLV),是一种流行的网络格式.目前国内外大部分视频分享网站都是采用的这种格式. File Structure 从整个文件上开看,FLV是由The FLV ...
- H.264标准(一)mp4封装格式详解
在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...
- 以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解
转载:http://www.cnblogs.com/lifan3a/articles/6649970.html 以太网帧格式.IP数据报格式.TCP段格式+UDP段格式 详解 1.ISO开放系统有 ...
- java分享第十五天(log4j 格式详解)
log4j 格式详解 log4j.rootLogger=日志级别,appender1, appender2, -. 日志级别:ALL<DEBUG<INFO<WARN<ERRO ...
随机推荐
- Python-Day3 Python基础进阶之集和/文件读写/函数
一.集和 集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 1.创建集合 >>> s ...
- 管道和FIFO
pipe 子进程从终端读取一个文件名, 通过管道将文件名传递给父进程 父进程收到文件名后, 读取文件内容并通过管道传递给子进程 子进程接收到文件内容并输出到终端 #include <stdio. ...
- CentOS 6.3 配置 yum
ContOS 配置yum:1.cd /etc/yum.repos.d2.创建个任意目录,将所有文件移动到创建的目录中,除了CentOS-Media.repo3.编辑CentOS-Media.repov ...
- 在Debian中安装VMware Workstatption 12
在Debian中安装VMware Workstatption 12-----------------------------------------------> 下载文件: *vmwar ...
- 大晚上装CocoaPods出现错误坑爹
大晚上装CocoaPods出现错误坑爹 [!] Pod::Executable clone 'https://github.com/CocoaPods/Specs.git' master xcrun: ...
- 分布式文件系统 - FastDFS
分布式文件系统 - FastDFS 别问我在哪里 也许我早已不是我自己,别问我在哪里,我一直在这里. 突然不知道说些什么了... 初识 FastDFS 记得那是我刚毕业后进入的第一家公司,一个技术小白 ...
- 设计模式之原型模式(Prototype)
1.出现原因 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作:由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口. 如何应对这种变化?如何向“客户程序(使用这些对 ...
- 贱贱的美团安卓客户端---如何实现让安卓app在应用列表获得较靠前的位置
起因: 自打愚安我开始使用android设备以来,一直觉得google还算厚道,应用列表里的顺序一直都是依据APP的名称,按照先中文(拼音字母表顺序),后英文(字母表顺序)的原则进行排序的,并没有说G ...
- ListView防止滑动变色的小技巧
listview滑动时会变成白色,如果背景色不是白色的话可以通过设置setCacheColorHint(Color.TRANSPARENT);来避免变色,.对应的xml也可以进行设置.
- 【转】 Android经验: proguard 阻碍 webview 正常工作
转自:http://blog.csdn.net/span76/article/details/9065941 WebView 常识 使用 Alert 提供消息 我在页面经常用 Alert 提供消息, ...