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 Tag和Video Tag是真正的音頻和視頻數據載體,在整個body中交替出現。以下將詳細講解每個tag的屬性和注意事項。
Script Tag
每個Tag都是由Tag Header和Tag Data組成,如圖所示,Tag結構圖。
其中Tag Header結構都是一樣的,用於區分每個Tag所攜帶的數據類型,如下結構圖。
可以看出,TagType字段,標記三種不同類型,分別是audio、video、script data。其中每個字段的詳細介紹,見下面表格。
接着講解Script Tag,它表示控制幀信息,存放關於FLV視頻和音頻的元數據,如:duration、width、height等。通常該類型Tag會跟在File Header後面作爲第一個Tag出現,而且只有一個 。其結構如下圖所示。
其中,Tag Header已經在上文中介紹過了,此處不再贅述,只介紹Tag Data,詳細請看如下表格。
Video Tag
video tag :表示video數據,同樣包括Tag Header和Tag 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 Header和Tag Data,同樣Tag Header已經在上文做過講述,其中TagType=8,此處只講Tag Data部分。其組成結構如下圖所示:
其中每個字段的解釋,可以參考如下表格:
以上是audio Tag每個屬性的詳細總結,精確到字節、位,可以直接對着流程圖解析。
寫在結尾
從事音視頻流媒體開發已經兩年了,今天是第一天總結的第一篇像樣點的流媒體相關的文章,之前本來是要輸出的,因爲俗事纏身,又因經常加班,公司內網不好輸出文章,晚上回到家又比較晚,就一拖再拖,一直到今天了。
最近做一個直播項目,採用http-flv傳輸模式,正好用到了flv的解封裝。因此才下定決心,將開發中的手稿總結成文。在我遇到的流媒體類型中,flv是最“和善”的一種,封裝格式簡單,傳輸效率較高。與http搭配,延時很小,做直播很適合。本文只是簡單地總結了一下flv的格式定義等信息,並沒有通過貼出相應的解封裝代碼,可能看起來比較空洞。因爲項目還沒做完,所以等項目結束了,會專門補發一篇flv解封裝的文章,作爲本文的“佐證”。
本文通過分解思維導圖“樹形結構”來展開闡述,完整的思維導圖也同步上傳到我的資源,有需要的可以免費下載。在博主開發中,遇到一款非常友善的工具“FlvAnalyzer”,快速的協助我完成了flv的轉封裝,但是不知道這款工具的開發者是哪位大神,在此先表示衷心的感謝。這款工具同樣上傳到我的資源中,免費給需要的同學使用。如果閱讀本文發現有錯誤,請隨時聯繫博主修改完善;如果本文對你有助,請點贊關注我,相互學習,共同進步!