FLV文件格式解析

最近要用到flv,整理了一些flv格式的資料,供參考。 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

body部分由一個個Tag組成,每個Tag的下面有一塊4bytes的空間,用來記錄這個tag的長度,這個後置用於逆向讀取處理,他們的關係如下圖:

FVL結構圖

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一般只有一個,是flv的第一個Tag,用於存放flv的信息,比如duration、audiodatarate、creator、width等。

首先介紹下腳本的數據類型。所有數據都是以數據類型+(數據長度)+數據的格式出現的,數據類型佔1byte,數據長度看數據類型是否存在,後面纔是數據。
其中數據類型的種類有:

  • 0 = Number type
  • 1 = Boolean type
  • 2 = String type
  • 3 = Object type
  • 4 = MovieClip type
  • 5 = Null type
  • 6 = Undefined type
  • 7 = Reference type
  • 8 = ECMA array type
  • 10 = Strict array type
  • 11 = Date type
  • 12 = Long string type

如果類型爲String,後面的2bytes爲字符串的長度(Long String是4bytes),再後面纔是字符串數據;如果是Number類型,後面的8bytes爲Double類型的數據;Boolean類型,後面1byte爲Bool類型。

知道了這些後再來看看flv中的腳本,一般開頭是0x02,表示String類型,後面的2bytes爲字符串長度,一般是0x000a(”onMetaData”的長度),再後面就是字符串”onMetaData”。好像flv格式的文件都有onMetaData標記,在運行ActionScript的時候會用到它。後面跟的是0x08,表示ECMA Array類型,這個和Map比較相似,一個鍵跟着一個值。鍵都是String類型的,所以開頭的0x02被省略了,直接跟着的是字符串的長度,然後是字符串,再是值的類型,也就是上面介紹的那些了。

3.總結

flv的格式還是比較簡單的,header部分很簡潔,body部分都是由一個個tag,tag的話也就三種,腳本tag一般只有一個的,我想這也是flv能成爲在線視頻格式的原因吧。只要瞭解了格式,我們就可以寫個程序來解析flv文件了,這也是我下一步要做的。
最後附上flv官方手冊:video_file_format_spec_v10

轉自Wuyuan’s Blog 的文章 地址: http://wuyuans.com/2012/08/flv-format

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章