FLV封裝格式詳解,通過腦圖和表格多樣化分解flv

FLV概述

在這裏插入圖片描述 FLV(Flash Video)是比較流行的流媒體格式,由於其視頻文件體積輕巧、封裝播放簡單等特點,很適合在網絡上進行傳輸播放,目前主流的視頻網站無一例外地使用了FLV格式,如bilibili優酷。另外近幾年html5較火,直播盛行。而flv在易傳輸、易封裝等方面佔據優勢,使其成爲直播媒體流的首選之一。

FLV是流媒體封裝格式,我們可以將其數據看爲二進制字節流。總體上看,FLV包括文件頭(File Header)和文件體(File Body)兩部分,其中文件體由一系列的Tag及Tag Size對組成。 如下圖所示,基本的結構圖。
在這裏插入圖片描述

FLV封裝格式

FLV Header

FLV Header 共佔9個字節,按照如下順序組合成 FLV 頭部信息。詳細結構如下圖所示。

Signature(3bytes)+Version(1byte)+Flags(1byte)+DataOffset(4bytes)

在這裏插入圖片描述
上圖直觀展示了 FLV Header 的結構信息,下面將逐個字段詳細介紹。

在這裏插入圖片描述

FLV Body

FLV Body是由一系列連續PreviousTagSize + tag構成。詳細組成可以先看如下樹形圖。

在這裏插入圖片描述
從上圖可以看出:FLV Body= PreviousTagSize+ Script Tag+Audio Tag[0] + Video Tag[0]+PreviousTagSize + ……+Audio Tag[n]+Video Tag[n]

詳細的解釋清看如下章節。

PreviousTagSize

PreviousTagSize顧名思義,指的是前一個tag的size,因此一個flv文件的第一個PreviousTagSize 大小總是爲0。固定4個字節。tag有三種,分別如下圖:
在這裏插入圖片描述
FLV Body中,tag分爲三類,如上圖所示,其中Script Tag只在flv開頭出現,一個flv文件中只出現一次。Audio TagVideo Tag是真正的音頻和視頻數據載體,在整個body中交替出現。以下將詳細講解每個tag的屬性和注意事項。

Script Tag

每個Tag都是由Tag HeaderTag Data組成,如圖所示,Tag結構圖。
在這裏插入圖片描述

其中Tag Header結構都是一樣的,用於區分每個Tag所攜帶的數據類型,如下結構圖。

在這裏插入圖片描述
可以看出,TagType字段,標記三種不同類型,分別是audiovideoscript data。其中每個字段的詳細介紹,見下面表格。
在這裏插入圖片描述

接着講解Script Tag,它表示控制幀信息,存放關於FLV視頻和音頻的元數據,如:durationwidthheight等。通常該類型Tag會跟在File Header後面作爲第一個Tag出現,而且只有一個 。其結構如下圖所示。
在這裏插入圖片描述
其中,Tag Header已經在上文中介紹過了,此處不再贅述,只介紹Tag Data,詳細請看如下表格。

在這裏插入圖片描述

Video Tag

video tag :表示video數據,同樣包括Tag HeaderTag Data數據,其中Tag Header同樣在上文已經講過,其中TagType=9,此處只講Tag Data。其組成結構如下圖所示。
在這裏插入圖片描述
上圖可以看出,Video Tag Data結構非常簡單,只有三個字段,如下表格清晰的列出了每個字段的解釋。
在這裏插入圖片描述
上表清晰的總結了Tag Data的每個字段值,那麼爲什麼要給Video Data標記紅色呢?那肯定是有原因的。從上表可以看出,CodecID取值各不相同,其中CodecID=7時,表示AVCVideoPacket格式的數據,這種格式比較特殊,有自己專門的格式:

AVCVideoPacket 格式:|AVCPacketType(8)|CompostionTime(24)|Data|

數據格式詳細解釋如下圖所示。 在這裏插入圖片描述
以上就是Video Tag組成屬性的詳細解釋。下面開始看Sudio Tag的內容。

Audio Tag

audio tag:表示audio數據 ,其組成同樣是Tag HeaderTag Data,同樣Tag Header已經在上文做過講述,其中TagType=8,此處只講Tag Data部分。其組成結構如下圖所示:
在這裏插入圖片描述
其中每個字段的解釋,可以參考如下表格:

在這裏插入圖片描述
以上是audio Tag每個屬性的詳細總結,精確到字節、位,可以直接對着流程圖解析。

寫在結尾

從事音視頻流媒體開發已經兩年了,今天是第一天總結的第一篇像樣點的流媒體相關的文章,之前本來是要輸出的,因爲俗事纏身,又因經常加班,公司內網不好輸出文章,晚上回到家又比較晚,就一拖再拖,一直到今天了。

最近做一個直播項目,採用http-flv傳輸模式,正好用到了flv的解封裝。因此才下定決心,將開發中的手稿總結成文。在我遇到的流媒體類型中,flv是最“和善”的一種,封裝格式簡單,傳輸效率較高。與http搭配,延時很小,做直播很適合。本文只是簡單地總結了一下flv的格式定義等信息,並沒有通過貼出相應的解封裝代碼,可能看起來比較空洞。因爲項目還沒做完,所以等項目結束了,會專門補發一篇flv解封裝的文章,作爲本文的“佐證”。

本文通過分解思維導圖“樹形結構”來展開闡述,完整的思維導圖也同步上傳到我的資源,有需要的可以免費下載。在博主開發中,遇到一款非常友善的工具“FlvAnalyzer”,快速的協助我完成了flv的轉封裝,但是不知道這款工具的開發者是哪位大神,在此先表示衷心的感謝。這款工具同樣上傳到我的資源中,免費給需要的同學使用。如果閱讀本文發現有錯誤,請隨時聯繫博主修改完善;如果本文對你有助,請點贊關注我,相互學習,共同進步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章