国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
視頻文件頭解析--mkv

MKV 的文件格式的目標是,成為多媒休包容格式的標準。它基于EBML(擴展二進制多媒體語言)。與XML標記語言有點相似。

EBML是類似于XML那樣的層次化結(jié)構(gòu),每一個元素都有它的ID(就是元素名)和值。另外由于是二進制存儲,還含有一個長度值來記錄它的值的長度,每個元素的排列是ID,長度,值
     然后它的ID和長度的表示方法很有趣,是采用了UTF-8那樣的不定長前綴表示法。轉(zhuǎn)換成二進制后,如果以1開頭,那么長度是1字節(jié),如果以01開頭就是2字節(jié),001開頭是三字節(jié)……依此類推。前綴之后的值就是其值(當然,ID就和值無關(guān),只是拿來確定ID的長度了)。
     對于元素的值,就采用普通的方法存儲。值得注意的是,整數(shù)之類的值保存與一般二進制會前后顛倒不同,是按從高到低的順序存儲(例如:對于數(shù)0xFE65C4,一般的二進制保存到文件后會變成C4 65 FE,而在EBML里就是以FE 65 C4的形式保存的)
     舉個例子,這是某MKV文件里的一段:

……42 82 88 6D61 74 72 6F 73 6B 61 42 87 81 01……

于是首先看42,轉(zhuǎn)換為2進制值為01000010(注意這里的42是十六進制,別錯當成10進制轉(zhuǎn)換成00101010了XD,另外不足8位的用0補齊)。由于是01開頭所以知道ID的長度是2字節(jié),于是42 82就是它的ID。之后是長度:88轉(zhuǎn)換為2進制值為10001000,以1開頭,于是長度只有1字幕,去掉前綴1后值為0001000,也就是8,即是說后8個字節(jié)都是它的值。查表可知ID 42 82也就是DocType,它的值是字符串,于是把后面8字節(jié)6D 61 74 72 6F 73 6B 61按UTF-8解碼可得“matroska”(由于是英文字符,UTF-8和ASCII碼一樣XD)。
     之后又是一個新元素,同理得知42 87是其ID,長度是81,也就是長為1字節(jié),后面的01就是它的值。同樣可查得4287代表DocTypeVersion,值類型為整數(shù),于是這一段EBML碼解析結(jié)果為:
DocType=matroska
DocTypeVersion=1
     說了半天,EBML是什么?是Extensible Binary Meta Language(可擴展二進制元語言)的縮寫,主要是設(shè)計用來描述媒體文件的。

MKV中的元素(類似于XML中的標記):

EBML

               DocType

               DocTypeVersion

               DocTypeReadVersion    etc...

Segement

             SegementInformation

             SeekHead

             Tracks

             Clusters

             Cues

             Chapters

             Attachments

              tags

 

數(shù)據(jù)結(jié)構(gòu):

typedef struct

{

   D_UINT8 video_track_type[STREAM_MAX_NUM];

   D_UINT8 audio_track_type[STREAM_MAX_NUM];

   D_UINT8 other_track_type[STREAM_MAX_NUM];

   D_UINT8 reserved;

   D_UINT32 video_codec[STREAM_MAX_NUM];

   D_UINT32 audio_codec[STREAM_MAX_NUM];

   D_UINT32 other_codec[STREAM_MAX_NUM];

}MKV_FILE_INFO;

 

操作步驟: 

1、首先打開文件指針,讀取2k自己的文件內(nèi)容到headbuffer里面

2、通過mkv_stream_verify函數(shù)解析當前文件頭中是否有ebml元素的id號(EBML元素的ID被編碼成一個不定長整數(shù),數(shù)據(jù)寬度的最大值默認為4字節(jié))。如果id號不等于0X1a45dfa3 ,報錯。EBML元素是EBMLheader的一個容器,EBML:= 0X1a45dfa3 container

3、EBML是類似于XML那樣的層次化結(jié)構(gòu),包含多個結(jié)構(gòu),每一個元素都有它的ID(就是元素名)和值,通過mkv_file_head_parser函數(shù)解析每一個元素的詳細信息。具體操作為:

1)初始化mkv各參數(shù)的存儲變量,置0,打開mkv文件返回文件指針,申請header空間(300k)

2)讀取300k的mkv文件頭數(shù)據(jù)到內(nèi)存中,如果文件沒有申請的空間大,置FeofFlag為1(暫時不知道FeofFlag是用來干嘛的)

3)通過matroska_ebml_head_read函數(shù)解析當前文件是不是Matroska視頻容器格式。EBML是類似于XML那樣的層次化結(jié)構(gòu),每一個元素都有它的ID(就是元素名)和值。一個EBML文檔是各個EBML元素的列表。每個元素有三個部分:ID,SIZE,DATA。其中,ID和SIZE的表示方法,采用的是UTF-8編碼那樣的不定長前綴表示法。而DATA采用普通的方法存儲,具體操作:

A)ebml_matroska_id_read,讀取embl head id看是否是mkv的

B)ebml_matroska_size_read,讀取embl size大小.

C)如果解析出來的size大小大于0,表明,在emblsize數(shù)據(jù)之后有有用數(shù)據(jù)需要解析(多組數(shù)據(jù))

D)判斷解析出來的id是哪種類型,如果是DOCTYPE,解析后面的值,如果值是"matroska",表明這個是mkv文件頭。此文件就是mkv文件。

E)其他類型的信息不解析。跳過數(shù)據(jù)

4)跳過EBML部分,解析Segement。matroska_segment_read函數(shù)進行解析。解析mkv文件里面包含的多條track信息,包括audio_pid、video_pid、編碼方式等.解析出來存在mkv_video_pid這種的全局變量里。segment里包括了多媒體數(shù)據(jù)和回放時所需要的信息頭.一個文件可以包括多個信息頭,但很多的庫不支持多個Segment。具體操作為:

A)同樣是讀取id(ebml_matroska_id_read),如果獲得的id不是EBML中Segment元素的標志,那么報錯。

B)讀取size大?。╡bml_matroska_size_read)

C)如果FeofFlag不為1的情況下,調(diào)用ebml_matroska_id_read讀取id,判斷id是什么類型。

D)如果id=0x1654AE6B(Master Tracks ID.描述了包含在Cluster中的數(shù)據(jù)軌道信息,可以在文件生成多個備份。如果沒有Cluster元素,Tracks元素也可以不存在)表明后面數(shù)據(jù)中是track信息。調(diào)用segment_master_track_read進行解析track。具體操作為:

a)   讀取之前id后面的size大?。╡bml_matroska_size_read)

b)   在size信息之后解析后面的數(shù)據(jù)獲取后面數(shù)據(jù)緊接著的那個id號,如果 id=0xAE(每個軌道的標示符,描述一個在Segment元素中的軌道.網(wǎng)上也有說是0x4E的,所有的軌道信息包含在Tracks元素中,每個軌道用一個TrackEntry元素來表示),調(diào)用segment_master_track_info函數(shù)來讀取tarck的序列號,軌道類型,編碼類型ID,解壓時所需要的數(shù)據(jù),其他的都跳過。此函數(shù)中能得到mkv封裝格式的編碼算法,audio和video pid等相關(guān)信息。主要用到的方法跟之前一樣,一層層去解析,如果遇到了id,判斷當前id是軌道序列號或者軌道類型,或者軌道使用的編碼類型,解壓時所使用的私有數(shù)據(jù)等信息,對后面的參數(shù)進行解析,得到的數(shù)據(jù)對應(yīng)的存入全局變量,就會得到當前mkv文件中的所有track信息。

E)其他的id不解析,跳過后面的數(shù)據(jù)區(qū)

5)Segement解析完,track也解析完了,那么mkv文件里包含的所有音視頻信息就都解析出來了,把他們賦值給DG_MEDIA_FILE_INFO類型的file_info結(jié)構(gòu)體,供底層播放文件解碼時使用。

6)去初始化。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【精】【多媒體封裝格式詳解】---mkv
MKV的重新封裝以及從MKV文件提取字幕、音頻圖文教程
細看MKV爭當視頻格式新寵兒 → 測試/評論 → OGG.CN
如何將字幕嵌入mkv?
MKV封裝軟件
MkvToMp4中文版下載
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服