flv 文件格式详解

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

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 文件格式详解_第1张图片
如图:这就是flv header 左边就是16进制数据。

FLV body

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大小

PreviousTagSize

就是上一个tag的大小, 第一个PreviousTagSize 总是0,因为上一个tag没有是,紧临着FLV header。大小是4个字节。

tag

tag由 header和data 两部分构成。

tag header

内容 类型 说明

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

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/

图形详解

flv 文件格式详解_第2张图片相同的颜色, 相同的级别
flv 文件格式详解_第3张图片

你可能感兴趣的:(基础知识)