1. 程式人生 > >封裝格式---FLV---文件格式解析

封裝格式---FLV---文件格式解析

ttl span 在線 reserve byte 16bit ams 這也 介紹

轉自:https://wuyuans.com/2012/08/flv-format

flv文件主要由兩部分組成:header和body。

1.header

header部分記錄了flv的類型、版本等信息,是flv的開頭,一般都差不多,占9bytes。具體格式如下:

文件類型 3 bytes “FLV”
版本 1 byte 一般為0x01
流信息 1 byte 倒數第一位是1表示有視頻倒數第三位是1表示有音頻,倒數第二、四位必須為0
header長度 4 bytes 整個header的長度,一般為9;大於9表示下面還有擴展信息

2.body

每個Tag前面還包含了Previous Tag Size字段,表示前面一個Tag的大小。

body部分由一個個Tag組成,每個Tag的下面有一塊4bytes的空間,用來記錄這個tag的長度,這個後置用於逆向讀取處理,他們的關系如下圖:技術分享圖片

2.1.Tag

每個Tag由也是由兩部分組成的:Tag Header和Tag Data。Tag Header裏存放的是當前Tag的類型、數據區(Tag Data)長度等信息,具體如下:

名稱長度介紹
Tag類型 1 bytes 8:音頻
9:視頻
18:腳本
其他:保留
數據區長度 3 bytes 在數據區的長度
時間戳 3 bytes 整數,單位是毫秒。對於腳本型的tag總是0
時間戳擴展 1 bytes 將時間戳擴展為4bytes,代表高8位。很少用到
StreamsID 3 bytes 總是0
數據區(data) 由數據區長度決定 數據實體

2.2.Tag Data

數據區根據Tag類型的不同可分為三種,音頻數據、視頻數據和腳本數據。

2.2.1.音頻數據

第一個byte是音頻的信息,格式如下。

名稱長度介紹
音頻格式 4 bits 0 = Linear PCM, platform endian
1 = ADPCM
2 = MP3
3 = Linear PCM, little endian
4 = Nellymoser 16-kHz mono
5 = Nellymoser 8-kHz mono
6 = Nellymoser
7 = G.711 A-law logarithmic PCM
8 = G.711 mu-law logarithmic PCM
9 = reserved
10 = AAC
11 = Speex
14 = MP3 8-Khz
15 = Device-specific sound
采樣率 2 bits 0 = 5.5-kHz
1 = 11-kHz
2 = 22-kHz
3 = 44-kHz
對於AAC總是3
采樣的長度 1 bit 0 = snd8Bit
1 = snd16Bit
壓縮過的音頻都是16bit
音頻類型 1 bit 0 = sndMono
1 = sndStereo
對於AAC總是1

第2byte開始就是音頻流數據了。

2.2.2.視頻數據

和音頻數據一樣,第一個byte是視頻信息,格式如下:

名稱長度介紹
幀類型 4 bits 1: keyframe (for AVC, a seekable frame)
2: inter frame (for AVC, a non-seekable frame)
3: disposable inter frame (H.263 only)
4: generated keyframe (reserved for server use only)
5: video info/command frame
編碼ID 4 bits 1: JPEG (currently unused)
2: Sorenson H.263
3: Screen video
4: On2 VP6
5: On2 VP6 with alpha channel
6: Screen video version 2
7: AVC

2.2.3腳本數據

該類型Tag又通常被稱為Metadata Tag,會放一些關於FLV視頻和音頻的元數據信息如:duration、width、height等。通常該類型Tag會跟在File Header後面作為第一個Tag出現,而且只有一個。結構如圖所示:

技術分享圖片

第一個AMF包:

第1個字節表示AMF包類型,常見的數據類型如下:

技術分享圖片

FLV文件中,第一個字節一般總是0x02,表示字符串。第2-3個字節為UI16類型值,標識字符串的長度,一般總是0x000A(“onMetaData”長度)。後面字節為具體的字符串,一般總為“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。

第二個AMF包:

第1個字節表示AMF包類型,一般總是0x08,表示數組。第2-5個字節為UI32類型值,表示數組元素的個數。後面即為各數組元素的封裝,數組元素為元素名稱和值組成的對。常見的數組元素如下表:
技術分享圖片

3.總結

flv的格式還是比較簡單的,header部分很簡潔,body部分都是由一個個tag,tag的話也就三種,腳本tag一般只有一個的,我想這也是flv能成為在線視頻格式的原因吧。

封裝格式---FLV---文件格式解析