本文目的:
熟悉FLV格式,能够直接使用ultrEdit直接分析一段FLV文件或许相关信息,或者编写程序解析出FLV文件相关信息
一、FLV文件格式
FLV是流媒体格式的一种
FLV是一个二进制文件,由文件头(FLV header)和很多tag组成。tag又可以分成三类:audio,video,script,分别代表音频流,视频流,脚本流(关键字或者文件信息之类)。
FLV文件=FLV头文件+ tag1+tag内容1 + tag2+tag内容2 + ...+... + tagN+tag内容N。
FLV包括文件头(File Header)和文件体(File Body)两部分:
Tag为每一个内容,目前包括音频、视频、脚本。
previousTagSize为前一个Tag的长度。
Header下面四个字节的PreviousTagSize,因为前一个没有Tag,所以值填写0
二、FLV Header格式(9 bytes)
Field | type | Comment |
签名 | UI8 | ’F’(0X46) |
签名 | UI8 | ‘L’(0X4C) |
签名 | UI8 | ‘V’(0x56) |
版本 | UI8 | FLV的版本。0x01表示FLV 版本是1 |
保留字段 | UB5(位域) | 前五位必须是0 |
是否有音频流 | UB1(位域) | 音频流是否存在标志 |
保留字段 | UB1(位域) | 必须是0 |
是否有视频流 | UB1(位域) | 视频流是否存在标志 |
文件头大小 | UI32 | FLV版本1时填写9,表明的是FLV头的大小,为后期的FLV版本扩展使用。包括这四个字节。 数据的起始位置就是从文件开头偏移这么多的大小。 |
FLV tags 结构:
| TagType(8) | DataSize(24) | Timestamp(24) |TimestampExtended(8) | StreamID(24) | Data(DataSize) |
Field | type | Comment |
TAG类型 | UI8 | 0x08: audio 0x09: video 0x12: script data——这里是一些描述信息。 all others: reserved其他所有值未使用。 |
数据大小 | UI24 | 数据区的大小,不包括包头。包头总大小是11个字节。 |
时戳 | UI24 | 当前帧时戳,单位是毫秒。相对于FLV文件的第一个TAG时戳。第一个tag的时戳总是0。——不是时戳增量,rtmp中是时戳增量。 |
时戳扩展字段 | UI8 | 如果时戳大于0xFFFFFF,将会使用这个字节。这个字节是时戳的高8位,上面的三个字节是低24位。 |
流ID | U24 | 总是0 |
数据区Data | UI8[n] |
Data为具体的数据内容,
如果TagType=0x08,为AudioData;
如果TagType=0x09,为VideoData;
如果TagType=0x12,为ScriptDataObject,但该项因为内容不固定,所以在FLV文件中可以没有该Tag内容。
三、Script Tag Data结构
该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的参数信息,如duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。
一般来说,该Tag Data结构包含两个AMF包。AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。具体说明如下,大家可以参照图片上的数据进行理解
第1个字节表示AMF包类型,一般总是0x08,表示数组。
第2-5个字节为UI32类型值,表示数组元素的个数。
后面即为各数组元素的封装,数组元素为元素名称和值组成的对。表示方法如下:
第1-2个字节表示元素名称的长度,假设为L。
后面跟着为长度为L的字符串。
第L+3个字节表示元素值的类型。
后面跟着为对应值,占用字节数取决于值的类型。
例如:
等等。。。
四、VIdeo Tag Data结构
视频Tag也用开始的第1个字节包含视频数据的参数信息,从第2个字节开始为视频流数据。
第1个字节的前4位的数值表示帧类型。
第1个字节的后4位的数值表示视频编码ID
Field | type | Comment |
帧类型 | UB4 | 1: keyframe (for AVC, a seekable frame)——h264的IDR,关键帧,可重入帧。 2: inter frame (for AVC, a non- seekable frame)——h264的普通帧 3: disposable inter frame (H.263 only) 5: video info/command frame |
编码ID | UB4 | 使用哪种编码类型: 1: JPEG (currently unused) 2: Sorenson H.263 4: On2 VP6 5: On2 VP6 with alpha channel 6: Screen video version 2 7: AVC |
视频数据 | UI[N] | 如果是avc,则参考下面的介绍: AVCVIDEOPACKET |
五、Audio Tag Data结构
音频Tag开始的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。
第1个字节的前4位的数值表示了音频数据格式,各值代表的意义大家可以查阅Adobe公司发布的FLV格式说明文档
第1个字节的第5-6位的数值表示采样率,0 = 5.5 kHz,1 = 11 kHz,2 = 22 kHz,3 = 44 kHz。
第1个字节的第7位表示采样精度,0 = 8bits,1 = 16bits。
第1个字节的第8位表示音频类型,0 = mono,1 = stereo。
Field | type | Comment |
音频格式 | UB4 | 0 = Linear PCM, platform endian 7 = G.711 A-law logarithmic PCM 8 = G.711 mu-law logarithmic PCM 9 = reserved 10 = AAC 14 = MP3 8-Khz 15 = Device-specific sound 7, 8, 14, and 15:内部保留使用。 flv是不支持g711a的,如果要用,可能要用线性音频。 |
采样率 | UB2 | For AAC: always 3 0 = 5.5-kHz 1 = 11-kHz 2 = 22-kHz 3 = 44-kHz |
采样大小 | UB1 | 0 = snd8Bit 1 = snd16Bit |
声道 | UB1 | 0=单声道 1=立体声,双声道。AAC永远是1 |
声音数据 | UI8[N] | 如果是PCM线性数据,存储的时候每个16bit小端存储,有符号。 如果音频格式是AAC,则存储的数据是AAC AUDIO DATA,否则为线性数组。 |
参考:
http://www.360doc.com/content/16/1013/17/474846_598171645.shtml