MKV 文件格式解析

前言

MKV(Matroska Video File)是一种Matroska媒体格式的多媒体封装格式(Multimedia Container Format,简称MCF)但Matroska媒体格式除了MKV外,常见的还有MKA (Matroska Audio File)单一音频文件,可以有多条及多种类型的音轨,MKS (Matroska Subtitles)字幕文件,Matroska来自于俄语,影射俄罗斯娃娃,就是下面这个啦,表示一层包着另外一层。

MKV采用可扩展二进制元语言EBML(Extensible Binary Meta Language)来描述其文件结构,EBML用元素(Elements)来描述EBML文档,组织结构如下:

Element元素ID大端方式编码,起始位0的个数代表了ID的长度,ID长度=起始0的个数+1。除起始位0外,其余bit全1的ID为保留 ID,元素ID可以包括其子ID。

Element数据长度也采用大端方式编码,起始位0的个数代表了数据长度(包括头部)占用的字节个数,字节个数=起始0的个数+1。可以是1~8个字节:

EBML组成的文件包含EBML头和EBML体两部分。Matroska 文件可以看作是包含EBML头和Segment两部分的文件。

MKV文件分析

MKV文件分析工具有 EBML Tree Viewer  AVI-Mux GUI和MKVToolnix,下面图片是用AVI-Mux解析的某MKV文件

EBML头

Segment

Matroska 文件的segment包含了音视频数据和播放音视频数据所需要的信息。Matroska 文件中可以有多个segment,但不是所有的播放器都支持这样做。Segment的结构示意图如下:

Segment的第一级子元素元素名及ID如下:

1. SeekHead
包含多个seek entry,每一个seek entry是EBML的一种类型的元素,SeekID对应EBML元素ID。SeekPosition对应元素在Segment中的位置。这个位置的base是Segment的起始位置,SeekPosition+Segment的起始位置才是元素在文件中的绝对位置。

2. Info

包含了Segment的时间戳base和时长。

以下是Info元素的解释:

3. Tracks
    音视频,字幕流的描述信息,TrackNumber是流的编号,更像是流的序列号,在Block的头部中使用到的Track Number便是来自于此,TrackUID是Track的唯一标识,具有长达8个字节。它可能会在后面的Tag中用到,用来标识此Tag描述的Track。CodecID以及音视频播放的参数也保存在此元素中。

详细元素解释如下:

4. Chapters
用来预览文件里面的分段信息,它提前定义了一些时间点可供预览时跳到对应时间。
5. Cluster
    Cluster包含了音频视频字幕轨道的数据流,Matroska文件至少包含一个Cluster元素,每个必须包含一个时间戳,它也是第一个Block的时间戳,这个时间戳是与Segment相对。每个Block里面包含了相对第一个Block时间戳的时间偏移,因此,Block里面的时间可以看作是Segment的时间偏移+Cluster的时间偏移+Block的时间偏移。
    参考帧信息也在Block中描述。如SimpleBlock的前几个字节为:A3 20 4F EC 81 00 00 80
   A3表示是SimpleBlock, 20 4F EC表示长度为20460字节,81(8表示长度1字节,1表示Track Number为1) 00 00(两个字节的time code)
   80要按位解析,最高位优先:
     【  7 】是Keyframe设置为1,
     【6-4】保留。
     【  3 】此帧解码但不显示置1
     【2-1】Lacing 标记。00:没有Lacing。01:Xiph Lacing。11:EBML Lacing。 10:固定长度Lacing。
     【 0 】Block可以被丢弃置1.    
   BlockGroup中的ReferenceBlock用来表示Block类型。Block里面必须包括TrackNumber参数,用来描述当前的Block属于哪个Track,注意这儿用的是TrackNumber而不是TrackUID。所以一个Cluster是可以同时包含Video,Audio,Subtitle数据的,这些数据存在于不同的Block中。

如下是Cluster中元素的详细解释:

看一个BlockGroup中包括Block的例子:

6. Cues
    Cues元素用来对播放的音视频数据进行Seek的,它可以定位到特定的时间点进行播放。没有Cues的Seek比较麻烦,需要对Cluster进行parse才行。Cues中应该包含多个CuePoint才是合理的,Cues可以说成就是索引表。CuePoint时间戳放在CueTime Element中的,对应时间在文件中的位置放在CueTrackPositions中。注意CueTrackPositions并不是Cluster的绝对偏移,它是相对于Segment的偏移。也就是说,CueTrackPositions需要加上Segment在文件中的位置和Segment header的长度才是最终要查找的文件位置,Cue索引的Cluster在文件中的位置=CueTrackPosition+Segment Pos + Segment Header size

元素解释如下:

7. Attachments
给Matroska文件添加一些附加的文件信息,比如图片,网页,程序等等。
8. Tags
Segment的metadata描述。

后记:

在笔者看来,MKV文件格式中如果出现了错误,寻求一个完美的解决方案相当麻烦。MKV中的元素ID不具有唯一性,可能和数据相同,这就造成了在resync的时候,误把数据当成元素ID的可能性。

参考网页:

https://www.xuebuyuan.com/zh-hant/1695652.html
https://www.xuebuyuan.com/zh-hant/2111311.html
https://www.matroska.org/technical/diagram.html
https://matroska-org.github.io/libebml/specs.html
https://github.com/ietf-wg-cellar/ebml-specification/blob/master/specification.markdown#ebml-element-types

MKV 文件格式解析相关推荐

  1. Android init.rc文件格式解析

    /****************************************************************************** Android init.rc文件格式解 ...

  2. 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )

    文章目录 一.Android 逆向方法 1.静态逆向解析 2.函数调用分析 3.动态运行跟踪 4.运行日志分析 5.文件格式解析 6.敏感信息分析 7.网络信息监控 8.软件动态调试 9.环境伪装模拟 ...

  3. gcc 删除elf_ELF文件格式解析器 原理 + 代码

    本文为看雪论坛精华文章 看雪论坛作者ID:菜鸟m号 附件链接:[原创] ELF文件格式解析器 原理 + 代码 写在前面: 读<Linux二进制>,发现作者对 ELF文件格式部分并没有做详细 ...

  4. cfile清空文件内容_编译-链接-加载 :ELF文件格式解析

    摘要:对于C++的初学者,经常在程序的编译或者加载过程中遇到很多错误,类似undefined reference to ... 和 GLIBCXX_3.4.20 not found 等.这些错误都涉及 ...

  5. mp4文件格式解析(一)

    原文地址:mp4文件格式解析(一)作者:可下人间 目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准.随后MP4概念被转移到视频上,对应的是MPE ...

  6. QuickTime文件格式解析

    QuickTime文件格式解析 Peter Lee 2008-06-14 一.简介 QuickTime是Apple公司开发的一套完整的多媒体平台架构,可以用来进行多种媒体的创建,生产,和分发,并为这一 ...

  7. elf section类型_ELF文件格式解析

    ELF文件格式解析 ELF(Executable and Linking Format) 1) 可重定位的对象文件(Relocatable file) 2) 可执行的对象文件(Executable f ...

  8. .lnk文件格式解析

    .lnk文件格式解析 由于.lnk文件提供丰富的调用方式,因此在研究该文件类型格式的基础的可以发现有很多字段可以被恶意利用.下面是一个.lnk文件格式的通用结构,也就 说.lnk文件是由这样不同的节组 ...

  9. fastq与fasta文件格式解析

    fastq与fasta文件格式解析 一.fasta格式 二.fastq格式 2.1 格式说明 2.2 碱基质量计算 2.3 Quality Score简化 三.二代测序的fastq文件格式介绍 四.补 ...

  10. android 播放视频文件格式,Android视频文件格式解析相关分析

    目录结构 OpenCore的代码在如下目录中:external/opencore/.这个目录是OpenCore的根目录,其中包含的子目录以下所示: * android:这里面是一个上层的库,它基于PV ...

最新文章

  1. Android定制:修改开机启动画面
  2. json对象与字符串互转方法
  3. 周志华讲座---关于人工智能---科普性质---天地工学讲坛2017.11.30
  4. java 反射 本类,关于Java反射中基本类型的class有关问题
  5. 杭电1003 java_杭电ACM1003题怎么理解?
  6. hdu--5135--贪心
  7. C# Socket 编程详解
  8. sql转java对象_关于hibernate中使用sql语句时,类对象的转换问题。
  9. 使用Python进行描述性统计
  10. 浅析分支定界法在SLAM技术中的应用
  11. Unity 2D图像识别 动态添加相片到图像库 AR Tracked Image
  12. 计算机上分辨率怎么设置在哪里设置方法,windows7如何设置分辨率_windows7设置分辨率的方法...
  13. MPC-HC 播放器设置
  14. 北京中医药大学远程教育 计算机基础考试,北京中医药大学远程教育计算机基础(2008版)-第4次...
  15. 学习安卓的简单心得,以及LinearLayout的简单使用
  16. 几款U盘数据恢复的软件使用测评
  17. PS用橡皮檫檫除图形与背景颜色一样的方法
  18. SPSSModeler的下载与安装
  19. iOS 判断APP是否打开定位,并实现直接跳转打开定位
  20. 关于CPU的18个知识

热门文章

  1. java中特殊符号_java中的特殊字符集合
  2. AutoPatch java_EBS开发技术之Patch安装
  3. 基于Promethues与Grafana的Greenplum分布式数据库监控的实现
  4. php 微信公众号关注推送欢迎语
  5. 第五章 项目范围管理
  6. 我读过的(股票)书籍
  7. Java中文分词组件 - word分词
  8. 国家发展改革委财政部关于不动产登记收费标准等有关问题的通知
  9. java 日期 英文月份_java日期月份转英文格式
  10. word---尾注法插入参考文献