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 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) 5: video info/command frame |
編碼ID |
UB4 |
使用哪種編碼型別: 1: JPEG (currently unused) 2: Sorenson H.263 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 7 = G.711 A-law logarithmic PCM 8 = G.711 mu-law logarithmic PCM 9 = reserved 10 = AAC 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