MATROSKA(MKV)格式仅仅包含两种Top Level Elements,即EBML  Header和Segment。

EBML Header用来描述一个EBML文件,而且一个文件只包含一个EBML Header。更多的EBML Header将会被读取它的应用程序忽略掉。MKV合成器在合成多个文件时可能会出现这样的情况,即包含多个EBML Header。EBML Header包含的内容包括:编码器版本、解析器版本、文件类型等。

Segment包含多媒体数据和各个必要的Header信息。一个MKV文件可以包含多个Segment,但不提倡这样做,因为并不是所有的工具都能够正确的处理多segment。

1、Element Inside Segment

包含在Segment中的element被称为Level 1 Element。Segment包含的element如表1所示。

表1 Segment包含的elements

2、SeekHead

SeekHead包含了一个关于Segment中的Element的位置的列表,列表的每个元素被称为Seek Element。每个Seek Element由Element ID和Position组成,如表2所示。

表2 Seek Element包含的元素

在SeekHead中,没有明确的说明在该别表中包含了多少个Seek Element,因此需要一个一个进行解析并获得Seek Element的个数。比如, 标识Seek Element的EBML-ID为0X4DBB,因此,到解析出0X4DBB时,就说明出现了一个Seek Element。

3、Cluster

Cluster包括多媒体数据和时间跨度。虽然不强制坚持elements的顺序,但是最好不要在第一个BlockGroup/SimpleBlock之后出现非BlockGroup/SimpleBlock。

Cluster中的Block有两种类型:

(1)BlockGroup,这种block带有一些附加信息,比如参考数据等。

(2)SimpleBlock,这种block不带有附加信息,而且开销比较小。

Block的格式如下所示:

BLOCK {
    vint TrackNumber
    sint16 Timecode      // relative to Cluster timecode
    int8 Flags                  // lacing , keyframe , discardable
    if ( lacing ) {
        int8 frame_count − 1
        if ( lacing == EBML lacing ) {
            vint s i ze [0]
            s vint s i ze [1 . . frame_count−2]
        } el se i f (lacing == Xiph lacing ) {
            int8 size [size of < leading (frame_count−1) frames> / 255 + 1]
        }
    }
    int8 [ ] data
}

其中,lacing有三种类型:Xiph lacing、EBML lacing和Fixed lacing。Lacing 是一种技术,这种技术允许在一个block中包含多个frame数据,这样可以降低开销,而且在后面对Lacing的处理过程中可以很容易的将frame分开。通常,在Lacing中的最后一个frame的大小是不保存的,因为它可以通过block的大小、block header的大小以及其他的frame的大小推算出来。

(1)Xiph lacing:将每个frame的大小编码成八位整数的和。如果一个数值小于255,说明下一个数值是一个frame的。例如:

size = {187, 255, 255, 120, 255, 0, 60}

改Lacing包含四个frame,它们的大小分别为:187、255 + 255 + 120 = 630,、255 + 0 = 255、60。

(2)EBML Lacing:lace中的第一个frame的大小为size[0],第i个frame的大小为size[i] - size[i - 1]。

(3)Fixed Lacing:lace中的所有frame具有相同的大小,因此不需要知道lace中frame的个数就足够了。

4、Cues

Cues包含了有助于seek操作的有用信息。每个Cue包含一个CuePoint element,里面包含了时间戳和一个列表,类表的每个元素由track号和cluster position[,cluster的block号]。通常情况下,CuePoint应该仅仅只指向关键帧。每个CuePoint包含一个指向一个timecode的entry或者一个entry列表,该entry列表中有一个entry指向track。

每个CuePoint element包含两个重要的element:CueTime和CueTrackPositions。

CueTime:与CuePoint相关的Clusters或Blocks的timecode。

CueTrackPositions:在该位置能够找到与CueTime相关的Cluster或Block。

其中,CueTrackPositions包含的element如表3所示:

表3 CueTrackPositions包含的element

5、Chapters

Chapters包含了在Segment中能够找到的所有的editions和chapters。MKV文件中的Chapters是非常有用的而且处理方式也比较复杂。Chapters element包含了一个EditionEntry element,用来描述Edition。一个edition会包含一组关于chapter的定义,因此,如果有多个edition,就意味着有多组关于chapter的定义。当存在一个playlist的时候这种情况就会出现,播放完一个chapter之后播放另一个,而且在这些chapter之间会有间隙。EditionEntry包含的element如表4所示。

表4 EditionEntry包含的element

MATROSKA文件格式之Segments学习相关推荐

  1. Matroska文件格式标准

    转载自:http://matroska.org/technical/specs/index.html Specifications View Revisions Status of this docu ...

  2. linux在cd后直接显示文件格式,Linux命令学习笔记之一目录与文件基本操作

    目录操作 cd:进入目录 基本格式:cd 目录名 例子: 1).在当前目录进入子目录a,输入"cd a" 2).在当前目录进入根目录下的子目录tmp,输入"cd /tmp ...

  3. android上传sd卡文件格式,Android开发学习:向模拟器的sdcard中添加文件

    向模拟器的sdcard中添加文件有两种方法: 1.在eclipse的DDMS视图中操作 启动eclipse---打开DDMS视图---选择File Explorer,出现下面的窗口 选中sdcard文 ...

  4. obj文件格式与mtl文件格式

    .obj文件格式与.mtl文件格式 最近在学习obj文件格式,上网查了些资料,很难找到比较全面的文章,尤其是对.mtl文件的说明甚少.今天把最近搜索的资料整合了一下. 这里的obj文件格式指的是Wav ...

  5. Matroska文件解析之SimpleBlock

    分析二进制文件是一件痛苦的事情,最近在做一个关于流媒体的项目研究,涉及到webm这种开源视频文件,它其实就是用Matroska(也就是大家熟悉的MKV容器格式)包裹VP8和VBRIS,没什么特别的. ...

  6. SitePoint播客#63:有两个网站

    Episode 63 of The SitePoint Podcast is now available! This week your hosts are Patrick O'Keefe (@iFr ...

  7. Weka中数据挖掘与机器学习系列之Exploer界面(七)

    不多说,直接上干货! Weka的Explorer(探索者)界面,是Weka的主要图形化用户界面,其全部功能都可通过菜单选择或表单填写进行访问.本博客将详细介绍Weka探索者界面的图形化用户界面.预处理 ...

  8. python语言初学

    python python是一门解释性语言(C语言编写的),意味着它是逐行翻译解释代码的 python的执行程序文件格式:.py 参考学习:黑马程序员Python教程_600集Python从入门到精通 ...

  9. 天融信AlphaFuzzer测试工具 使用教程

    原文:http://blog.topsec.com.cn/ad_lab/alphafuzzer/ AlphaFuzzer1.1 AlphaFuzzer1.2 更新记录: 2015年7月30日  1.2 ...

最新文章

  1. 数据产品经理:如何做需求管控?
  2. 实践自定义UI—View
  3. byte数组转file不写入磁盘_Linux 环境写文件如何稳定跑满磁盘 I/O 带宽?
  4. python3反爬虫原理与绕过实战 网盘_Python 3反爬虫原理与绕过实战
  5. 2007年10月小记
  6. 前端学习(565):margin重叠意义
  7. Spring Data JPA 禁止自动更新
  8. C/C++中字符串与数字相互转换
  9. 解决方案-CMake error: error in configuration process, project files may be invalid(WindowsVS可参考)
  10. 分页标签commons.tld,NavigationTag,Page
  11. presto 时间函数
  12. 【中学】寻找阿姆斯特朗数
  13. matlab 图案 柱状图_科学网—使用matlab绘画柱状图,且使用不同的图案填充 - 时杰的博文...
  14. 大学C语言学习笔记(C语言程序设计第五版——谭浩强,翁凯C语言基础教程)基础、算法、程序结构、数组、函数、指针、枚举、结构、联合
  15. 2020国内外常用的BI商业智能软件
  16. php 九宫格验证码,PHP+Ajax微信手机端九宫格抽奖实例
  17. 洛谷P1478 陶陶摘苹果(升级版)【水题】
  18. 长三角政务服务“一网通办” 公积金提取 `网签合同编号`如何获取?
  19. 无限循环小数转化分数
  20. CentOS curl命令详解

热门文章

  1. 大盘点:近期最值得阅读的五本深度学习书籍
  2. 基于Vue框架的在线投票系统的设计与实现毕业设计-附源码221604
  3. excel打开空白不显示内容
  4. 我理解的组件和控件的区别
  5. 你只要掌握这项技术,我保你年薪30万~
  6. 无废话ExtJs 入门教程十七[列表:GridPanel]
  7. css: css3动画(淡入淡出)
  8. 202x年智能微模块数据中心解决方案(专业完整版)
  9. Java 泛型 ? extends 与 ? super
  10. 面试官:我们天天用注解,那你知道注解的实现原理吗?