FLV格式解析

本文目的:

熟悉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文件体

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)
4: generated keyframe (reserved for server use only)

5: video info/command frame

编码ID

UB4

使用哪种编码类型:

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

视频数据

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
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

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


猜你喜欢

转载自blog.csdn.net/q2519008/article/details/80963631