FLV格式解析

本文目的:
熟悉FLV格式,能够直接使用ultrEdit直接分析一段FLV文件或许相关信息,或者编写程序解析出FLV文件相关信息

一、FLV文件格式

FLV是流媒体格式的一种
FLV是一个二进制文件,由文件头(FLV header)和很多tag组成。
tag又可以分成三类:audio、video、script,分别代表音频流,视频流,脚本流(关键字或者文件信息之类)

FLV文件 = FLV头文件 + tag1 + tag内容1 + tag2 + tag内容2 + ... + ... + tagN + tag内容N


FLV包括文件头(File Header)和文件体(File Body)两部分:

在这里插入图片描述

Tag为每一个内容,目前包括音频、视频、脚本。

previousTagSize为前一个Tag的长度。

Header下面四个字节的PreviousTagSize,因为前一个没有Tag,所以值填写0


二、FLV Header格式(9 bytes)

FieldtypeComment
签名UI8’F’ (0X46)
签名UI8‘L’ (0X4C)
签名UI8‘V’ (0x56)
版本UI8FLV的版本。0x01表示FLV 版本是1
保留字段UB5(位域)前五位必须是0
是否有音频流UB1(位域)音频流是否存在标志
保留字段U15(位域)必须是0
是否有视频流UB5(位域)视频流是否存在标志
文件头大小UI32FLV版本1时填写9,表明的是FLV头的大小,为后期的FLV版本扩展使用。包括这四个字节。
数据的起始位置就是从文件开头偏移这么多的大小。

三、FLV文件体

FLV tags 结构:

| TagType(8) | DataSize(24) | Timestamp(24) |TimestampExtended(8) | StreamID(24) | Data(DataSize) |

FieldtypeComment
TAG类型UI8如果TagType=0x08,为AudioData;
如果TagType=0x09,为VideoData;
如果TagType=0x12,为ScriptDataObject,但该项因为内容不固定,所以在FLV文件中可以没有该Tag内容。
数据大小UI24数据区的大小,不包括包头。包头总大小是11个字节。
时戳UI24当前帧时戳,单位是毫秒。相对于FLV文件的第一个TAG时戳。第一个tag的时戳总是0。——不是时戳增量,rtmp中是时戳增量。
时戳扩展字段UI8如果时戳大于0xFFFFFF,将会使用这个字节。这个字节是时戳的高8位,上面的三个字节是低24位。
流IDUI24总是0
数据区DataUI8[ n ]具体的数据内容

四、Script Tag Data结构

该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的参数信息,如duration、width、height等。
通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。

一般来说,该Tag Data结构包含两个AMF包。
AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,在Adobe的很多产品中应用,简单来说,AMF将不同类型的数据用统一的格式来描述。
第一个AMF包封装字符串类型数据,用来装入一个“onMetaData”标志,这个标志与Adobe的一些API调用有,在此不细述。
第二个AMF包封装一个数组类型,这个数组中包含了音视频信息项的名称和值。

具体说明如下,大家可以参照图片上的数据进行理解

在这里插入图片描述

第1个字节表示AMF包类型,一般总是0x08,表示数组。
第2-5个字节为UI32类型值,表示数组元素的个数。
后面即为各数组元素的封装,数组元素为元素名称和值组成的对。

表示方法如下:
第1-2个字节表示元素名称的长度,假设为L。后面跟着为长度为L的字符串。
第L+3个字节表示元素值的类型。 后面跟着为对应值,占用字节数取决于值的类型。


例如:

在这里插入图片描述


五、VIdeo Tag Data结构

视频Tag也用开始的第1个字节包含视频数据的参数信息,从第2个字节开始为视频流数据。
在这里插入图片描述
第1个字节的前4位的数值表示帧类型,第1个字节的后4位的数值表示视频编码ID

Fieldtypecomment
帧类型UB41: keyframe (for AVC, a seekable frame)——h264的IDR,关键帧,可重入帧。
2: inter frame (for AVC, a non- seekable frame)——h264的普通帧
3: disposable inter frame (H.263 only)
4: generated keyframe (reserved for server use only)
5: video info/command frame
编码IDUB4使用哪种编码类型:
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
视频数据UI [ n ]如果是avc,则参考下面的介绍:
AVCVIDEOPACKET

六、Audio Tag Data结构

音频Tag开始的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。
第1个字节的前4位的数值表示了音频数据格式,各值代表的意义大家可以查阅Adobe公司发布的FLV格式说明文档
第1个字节的第5-6位的数值表示采样率,0 = 5.5 kHz,1 = 11 kHz,2 = 22 kHz,3 = 44 kHz。
第1个字节的第7位表示采样精度,0 = 8bits,1 = 16bits。
第1个字节的第8位表示音频类型,0 = mono,1 = stereo。

Fieldtypecomment
音频格式UB40 = 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
7, 8, 14, and 15:内部保留使用。
flv是不支持g711a的,如果要用,可能要用线性音频。
采样率UB2For AAC: always 3
0 = 5.5-kHz
1 = 11-kHz
2 = 22-kHz
3 = 44-kHz
采样大小UB10 = snd8Bit
1 = snd16Bit
声道UB10=单声道
1=立体声,双声道。AAC永远是1
声音数据UI8[ n ]如果是PCM线性数据,存储的时候每个16bit小端存储,有符号。
如果音频格式是AAC,则存储的数据是AAC AUDIO DATA,否则为线性数组。

参考:https://blog.csdn.net/q2519008/article/details/80963631

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页