1. 程式人生 > >封裝格式---FLV---檔案格式解析

封裝格式---FLV---檔案格式解析

轉自: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的長度,這個後置用於逆向讀取處理,他們的關係如下圖:flv

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能成為線上視訊格式的原因吧。