最近要用到flv,整理了1些flv格式的資料,供參考。 flv文件主要由兩部份組成:header和body。
文件類型 | 3 bytes | “FLV” |
版本 | 1 byte | 1般為0x01 |
流信息 | 1 byte | 倒數第1位是1表示有視頻,倒數第3位是1表示有音頻,倒數第2、4位必須為0 |
header長度 | 4 bytes | 全部header的長度,1般為9;大于9表示下面還有擴大信息 |
名稱 | 長度 | 介紹 |
---|---|---|
Tag類型 | 1 bytes | 8:音頻 9:視頻 18:腳本 其他:保存 |
數據區長度 | 3 bytes | 在數據區的長度 |
時間戳 | 3 bytes | 整數,單位是毫秒。對腳本型的tag總是0 |
時間戳擴大 | 1 bytes | 將時間戳擴大為4bytes,代表高8位。很少用到 |
StreamsID | 3 bytes | 總是0 |
數據區(data) | 由數據區長度決定 | 數據實體 |
名稱 | 長度 | 介紹 |
---|---|---|
音頻格式 | 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 |
名稱 | 長度 | 介紹 |
---|---|---|
幀類型 | 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 |
首先介紹下腳本的數據類型。所有數據都是以數據類型+(數據長度)+數據的格式出現的,數據類型占1byte,數據長度看數據類型是不是存在,后面才是數據。
其中數據類型的種類有:
如果類型為String,后面的2bytes為字符串的長度(Long String是4bytes),再后面才是字符串數據;如果是Number類型,后面的8bytes為Double類型的數據;Boolean類型,后面1byte為Bool類型。
知道了這些后再來看看flv中的腳本,1般開頭是0x02,表示String類型,后面的2bytes為字符串長度,1般是0x000a(“onMetaData”的長度),再后面就是字符串“onMetaData”。好像flv格式的文件都有onMetaData標記,在運行ActionScript的時候會用到它。后面跟的是0x08,表示ECMA Array類型,這個和Map比較相似,1個鍵隨著1個值。鍵都是String類型的,所以開頭的0x02被省略了,直接隨著的是字符串的長度,然后是字符串,再是值的類型,也就是上面介紹的那些了。