最近要用到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被省略了,直接随着的是字符串的长度,然后是字符串,再是值的类型,也就是上面介绍的那些了。