一、概述
FLV(Flash Video)是Adobe公司设计开发的一种流媒体格式。因为可以在Flash playe播放,浏览器插件也支持Flash player,所以是流行一时的主流流媒体格式。
二、FLV文件格式
格式为:FLV Header + FLV Body。其中FLV Body有一系列的Tag组成。
FLV Header
格式如下:
- Signature:0X46,“F”
 - Signature:0X4C,“L”
 - Signature:0X56,“V”
 - Version:版本号,目前为0X01
 - TypeFlagsReserved:5bit,总是0
 - TypeFlagsAudio:1bit,是否存在音频,1表示存在
 - TypeFlagsReserved:1bit,总是0
 - TypeFlagsVideo:1bit,是否存在视频,1表示存在
 - DataOffset:4byte,从Flv Header到Flv Body开始的字节数,1版本下该值为9
 
FLV Body
该数据结构由一个个Tag和PreviousTagSize组成,PreviousTagSize字段,标记前面一个Tag的大小。
PreviousTagSize & Tag Header

- PreviousTagSize:4byte,表示前一个Tag的长度。
 - Type:1byte,表示Tag类型,类型分为音频(0X08)、视频(0X09)、scripte data(0X12),其他类型值被保留。
 - DataSize:3byte,表示当前Tag Data内容的大小。
 - Timestamp:3byte,表示当前Tag的时间戳。
 - Timestamp Extended:1byte,表示时间戳的扩展自负,当24位Timestamp不够用的时候,该字节可以将时间戳扩展到32位。
 - StreamID:3字节,表示流id,总是0。
 - TagData:不同的类型结构不同。
 
Tag Data
一般一个FLV文件 = 一个头文件+一个script Tag+多个video/audio Tag。
Audio Tag Data

- SoundFormat:8bit,音频编码类型。
- 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
 
 - SoundRate:2bit,音频采样率。
- 0:5.5kHz
 - 1:11kHz
 - 2:22kHz
 - 3:44kHz
 
 - SoundSize:1bit,音频采样精度。
- 0:8bit
 - 1:16bit
 
 - SoundType:1bit,音频类型。
- 0:sndMono
 - 1:sndStereo
 
 
注意:如果SoundFormat的值为10,表示当前类型为AAC的情况。音频数据格式如下:
- AACPacketType:1byte,data值类型。
- 0:AAC sequence header
 - 1:AAC data
 
 - Data:数据,根据type类型为AudioSpecificConfig和Raw AAC frame data
 
Video Tag Data

- FrameType:4bit,帧类型
- 1:keyframe(关键帧)
 - 2:inter frame
 - 3:disposable inter frame
 - 4:generated keyframe
 - 5:video info/command frame
 
 - CodecID:4bit,编码类型
- 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(H264)
 
 
注意:如果CodecID的值为7,表示当前类型为H264。视频数据格式如下:
- AVCPacketType:8bit,包类型
- 0:AVC sequence header
 - 1:AVC NALU
 - 2:AVC end of sequence
 
 - CompositionTime:24bit,时间值
- Composition time offset:当前AVCPacketType必须为1
 - 0
 
 - Data:
- AVCPacketType为0时:AVCDecoderConfigurationRecord
- configurationVersion:8bit,
 - AVCProfileIndication:8bit,
 - profile_compatibility:8bit,
 - AVCLevelIndication:8bit,
 - lengthSizeMinusOne:8bit,
 - numOfSequenceParameterSets:8bit,SPS的个数
 - sequenceParameterSetLength:16bit,SPS的长度
 - sequenceParameterSetNALUnits:8bit[n],SPS数据
 - 多SPS重复格式:
 - numOfPictureParameterSets:8bit,PPS的格式
 - pictureParameterSetLength:8bit,PPS的长度
 - pictureParameterSetNALUnits:8bit[n],PPS的数据
 - 多PPS重复格式:
 
 - AVCPacketType为1时:One Or More NALUs
- NALU len:32bit,NALU长度
 - NALU Data:8bit[n],NALU值
 - 多NALU重复格式:
 
 - AVCPacketType为2时:空
 
 - AVCPacketType为0时:AVCDecoderConfigurationRecord
 
Script Tag Data
又被叫MetadataTag(控制帧),放入一些音视频的基本信息,如宽高等。通常该类型的Tag会放在Header后面的第一个类型,并且只出现一次。
- AMF1
- AMF Type:1byte,类型,一般为0X02。
- AFM_DATA_TYPE_NUMBER:0X00
 - AFM_DATA_TYPE_BOOL:0X01
 - AFM_DATA_TYPE_STRING:0X02
 - AFM_DATA_TYPE_OBJECT:0X03
 - AFM_DATA_TYPE_NULL:0X05
 - AFM_DATA_TYPE_UNDEFINED:0X06
 - AFM_DATA_TYPE_REFERENCE:0X07
 - AFM_DATA_TYPE_MIXEDARRAY:0X08
 - AFM_DATA_TYPE_OBJECT_END:0X09
 - AFM_DATA_TYPE_ARRAY:0X0A
 - AFM_DATA_TYPE_DATE:0X0B
 - AFM_DATA_TYPE_LONG_STRING:0X0C
 - AFM_DATA_TYPE_UNSUPPORTED:0X0D
 
 - lenght:2byte,字符串长度,一般为**0X000A。
 - string:字符串,一般为onMetaData
 
 - AMF Type:1byte,类型,一般为0X02。
 - AMF2
- AMF Type:1byte,类型,一般为0X08。
 - array length:4byte,数组元素个数
 - array:数组元素,格式为元素名长度(16bit) + 元素名称(8bit[n]) + 元素的值(double)。
- duration:时长
 - width:视频宽度
 - height:视频高度
 - videoDataRate:视频码率
 - frameRate:视频帧率
 - videoCodecId:视频编码方式
 - audioSampleRate:音频采样率
 - audioSampleSize:音频采样精度
 - stereo:是否立体声
 - audioCodecId:音频编码方式
 - fileSize:文件大小