1、FLV格式数据封装
FLV (Flash Vedio ) 是一种视频流媒体格式,FLV是被众多新一代视频分享网站所采用,是目前增长最快、最为广泛的视频传播格式。是在sorenson公司的压缩算法的基础上开发出来的。FLV格式不仅可以轻松的导入Flash中,速度极快,并且能起到保护版权的作用,并且可以不通过本地的微软或者REAL播放器播放视频。
2、FLV文件结构
FLV里面是由多个Tag构成的:[[tag1][tag2][tag3][tag4]…]
而Tag多种类型,最常见的是Metainfo Tag
,Video Tag
,Audio Tag
。
而一般的文件结构里是这样存放的:[[Flv Header][Metainfo Tag][Video Tag][Audio Tag][Video Tag][Audio Tag][Other Tag]…],其中 AudioTag 和 VideoTag 出现的顺序随机的,没有严格的定义。
Flv Header 是文件的头部,用FLV
字符串标明了文件的类型,以及是否有音频、视频等信息。之后会有几个字节告诉接下来的包字节数。
Metainfo 中用来描述Flv中的各种参数信息,例如视频的编码格式、分辨率、采样率等等。如果是本地文件(非实时直播流),还会有偏移时间戳之类的信息用于支持快进等操作。
VideoTag 存放视频数据。对于H.264来说,第一帧发送的NALU应为 SPS和PPS,这个相当于H.264的文件头部,播放器解码流必须先要找到这个才能进行播放。之后的数据为I帧或P帧。
AudioTag 存放音频数据。对于AAC来说,我们只需要在每次硬编码完成后给数据加上adts头部信息即可。
3、详细介绍一下三种Tag的Tag Data部分的结构
(1).音频tag
音频Tag开始的第1个字节包含了音频数据的参数信息,从第2个字节开始为音频流数据。结构如图3所示。
图3.Audio Tag Data结构
第1个字节的前4位的数值表示了音频编码类型。如表1所示。
表1.音频编码类型
值 | 含义 |
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位的数值表示音频采样率。如表2所示。
表2.音频采样率
值 | 含义 |
0 | 5.5kHz |
1 | 11KHz |
2 | 22 kHz |
3 | 44 kHz |
PS:从上表可以发现,FLV封装格式并不支持48KHz的采样率。
第1个字节的第7位表示音频采样精度。如表3所示。
表3.音频采样精度
值 | 含义 |
0 | 8bits |
1 | 16bits |
第1个字节的第8位表示音频类型。
表4. 音频类型
值 | 含义 |
0 | sndMono |
1 | sndStereo |
(2).视频tag
视频Tag也用开始的第1个字节包含视频数据的参数信息,从第2个字节为视频流数据。结构如图4所示。
图4.Video Tag Data结构
第1个字节的前4位的数值表示帧类型。如表5所示。
表5.帧类型
值 | 含义 |
1 | keyframe (for AVC,a seekable frame) |
2 | inter frame (for AVC,a nonseekable frame) |
3 | disposable inter frame (H.263 only) |
4 | generated keyframe (reserved for server use) |
5 | video info/command frame |
第1个字节的后4位的数值表示视频编码类型。如表6所示。
表6.视频编码类型
值 | 含义 |
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 |
(2).脚本tag
该类型Tag又通常被称为Metadata Tag,会放一些关于FLV视频和音频的元数据信息如:duration、width、height等。通常该类型Tag会跟在File Header后面作为第一个Tag出现,而且只有一个。结构如图5所示。
图5.Script Tag Data结构
第一个AMF包:
第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类型值,表示数组元素的个数。后面即为各数组元素的封装,数组元素为元素名称和值组成的对。常见的数组元素如表7所示。
表7.常见MetaData
值 | 含义 |
duration | 时长 |
width | 视频宽度 |
height | 视频高度 |
videodatarate | 视频码率 |
framerate | 视频帧率 |
videocodecid | 视频编码方式 |
audiosamplerate | 音频采样率 |
audiosamplesize | 音频采样精度 |
stereo | 是否为立体声 |
audiocodecid | 音频编码方式 |
filesize | 文件大小 |