FLV简介
FLV(Flash Video)是现在非常流行的流媒体格式,由于其视频文件体积轻巧、封装播放简单等特点,使其很适合在网络上进行应用,目前主流的视频网站很多都是使用了FLV格式。
另外RTMP和FLV格式有着友好的兼容性,在使用RTMP进行推流时,RTMP Packet中封装的音视频数据流,其实和FLV/tag封装音频和视频数据的方式是相同的。
FLV格式解析
首先我们来看一张图:
FLV封装格式是由一个文件头(flie header)和 文件体(file Body)组成。其中,FLV body由一对对的(Previous Tag Size字段 + tag)组成。
Previous Tag Size字段 排列在Tag之前,占用4个字节。Previous Tag Size记录了前面一个Tag的大小,用于逆向读取处理。
FLV header后的第一个Pervious Tag Size的值为0。
Tag一般可以分为3种类型:脚本(帧)数据类型、音频数据类型、视频数据。FLV数据以大端序进行存储。
我们通过一张图看下FLV的具体文件结构:
- FLV header
FLV头占9个字节,用来标识文件为FLV类型,以及后续存储的音视频流。
FLV头由以下几部分组成:
1、 Signature(3 Byte)+Version(1 Byte)+Flags(1 Bypte)+DataOffset(4 Byte) 总共9个字节。
signature 占3个字节 固定FLV三个字符作为标示。一般发现前三个字符为FLV时就认为他是flv文件。二进制查看器中就是0x46 0x4C 0x56
,代表FLV。
Version 占1个字节 标示FLV的版本号。一般是1。
Flags 占1个字节 内容标示。第0位和第2位,分别表示 video 与 audio 存在的情况.(1表示存在,0表示不存在)。比如tag是0x05,也就是二进制的00000101,代表既有视频,也有音频。
DataOffset 4个字节 表示FLV的header长度。目前第一版是9。
- FLV Body
FLV的body部分是一系列的back-pointers+tag构成的。其中Back-pointer表示Previous Tag Size(前一个tag的字节数据长度),占4个字节。
tag分三种类型:video(视频),audio(音频),scripts(脚本数据)。
- FLV Tag
每一个Tag也是由两部分组成:tag header 和 tag data。
Tag Header里存放的是当前tag的类型、数据区(tag data)的长度等信息。tag header一般占11个字节的内存空间。
具体内容如下:
1、 type 1个字节。8为Audio,9为Video,18为scripts。(8、9、18这些是使用type转换成十进制的结果)
2、 tag data size 3个字节。表示tag data的长度。从streamd id 后算起。
3、 Timestreamp 3个字节。时间戳。
4、 TimestampExtended 1个字节。时间戳扩展字段。
5、 stream id 3个字节。总是0。
- Script Tag Data结构(脚本类型、帧类型)
该类型Tag又被称为MetaData Tag,存放一些关于FLV视频和音频的元信息,
比如:duration、width、height等。通常该类型Tag会作为FLV文件的第一个tag,并且只有一个,通常都是跟在FLV Header后。
该类型的Tag Data一般分为两个AMF包:
AMF(Action Message Format)是Adobe设计的一种通用数据封装格式,简单来说,AMF将不同类型的数据用统一的格式来描述。
第一个AMF包:
第1个字节表示AMF包类型,一般总是0x02,表示字符串。第2-3个字节为标识字符串的长度,一般总是0x000A(“onMetaData”长度)。后面字节为具体的字符串,一般总为“onMetaData”(6F,6E,4D,65,74,61,44,61,74,61)。
第二个AMF包:
第1个字节表示AMF包类型,一般总是0x08,表示数组。第2-5个字节为UI32类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如下表所示:
值 | 含义 |
---|---|
duration | 时长 |
width | 视频宽度 |
heiht | 视频高度 |
video data rate | 视频码率 |
frame rate | 视频帧率 |
video codec id | 视频编码方式 |
audio sample rate | 音频采样率 |
audio sample size | 音频采样精度 |
stereo | 是否为立体声 |
audio codec id | 音频编码方式 |
filesize | 文件大小 |
这就是脚本类型数据的组成部分。
- Audio Tag Data结构(音频类型)
音频Tag Data区域开始的第一个字节包含了音频数据的参数信息,从第二个字节开始为音频流数据。
其中第一个字节的1到4为代表的是音频格式:
转换成十进制后的值 | 代表的格式 |
---|---|
0 | Linear PCM |
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 |
接着2位为采样率(对于AAC总是3):
值 | 类型 |
---|---|
0 | 5.5-kHz |
1 | 11-kHz |
2 | 22-kHz |
3 | 44-kHz |
接着1位为采样的长度(压缩过的音视频都是16bit):
值 | 类型 |
---|---|
0 | snd8Bit |
1 | snd16Bit |
最后1位为音频类型(对于AAC总是1):
值 | 类型 |
---|---|
0 | sndMono |
1 | sndStereo |
从第二个字节开始的就是音频数据了。
- video Tag Data结构(视频类型)
视频Tag Data和音频Tag Data一样,开始的第一个字节包含视频数据的参数信息,从第二个字节开始为视频流数据。
第一字节的前四位表示的是帧类型,值如下:
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,值如下
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
第二个字节开始为视频数据。
结束
对于FLV的格式介绍就到此结束了,为了加深对FLV格式的理解,建议使用十六进制查看器打开一个flv文件,对照文章进行转换学习。
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/13614.html