視頻封裝格式之mkv--1
Matroska是一種多媒體封裝格式,這個封裝格式可把多種不同編碼的視頻及16條或以上不同格式的音頻和語言不同的字幕封裝到一個Matroska Media檔內。它也是其中一種開放原始碼的多媒體封裝格式。很多人把Matroska當作爲mkv,其實mkv只是Matroska媒體系列的其中一種檔案格式。
Matroska媒體定義了三種類型的檔:MKV(Matroska Video File,視訊檔,可以包含音訊和字幕)、MKA(Matroska Audio File,單一的音訊檔,可以有多條及多種類型的音軌)和MKS(Matroska Subtitles,字幕文件),這三種文件中以MKV最爲常見,是一種萬能的封裝容器。
2002年12月7日開始開發,是多媒體封裝格式科研計劃之一,其採用EBML(Extensible Binary Meta Language,可擴展的二進制語言)取代其他的二進制格式,其有很多優點,節省空間,容易擴展等。
1. EBML可擴展的二進制語言
EBML是一種類似於XML格式的可擴展二進制語言,是用可變長度的整數存儲,以節省空間每個EBML元素都有ID(屬性類型)、size(後面data部分的大小)和data(實際的數據)三部分組成,
typedef struct EBML{
vint ID; //ID的類型長度是可變的
vint size; //size的類型長度是可變的
char[size] data;///數據
};
ID和size的長度是不固定的,需要通過計算得到,長度=1+整數前綴0比特的個數,舉例如下,mkv文件中一段16進製表示的數據:
.....42 82 88 6D 61 74 72 6F 73 6B 61 42 87 81 01......
1. 將0x42轉成二進制爲01000010,按照上面規則前面有1個0 所以知道ID的長度爲2個字節,也就是0x4282爲ID值;
2. 將0x88 轉成2進製爲10001000,1爲開頭,長度就是1,去掉前綴1變成了00001000,也就是size的值爲 8;
3. 接下來的8個字節就是data值:6D 61 74 72 6F 73 6B 61,根據上面ID值查表得知這個EMBL名稱爲DocType,也就是說data的內容是string格式,所以轉成ASKII碼data值就是“matroska” 和後面顯示的一致。