FLV格式概述:
FLV(Flash Video)是Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特点,使其很适合在互联网上进行应用。此外,FLV可以使用Flash Player进行播放,而Flash Player插件已经安装在全世界绝大部分浏览器上,这使得通过网页播放FLV视频十分容易。
FLV结构:
FLV文件 : 文件头(File Header)+文件体(File Body)
FLV文件头 : 9Byte
FLV文件体 : Previous Tag Size + Tag
FLV文件头解析:
文件头由一下几部分组成:
Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 Byte)
Signature 占3个字节:
固定FLV三个字符作为标示。一般发现前三个字符为FLV时就认为他是flv文件。
Version 占1个字节:
标示FLV的版本号。这里我们看到是1
Flags 占1个字节:
内容标示。第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)。截图看到是0x05,也就是00000101,代表既有视频,也有音频。
DataOffset 占4个字节:
表示FLV的header长度。这里可以看到固定是9。
FLV文件体解析:
FLV的文件体部分是由一系列的Previous Tag Size + tag构成:
Previous Tag Size固定4个字节,表示前一个tag的size
tag 分三种类型,scripts、video、audio
scripts tag 解析:
scripts tag是由tag Header + Tag Data组成:
该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的元数据信息如:duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。
tag Header:
TagType: 18 (1 byte)
TagType 代表含义如下:
8: audio
9 : video
18 : script data
DataSize: 293 (3 bytes)
tag Data大小
tag Header大小 = Previous Tag Size - DataSize
TimeStamp: 0 (3 bytes)
时间戳
TimestampExtended: 0 (1 byte)
扩展时间戳
StreamId: 0 (3 bytes)
流ID
tag Data:
第一个AMF包:
第1个字节表示AMF包类型,一般总是0x02,表示字符串。
第2-3个字节为UI16类型值,标识字符串的长度,一般总是0x000A(“onMetaData”长度)。
后面字节为具体的字符串,一般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。
第二个AMF包:
第1个字节表示AMF包类型,一般总是0x08,表示数组。
第2-5个字节为UI32类型值,表示数组元素的个数。
后面即为各数组元素的封装,数组元素为元素名称和值组成的对。
常见的数组元素如图所示:
Video tag 解析:
video tag是由tag Header + Tag Data组成:
tag Header:
TagType: 9 (1 byte)
TagType 代表含义如下:
8: audio
9 : video
18 : script data
DataSize: 50 (3 bytes)
tag Data大小
tag Header大小 = Previous Tag Size - DataSize
TimeStamp: 0 (3 bytes)
时间戳
TimestampExtended: 0 (1 byte)
扩展时间戳
StreamId: 0 (3 bytes)
流ID
tag Data:
FrameType: 1 (4 bits)
FrameType 代表含义如下:
1 : 关键帧(for AVC, a seekableframe)
2 : 帧间参考帧(for AVC, a non -seekable frame)
3 : disposable inter frame(H.263only)
4 : generated keyframe(reserved forserver use only)
5 : video info / command frame
CodecID: 7 (4 bits)
CodecID 代表含义如下:
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
AVCPacketType: 0 (1 byte)
AVCPacketType 代表含义如下:
AVCPacketType=0x00,为AVCSequence Header;
AVCPacketType=0x01,为AVC NALU;
AVCPacketType=0x02,为AVC end ofsequence
CompositionTime Offset: 0 (3 bytes)
相对时间戳,如果AVCPacketType=0x01,为相对时间戳,其它均为0
data部分
如果AVCPacketType=0x00,为AVCDecorderConfigurationRecord(包含了参数信息,例如profile、PPS、SPS等);
如果AVCPacketType=0x01,为NALUs(视频数据);
如果AVCPacketType=0x02,为空。
Audio tag 解析:
video tag是由tag Header + Tag Data组成:
tag Header:
TagType: 8 (1 byte)
TagType 代表含义如下:
8: audio
9 : video
18 : script data
DataSize: 7 (3 bytes)
tag Data大小
tag Header大小 = Previous Tag Size - DataSize
TimeStamp: 0 (3 bytes)
时间戳
TimestampExtended: 0 (1 byte)
扩展时间戳
StreamId: 0 (3 bytes)
流ID
tag Data:
SoundFormat: 10 (4 bits)
SoundFormat 代表含义如下:
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: 3 (2 bits)
SoundRate 代表含义如下:
0 = 5.5-kHz
1 = 11 - kHz
2 = 22 - kHz
3 = 44 - kHz
SoundSize: 1 (1 bit)
SoundSize 代表含义如下:
0 = snd8Bit
1 = snd16Bit
SoundType: 1 (1 bit)
SoundType 代表含义如下:
0 = sndMono
1 = sndStereo
AACAUDIODATA:包含AACPacketType + Data(AudioSpecificConfig)
AACPacketType: 0
0x00 = AAC sequence header,类似h.264的sps,pps,在FLV的文件头部出现一次。
0x01 = AAC raw,AAC数据
audioObjectType: 2 (5bits)
audioObjectType代表含义如下:
AAC Main 0x01
AAC LC 0x02
AAC SSR 0x03
…
samplingFrequencyIndex: 4 (4bits)
samplingFrequencyIndex代表含义如下:
0x00 96000
0x01 88200
0x02 64000
0x03 48000
0x04 44100
0x05 32000
0x06 24000
0x07 22050
0x08 16000
0x09 12000
0x0A 11025
0x0B 8000
0x0C reserved
0x0D reserved
0x0E reserved
0x0F escape value
channelConfiguration: 2 (4bits)
channelConfiguration代表含义如下:
0x00 - defined in audioDecderSpecificConfig
0x01 单声道(center front speaker)
0x02 双声道(left, right front speakers)
0x03 三声道(center, left, right front speakers)
0x04 四声道(center, left, right front speakers, rear surround speakers)
0x05 五声道(center, left, right front speakers, left surround, right surround rear speakers)
…
AOT Specific Config : 56 E5 00(不太清除是什么作用)
FLV协议整体结构示意图: