HTTP FLV交互流程及实例解析

news2024/11/22 15:02:45

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一般采用分块的传输方式,分块的格式如下:
2

  • 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拉流的数据包,我也放到网盘里了,可关注公众号:壹零仓,发送:视频流分析,获取,数据包总览如下:
1

  • 首先建立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数据,分块传输的方式,实例如下:
    2

flv传输音视频第一包为flv header,其结构如下:
1

对照抓包数据可以解析出,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格式如下
1
第一个tag的PreviousTagSize=0,这里放到第一个分块数据的末尾了,就是在flv header数据之后的四个字节,赋值为0x00000000.

  • flv tag包含音频tag和视频tag,视频tag我们在rtmp中已经详细介绍了,这里介绍下音频tag,其格式如下图:
    tag header
    1
    Audio tags
    1

实例数据如下:
1

  • 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的格式:
1
有关详细说明,可关注公众号:壹零仓,发送rtmp,查看文章《RTMP封装H264和H265协议详解》
有关video tag的实例数据如下:
1
前面文章已做了详细介绍,这里不做详细解析了

结束语

HTTP FLV传输相比于fmp4协议传输,是非常简单,既保证了实时性,又具有HTTP网络的适应性,当前很多直播和交互直播领域广泛应用,具体代码如何实现,可参照ffmpeg源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32-Camera性能(简单)测试评估

TOC 1. ESP32-Camera简介 最近因为接触了ESP32摄像头相关的资料和信息,稍微简单整理下,希望对该方案有兴趣的朋友可以有所帮助。 1.1 资料&信息 The Internet of Things wit ESP32ESP32-S Series开发模组Github: ESP32-Camera 1.2 ESP-EYE摄像头…

别忘记我:通过局部-全局内容建模进行文本擦除方法

本文简要介绍了发表于ECCV 2022的论文“Don’t Forget Me: Accurate Background Recovery for Text Removal via Modeling Local-Global Context”的相关工作。该论文针对文本擦除中存在的复杂背景修复的问题,提出了CTRNet,它利用局部和全局的语义建模提…

一个 go-sql-driver 的离奇 bug

文|郝洪范京东技术专家Seata-go 项目共同发起人微服务底层技术的探索与研究。本文 3482 字 阅读 7 分钟对于 Go CURD Boy 来说,相信 github.com/go-sql-driver/mysql 这个库都不会陌生。基本上 Go 的 CURD 都离不开这个特别重要的库。我们在开发 Seata-g…

LabVIEW将现有数据文件映射至TDMS数据文件格式

LabVIEW将现有数据文件映射至TDMS数据文件格式在某些情况下,可能无法使用TDMS文件格式,例如客户或供应商指定必须使用某种格式存储数据。有些传统仪器可能会自动使用某种自定义格式提供数据输出文件。此外,已经用某种方式收集的传统测量数据无…

PyQt6快速入门-自定义Widget

自定义Widget 文章目录 自定义Widget1、准备工作2、重写paintEvent事件3、Position策略4、更新显示5、绘制条形框5.1 绘制计算5.2 绘制条形框6、自定义样式7、添加鼠标交互能力8、完整代码QPainter是Qt中所有小部件绘制的基础。在本文中,详细介绍如何构建一个全新的自定义 GUI…

vue文本点击样式设置

vue文本点击样式设置嘚吧嘚干就完了光标边小手文本域样式修改hover语法语法一语法二语法三语法四学以致用,效果实现嘚吧嘚 相信当家在写代码的过程中,文本的点击事件是常有的吧,如历史搜索记录、页面跳转等。本次就就分享一下文本点击样式设…

从CES的亚马逊云科技展台,看云计算如何改变汽车行业

当云计算技术被广泛运用于智能汽车的制造,会给整个汽车行业带来怎样的变革?CES 2023汽车展区:亚马逊云科技展台成为焦点作为全球规模最大、影响力最为广泛的国际消费电子展,CES 2023于近日在美国拉斯维加斯圆满落下帷幕。在这场汇…

数据结构和算法的基本概念和基本术语(数据,数据元素,数据项,数据对象)

目录 一、数据结构的研究内容 1.1学生信息管理系统 1. 2人机对弈问题 1. 3最短路径问题 二、基本概念和术语 2.1数据,数据元素,数据项,数据对象 2.1.1 数据(Data): 2.1.2 数据元素(Data Element)&a…

关于elasticsearch一些基本操作

哈喽~大家好,这篇来看看关于elasticsearch一些基本操作。 🥇个人主页:个人主页​​​​​ 🥈 系列专栏: 【微服务】 🥉与这篇相关的文章: SpringCloud Se…

Import语句基础

1 问题 在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类。 2 方法 1.import导入声明可分为两种: 1&a…

【每日一道智力题】之 轮流取石子(简单的尼姆博弈)

题目:一共有N颗石子(或者其他乱七八糟的东西),每次最多取M颗最少取1颗,A,B轮流取,谁最后会获胜?(假设他们每次都取最优解)。解答:结论&#xff1a…

告诉大家几个好用的功能

功能一:打开通知面板/月历面板 WinN的作用是调出通知面板,由于Windows 11将月历与通知面板合在了一起,因此它的另一项功能,就是——打开月历。 功能二:WindowsW:启用小组件面板 如果我们需要用到系统自带的小组件&am…

WC2023游记

今年,我势必打破铜牌魔咒 Day -?~? 虽然已年及高二,但WC的讲课还是没有听懂多少,这段时间,北师大还有一名E队来我校训练,我只能感慨:“如果一个选手比你强,还比你小,那你就再也打…

51 种 AI 工具,生活、编程、内容创建都应该使用它

AI 正在席卷全球 🔥🔥🔥 它具有无限的潜力,并将改变我们的生活,让生活变得更美好。这项技术将迅速改进,您今天可以使用许多工具来提高您的工作效率,帮助您完成工作,为您提供有关许多…

单网口ubuntu主机配置virt-manager传统桥接bridge网络

单网口ubuntu主机配置virt-manager传统桥接bridge网络 虚拟机的网络桥接bridge模式往往需要物理宿主机有两个网口,一个网口1连接外网配置ip,另一个网口2空闲不配置ip,在virt-manager里配置虚拟机的网卡绑定网口2,从而实现虚拟机桥…

81.门控循环单元(GRU)以及代码实现

1. 关注一个序列 做RNN的时候,处理不了太长的序列,因为把整个序列信息全部放在隐藏状态中,所有东西都放进去,当时间步很长的话,隐藏状态就会累积太多东西,就可能对很前面的信息不那么容易抽取出来了。 所…

Aftermath:一款针对macOS的免费开源事件响应框架

关于Aftermath Aftermath是一款针对macOS的事件响应框架,该工具基于Swift语言开发,是一款完全免费且开源的网络安全事件响应框架。 在Aftermath的帮助下,广大研究人员可以轻松收集并分析受感染主机的数据。除此之外,在理想情况下…

“深度学习”学习日记。误差反向传播法--Affine/Softmax层的实现

2023.1.17 Affine层: 在神经网络的正向传播中,为了计算加权信号的总和,使用矩阵乘积运算。 比如: import numpy as npx np.arange(6).reshape(2, 3) # (2,3) w np.arange(6).reshape(3, 2) # (3,2) b np.arange(4).resha…

LeetCode083_83. 删除排序链表中的重复元素

LeetCode083_83. 删除排序链表中的重复元素 一、描述 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2]示例 2&#xff1…

虚拟机或Linux安装Nginx及本地指定虚拟机域名

安装必要工具和依赖 yum -y install wget gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -----------------------------------废话开始------------------------------------------------- 上面这句话的意思:以下当废话 yum ---在线安装命令 inst…