目錄(?)[-]
- EBMLExtensible Binary Meta Language
- 整體結構
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的整體架構結構。
|
EBML元素都有自己的級别, 每一個高一級的元素由若幹次一級的元素組成。
從整個MKV檔案整體來看可分為2大部分:
EBML Header和Segment。
EBML Header由EBMLVersion、DocType等子元素組成,包含了檔案的版本、文檔類型等相關資訊。
Segment部分儲存了媒體檔案的視訊和音頻的實際資料,其data部分又可以分為SeekHead、Tracks、Cluster等若幹子元素。