flv 協議解析 學習記錄

2021-07-09 05:57:10 字數 2076 閱讀 5351

flv是流**封裝格式,我們可以將其資料看為二進位制位元組流。總體上看,flv包括檔案頭(file header)和檔案體(file body)兩部分,其中檔案體由一系列的tag及tag size對組成。因此乙個flv檔案看上去是下面的結構:

其中,previous tag size

緊跟在每個

tag之後,佔

4個位元組表示乙個

ui32

型別的數值,表示前面乙個

tag的大小。

需要注意的是,

previous tag size #0

的值總是為0。

tagscript

,且每個

tag只能包含一種型別

的資料。下面我們看看

file header

和tag

的具體結構,為了方便大家理解,我貼乙個實際

flv檔案的位元組流,

中把不同部分區分了顏色。

一、file header結構

file header在當前版本中總是由9個位元組組成,如圖中藍色區域所示。

第1-3位元組為檔案標識(signature),總為「flv」(0x46 0x4c 0x56),如圖中紫色區域。

第4位元組為版本,目前為1(0x01)。

第5個位元組的前5位保留,必須為0。

第5個位元組的第6位表示是否存在音訊tag。

第5個位元組的第7位保留,必須為0。

第6-9個位元組為ui32型別的值,表示從file header開始到file body開始的位元組數,版本1中總為9。

二、previous tag size結構

如圖中紅色位置所示。

三、tag結構

tag包括tag header和tag data兩部分。不同型別的tag的header結構是相同的,但是data結構各不相同。如圖中綠色和黃色區域分別表示tag header資料和tag data資料。

當前版本的tag header結構占用11個位元組。

第2-4位元組為ui24型別的值,表示該tag data部分的大小。

第5-7位元組為ui24型別的值,表示該tag的時間戳(單位為ms),第乙個tag的時間戳總是0。

第8個位元組為時間戳的擴充套件位元組,當24位數值不夠時,該位元組作為最高位將時間戳擴充套件為32位值。

第9-11位元組為ui24型別的值,表示stream id,總是0。

後面的位元組為tag data資料,data的大小由第2-4位元組的數值指示,根據第1個位元組指示的tag型別,按照不同的結構解析tag data。下面分別介紹。

四、audio tag data結構

音訊tag開始的第1個位元組包含了音訊資料的引數資訊,從第2個位元組開始為音訊流資料。

第1個位元組的第5-6位的數值表示取樣率,0 = 5.5 khz,1 = 11 khz,2 = 22 khz,3 = 44 khz。

第1個位元組的第7位表示取樣精度,0 = 8bits,1 = 16bits。

第1個位元組的第8位表示音訊型別,0 = mono,1 = stereo。

五、video tag data結構

第1個位元組的前4位的數值表示幀型別。

六、script tag data結構

第乙個amf包:

第1個位元組表示amf包型別,一般總是0x02,表示字串,其他值表示意義請查閱文件。

第2-3個位元組為ui16型別值,表示字串的長度,一般總是0x000a(「onmetadata」長度)。

後面位元組為字串資料,一般總為「onmetadata」。

第二個amf包:

第1個位元組表示amf包型別,一般總是0x08,表示陣列。

第2-5個位元組為ui32型別值,表示陣列元素的個數。

後面即為各陣列元素的封裝,陣列元素為元素名稱和值組成的對。表示方法如下:

第1-2個位元組表示元素名稱的長度,假設為l。

後面跟著為長度為l的字串。

第l+3個位元組表示元素值的型別。

後面跟著為對應值,占用位元組數取決於值的型別。

FLV檔案解析

flv header 一般比較簡單,包括檔案型別之類的全域性資訊 檔案型別 3bytes 總是flv 0x46 0x4c 0x56 否則.版本1byte 一般是0x01,表示flv version 1 流資訊1byte header長度 4bytes 整個檔案頭的長度,一般是9 3 1 1 4 有時...

FLV檔案格式解析

flv是流 封裝格式,我們可以將其資料看為二進位制位元組流。總體上看,flv包括檔案頭 file header 和檔案體 file body 兩部分,其中檔案體由一系列的tag及tag size對組成。因此乙個flv檔案看上去是下面的結構 其中,previous tag size 緊跟在每個 tag...

FLV檔案格式解析

原創出處 flv是流 封裝格式,我們可以將其資料看為二進位制位元組流。總體上看,flv包括檔案頭 file header 和檔案體 file body 兩部分,其中檔案體由一系列的tag及tag size對組成。因此乙個flv檔案看上去是下面的結構 一 file header結構 file head...