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源码。

作者:壹零仓

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论