flv容器的扩展名是.flv 是邮adobe推出的一种封装格式,主要用于流媒体系统,由于flash player的普遍使用,flv的容器也比较流行。
flv的封装格式比较简单,由一个header和body构成。
其官方文档地址为:
http://read.pudn.com/downloads358/doc/fileformat/1556492/adobe_video_file_format_spec_v10.pdf
FLV header字段说明如图:
内容 类型 说明
Signature uint_8 “F” 0x46
Signature uint_8 “L” 0x4C
Signature uint_8 “V” 0x56
Version uint_8 0x01
TypeFlagsReserved UB[5] 0
TypeFlagsAudio UB[1] 标记是否有音频1代表有
TypeFlagsReserved UB[1]
TypeFlagsVideo UB[1] 标记是否有视频1代表有
DataOffset uint_32 header大小
图表中表示的是flv header的各字段。这个是header是固定的,总共的大小为9个字节,所以DATAOFFSET基本为9
如图:这就是flv header 左边就是16进制数据。
FLV body有PreviousTagSize 和 tag 两部分组成。
PreviousTagSize 代表的是上一个tag的大小, PreviousTagSize 为0
tag 具体的音视频数据
内容 类型 说明
PreviousTagSize 0 uint_32 0
tag1 FLVTAG tag
PreviousTagSize1 uint_32 上一个tag大小
… … …
tagN FLVTAG tag
PreviousTagSizeN uint_32 上一个tag大小
就是上一个tag的大小, 第一个PreviousTagSize 总是0,因为上一个tag没有是,紧临着FLV header。大小是4个字节。
tag由 header和data 两部分构成。
内容 类型 说明
tagtype uint_8 tag类型
0x08代表音频
0x09 代表视频
0x12 代表脚本
datasize uint_24 代表tag data的大小
timestamp uint_24 时间戳 毫秒
timestampExtended uint_8 额外时间戳
streamID uint_24 0
一个tag header的大小为12个字节。
tag data有不同的类型,而不同的类型结构也是不一样的。
audio tag
内容 类型 说明
soundformat UB[4] 音频格式
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 UB[2] 音频采样率
0 = 5.5-kHz
1 = 11-kHz
2 = 22-kHz
3 = 44-kHz(AAC一直是3)
soundsize UB[1] 音频位深
0 = snd8Bit
1 = snd16Bit
soundType UB[1] 音频声道
0 = sndMono(单声道)
1 = sndStereo(立体声)
soundData uint_8 音频编码数据
由图表可知,audio tag描述总共占用一个字节,剩余就是音频的编码数据 ,而音频的编码数据的存储方式也是有区别,这里就不详细说明了。
video tag
内容 类型 说明
frameType UB[4] 1: keyframe (for AVC, a seekable frame)关键帧
2: inter frame (for AVC, a non-seekable frame)非关键帧
3: disposable inter frame (H.263 only)
4: generated keyframe (reserved for server use only)
5: video info/command frame
codecId UB[4] 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
videoData If CodecID == 2 H263VIDEOPACKET
If CodecID == 3 SCREENVIDEOPACKET
If CodecID == 4 VP6FLVVIDEOPACKET
If CodecID == 5 VP6FLVALPHAVIDEOPACKET
If CodecID == 6 SCREENV2VIDEOPACKET
if CodecID == 7
AVCVIDEOPACKET
若是AVC 即264的数据
内容 类型 说明
AVCPacketType uint_8 0: AVC sequence header
1: AVC NALU
2: AVC end of sequence (lower level NALU sequence ender is not required or supported)
CompositionTime int_24 if AVCPacketType == 1
Composition time offset
else
0
Data uint_8[n] if AVCPacketType == 0
AVCDecoderConfigurationRecord
else if AVCPacketType == 1
One or more NALUs (can be individualslices per FLV packets; that is, full framesare not strictly required)
else if AVCPacketType == 2
empty
script tag
脚本tag 主要是在FLVheader和body之间的那个onMetaData, 里面存储都整个flv的信息,也可以包含各个tag的偏移量。这并不是一个必要的tag,没有该tag也可以进行播放。这个tag就不详细叙述了。该tag可以通过工具yamdi进行生成,该工具就是对flv进行流化处理。yamdi的地址为
https://github.com/ioppermann/yamdi
https://sourceforge.net/projects/yamdi/files/
vlc,ffplay, video.js,ijkplayer等
flvAnalyser: https://github.com/zymill/flvAnalyser
flvparser : https://download.csdn.net/download/cabbage2008/9343003
FLV Format Analysis
https://sourceforge.net/projects/flvformatanalysis/
rtmpdump
http://rtmpdump.mplayerhq.hu/
flvparser
https://github.com/riverlight/FlvParser
yamadi
https://github.com/ioppermann/yamdi
ffmpeg
http://ffmpeg.org/