HTTP FLV交互流程及实例解析
文章目录
- HTTP FLV交互流程及实例解析
- HTTP FLV传输方式
- HTTP FLV 抓包分析
- 结束语
HTTP FLV传输方式
前文已经介绍过,HTTP FLV利用了一个HTTP的协议约定,http 的content-length头字段如果不存在,则客户端就会一直接收数据,直到HTTP连接断开为止,HTTP FLV传输流程是视频客户端发送HTTP请求,不带content-length头字段,服务器响应HTTP,并一直发送FLV的数据;客户端接收响应并一直接收数据直到连接断开。HTTP FLV一般采用分块的传输方式,分块的格式如下:
- chunk分块包含长度头和数据体,长度头和数据体都以0x0d0a换行符为结尾标志
- 长度头的值是以16进制的ASCII值表示,以0x0d0a为结尾,比如31 35 30 0d 0a ascii为31、35、30的字符分别为’1’、‘5’、‘0’,因此表示数据体的长度为0x150,这里要注意是十六进制表示,其十进制为336
- 消息体紧跟在长度头后,以0x0d0a为结尾,这里注意长度头所表示的长度不包含0x0d0a
- 最后一个块用长度为0的块来表示,即为:30 0d 0a
HTTP FLV 抓包分析
样例数据包,是通过wireshark抓取的HTTP FLV拉流的数据包,我也放到网盘里了,可关注公众号:壹零仓,发送:视频流分析,获取,数据包总览如下:
- 首先建立TCP连接
- 视频客户端发送HTTP Get请求,获取FLV数据,请求如下:
GET /flv?port=1935&app=live&stream=test HTTP/1.1
Host: 10.45.12.29
Accept: */*
Accept-Language: zh_CN
User-Agent: VLC/3.0.18 LibVLC/3.0.18
Range: bytes=0-
资源标识flv,rtmp推送端口为1935,应用名为live标识直播,流标识为test,这里没有content-length,标识一直接收数据,Rang字段直播时从0开始,一直播放,如果时点播,可通过rang来制定字节偏移和长度,服务器收到rang后,需要校验rang的合法性
- 服务器端响应包含HTTP响应头和FLV的数据,音视频数据会携带在响应消息体里,这里无content-length,标识消息体不定长,客户端需要一直接收
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7oGYWcZ-1673946539319)(https://gitee.com/wangdenuan/picstorage/raw/master/images/20230112153318.png)]
这里要注意响应头字段中的Transfer-Encoding:chunked 标识分块传输
- 响应消息体为FLV数据,分块传输的方式,实例如下:
flv传输音视频第一包为flv header,其结构如下:
对照抓包数据可以解析出,chunk长度为0x0d=13,签名为"FLV",版本为0x01,typeflagsaudio=0x05>>2&0x01=1,typeflagsvideo=0x05&0x01=1,说明flv包含音频和视频,dataoffset固定为0x00000009,chunk数据块最后还包含四个字节,是表示PreviousTagSize,分块的传输一个tag的前面四个字节需要带上上一个tag的大小,一般放到上一个分块数据的末尾,这样每次解析完一个tag后,就可以知道本tag的大小,flv body格式如下
第一个tag的PreviousTagSize=0,这里放到第一个分块数据的末尾了,就是在flv header数据之后的四个字节,赋值为0x00000000.
- flv tag包含音频tag和视频tag,视频tag我们在rtmp中已经详细介绍了,这里介绍下音频tag,其格式如下图:
tag header
Audio tags
实例数据如下:
- 0x313530,表示块长度为0x150=336
- 0x08,tagtype=8,表示tag为音频tag
- 0x000141,tagbody大小,换算成十进制等于321
- 0x00000000,表示timestamp为0,扩展时间戳也为0
- 0x00000000,表示streamid=0,后面为audiodata数据
- 0x72,soudfomart为高四位,等于7表示G711编码,soundrate为第三第四位,值为0表示5.5khz,soudsize为第二位,值为1,表示采样精度是16位,soundsize为第一位,值为0表示单通道,之后接入的数据为音频数据。
video tag的格式:
有关详细说明,可关注公众号:壹零仓,发送rtmp,查看文章《RTMP封装H264和H265协议详解》
有关video tag的实例数据如下:
前面文章已做了详细介绍,这里不做详细解析了
结束语
HTTP FLV传输相比于fmp4协议传输,是非常简单,既保证了实时性,又具有HTTP网络的适应性,当前很多直播和交互直播领域广泛应用,具体代码如何实现,可参照ffmpeg源码