FLV协议简介
FLV(Flash Video)是一种流媒体格式,因其体积小、协议相对简单,很快便流行开来,并得到广泛的支持。
常见的HTTP-FLV直播协议,就是使用HTTP流式传输通过FLV封装的音视频数据。对想要了解HTTP-FLV的同学来说,了解FLV协议很有必要。
概括地说,FLV 由 FLV header 跟 FLV file body 两部分组成,而 FLV file body 又由多个 FLV tag组成。
FLV = FLV header + FLV file body
FLV file body = PreviousTagSize0 + Tag1 + PreviousTagSize1 + Tag2 + ... + PreviousTagSizeN-1 + TagN
FLV tag又分为3种类型:
- Video Tag:存放视频相关数据;
- Audio Tag:存放音频相关数据;
- Script Tag:存放音视频元数据;
在实际讲解FLV协议前,首先对单位进行约定:
类型 | 定义 |
---|---|
0x... | 16进制数据 |
SI8 | 有符号8位整数 |
SI16 | 有符号16位整数 |
SI24 | 有符号24位整数 |
SI32 | 有符号32位整数 |
STRING | Sequence of Unicode 8-bit characters (UTF-8), terminated with 0x00 (unless otherwise specified) |
UI8 | 无符号8位整数 |
UI16 | 无符号16位整数 |
UI24 | 无符号24位整数 |
UI32 | 无符号32位整数 |
xxx [ ] | 类型为xxx的数组 |
xxx [n] | 类型为xxx的数组,数组长度为n |
FLV header
FLV header由如下字段组成,其中:
- 前三个字节内容固定是FLV
- 最后4个字节内容固定是9(对FLV版本1来说)
字段 | 字段类型 | 字段含义 |
---|---|---|
Signature | UI8 | 签名,固定为'F' (0x46) |
Signature | UI8 | 签名,固定为'L' (0x4c) |
Signature | UI8 | 签名,固定为'V' (0x56) |
Version | UI8 | 版本,比如 0x01 表示 FLV 版本 1 |
TypeFlagsReserved | UB[5] | 全为0 |
TypeFlagsAudio | UB[1] | 1表示有audio tag,0表示没有 |
TypeFlagsReserved | UB[1] | 全为0 |
TypeFlagsVideo | UB[1] | 1表示有video tag,0表示没有 |
DataOffset | UI32 | FLV header的大小,单位是字节 |
FLV file body
FLV file body很有规律,由一系列的TagSize和Tag组成,其中:
- PreviousTagSize0 总是为0;
- tag 由tag header、tag body组成;
- 对FLV版本1,tag header固定为11个字节,因此,PreviousTagSize(除第1个)的值为 11 + 前一个tag 的 tag body的大小;
字段 | 字段类型 | 字段含义 |
---|---|---|
PreviousTagSize0 | UI32 | 总是0 |