欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

flv 文件格式详解

程序员文章站 2022-06-13 12:29:33
...

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 文件格式详解
如图:这就是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 文件格式详解相同的颜色, 相同的级别
flv 文件格式详解

相关标签: 基础知识