一、背景介绍

Matroska多媒体容器(Multimedia Container)是一种开放标准的自由的容器和文件格式,是一种多媒体封装格式,能够在一个文件中容纳无限数量的视频、音频、图片或字幕轨道。所以其不是一种压缩格式,而是Matroska定义的一种多媒体容器文件。其目标是作为一种统一格式保存常见的电影、电视节目等多媒体内容。在概念上Matroska和其他容器,比如AVI、MP4或ASF(Advanced Sreaming Format,即高级流格式)比较类似,但其在技术规程上完全开放,在实现上包含很多开源软件。可将多种不同编码的视频及16条以上不同格式的音频和不同语言的字幕流封装到一个Matroska 媒体文件当中。最大的特点就是能容纳多种不同类型编码的视频、音频及字幕流。
(注:采用Matroska封装协议的文件有很多,如mkv,webm,为了便于描述,下文中的matroska与mkv等价)

二、语法组成

与MP4封装协议类似, Matroska文件是由一个个EBML elements组成(MP4是由一个个box/atom组成),
MP4的box的ID与size所占字节一般为4个字节,Matroska的element的ID和size所占的字节数是不定的,
根据实际情况来分配字节数。如下:

typedef struct {
vint ID // EBML-ID
vint size // size of element
char[size] data // data
} EBML_ELEMENT;
为了说明element的ID和size所占的字节数是变长的,我们使用vint(Unsigned Integer Values of Variable Length)来表示这种类型,
vint的len = 1 + [number_of_leading_zero_bits].
如mkv文件的第一个内容为0x1A,二进制位 0001 1010;
Leading_zero_bits的个数为3,故此ID的len = 1 + 3 = 4;
继续往后对三个字节,可知此ID为 1A 45 DF 43, 查表可知,此ID为 EBML Header。

三、文件结构

先整体看一下mkv的文件结构

从图中可以看出,mkv文件整体由两部分组成,EBML 与Segment
EBML用于描述此文件采用了EBML这种方式编码,此部分里面的内容与解码不相关;
而Segment里面包含了各种与解码信息相关的内容

3.1 Segment组成

3.1.1 SEEKHEAD

此部分用于快速seek文件,里面包含了其他部分相对于Segment起始位置的偏移量(如:记载了TRACKS的偏移量),
方便快速找到其他部分,如果没有,也不影响解码;


如:本文件记录了三处seek点,分别为 SEGMENTINFO, TRACKS和CUES部分相对于Segment起始位置的偏移量,便于快速seek至对应的部分;

3.1.2 Void

空的element,没有什么作用

3.1.3 SEGMENTINFO

记录一些SEGMENT的通用信息,如时间戳的基准单位TimeCodeScale等信息,


TimeCodecScale:解码时间基础单位,计算duration时需要乘以此值获得对应的ns数;
MuxingApp与WritingApp表示如下:

Duration:此segment的duration,注意duration的内容要以float形式来查看,如本文件的duration的内容为:44 89 84 45 11 D0 00,Duration为45 11 D0 00,转换为float数为2333.0000
故本segment的时长为 duration x TimeCodeScale = 2333.0000 x 1000000ns = 2.333s
由于本文件只有一个segment,故文件的duration也为2.333s
注意;mkv协议中可以运行一个文件中包含多个segment,但为了兼容性,请不要包含多个segment。
DateUTC表示创建时的日期,距离Jan 01, 2001, 0:00:00 GMT+0h的纳秒数
SegmentUID, Segment独一无二的标示符。

3.1.4 TRACKS

各路track的metaData,注意各路track的数据在Cluster里面,而不是位于TRACKS里面


本文件中有两路track,
TrackNumber: cluster数据中对应track的number号,用于区分不用的track
TrackUID: 文件中此路track独一无二的标示
TrackType:track类型,如下:

Flaglacing: 指示一个Block中是否存放多帧视频或音频(默认为0,存放一帧视频或者音频)
MinCache: 指示播放时需要最新的真存buffer数,一般为0或者没有这一部分
CodecID:字符串的形式来表示此路track的编码格式,如V_MPEG4/ISO/AVC,
可以参考https://matroska.org/technical/specs/codecid/index.html来查看具体CodeID信息
CodecPrivate:配置帧信息
DefaultDuration:每一帧的duration,以ns为单位,可以根据此计算帧率
Video:存放宽高,显示宽高信息
Audio:存放采样率,通道数等信息
Language:一般为und,代表Undetermined,可以查询ISO639-2 .标准获取对应信息

TimeCode:当前Cluster的起锚时间,注意乘以TimeCodecScale来获取对应的值
SimpleBlock:不包含附件的Block,里面存放音频或者视频的数据包

3.1.5 CUES:里面存放视频关键帧的信息


由一包包CuePoint组成,每个CuePoint由关键帧的时间戳和关键帧在Segment中的相对位置pos组成,便于快速seek

##附录:
mkv解析工具下载地址
http://download.csdn.net/detail/u012188065/9688209
浮点数与十六进制转换工具下载地址
http://download.csdn.net/detail/u012188065/9688211
mkv封装协议下载地址
http://download.csdn.net/detail/u012188065/9688213
ISO639-2 协议下载地址
http://download.csdn.net/detail/u012188065/9688217

多媒体封装协议之Matroska封装协议介绍相关推荐

  1. 走进音视频的世界——Matroska封装格式的介绍(二)

    Matroska封装格式非常灵活.兼容性好,既适用于本地文件存储又可以进行实时流传输.本篇文章主要探讨Matroska的编解码器映射,如何封装视频流.音频流.字幕流.如果要Matroska的介绍.功能 ...

  2. Pycharm实现645协议解析器(五)DL645协议的报文封装

    (五)Pycharm实现645协议解析器DL645协议的报文封装 目录 (五)Pycharm实现645协议解析器DL645协议的报文封装 帧结构回顾 帧报文的数据封装 (1)前导符和起始符 (2)地址 ...

  3. 彩信库包含smil组装,打包,发送.是基于mm1协议c/c++封装.支持多平台的彩信库.

    库的地址: svn checkout http://broncho-mms.googlecode.com/svn/trunk/ broncho-mms-read-only 彩信库包含smil组装,打包 ...

  4. 远程访问的类型 使用的协议和身份验证方法介绍

    1.1 远程访问 通过将"路由和远程访问"配置为充当远程访问服务器,可以将远程工作人员或流动工作人员连接到组织网络上.远程用户可以像其计算机物理连接到网络上一样进行工作. 利用远程 ...

  5. 常见的网络协议与网络要素的介绍

    常用的网络协议有 TCP/IP 协议.IPX/SPX 协议.NetBEUI 协议.HTTP 协议.FTP 协议等.网络通信协议是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络提供通信 ...

  6. 实现国标GB/T2818视频流媒体解决方案EasyGBS国标GB28181-2016版的sip协议tcp沾包流程说明介绍

    实现国标GB/T2818视频流媒体解决方案EasyGBS国标GB28181-2016版的sip协议tcp沾包流程说明介绍 参考文章: (1)实现国标GB/T2818视频流媒体解决方案EasyGBS国标 ...

  7. 蓝牙 BLE 协议学习: 有关概念介绍

    背景 在学校内就用过蓝牙技术参加过比赛(并拿了奖):而蓝牙作为物联网中比较常见的协议,有必要进行深入的学习.此后的文章会以 ble(v4.0) 进行学习. 介绍 蓝牙技术最初由电信巨头爱立信公司于 1 ...

  8. FTP协议 服务器端口,FTP协议介绍

    原标题:FTP协议介绍 一.FTP介绍 FTP (File transfer protocol) 是TCP/IP 协议组中的协议之一.他最主要的功能是在服务器与客户端之间进行文件的传输.FTP就是实现 ...

  9. Http协议详解和版本介绍

    一.概念 协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器. ...

最新文章

  1. mysql ERROR 1045
  2. 如何在linux下修改组权限
  3. 判断图有无环_萧阳环保教你判断布袋除尘器是否合格记住这3点
  4. android新闻app_如何利用 Python 爬虫实现给微信群发新闻早报?
  5. CodeForce 534C Polycarpus' Dice (数学推理)
  6. appium连接模拟器时屏幕倒转
  7. 从特斯拉到计算机视觉之「图像语义分割」
  8. Java Class Loader Retrospect
  9. 使用junit进行单元测试_使用JUnit5对DynamoDB应用程序进行单元测试
  10. OJ1008: 美元和人民币
  11. shell 编程-Expect
  12. 17秋 SDN课程 第五次上机作业
  13. 推荐系统(Recommendation system )
  14. [LeetCode]12. Integer to Roman
  15. JAVA设计模式之3-抽象工厂模式
  16. php对联广告,js 左右悬浮对联广告代码示例
  17. 欧姆字符的编码c语言,欧姆符号怎么打
  18. PHP站内搜索功能(laravel自带Scout驱动+elasticsearch)
  19. Windows IIS IUSR IWAM 帐户密码同步
  20. 小程序第三方微信授权登录的实现

热门文章

  1. 如何搭建入侵检测系统
  2. 5.38版本的 Keil5 下载、安装、激活 ——2023年7月11日
  3. 管理类联考——英语二——技巧篇——写作——A节——书信——九类书信黄金句型(背诵版)
  4. python print hello world_print('Hello World!')的新玩法
  5. 论文阅读:Understanding Doubly Stochastic Clustering
  6. 读书|《开创新品类》营销必学读物
  7. el-tabel-coumn中label换行
  8. Java源码解析库对比:javaparser、qdox、spoon
  9. 生产者消费者模型的三种实现方式
  10. TypeScript入门篇——基础知识(快速了解js与ts差异)