目录

  • 0. 前言
  • 1. FLV Header
  • 2. FLV File Body
  • 2.1 FLV tag 格式
  • 2.2 AUDIO DATA
  • 2.2.1 音频tag头
  • 2.2.2 AAC音频数据
  • AudioSpecificConfig
  • 2.3 VIDEO DATA
  • 2.3.1 视频tag头
  • 2.3.2 AVC视频packet

0. 前言

FLV 是 flash video 的缩写,是 Adobe Flash payler 支持的一种流媒体播放格式。flv文件格式的官方文档 Adobe Flash Video File Format Specification Version 10.1 的附录E里。
flv文件格式由flv header和许多tag组成,一个flv文件只有一个flv header,tag 类型分为音频、视频、脚本,共三种类型,tag 由 tag 头和 tag 数据组成。

1. FLV Header

FLV header有 9 个字节,定义如下

字段

类型

描述

Signature

UI8

总是'F', 0x46

Signature

UI8

总是'L', 0x4C

Signature

UI8

总是'V', 0x56

version

UI8

文件版本号,总是1

保留字段

UB5

0

TypeFlagsAudio

UB1

0-无音频;1-有音频

保留字段

UB1

0

TypeFlagsVideo

UB1

0-无视频;1-有视频

DataOffset

UI32

flv头的长度,version=1时,总是9

2. FLV File Body

flv 文件体由许多tag挨个存储组成,每个tag的前四个字节表示前一个tag的长度。

2.1 FLV tag 格式

tag 的格式如下

字段

类型

描述

Reserved

UB2

保留字段,总是0

Filter

UB1

表示包是否被处理过,如加密处理,0-未加密,1-加密

TagType

UB5

tag类型,8 - audio,9 - video, 18 - script data

DataSize

UI24

消息的长度。从StreamID到标签结束的字节数(等于tag的长度- 11)

Timestamp

UI24

数据的时间戳,单位是ms

TimestampExtended

UI8

扩展时间戳,这字节与前3字节组成SI32的时间戳,前三位是低24bit值

StreamID

UI24

总是0

AudioTagHeader

AudioTagHeader

如果TagType==8,接着就是音频tag头,AudioTagHeader定义在2.2.1小节

VideoTagHeader

VideoTagHeader

如果TagType==9,接着就是视频tag头,VideoTagHeader定义在后面

EncryptionHeader

EncryptionHeader

如果Filter==1,接着就是加密头,EncryptionHeader定义在后面

FilterParams

FilterParams

如果Filter==1才有此字段

Data

tag的数据,数据格式与TagType的类型有关,if TagType == 8,AUDIODATA; if TagType == 9,VIDEODATA;if TagType == 18,SCRIPTDATA

2.2 AUDIO DATA

音频数据由音频tag头和音频data构成。

2.2.1 音频tag头

音频tag头一个字节或者2个字节

字段

类型

描述

SoundFormat

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, 15是保留值

SoundRate

UB2

采样率

0 = 5.5 kHz

1 = 11 kHz

2 = 22 kHz

3 = 44 kHz

SoundSize

UB1

采样位数

0 = 8-bit

1 = 16-bit

SoundType

UB1

声道模式

0 = 单声道

1 = 双声道(立体声)

AACPacketType

UI8

AAC包类型,如果SoundFormat = 10 才会有这个字段

0 = AAC sequence header

1 = AAC raw

2.2.2 AAC音频数据

字段

类型

描述

data

IF AACPacketType == 0

AudioSpecificConfig

ELSE IF AACPacketType == 1

Raw AAC frame data in UI8 []

AudioSpecificConfig定义在 ISO/IEC 14496-3 2009 中第1.6.2.1小节。请注意,这与来自MP4/F4V文件的esds box的内容不同

ISO/IEC 14496-3 2009确实不好找,但是我还是找到了。https://csclub.uwaterloo.ca/~ehashman/ISO14496-3-2009.pdf,有可能这个地址会失效,也可以点这里下载 ISO-IEC-14496-3-2009.7z。

AudioSpecificConfig

AudioSpecificConfig的结构在ISO/IEC 14496-3中描述得好复杂,wiki 的描述简洁一些。

5 bits: object type                  #AudioObjectType
if (object type == 31)
    6 bits + 32: object type
4 bits: frequency index              #samplingFrequencyIndex
if (frequency index == 15)
    24 bits: frequency
4 bits: channel configuration        #channelConfiguration
var bits: AOT Specific Config

AudioObjectType定义在 ISO/IEC 14496-3 的 1.5.1.1 table 1.1

samplingFrequencyIndex对应表

samplingFrequencyIndex


0x0

96000

0x1

88200

0x2

64000

0x3

48000

0x4

44100

0x5

32000

0x6

24000

0x7

22050

0x8

16000

0x9

12000

0xa

11025

0xb

8000

0xc

7350

0xd

reseverd

0xe

reseverd

0xf

escape value

channelConfiguration 定义在 ISO/IEC 14496-3 的 1.6.3.5

以上定义可以查看这里 MPEG-4 Audio wiki

2.3 VIDEO DATA

视频数据由视频tag头和视频data构成。

2.3.1 视频tag头

字段

类型

描述

Frame Type

UB4

视频帧类型,定义如下:

1 = 关键帧

2 = 非关键帧(inter frame)

3 = disposable inter frame (H.263 only)

4 = generated key frame (reserved for server use only)

5 = video info/command frame

CodecID

UB4

编码格式,定义如下:

2 = H.263

3 = Screen video

4 = On2 VP6

5 = On2 VP6 with alpha channel

6 = Screen video version 2

7 = AVC(H264)

AVCPacketType

if CodecID == 7

UI8

0 = AVC sequence header(序列头)

1 = AVC NALU

2 = AVC end of sequence

CompositionTime

IF CodecID == 7

SI24

IF AVCPacketType == 1

{Composition time offset}

ELSE

{0}

压缩时间定义在ISO 14496-12, 8.15.3,在FLV中时间偏移单位是ms

2.3.2 AVC视频packet

字段

类型

描述

Data

IF AVCPacketType == 0

{AVCDecoderConfigurationRecord}

IF AVCPacketType == 1

如果AVCPacketType为0,data是AVC的编码配置信息,解码器需要使用,AVCDecoderConfigurationRecord定义在ISO/IEC 14496-15 5.2.4.1,此段和MP4/FLV中 avcc box 的内容一样;如果AVCPacketType为1,data是AVC的编码帧

ISO/IEC 14496-15确实不好下载,官方的需要买的,我找了好久找了到2010的第二版,我想第二版比第一版要好吧。我提供 ISO/IEC 14496-15 2010下载。

aligned(8) class AVCDecoderConfigurationRecord {
    unsigned int(8) configurationVersion = 1;
    unsigned int(8) AVCProfileIndication;
    unsigned int(8) profile_compatibility;
    unsigned int(8) AVCLevelIndication;
    bit(6) reserved = ‘111111’b;
    unsigned int(2) lengthSizeMinusOne;
    bit(3) reserved = ‘111’b;
    unsigned int(5) numOfSequenceParameterSets;
    for (i=0; i< numOfSequenceParameterSets; i++) {
        unsigned int(16) sequenceParameterSetLength ;
        bit(8*sequenceParameterSetLength) sequenceParameterSetNALUnit;
    }
    unsigned int(8) numOfPictureParameterSets;
    for (i=0; i< numOfPictureParameterSets; i++) {
        unsigned int(16) pictureParameterSetLength;
        bit(8*pictureParameterSetLength) pictureParameterSetNALUnit;
    }
    if( profile_idc == 100 || profile_idc == 110 ||
        profile_idc == 122 || profile_idc == 144 )
    {
        bit(6) reserved = ‘111111’b;
        unsigned int(2) chroma_format;
        bit(5) reserved = ‘11111’b;
        unsigned int(3) bit_depth_luma_minus8;
        bit(5) reserved = ‘11111’b;
        unsigned int(3) bit_depth_chroma_minus8;
        unsigned int(8) numOfSequenceParameterSetExt;
        for (i=0; i< numOfSequenceParameterSetExt; i++) {
            unsigned int(16) sequenceParameterSetExtLength;
            bit(8*sequenceParameterSetExtLength) sequenceParameterSetExtNALUnit;
        }
    }
}