本文共 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位的数值表示视频编码IDField | 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.2633: Screen video4: On2 VP65: On2 VP6 with alpha channel 6: Screen video version 27: 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 endian1 = ADPCM2 = MP33 = Linear PCM, little endian4 = Nellymoser 16-kHz mono5 = Nellymoser 8-kHz mono6 = Nellymoser7 = G.711 A-law logarithmic PCM8 = G.711 mu-law logarithmic PCM 9 = reserved10 = AAC11 = Speex14 = MP3 8-Khz15 = Device-specific sound7, 8, 14, and 15:内部保留使用。flv是不支持g711a的,如果要用,可能要用线性音频。 |
采样率 | UB2 | For AAC: always 30 = 5.5-kHz1 = 11-kHz2 = 22-kHz3 = 44-kHz |
采样大小 | UB1 | 0 = snd8Bit1 = 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!