概述
Flash Video(簡(jiǎn)稱FLV),是一種網(wǎng)絡(luò)視頻格式,用作流媒體格式,它的出現(xiàn)有效地解決了視頻文件導(dǎo)入Flash后,使導(dǎo)出的SWF文件體積龐大,不能在網(wǎng)絡(luò)上有效使用等缺點(diǎn)。
FLV文件結(jié)構(gòu)
FLV 文件 = File Header(FLV 文件頭)+ File Body(FLV 文件體)。其中文件體又由一系列的 Tag 和 Tag Size 組成。

FLV File Header

| 字段 | 字節(jié) | 描述 |
|---|---|---|
| signature | 3 | 文件格式標(biāo)識(shí)。('F‘ : 0x46,'L' : 0x4C,'V' : 0x56) |
| version | 1 | 版本號(hào)。(0x01:版本號(hào)為1) |
| type flags | 1 | 類型標(biāo)識(shí)。 前5個(gè)bit是類型標(biāo)志預(yù)留字段,必須是0; 第6個(gè)bit音頻類型標(biāo)志(TypeFlagsAudio); 第7個(gè)bit是類型標(biāo)志預(yù)留字段,必須是0; 第8個(gè)bit視頻類型標(biāo)志(TypeFlagsVideo)。(0x05,也就是 00000101,表示既有音頻也有視頻) |
| data offset | 4 | 文件頭的長(zhǎng)度。(對(duì)于版本號(hào)為1的FLV文件來(lái)說(shuō),文件頭長(zhǎng)度固定是9,大于9表示下面還有擴(kuò)展信息) |
FLV File Body
Body部分是由一系列的 PreviousTagSize + Tag 構(gòu)成。
PreviousTagSize 固定為4字節(jié),表示前一個(gè)Tag的size
Tag分為3種類型:Script(腳本)、Video(視頻)、Audio(音頻)
FLV Tag
FLV中的Tag又分為 tag header(tag頭部分)和 tag data(tag數(shù)據(jù)部分)。
FLV Tag Header
| 字段 | 字節(jié) | 描述 |
|---|---|---|
| TagType | 1 | 當(dāng)前tag的類型,值有: 0x08:audio 0x09:video 0x12:script 其他:未使用的預(yù)留值 |
| DataSize | 3 | 數(shù)據(jù)部分的數(shù)據(jù)長(zhǎng)度(Data字段的數(shù)據(jù)長(zhǎng)度)。 |
| Timestamp | 3 | 當(dāng)前幀的時(shí)間戳,單位是毫秒。相對(duì)于第一個(gè)TAG的時(shí)間戳(第一個(gè)的時(shí)間戳總是0) |
| TimestampExtended | 1 | 時(shí)間戳擴(kuò)展字段。 如果時(shí)間戳大于0xFFFFFF,將會(huì)使用這個(gè)字節(jié)。這個(gè)字節(jié)是時(shí)間戳的高8位,上面的三個(gè)字節(jié)是低24位。 |
| StreamID | 3 | 流ID,總是0 |
| Data | n | 數(shù)據(jù)部分 |
FLV Script Tag
Script Tag一般只有一個(gè),且是FLV中第一個(gè)Tag,用來(lái)存放一些描述信息,如:duration、width、height等。Script Tag 中Data部分的數(shù)據(jù)都是以 【數(shù)據(jù)類型 + 數(shù)據(jù)長(zhǎng)度 + 數(shù)據(jù)】的格式出現(xiàn)的。一般來(lái)說(shuō),該Tag Data結(jié)構(gòu)包含兩個(gè)AMF包。AMF(Action Message Format)是Adobe設(shè)計(jì)的一種通用數(shù)據(jù)封裝格式,在Adobe的很多產(chǎn)品中應(yīng)用,簡(jiǎn)單來(lái)說(shuō),AMF將不同類型的數(shù)據(jù)用統(tǒng)一的格式來(lái)描述。第一個(gè)AMF包封裝字符串類型數(shù)據(jù),用來(lái)裝入一個(gè)“onMetaData”標(biāo)志,這個(gè)標(biāo)志與Adobe的一些API調(diào)用有關(guān)。第二個(gè)AMF包封裝一個(gè)數(shù)組類型,這個(gè)數(shù)組中包含了音視頻信息項(xiàng)的名稱和值。

Script Data Type
| 值 | 類型 | 說(shuō)明 |
|---|---|---|
| 0 | Number type | double類型,后8字節(jié)為數(shù)據(jù)長(zhǎng)度 |
| 1 | Boolean type | bool類型,后1字節(jié)為數(shù)據(jù)長(zhǎng)度 |
| 2 | String type | string類型,后兩字節(jié)為數(shù)據(jù)長(zhǎng)度 |
| 3 | Object type | |
| 4 | MovieClip type | |
| 5 | Null type | |
| 6 | Undefined type | |
| 7 | Reference type | |
| 8 | ECMA array type | 數(shù)組類型(類似Map),后4字節(jié)為數(shù)組長(zhǎng)度。(key:前兩字節(jié)為長(zhǎng)度;value部分第1字節(jié)為類型) |
| 10 | Strict array type | |
| 11 | Date type | |
| 12 | Long string type |
第一個(gè)AMF

02:String類型
0A:String長(zhǎng)度為10
后面10字節(jié)為數(shù)據(jù)的值
FLV Video Tag Data
| 字段 | 占位 | 描述 |
|---|---|---|
| FrameType | 4 | 幀類型。 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 |
| CodecID | 4 | 編碼類型。 1: JPEG(目前未用到) 2: Sorenson H.263 3: Screen video 4: On2 VP6 5: On2 VP6 with alpha channel 6: Screen video version 2 7: AVC(高級(jí)視頻編碼) |
| VideoData | n | 數(shù)據(jù)部分(AVC則需要參考下面AVCVIDEOPACKET部分) |
AVCVIDEOPACKET
| 字段 | 字節(jié) | 描述 |
|---|---|---|
| AVCPacketType | 1 | 0:AVC sequence header 1:AVC NALU 2:AVC end of sequence |
| CompositionTime | 3 | 合成時(shí)間。 AVCPacketType==1,表示 合成時(shí)間(單位毫秒); 否則為0 |
| data | n | 如果AVCPacketType==0,數(shù)據(jù)部分為AVCDecoderConfigurationRecord; 如果AVCPacketType==1,數(shù)據(jù)部分為1個(gè)或多個(gè)NALU; 如果AVCPacketType==2,數(shù)據(jù)部分為空 |
AVCDecoderConfigurationRecord
AVCDecoderConfigurationRecord 包含了H.264解碼相關(guān)比較重要的SPS和PPS信息,再給AVC解碼器送數(shù)據(jù)流之前一定要把SPS和PPS信息送出,否則的話解碼器不能正常解碼。而且在解碼器stop之后再次start之前,如seek、快進(jìn)快退狀態(tài)切換等,都需要重新送一遍SPS和PPS的信息。AVCDecoderConfigurationRecord在FLV文件中一般情況也是出現(xiàn)1次,也就是第一個(gè)video tag。
| 字段 | 字節(jié) | 描述 |
|---|---|---|
| 版本 | 1 | 0x01,版本號(hào)為1 |
| 編碼規(guī)格 | 3 | sps[1]+sps[2]+sps[3] |
| NALU 的長(zhǎng)度 | 1 | 0xFF,包長(zhǎng)為 (0xFF& 3) + 1,也就是4字節(jié)表示 |
| SPS個(gè)數(shù) | 1 | 0xE1,個(gè)數(shù)為0xE1 & 0x1F 也就是1 |
| SPS長(zhǎng)度 | 2 | 整個(gè)sps長(zhǎng)度 |
| SPS的內(nèi)容 | n | 整個(gè)sps |
| PPS個(gè)數(shù) | 1 | 0x01,1個(gè) |
| PPS長(zhǎng)度 | 2 | 整個(gè)pps長(zhǎng)度 |
| PPS內(nèi)容 | n | 整個(gè)pps內(nèi)容 |

FLV Audio Tag Data
與Video Tag類似。
| 字段 | 占位 | 描述 |
|---|---|---|
| SoundFormat | 4 | 音頻數(shù)據(jù)格式。值: 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 (7,8,14,15是內(nèi)部預(yù)留) |
| SoundRate | 2 | 音頻采樣率。值: 0 = 5.5-kHz 1 = 11-kHz 2 = 22-kHz 3 = 44-kHz (對(duì)于AAC來(lái)說(shuō),該字段總是3) |
| SoundSize | 1 | 采樣長(zhǎng)度。值: 0 = snd9Bit 1 = snd16Bit (對(duì)于壓縮過(guò)的音頻來(lái)說(shuō),一般都是16bit) |
| SoundType | 1 | 音頻類型(單聲道還是雙聲道)。值: 0 = sndMono 1 = sndStereo (對(duì)于AAC,總是1) |
| SoundData | n | 音頻數(shù)據(jù)部分(AAC則需要參考下面AACAUDIODATA部分) |
AACAUDIODATA
| 字段 | 字節(jié) | 描述 |
|---|---|---|
| AACPacketType | 1 | 0:AAC 序列頭<br />1:AAC 數(shù)據(jù) |
| Data | n | 如果AACPacketType==0,參考下面的 AudioSpecificConfig 如果AACPacketType==1,即AAC原始音頻數(shù)據(jù) |
AudioSpecificConfig
| 字段 | 占位 |
|---|---|
| audioObjectType | 5 |
| samplingFrequencyIndex | 4 |
| channelConfiguration | 4 |
| frameLengthFlag | 1 |
| dependsOnCoreCoder | 1 |
| extensionFlag | 1 |