文章插图
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 + TagNFLV tag又分为3种类型:
- Video Tag:存放视频相关数据;
- Audio Tag:存放音频相关数据;
- Script Tag:存放音视频元数据;
类型定义0x...16进制数据SI8有符号8位整数SI16有符号16位整数SI24有符号24位整数SI32有符号32位整数STRINGSequence 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来说)
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的大小;
FLV tags
FLV tag由 tag header + tag body组成 。
tag header如下,总共占据11个字节:
字段字段类型字段含义TagTypeUI8tag类型
8:audio
9:video
18:script data
其他:保留DataSizeUI24tag body的大小TimestampUI24相对于第一个tag的时间戳(单位是毫秒)
第一个tag的Timestamp为0TimestampExtendedUI8时间戳的扩展字段,当 Timestamp 3个字节不够时,会启用这个字段,代表高8位StreamIDUI24总是0Data取决于根据TagTypeTagType=8,则为AUDIODATA
TagType=9,则为VIDEODATA
【FLV协议5分钟入门浅析】TagType=18,则为SCRIPTDATAOBJECT
In playback, the time sequencing of FLV tags depends on the FLV timestamps only. Any timing mechanisms built into the payload data format are ignored.Audio tags
定义如下所示:
字段字段类型字段含义SoundFormatUB[4]音频格式,重点关注 **10 = AAC **
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
11 = Speex
14 = MP3 8-Khz
15 = Device-specific sound
SoundRateUB[2]采样率,对AAC来说,永远等于3
0 = 5.5-kHz
1 = 11-kHz
2 = 22-kHz
3 = 44-kHzSoundSizeUB[1]采样精度,对于压缩过的音频,永远是16位
0 = snd8Bit
1 = snd16BitSoundTypeUB[1]声道类型,对Nellymoser来说,永远是单声道;对AAC来说,永远是双声道;
0 = sndMono 单声道
1 = sndStereo 双声道SoundDataUI8[size of sound data]如果是AAC,则为 AACAUDIODATA;
其他请参考规范;
备注:
If the SoundFormat indicates AAC, the SoundType should be set to 1 (stereo) and the SoundRate should be set to 3 (44 kHz). However, this does not mean that AAC audio in FLV is always stereo, 44 kHz data. Instead, the Flash Player ignores these values and extracts the channel and sample rate data is encoded in the AAC bitstream.AACAUDIODATA
当 SoundFormat 为10时,表示音频采AAC进行编码,此时,SoundData的定义如下:
字段字段类型字段含义AACPacketTypeUI80: AAC sequence header
推荐阅读
- 老中医5分钟教你看懂12经络,最简单的十二经络讲解,收藏了吧!
- 5分钟学会如何不花冤枉钱买到适合的手机
- robots.txt协议如何设置禁止搜索引擎抓取?
- 烤箱第一次使用空烤20分钟可以吗 烤箱空烤10分钟还是15分钟
- “5G下深矿”山西多家煤企与中国移动签署5G战略合作协议
- 程序员需要掌握的一些网络协议汇总
- 附协议范本 注意,离婚协议中这6种约定无效!
- 学习一下OAuth2.0协议
- 不用敲代码,5分钟教会你爬虫
- 个个都有坑!《离婚协议》最容易忽略的7个问题