【多媒体封装格式详解】---MKV【1】

来源:互联网 发布:电脑管家的数据恢复 编辑:程序博客网 时间:2024/05/19 00:54

目录(?)[-]

  1. EBMLExtensible Binary Meta Language
  2. 整体结构

Matroska 开源多媒体容器标准。MKV属于其中的一部分。
Matroska常见的有.MKV视频格式、MKA音频格式、.MKS字幕格式、.MK3D files (stereoscopic/3D video).

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比特的个数.


(解释:由于ID和size是可变长度无符号整形,所以此处的长度是ID或size所占的字节数,对于ID,对应字节数的值就是ID的值;对于size,去掉前缀的值就是size的值,即其后data的size大小。)


从MKV文件中简单接一段来举个例子。这是16进制表示方式


因为每个EBML元素都是由ID size data 三部分组成,我们就按照这些来分析。

将0x42 转成2进制 为 01000010    (不满8位的拿0补齐)按照上面规则  前面有1个0 所以知道ID的长度为2,也就是0x4282为ID值。

将0x88 转成2进制为 10001000 1为开头 长度就是1,去掉前缀1变成了00001000 ,也就是 size的值为 8.

接下来的8个字节就是data值:6D 61 74 72 6F 73 6B 61  根据上面ID值查表得知 这个EMBL 名称为DocType 也就是说data的内容是string格式,所以转成askII码 data值就是“matroska” 和后面显示的一致。

所以这个EBML元素就解析出来了

ID=0x4282;

size=8;

data=“matroska” ;

得到的信息就是 DocType = matroska。


2.整体结构


让我们看看MKV的整体框架结构。

Level 0GroupingLevel 1Level 2Level 3EBMLHeaderEBMLVersion DocType SegmentMeta Seek InformationSeekHeadSeekSeekIDSeekPositionSeekSeekIDSeekPositionSegment InformationInfoTitle SegmentUID TrackTracksTrackEntryNameTrackNumberTrackTypeTrackEntryNameTrackNumberTrackTypeChaptersChaptersEdition Entry ClustersClusterTimecode BlockGroupBlockBlockGroupBlockReferenceBlockBlockGroupBlockClusterTimecode BlockGroupBlockBlockGroupBlockBlockGroupBlockBlockGroupBlockBlockDurationCueing DataCuesCuePointCueTimeCuePositionCuePointCueTimeCuePositionAttachmentAttachmentsAttachedFileFileNameFileDataAttachedFileFileNameFileDataTaggingTagsTagMultiTitleLanguageTagMultiTitleLanguageEBML元素都有自己的级别,每一个高一级的元素由若干次一级的元素组成。
从整个MKV文件整体来看可分为2大部分:

EBML Header和Segment。

EBML Header由EBMLVersion、DocType等子元素组成,包含了文件的版本、文档类型等相关信息。

Segment部分保存了媒体文件的视频和音频的实际数据,其data部分又可以分为SeekHead、Tracks、Cluster等若干子元素。


0 0