2024年2月11日发(作者:)

FLV文件结构

FLV是一个二进制文件,由文件头(Flv header / File header)和很多Tag组成。Tag又可以分成三类:Metadata Tag、Audio Tag、Video Tag,分别为元数据(包括文件信息、音视频信息等)、音频流,视频流。可以使用小工具查看Flv文件信息(选择要显示的信息类型下面的下拉框中选择“file header info,

metadata info, tag header info”较好)。

各个部分介绍如下:

1. Flv Header

一般比较简单,包括文件类型之类的全局信息,包括以下部分:

(1) 文件类型 3bytes

总是FLV(0x46 0x4C 0x56)

(2) 版本1byte

一般是0x01,表示FLV version 1

(3) 流信息 1byte

倒数第一bit为1表示有视频流,倒数第三bit为1表示有音频流,其他一般都是0(有些软件如flvtool2可能造成倒数第四bit是1,不过也ok)

(4) header长度4bytes

整个文件头的长度,一般是9(3+1+1+4),有时候后面还有些别的信息,就不是9了

1.5 First Tag Size 4bytes

一般为0,只是为了格式上统一。因为后面每个Tag段都包含Tag+Pre Tag Size,这里File Header部分也看作一个Header+First Tag Size。First Tag Size的具体数值意义不大。

2. Flv Body

Flv body由很多Tag组成,一个Tag包括以下信息:

第一部分,Tag Header,共11bytes,含以下四个部分:

(1) Tag类型 1byte

三类:8 -- 音频Tag;9 -- 视频Tag;18 -- 元数据Tag

(2) 数据区长度 3bytes

Tag Data的长度,以字节为单位

(3) 时间戳 4bytes

单位为ms,如果是Metadata Tag则为0

时间戳包括基本时间戳(前3bytes)和扩展时间戳(后1byte),基本时间戳为低三位,扩展时间戳为高一位,即T=( Textend << 24) + Tbase

(4) Stream id 3bytes

总是0(不知道干啥的)

第二部分,Tag Data,共(数据区长度)个byte

数据区

If TagType == 8 AUDIODATA

If TagType == 9 VIDEODATA

If TagType == 18 METADATA

第三部分,Pre Tag Size,4bytes

当前Tag的长度,即第一部分+第二部分的长度和,也等于11+数据区长度 3bytes。这个数值和数据区长度合在一起可以提供一定的数据鲁棒性,可以用来寻找数据不完整的Flv的可用Tag的起始位置。

在第二部分,数据区根据不同的Tag类型有不同的组织方式:

2.1 Audio Tag 数据区

audio信息 1byte,共8位

(1) 前四位bits表示音频格式:

0 = 未压缩

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表示采样率(samplerate):

0 -- 5.5kHz

1 -- 11kHz

2 -- 22kHz

3 -- 44kHz

(3) 然后一位bit表示每个采样的长度:

0 -- snd8Bit

1 -- snd16Bit

(4) 最后一位bit表示类型:

0 -- sndMomo

1 -- sndStereo

audio数据

2.2 Video Tag 数据区

video信息 1byte,共8位

(1) 前四位bits表示数据类型:

1 -- keyframe

2 -- inner frame

3 -- disposable inner frame (H.263 only)

4 -- generated keyframe (reserved for server use only)

5 -- video info/command frame

(2) 后四位bits表示编码器id:

1 -- JPEG (currently unused)

2 -- Seronson H.263

3 -- Screen video

4 -- On2 VP6

5 -- On2 VP6 without channel

6 -- Screen video version 2

7 -- AVC

Video数据