天天看點

學習和分析FLV封裝格式

這幾天在研究FLV 的封裝格式。

參考了網上的文章

http://blog.csdn.net/leixiaohua1020/article/details/17934487?locationNum=3

http://www.aichengxu.com/view/2430313

FLV 是應用很多的一種格式。

下面是針對具體的檔案來分析 。

學習和分析FLV封裝格式

1)  首先FlvHeader 是9個位元組,前三個是FLV,版本是01,後面的05(0000 0101),第6位和8位為1,表示有音頻也有視訊。 後面的4個位元組是9.

2)  緊跟着的4個位元組是PreviousTag Size 是0,因為前面沒有Tag

3)  後面緊跟着11個位元組的TagHeader, 從12 開始到0x02之前 ,Type為12表示script,dataSize 為 00 01 69, 後面的時間戳為0,後面的擴充時間戳也是0,然後後面的StreamID(3位)也是0

4)  往後看是TagData 第一個位元組02表示是第一個AMF包,表示字元串; 後面固定的是0x000A(“onMetaData”的長度,為10)。

5)  再往後是第二個AMF包,0x08,表示數組,後面2-5位元組是 00 00 0010(十進制為16),表示有16個數組元素。

6)  再往後有兩個位元組00 08(應該表示的是元素key值的長度,08表示“duration”一個8個位元組,後面依次類推),然後是key值字元串,然後是9個位元組的資料(奇怪!)。

7)  因為上面TagHeader中有dataSize,是以可以往下數00 0169 個位元組,後面是第二個Tag

學習和分析FLV封裝格式

其中上面是第二個Tag

1)   00 01 74 正好是 比00 01 69 大11,正好是TagHeader的大小

2)   後面跟着那個11個TagHeader, 09表示視訊, 00 002D(45)是這個Tag的Datasize。後面的timestamp, timestamp_ex,streamed 均為0

3)  緊接着是17,TagData的第一個位元組(0001 0111)表示keyFrame,AVC

4)  從17開始往下數45個位元組 00 00 0038(56,正好是45+11),

5)  下面的0x08表示音頻,後面的DataSize為09,後面的timestamp, timestamp_ex, streamed 也均為0.

6)  在往後是AF(1010  1111)  前4位1010表示AAC, 采樣率3表示44kHz采樣精度1表示16位,音頻類型為sndStereo

至此,分析完了 FlvHeader, TagHeader, TagData 的第一個位元組,其中也分析了音頻視訊以及Script。

=================================

其中分析MetaData 部分主要是參考的上面第二個連結

轉一張圖過來,相信一看就懂。

學習和分析FLV封裝格式