天天看點

【多媒體封裝格式詳解】---MKV【1】

目錄(?)[-]

  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進制表示方式

【多媒體封裝格式詳解】---MKV【1】

因為每個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 0
Grouping
Level 1
Level 2 Level 3
EBML
Header
EBMLVersion
DocType
Segment
Meta Seek Information
SeekHead
Seek
SeekID
SeekPosition
Seek
SeekID
SeekPosition
Segment Information
Info
Title
SegmentUID
Track
Tracks
TrackEntry
Name
TrackNumber
TrackType
TrackEntry
Name
TrackNumber
TrackType
Chapters
Chapters
Edition Entry
Clusters
Cluster
Timecode
BlockGroup Block
BlockGroup
Block
ReferenceBlock
BlockGroup Block
Cluster
Timecode
BlockGroup Block
BlockGroup Block
BlockGroup Block
BlockGroup
Block
BlockDuration
Cueing Data
Cues
CuePoint
CueTime
CuePosition
CuePoint
CueTime
CuePosition
Attachment
Attachments
AttachedFile
FileName
FileData
AttachedFile
FileName
FileData
Tagging
Tags
Tag
MultiTitle
Language
Tag
MultiTitle
Language

EBML元素都有自己的級别, 每一個高一級的元素由若幹次一級的元素組成。

從整個MKV檔案整體來看可分為2大部分:

EBML Header和Segment。

EBML Header由EBMLVersion、DocType等子元素組成,包含了檔案的版本、文檔類型等相關資訊。

Segment部分儲存了媒體檔案的視訊和音頻的實際資料,其data部分又可以分為SeekHead、Tracks、Cluster等若幹子元素。

繼續閱讀