視頻封裝格式之mkv--1

視頻封裝格式之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” 和後面顯示的一致。

  所以這個EBML元素就解析出來了ID=0x4282;size=8;data=“matroska” ;後面的數據,同理得知42 87是ID值,長度是81(一個字節),後面是其值01,查表可知4287代表DocTypeVersion,值類型是整數,於是解析後的結果是ID=0x42 87,size=1,data=1。
        綜上,此段EBML碼解析後的結果是:DocType=matroska,DocTypeVersion=1。
2. MKV文件的整體框架
        框架主要有兩部分構成EBML Header和Segment。每個EBML元素都有自己的級別,每個高一級別的元素由若干個次一級的元素組成。
        EBML Header主要有EBMLVersion、DocType等子元素組成,包含了文件的版本、文檔類型等相關信息;
        Segment是音頻相關信息的保存地方,其有次一級的Track、Clusters、Cueing Data等組成:
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章