1. 程式人生 > >FLV格式解析

FLV格式解析

本文目的:

熟悉FLV格式,能夠直接使用ultrEdit直接分析一段FLV檔案或許相關資訊,或者編寫程式解析出FLV檔案相關資訊


一、FLV檔案格式

FLV是流媒體格式的一種

FLV是一個二進位制檔案,由檔案頭(FLV header)和很多tag組成。tag又可以分成三類:audio,video,script,分別代表音訊流,視訊流,指令碼流(關鍵字或者檔案資訊之類)。
FLV檔案=FLV標頭檔案+ tag1+tag內容1 + tag2+tag內容2 + ...+... + tagN+tag內容N。

FLV包括檔案頭(File Header)和檔案體(File Body)兩部分:


Tag為每一個內容,目前包括音訊、視訊、指令碼。

previousTagSize為前一個Tag的長度。

Header下面四個位元組的PreviousTagSize,因為前一個沒有Tag,所以值填寫0


二、FLV Header格式(9 bytes)

Field

type

Comment

簽名

UI8

’F’(0X46)

簽名

UI8

‘L’(0X4C)

簽名

UI8

‘V’(0x56)

版本

UI8

FLV的版本。0x01表示FLV 版本是1

保留欄位

UB5(位域)

前五位必須是0

是否有音訊流

UB1(位域)

音訊流是否存在標誌

保留欄位

UB1(位域)

必須是0

是否有視訊流

UB1(位域)

視訊流是否存在標誌

檔案頭大小

UI32

FLV版本1時填寫9,表明的是FLV頭的大小,為後期的FLV版本擴充套件使用。包括這四個位元組。

資料的起始位置就是從檔案開頭偏移這麼多的大小。

三、FLV檔案體

FLV tags 結構:

| TagType(8) | DataSize(24) | Timestamp(24) |TimestampExtended(8) | StreamID(24) | Data(DataSize) |

Field

type

Comment

TAG型別

UI8

0x08: audio

0x09: video

0x12: script data——這裡是一些描述資訊。

all others: reserved其他所有值未使用。

資料大小

UI24

資料區的大小,不包括包頭。包頭總大小是11個位元組。

時戳

UI24

當前幀時戳,單位是毫秒。相對於FLV檔案的第一個TAG時戳。第一個tag的時戳總是0。——不是時戳增量,rtmp中是時戳增量。

時戳擴充套件欄位

UI8

如果時戳大於0xFFFFFF,將會使用這個位元組。這個位元組是時戳的高8位,上面的三個位元組是低24位。

流ID

U24

總是0

資料區Data

UI8[n]


Data為具體的資料內容,

如果TagType=0x08,為AudioData;

如果TagType=0x09,為VideoData;

如果TagType=0x12,為ScriptDataObject,但該項因為內容不固定,所以在FLV檔案中可以沒有該Tag內容。


三、Script Tag Data結構

    該型別Tag又通常被稱為Metadata Tag,會放一些關於FLV視訊和音訊的引數資訊,如duration、width、height等。通常該型別Tag會跟在File Header後面作為第一個Tag出現,而且只有一個。

    一般來說,該Tag Data結構包含兩個AMF包。AMF(Action Message Format)是Adobe設計的一種通用資料封裝格式,在Adobe的很多產品中應用,簡單來說,AMF將不同型別的資料用統一的格式來描述。第一個AMF包封裝字串型別資料,用來裝入一個“onMetaData”標誌,這個標誌與Adobe的一些API呼叫有,在此不細述。第二個AMF包封裝一個數組型別,這個陣列中包含了音視訊資訊項的名稱和值。具體說明如下,大家可以參照圖片上的資料進行理解


       第1個位元組表示AMF包型別,一般總是0x08,表示陣列。

       第2-5個位元組為UI32型別值,表示陣列元素的個數。

       後面即為各陣列元素的封裝,陣列元素為元素名稱和值組成的對。表示方法如下:

       第1-2個位元組表示元素名稱的長度,假設為L。

       後面跟著為長度為L的字串

       第L+3個位元組表示元素值的型別

       後面跟著為對應值,佔用位元組數取決於值的型別

例如:



等等。。。


四、VIdeo Tag Data結構

視訊Tag也用開始的第1個位元組包含視訊資料的引數資訊,從第2個位元組開始為視訊流資料。


    第1個位元組的前4位的數值表示幀型別。

    第1個位元組的後4位的數值表示視訊編碼ID

Field

type

Comment

幀型別

UB4

1: keyframe (for AVC, a seekable frame)——h264的IDR,關鍵幀,可重入幀。

2: inter frame (for AVC, a non- seekable frame)——h264的普通幀

3: disposable inter frame (H.263 only)
4: generated keyframe (reserved for server use only)

5: video info/command frame

編碼ID

UB4

使用哪種編碼型別:

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

視訊資料

UI[N]

如果是avc,則參考下面的介紹:

AVCVIDEOPACKET


五、Audio Tag Data結構

音訊Tag開始的第1個位元組包含了音訊資料的引數資訊,從第2個位元組開始為音訊流資料。

    第1個位元組的前4位的數值表示了音訊資料格式,各值代表的意義大家可以查閱Adobe公司釋出的FLV格式說明文件

    第1個位元組的第5-6位的數值表示取樣率,0 = 5.5 kHz,1 = 11 kHz,2 = 22 kHz,3 = 44 kHz。

    第1個位元組的第7位表示取樣精度,0 = 8bits,1 = 16bits。

    第1個位元組的第8位表示音訊型別,0 = mono,1 = stereo。

Field

type

Comment

音訊格式

UB4

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, and 15:內部保留使用。

flv是不支援g711a的,如果要用,可能要用線性音訊。

取樣率

UB2

For AAC: always 3

0 = 5.5-kHz

1 = 11-kHz

2 = 22-kHz

3 = 44-kHz

取樣大小

UB1

0 = snd8Bit

1 = snd16Bit

聲道

UB1

0=單聲道

1=立體聲,雙聲道。AAC永遠是1

聲音資料

UI8[N]

如果是PCM線性資料,儲存的時候每個16bit小端儲存,有符號。

如果音訊格式是AAC,則儲存的資料是AAC AUDIO DATA,否則為線性陣列。



參考:

http://www.360doc.com/content/16/1013/17/474846_598171645.shtml