FLV格式解析
发布日期:2021-06-29 14:51:41 浏览次数:3 分类:技术文章

本文共 3196 字,大约阅读时间需要 10 分钟。

本文目的:

熟悉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)

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

三、FLV文件体

FLV tags 结构:

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

Field type Comment
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位。
流ID UI24 总是0
数据区Data UI8[ 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

Field type comment
帧类型 UB4 1: 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
编码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
视频数据 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。

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

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

转载地址:https://ciellee.blog.csdn.net/article/details/105772501 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【高通SDM660平台】(7) --- Camera onPreview 代码流程
下一篇:图像数据格式介绍 yuv420sp、yuv420sp、yv12、nv12等

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月03日 14时07分57秒