HTTP FLV交互流程及实例解析
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源码
HTTP FLV交互流程及实例解析相关推荐
- IEC104 规约详细解读(二)交互流程以及协议解析
流程 第一步:首次握手(U帧) 发送―>激活传输启动 : 68(启动符)04(长度)07(控制域) 00 00 00 接收―>确认激活传输启动: 68(启动符)04(长度)0B(控制域) ...
- python与c 交互原理_PYTHON 与C相互交互调用实例解析
PYTHON与C相互交互调用实例解析 使用前工具: Vc++编译器 Python解释器 如没有装VC,可以去微软网站下一个C++的编译器,地址如下: 装完后,在环境变量中把PYTHON的INCLUDE ...
- Redis源码剖析(一)服务器与客户端交互流程
Redis中的C/S模型 Redis底层还是基于网络请求的,对于单机数据库而言,网络请求仅仅是在一台机器上交互,即服务器客户端都在一台计算机上 当在终端输入redis-serve时,便启动了一个Red ...
- 深入浅出 Redis client/server交互流程
2019独角兽企业重金招聘Python工程师标准>>> 最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文 ...
- Reactor实例解析
\ 要点 \\ Reactor是一个运行在Java8之上的响应式流框架,它提供了一组响应式风格的API\\t 除了个别API上的区别,它的原理跟RxJava很相似\\t 它是第四代响应式框架,支持操作 ...
- 实例解析linux内核I2C体系结构
实例解析linux内核I2C体系结构 一.概述 谈到在linux系统下编写I2C驱动,目前主要有两种方式,一种是把I2C设备当作一个普通的字符设备来处理,另一种是利用linux I2C驱动体系结构来完 ...
- adaboost算法java_Adaboost 算法实例解析
Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...
- SoapUI简介和入门实例解析
SoapUI简介 SoapUI是一个开源测试工具,通过soap/http来检查.调用.实现Web Service的功能/负载/符合性测试.该工具既可作为一个单独的测试软件使用,也可利用插件集成到Ecl ...
- Android开发之IPC进程间通信-AIDL介绍及实例解析
一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用 ...
最新文章
- 《mysql性能调优与架构设计》笔记: 一mysql 架构组成
- 怎么把加载图标去掉_怎样在PCB上绘制图标
- php7和python3性能对比-为什么PHP7执行这个简单循环比Python3快得多?
- Conan and Agasa play a Card Game
- 如何解决 SQL Server 安装程序中的 COM+ 系统配置检查失败问题
- SpringBoot+Shiro学习(四):Realm授权
- ssl初一组周六模拟赛【2018.3.24】
- Unity脚本生命周期与执行顺序
- java将图片转byte存入数据库_Java将byte[]转图片存储到本地的案例
- LSI加入多核联盟参与编程与应用标准制定
- Android软键盘问题
- nod32 升级方法
- 罗马数字转换python_阿拉伯数字转换成罗马数字
- 微软招 HR 了!看来是招聘需求太旺盛,忙不过来了
- 台式机U盘安装Centos 安装界面黑屏并且没有网卡驱动
- display 常用属性
- 「cocos2d-x」垂直射击游戏之宇智波鼬 VS 九尾狐(1)
- arcmap fishnet 经纬度
- 宏观低速物理 '牛顿篇'
- 要闻君说:小米9已确认无线充电;华为着手操作的5G火车站启动建设仪式将于本月18日“登陆”;三星提出大力发展电信网络设备业务……...
热门文章
- 快收藏!高手Linux运维管理必备工具大全,你会吗?
- 还叫 “不可成药” 靶点?KRAS 已逆袭!- MedChemExpress
- U盘无法格式化怎么办?!
- Impact 主题(一):安装与启动
- 微信打不开怎么回事?分享解决办法
- MySQL 语句大全
- XDRamD工具 windows 7-10-11系统苹果绕过激活锁ID界面 新工具,屏幕锁界面打电话,苹果X 16系统也支持,
- Synchro plus SimTraffic 11.0.140.0中文版
- STM32 USB 虚拟串口 Virtual COM Port
- AutoJs学习-文字转语音QQ发送