程序员人生 网站导航

FLV文件格式解析

栏目:综合技术时间:2017-02-15 09:05:34

最近要用到flv,整理了1些flv格式的资料,供参考。 flv文件主要由两部份组成:header和body。

1.header

header部份记录了flv的类型、版本等信息,是flv的开头,1般都差不多,占9bytes。具体格式以下:
文件类型 3 bytes “FLV”
版本 1 byte 1般为0x01
流信息 1 byte 倒数第1位是1表示有视频,倒数第3位是1表示有音频,倒数第2、4位必须为0
header长度 4 bytes 全部header的长度,1般为9;大于9表示下面还有扩大信息

2.body

body部份由1个个Tag组成,每一个Tag的下面有1块4bytes的空间,用来记录这个tag的长度,这个后置用于逆向读取处理,他们的关系以下图:flv

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类型的不同可分为3种,音频数据、视频数据和脚本数据。

2.2.1.音频数据

第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.视频数据

和音频数据1样,第1个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脚本数据

脚本Tag1般只有1个,是flv的第1个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中的脚本,1般开头是0x02,表示String类型,后面的2bytes为字符串长度,1般是0x000a(“onMetaData”的长度),再后面就是字符串“onMetaData”。好像flv格式的文件都有onMetaData标记,在运行ActionScript的时候会用到它。后面跟的是0x08,表示ECMA Array类型,这个和Map比较相似,1个键随着1个值。键都是String类型的,所以开头的0x02被省略了,直接随着的是字符串的长度,然后是字符串,再是值的类型,也就是上面介绍的那些了。

3.总结

flv的格式还是比较简单的,header部份很简洁,body部份都是由1个个tag,tag的话也就3种,脚本tag1般只有1个的,我想这也是flv能成为在线视频格式的缘由吧。只要了解了格式,我们就能够写个程序来解析flv文件了,这也是我下1步要做的。
最后附上flv官方手册:video_file_format_spec_v10

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐