封裝格式---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的長度,這個後置用於逆向讀取處理,他們的關係如下圖:
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能成為線上視訊格式的原因吧。