FLV 文件格式

概述

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_文件結(jié)構(gòu).jpg

FLV File Header

FLV_File_Header.png
字段 字節(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)的名稱和值。

FLV_Script_Tag.png
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
FLV_Script_AMF_1.png

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)比較重要的SPSPPS信息,再給AVC解碼器送數(shù)據(jù)流之前一定要把SPSPPS信息送出,否則的話解碼器不能正常解碼。而且在解碼器stop之后再次start之前,如seek、快進(jìn)快退狀態(tài)切換等,都需要重新送一遍SPSPPS的信息。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_Video_Tag_1.png

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在如何看待嗶哩嗶哩的開(kāi)源 HTML5 播放器內(nèi)核 flv.js?中,flv.js作者有這樣一段回復(fù):一些人問(wèn)我為什...
    合肥黑閱讀 2,580評(píng)論 1 4
  • 目錄 概述 flv文件主體結(jié)構(gòu) Tag介紹 開(kāi)源的解析軟件 參考閱讀 參考 [1] FLV and F4V Fil...
    smallest_one閱讀 1,427評(píng)論 0 2
  • flv格式是由adobe公司制定的一種比較簡(jiǎn)單的流媒體存儲(chǔ)格式,由于其視頻文件體積輕巧、封裝播放簡(jiǎn)單等特點(diǎn),使其很...
    hijiang閱讀 926評(píng)論 0 0
  • 簡(jiǎn)介 FLV(Flash Video)是現(xiàn)在非常流行的流媒體格式,由于其視頻文件體積輕巧、封裝播放簡(jiǎn)單等特點(diǎn),使其...
    第八區(qū)閱讀 23,207評(píng)論 23 33
  • FLV Flash Video is a container file format used to delive...
    FlyingPenguin閱讀 3,559評(píng)論 1 5

友情鏈接更多精彩內(nèi)容