一、概述
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:文件大小