Signature(3 字节)为文件标识,总为”FLV”,(0x46,0x4c,0x66)
Version(1 字节)为版本,目前为 0x01
Flags(1 字节)前 5 位保留,必须为 0。第 6 位表示是否存在音频 Tag。第 7
位保留,必须为 0。第 8 位表示是否存在视频 Tag。
Headersize(4 字节)为从 File Header 开始到 File Body 开始的字节数,版本 1
中总为 9。
Previous Tag Size #0(4 字节)表示前一个 Tag 的长度
Tag Header
Tag #1
Type(1 字节)表示 Tag 类型,包括音频(0x08),视频
(0x09)和 script data(0x12),其他类型值被保留
Datasize(3 字节)表示该 Tag Ddata 部分的大小
Timestamp(3 字节)表示该 Tag 的时间戳
Timestamp_ex(1 字节)表示时间戳的扩展字节,当 24
位数值不够时,该字节最为最高位将时间戳扩展为 32
位数值
Streamed(1 字节)表示 stream id 总是 0
不同类型 Tag 的 data 部分结构各不相同,当 header 的
结构是相同的
Flv Header
Flv Body
Tag Data
Previous Tag size #1 即 Tag #1 的大小(11 + Datasize)
Tag #2
Previous Tag size #2
… …
Tag #N
Previous Tag size #N
注:不同类型的 Tag 的 Header 结构式相同的,但是 data 的结构各不相同,第一个帧通常为
Metadata Tag,即控制帧
Audio Tag Data 结构(音频 Tag)
音频 Tag 开始的第 1 个字节包含了音频数据的参数信息,从第 2 个字节开始为音频流
数据。
第 1 个字节的前 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
14 = MP3 8-Khz
15 = Device-specific sound
第 1 个字节的第 5-6 位的数值表示采样率,0 = 5.5kHz,1 = 11KHz,2 = 22 kHz,3 = 44
kHz。
第 1 个字节的第 7 位表示采样精度,0 = 8bits,1 = 16bits。
第 1 个字节的第 8 位表示音频类型,0 = sndMono,1 = sndStereo。
Video Tag Data 结构(视频 Tag)
视频 Tag 也用开始的第 1 个字节包含视频数据的参数信息,从第 2 个字节为视频流数
据
第 1 个字节的前 4 位的数值表示帧类型(FrameType)
1: keyframe (for AVC, a seekableframe)(关键帧)
2: inter frame (for AVC, a nonseekableframe)
3: disposable inter frame (H.263only)
4: generated keyframe (reservedfor server use only)
5: video info/command frame
第 1 个字节的后 4 位的数值表示视频编码 ID(CodecID)
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
Script Tag Data 结构(控制帧)
该类型 Tag 又通常被称为 Metadata Tag,会放一些关于 FLV 视频和音频的参数信息如:
duration、width、height 等。通常该类型 Tag 会跟在 File Header 后面作为第一个 Tag
出现,而且只有一个。
前 11 个字节为 Tag Header 结构
第一个 AMF 包(13 字节):
第 1 个字节表示 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 类型值,表示数组元素的个数。
后面即为各数组元素的封装,数组元素为元素名称和值组成的对。表示方法如下:
第 1-2 个字节表示元素名称的长度,假设为 L。
后面跟着为长度为 L 的字符串。
第 L+3 个字节表示元素值的类型。
后面跟着为对应值,占用字节数取决于值的类型。
常见的数组元素如下:
duration: a DOUBLE indicating the total duration of the file in seconds
width: a DOUBLE indicating the width of the video in pixels
height: a DOUBLE indicating the height of the video in pixels
videodatarate: a DOUBLE indicating the video bit rate in kilobits per second
framerate: a DOUBLE indicating the number of frames per second
videocodecid: a DOUBLE indicating the video codec ID used in the file
audiosamplerate: a DOUBLE indicating the frequency at which the audio stream
is replayed
audiosamplesize: a DOUBLE indicating the resolution of a single audio sample
stereo: a BOOL indicating whether the data is stereo
audiocodecid: a DOUBLE indicating the audio codec ID used in the file
filesize: a DOUBLE indicating the total size of the file in bytes