http://www.matroska.org/technical/specs/index.html

MATROSKA 文件格式

1.EBML (Extensible Binary Meta Language):

EBML语言使用不定长整数,这种方式相对于固定长度的32位/64位字长的整数值更节约空间.放置的位置也不受字节对齐约束..这种长度编码方式来自于UTF-8编码规范.

不定长度的无符号整数值(“vint”):

长度的计算方法:

长度 = 1 + 整数前缀0比特的个数.

使用大字节编码方式.

可以使用大于>=8字节的整数值,这时它的第一个字节的值将会是0x00,用来表达长度超过56位的整数值.但它是被MATROSKAY文件禁止的.

举个例子:

43 85 03: 将它换算成二进制如下:01000011 10000101 00000011,前缀0比特的个数为1,总长度为:1 + 1 = 2,所包括的字节为:01000011 10000101,最前值为1的比特用作中止前缀0比特.它不能被用来计算整数的结果,那么最终的整数值等于:03 85(901).这样看来,1个字节表示长度最多可以有7个前缀0比特,它也是MATROSKA文件所支持的整数最长长度.使数据所占的空间减小,这是EBML文件最大亮点.

长度未知整数值:

如果除了前缀0之外的比特位全部都是1的话,表示此整数的长度未知.MASTROSKA文件中除了文件头最后一个元素之外,都不要这样写.如果有的整数正好是这样的形式,要对它重编码,如:16383 = 7F FF,要把它编码成: 20 3F FF,虽然整数的长度不可避免的增加了.

EBML元素:

存储方式如下:

typedef struct {

vint ID; //Element ID

vint size; //Element size

char Data[size] //Element Data

} Ebml_Element;

包含其它元素的元素被称做:EBML Master Elements.子元素的排列顺序是任意的,但最好还是.有一种确定的定义.

有符号整数的表示方法:

大字节序,根据其值的正负符号来减去00或FF来得到具体的数值,如-257 = FE FF, FE FF – FFFF=257.

实数表示方法:

大字节序,可以使用32或64比特来表示IEEE标准定义的浮点数,虽然标准包括了80比特的浮点数,但MATROSKA不使用.

字符串类型:

String类型用ASCII编码方式.UTF-8类型用UTF-8编码方式.

2.MATROSKA 文件项级元素:

只有两种顶级元素:

1. EBML Header:

用来描述文件中的内容,一个文件只能有一个EBML Header,更多的将被读取它的程序忽略掉.有的MKV生成器在添加多个文件时可能会出现这种情况.

2. Segment

包括了多媒体数据和回放时所需要的信息头.一个文件可以包括多个信息头,但很多的库不支持多个Segment,Windows平台下可以用Haali Media Splitter来支持多Segment.

3. EBML文件头:

描述了EBML编解码器的版本号,文件类型,文件名.

元素列表:

Uint EBMLVersion ID:42 86 默认值:1 EBML编码器版本号.

Uint EBMLReadVersion ID:42 F7 默认值:1 EBML解析器版本号

Uint EBMLMaxIDLength ID:42 F2 默认值:4 EBML 元素ID号的最长长度(多少字节),在MATROSKA文件中最长为4字节.

Uint EBMLMAXSizeLength ID:42 F3 默认值:8 EBML元素最长长度(多少字节).

Uint DocTypes ID: 42 82 默认值:matroska EBML文件中的内容类型,MATROSKA文件为”matroska”.

Uint DocTypeVersion ID:42 87 默认值:1 EBML文件包含数据的编码器版本号.

Uint DocTypeReadVersion ID:42 85 默认值:1 EBML文件包含数据的解析器版本号.

由于所有的元素都包括的默认值,所以可以使用空EBML文件头.

最好不要使ID和元素最大长度超过8字节,对于几乎所有数据来说,它已经足够了,同时对于当前流行的32/65位字长的计算机来说,它将使一次整数运算生成多条指令.

4. Segment

Master SegmentInfo ID:15 49 A9 66 包括了SEGMENT元素的信息,如UID,标题等.

Master SeekHead ID:11 4D 9B 74 指向SEGMENT子素的索引信息,可以指向其它的SeekHead,如果Cluster元素中的BlockGroup和SimpleBlock子元素在其尾部,那么可以不用SeekHead,不然的话,文件的帧数据地址定位将很复杂。

Master Cluster ID:1F 42 B6 75 包括了视频,音频,字幕数据。因为MATROSKA文件提供了Charpter和Attachment子元素来表示其它的数据内容,所以可以没有Cluster元素。

Master Tracks ID:16 54 AE 6B 描述了包含在Cluster中的数据轨道信息,可以在文件生成多个备份。如果没有Cluster元素,Tracks元素也可以不存在。

Master Cues ID:1C 53 BB 6B 包含了Cluster数据帧的时间戳,用来支持即时定位。

Master Attachment ID:19 41 A4 69 包含了所有附加在此Segment元素中的文件。

Master Chapter ID:10 43 A7 70 包含了此Segment中所有文本支持信息。

Master Tag ID:12 65 C3 67 包含此Segmen或其子元素的其它附加信息,如作者名,多语言支持等,和回放无关。

Segment包含元素:

SegmentInfo包含元素:

Char[16] SegmentUID ID:73 A4 表示Segment的128位ID号,可以被其它的文件引用。

Utf-8 SegmentFilename ID: 73 84 保存此Segment的文件名,但文件名是很容易被改动的,所以没有较高的可靠性。

Char[16] PrevUID ID:3C B9 23 指向前一个Segment的128位的ID号,用在定位此Segment之前的时间点,利用它可以方便的找出同目录下的相应文件。

Utf-8 PrevFileName ID:3C 83 AB 包含前一个Segment的文件的名称,如果找不到,可以通过遍历文件中的SegmentUID查找。

Char[16] NextUID ID:3E B9 23 指向后一个Segment的128位ID号,用于定位超出此Segment范围的时间点。

Utf-8 NextFileName ID:3E 8E BB 包含后一个Segment的文件的名称。

Uint TimecodeScale ID:2A D7 B1 每个时间码都通过和此值相乘来得到具体时间(微秒单位),但不是所有的时间码都这样。

Float Duration ID:44 89 此Segment的总回放时间,将其乘以TimecodeScale来得出具体时间(微秒单位)。

Uft-8 Title ID:7B A9 此Segment的名称,如”Lord of the rings”不可以指定时间,可以用Tag元素来加入多个标题。

String MuxingApp ID:4D 80 生成此文件的库名称,如”libMatroska-0.7.0”,在发生问题时可以参考。

Utf-8 WritingApp ID:57 41 生成此文件的程序名称,如”mkvmerge 0.8.1”。

Int DateUTC ID:44 62 生成此文件的时间,从2001.01.01 0:00:00 GMT+0h开始计算。

SeekHead包含元素:

SeekHead包含了Segment的子元素的位置列表,每对位置,ID号对应着一个Seek元素:

Master Seek ID:4D BB 包含了一个Segment的子元素的ID号和它的具体位置。

Seek包含元素:

Uint SeekID ID:53 AB 某Segment的子元素的ID号。

Uint SeekPosition ID:53 AC 对应SeekID的元素的位置(相对于Segment数据首地址)。

SeekHead元素通常包含了全部的Segment的子元素,但有时Cluster元素是个例外。也可以引用另一个SeekHead,比如文件开始有一个小的SeekHead,它引用了另一个在文件尾的SeekHead。

Tracks包含元素:

包含了存储在Segment元素中轨道的信息,比如轨道类型(音频,视频,字幕),编码器ID,采样率。最好将所有的轨道信息包含在一个Tracks元素中。

每个轨道用一个TrackEntry元素来表示。虽然理论也可以使用TrackUID将轨道信息放在多个TrackEntry中。

有时会出现空TrackEntry元素,但如果所有的轨道都存储在一起或根本就没有轨道(如只有Chapter元素)将不会发生文件解析错误。

Master TrackEntry ID:4E 描述一个在Segment元素中的轨道。

TrackEntry包含元素:

Uint TrackNumber ID:D7 轨道的序列号,不可以为0,将被Cluster的子元素Block和SimpleBlock使用。

Uint TrackUID ID:73 C5 轨道的ID号,不可以为0。

Uint TrackType ID:83 轨道的类型,如视频,音频,字幕。

Bool FlagEnabled ID:89 默认值:1 是否使用此轨道。

Bool FlagDefault ID:88 默认值:1 是否默认播放,如果没有此值为1轨道,将由播放器选择。

Bool FlagForced ID:55 AA 是否必须播放,如果多个字幕轨道都包括此属性,那么将选择和音频语言相同的轨道,只会被数位限制管理(DRM)使用。

Bool FlagLacing ID:9C 默认值:1 是否包括了捆绑数据块(表示在一个数据块中包含多帧 lacing block)。

Uint MinCache ID:6D E7 默认值:0 在播放时必须提供多少帧的缓存区,比如当MPEG4帧以其编码顺序来播放时使用。

Uint MaxCache ID:6D F8 在播放时最大可以提供多少帧缓存区,如果等于0,表示不使用缓存。

Uint DefaultDuration ID:23 E3 83 表示一帧持续了多少微秒。当没有Duration元素或使用捆绑(lacing)方式时将使用此值。如果值为0表示此轨道的帧的持续时间不定。(如Vorbis 音频)。使用此值将使文件的定位非常容易。

Float TrackTimecodeScale ID:23 31 4F Block元素的时间码+Cluster时间码乘以此值得到Block的具体时间。

Utf-8 Name ID:53 6E 轨道的名称,不可指定语言。

String Language ID:22 B5 9C 默认值:eng 轨道使用的语言,和Name所用语言无关。

String CodecID ID:86 默认值:86 轨道使用的编码类型ID。

Binary CodecPrivate ID:63 A2 解压时所需要的数据。如Vorbis编码的初始化数据包。

Utf-8 CodecName ID:25 86 88 编码类型名称。

Uint AttachmentLink ID:74 46 附加在此轨道上的Attchment元素UID。

Master Video ID:E0 视频轨道视频相关信息。

Master Audio ID:E1 音频轨道音频相关信息。

Master ContextEncodings ID:6D 80 轨道的压缩或加密信息。

注意Video和Audio元素与轨道的数据的匹配,否则文件将不能回放。

Video包含元素:

Uint PixelWidth ID:B0 视频帧的宽度(像素单位)。

Uint PixelHeight ID:BA 视频帧的高度(像素单位)。

Uint PixelCropBottom ID:54 AA 默认值:0 从视频帧底部裁减多少像素。

Uint PixelCrop ID:54 BB 默认值:0 从视频帧顶部裁减多少像素。

Uint PixelCropLeft ID:54 CC 默认值:0 从视频帧左侧裁减多少像素。

Uint PixelCropRight ID:54 DD 默认值:0 从视频帧右侧裁减多少像素。

Uint DisplayWidth ID:54 B0 默认值:PixelWidth 回放屏幕宽度。

Uint DisplayHeight ID:54 BA 默认值:PixelHeight 回放屏幕高度。

Uint DisplayUnit ID:54 B2 默认值:0 回放屏幕宽度和高度单位。0-像素 1-厘米 2-英尺。

解码后,从Pixelxxx长度中裁减Cropxxx长度,然后拉伸至Displayxxx值回放。

Audio包含元素:

Uint SamplingFrequency ID:B5 默认值:8k 轨道采样率(单位Hz)。

Uint Output-SamplingFrequency ID:78 85 回放时使用的采样率。默认为SamplingFrequency。

Uint Channels ID:9F 默认值:1 轨道包含声道数。

Uint BitDepth ID:62 64 bps(bit per sample),通常用于PCM音频。

ContentEncodings包含元素:

Master ContentEncoding ID:62 40 描述轨道使用的压缩或加密信息。

ContentEncoding包含元素:

Uint ContentEncoding-Order ID:50 31 默认值:0 解码器的优先级,值最大的最先使用。

Uint ContentEncoding-Scope ID:50 32 默认值:1 轨道的哪一部分使用了此加密或压缩方式。

Uint ContentEncoding-Type ID:50 33 默认值:0 编码类型 0-压缩1-加密。

Master ContentCompression ID:50 34 具体压缩信息。

Master ContentEncryption ID:50 35 具体加密信息。

ContentEncoding元素有时可以达到压缩和加密兼有的效果,如压缩字幕,或将音频帧的同频头去掉。AC-3音频起始字节为:0B 77,在MATROSKA文件中它不存在。

ContentCompression包含元素:

ContentCompAlgo ID:42 54 默认值:0 描述压缩算法。

ContentCompSettings ID:42 55 压缩配置信息。

TrackType元素值种类:

0x01 视频轨道。

0x02 音频轨道。

0x03 混合音视频轨道。

0x10 标志(logo)轨道。

0x11 字幕轨道。

0x12 按钮轨道。

0x20 控制轨道。

ContentEncodingScope比特值:

1 全部帧。

2 由轨道的CodecPrivate指定。

4 用于下个ContentEncoding元素(由解码顺序指定)。

ContentCompAlgo元素值种类:

0 zlib

1 bzlib

2 lzo1x

3 header striping

Cluster包含元素:

一个Cluster元素通常包含了几秒钟的多媒体数据,子元素的顺序不固定,但最好将第一个BlockGroup或SimpleBlock元素放在最前部,这样方便找出时间码。

Uint TimeCode ID:E7 默认值:0 用来做所包含的Block的开始时间码。

Uint Position ID:A7 父元素在祖父元素的开始位置。在数据损坏时进行同步。

Uint PrevSize ID:AB 前一个Cluster的大小(字节单位)。方便反向定位和找出前面的Cluster,而不需要使用MetaSeek和Cue元素,在Cluster的ID值损坏后,定位仍可正常进行.

Master BlockGroup ID:A0 包含一个数据块及其相关信息如引用等.

Binary SimpleBlock ID:A3 只包含一个数据块,没有附加信息,所以资源浪费会小很多,SimpleBlock由Matroska V2提供.

BlockGroup包含元素:

Binary Block ID:A1 回放数据.

Int ReferenceBlock ID:FB 某帧相对于此数据块的时间码,在解码此数据块时必须已经将此帧解码.

Int BlockDuration ID:9B 此数据块的时间码,如果没有此元素,由下一数据块时间码-前一数据块时间码或DefaultDuration来计算.通常字幕是不需要知道持续时间的,除非确实需要控制它的显示时间,但最好还是写入它的Duration元素.

Cues包含元素:

Cues包含了非常有用的定位信息.信息的单元,称为CuesPoint,包含了时间戳,地址信息(Tracker号,Cluster位置,此Cluster的Block号.通常只用于定位关键帧.

Master CuePoint ID:BB Track的定位信息.

Uint CueTime ID:B3 在某Cluster的Block的时间码.

Master CueTrackPositions ID:B7 Cluster和Block的定位信息.

CueTrackPostions包含元素:

Uint CueTrack ID:F7 Track的序号,等于TrackEntry元素的TrackNumber.

Uint CueClusterPosition ID:F1 Cluster相对于Segment元素数据的相对地址.

Uint CueBlockNumber ID:53 78 Block的序号,在这个Cluster中.

Chapter包含元素:

包含了此Segment的全部文本信息.和DVD的Chapter相比,增强了很多,处理更加复杂.

Master EditionEntry ID:45 B9 描述了一个文本集,理论上可以用多个EditionPoint来描述同一文本集,但不推荐使用.

一个文本集包含了多个文本段落,可以有多个文本集.像播放列表一样使用,以一定间隔依次播放.

EditionEntry包含元素:

Uint EditionUID ID:45 BC 文本集的ID号.

Bool EditionFlagHidden ID:45 BD 默认值:0 用户是否可以看到.

Bool EditionFlagDefault ID:45 DB 默认值:0 播放器默认设置.

Bool EditionFlagOrdered ID:45 DD 默认值:0 文本段落是否顺序播放.

Master ChapterAtom ID:B6 文本段落的定义,内部也可以包含ChapterAtom.

ChapterAtom包含元素:

Uint ChapterUID ID:73 C4 文本段落的ID号,在文件中唯一.

Uint ChapterTimeStart ID:91 文本段落的开始时间(没有比例值),不可以小于0,即使多媒体数据时间最小为-30.000.

Uint ChapterTimeEnd ID:92 文本段落的结束时间,可能是下个段落的开始.

Bool ChapterFlagHidden ID:98 默认值:0 用户是否可见.

Bool ChapterFlagEnabled ID:45 98 默认值:1 是否被播放器跳过.

Char[16] ChapterSegmentUID ID:6E 67 仅当EditionFlagOrdered=1才有这个元素,用来定位此段落对应的Segment.可以通过搜索当前目录来找到相应文件.

Uint ChapterSegment-EditionUID ID:6E BC 文本段落集在由ChapterSegmentUID指定的Segment中的UID号.ChapterTimeStart和ChapterTimeEnd指定相应的回放时间.不被Haali Media Splitter支持.

Master ChapterTracks ID:8F 文本段落应用的Track列表.

Master ChapterDisplay ID:80 所有文本段落的内容.

ChapterTracks包含子元素:

Uint ChapterTrackNumber ID:89 Track序号。

Utf-8 ChapString ID:85 文本内容。

String ChapLanguage ID:43 7C 默认值:eng 所用语言,ISO639-2标准定义。

Utf-8 ChapCountry ID:43 7E 文本内容对应的国家代码,和语言无关。

Attachments包含元素:

Master AttachedFile ID:61 A7 包含附加文件及其相应信息。

AttachedFile包含元素:

Utf-8 FileDescrition ID:48 7E 文件的描述。

Utf-8 FileName ID:46 6E 附加文件名。

String FileMimeType ID:46 60 文件的MIME类型。

Binary FileData ID:46 5C 文件数据。

Uint FileUID ID:46 AE 附加文件的UID,可以被TrackEntry引用。

Tags包含元素:

Master Tag ID:73 73 描述一个标签。

Tag包含元素:

Master Targets ID:63 C0 标签应用至的元素。

Master SimpleTag ID:67 C8 每个SimpleTag为一个对应于Targets的标签。

Targets包含元素:

Uint TargetTypeValue ID:68 CA 默认值:50 此标签应用至的对象级别。

Uft-8 TrackUID ID:63 C5 此Tag对应的Track的UID.

Uint EditionUID ID:63 C9 此Tag对应的Edition的UID.只用来给Edition加入标题.

Uint EditionUID ID:63 C4 此Tag对应的Chapter的UID.

Uint AttachmentUID ID:63 C6 此Tag对应的Attachment的UID.

SimpleTag包含元素:

Utf-8 TagName ID:45 A3 Tag的名称.

String TagLanguage ID:44 7A 默认值:und TagName元素使用的元素.默认值比较特殊是”und”.

Bool TagOriginal ID:44 84 默认值:1 是否作为原始标题.

Utf-8 TagString ID:44 87 Tag的字符串值.

Binary TagBinary ID:44 85 Tag的二进制值.

一些常用的Tags

TITLE, Target是EditionUID,用来定义Edition的名称.它可以在屏幕上看到.

BPS, Target是TrackUID,用来定义此Track的比特率.

FPS,Target是TrackUID,用来定义此Track的帧率.

原贴地址:http://blog.csdn.net/CharlesPrince/archive/2009/03/07/3967398.aspx

参考文章:http://blog.csdn.net/hjie8627/archive/2009/08/20/4464154.aspx

参考文档:

标准:http://www.matroska.org/files/matroska.pdf

mkv格式说明表参见:http://www.matroska.org/technical/specs/index.html

工具:

mkvmerge/mmg/mkvextract/mkvpropedit/mkvinfo

AVI-Mux_GUI可以分析EBML tree,下载地址 http://www.alexander-noe.com/video/amg/

MATROSKA 文件格式相关推荐

  1. Matroska文件格式标准

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

  2. MATROSKA文件格式之Segments学习

    MATROSKA(MKV)格式仅仅包含两种Top Level Elements,即EBML  Header和Segment. EBML Header用来描述一个EBML文件,而且一个文件只包含一个EB ...

  3. Matroska文件解析之SimpleBlock

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

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

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

  5. 未拉手刹撞到前面车的动画_如何使用手刹将任何视频文件转换为任何格式

    未拉手刹撞到前面车的动画 If you've ever wanted to convert a video file, but weren't sure what to use, then Handb ...

  6. 下载的字幕php是什么格式的,mkv是什么文件格式

    mkv是Matroska的文件扩展名,Matroska多媒体容器是一种开放标准的自由的容器和文件格式,是一种多媒体封装格式,它不是一种压缩格式,而是Matroska定义的一种多媒体容器文件. 本文操作 ...

  7. 常见音频文件格式的特点。

    常见音频文件格式的特点. http://www.360doc.com/content/11/1125/18/8050095_167351161.shtml 要在计算机内播放或是处理音频文件,也就是要对 ...

  8. 多媒体文件格式之MKV

    [时间:2016-07] [状态:Open] MKV是一种开源的多媒体封装格式,是Matroska中应用比较多的格式之一.常见的后缀格式是.mkv(视频,包括音频和字幕)..mka(纯音频)..mks ...

  9. Ffmpeg快速命令使用 Ffmpeg选项详解 Ffmepg格式详解 常见视频文件格式详解

    http://www.ffmpeg.com.cn/index.php/%E9%A6%96%E9%A1%B5 Ffmpeg快速命令使用 From Ffmpeg工程组 Jump to: navigatio ...

  10. 常见的视频文件格式有哪些?

    常见的视频文件格式有哪些? 常见在线流媒体格式:mp4.flv.f4v.webm 移动设备格式:m4v.mov.3gp.3g2 RealPlayer :rm.rmvb 微软格式 :wmv.avi.as ...

最新文章

  1. 机器学习的门槛再度降低,AI小白如何用5分钟搞定建模?
  2. linux shell中小数的运算
  3. pytorch模型转onnx-量化rknn(bisenet)
  4. python实现cc攻击_运维纪录:遭遇CC攻击,防御与查水表
  5. bat 域 本机管理员密码_Windows域中特殊的用户-计算机对象攻防
  6. SpringBoot配置文件映射到JavaBean
  7. oracle有关游标的知识
  8. Android 开发常用ADB命令集合
  9. Banner字符可以通过类似以下网站生成
  10. 开启JAVA死锁之迷
  11. arduino做一个表白程序
  12. Android 手机修改 WiFi MAC 地址
  13. php蓝牙连接不上,蓝牙音响连接不上手机怎么办 两种方法轻松解决连接问题
  14. 计算机英语while,while循环用法
  15. ‘The client noticed that the server is not a supported distribution of Elasticsearch‘ 报错及解决办法
  16. BJTU 1729 Ryan的弹幕游戏(BFS)
  17. 利用jsp内置对象实现的简易聊天室
  18. Daily Practice 5th:Educational Codeforces Round 120 (Rated for Div. 2)
  19. C++排序求最值函数的调用
  20. 【Lua】Lua基础语法

热门文章

  1. Stata数据处理:快速读取万德-Wind-数据-readWind2
  2. Python图像处理丨基于OpenCV和像素处理的图像灰度化处理
  3. 博弈论 第五章 重复博弈
  4. wps怎么利用c语言编辑,WPS如何转换成图片?三种方法帮你实现
  5. 这次要讲不清前后端分离,我都怎么地!
  6. SOLIDWORKS在机械设计行业的优势所在
  7. 公钥,私钥,对称密钥
  8. C1083,无法打开包括文件...
  9. ES基于Hbase二级索引
  10. 2022-2028年中国智慧教育行业发展策略分析及投资前景研究报告