文章目录
1. FLV简介
FLV(Flash Video)是Adobe公司推出的一种流媒体格式,由于其封装后的音视频简单等特点,非常使用于互联网的使用. 目前主流的视频网站基本上都支持FLV,其格式封装的文件后缀为.flv
2. FLV封装格式解析
FLV封装格式有一个文件头(file header)和文件体(file body)组成.其中FLV body由一对对的(previous tag size字段 +tag)组成,previous tag size 字段排在tag前面,占用4字节,它代表了上一个tag的大小,用于逆向读取处理. FLV header后的第一个previous tag size为0.
Tag一般可以分为三种类型:脚本(帧)数据类型,视频数据类型,音频数据类型.
FLV以大端存储方式存放,其结构为:
注意:
1.flv文件中的Timestampe和TimestampeExtended组合就是dts,也就是编码时间,单位为ms,如果没有B帧的话dts等于pts.
2.CompositionTime表示pts相对于dts的偏移值,在每个视频tag的第14~16字节.
显示时间(pts)=编码时间(dts)+CompositionTime
3.FLV解析流程框架
4.Script Tag Data结构(脚本类型、帧类型)
该Tag又被称为MetaDataTag,存放一些关于FLV视频和音频的元信息,比如:duration,width,height等。通常该类型tag会作为FLV的第一个Tag,并且只有一个。
该类型TagData的结构为:
第一个AMF包:读一个字节表示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类型值,表示数组元素的个数。后⾯即为各数组元素的封装,数组元素为元素名称和值组成的对。常⻅的数组元素如下表所示。
值 | Comment | 例如 |
---|---|---|
duration | 时⻓(秒) | 210.732 |
width | 视频宽度 | 768.000 |
height | 视频⾼度 | 320.000 |
videodatarate | 视频码率 | 207.260 |
framerate | 视频帧率 | 25.000 |
videocodecid | 视频编码 | ID 7.000 (H264为7) |
audiodatarate | ⾳频码率 | 29.329 |
audiosamplerate | ⾳频采样率 | 44100.000 |
stereo | 是否⽴体声 | 1 |
audiocodecid | ⾳频编码 | ID 10.000 (AAC为10) |
major_brand | 格式规范相关 | isom |
minor_version | 格式规范相关 | 512 |
compatible_brands | 格式规范相关 | isomiso2avc1mp41 |
encoder | 封装⼯具名称 | Lavf54.63.104 |
filesize | ⽂件⼤⼩(字节) | 6636853.00 |
5.Audio Tag Data结构(音频类型)
音频Tag Data前两个字节:
- 第一个字节包含音频数据的参数信息
- 第二个字节开始为数据流
Field | Type | Comment |
---|---|---|
⾳频格式 SoundFormat | UB4 | 0 = Linear PCM, platform endian1 =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 | UB2 | 0 = 5.5kHz 1 = 11kHz 2 = 22.05kHz 3 = 44.1kHz 对于AAC总是3。但实际上AAC是可以⽀持到48khz以上的频率(这个参数对于AAC意义不⼤)。 |
采样精度 SoundSize | UB1 | 0 = snd8Bit 1 = snd16Bit 此参数仅适⽤于未压缩的格式,压缩后的格式都是将其设为1 |
⾳频声道SoundType | UB1 | 0 = sndMono 单声道 1 = sndStereo ⽴体声,双声道 对于AAC总是1 |
6.Video Tag Data结构(视频类型)
视频Tag Data开始的:
- 第⼀个字节包含视频数据的参数信息,
- 第⼆个字节开始为视频流数据。
Field | Type | Comment |
---|---|---|
帧类型 | UB4 | 1: keyframe (for AVC, a seekable frame)——h264的IDR,关键帧 2: inter frame (for AVC, a non- seekableframe)——h264的普通帧 3: disposable inter frame (H.263 only) 4: generated keyframe (reserved for server use only) 5: video info/command frame |
编码ID | UB4 | 使⽤哪种编码类型: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 |