Websocket实时音视频传输应用实战

背 景

随着互联网技术的发展,越来越多的企业和开发者开始寻求更高效、更稳定的通信解决方案。在这种背景下,WebSocket协议应运而生。WebSocket是一种在单个TCP连接上进行全双工通信的协议,它可以实现服务器和客户端之间的实时数据交换,提高了通信效率,降低了延迟。在金融、物联网等领域,数据的实时是非常重要的,传统的数据处理方式需要将数据打包成HTTP请求发送给服务器,然后等待服务器返回结果。这种方式效率低下,无法满足实时数据分析处理的需求。而WebSocket协议可以实现服务器和客户端之间的实时数据交换,使得数据服务请求响应更加高效。

粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

Websocket的概念

WebSocket是一种在单个TCP连接上进行全双工通信的网络协议。经过一次TCP握手就可以直接创建持久性连接,进而可实现服务端和客户端双向数据传输。Websocket建立一次连接后可以保持长时间的通信会话,链路复用,减少握手次数,从而能够满足业务上需要实时性和即时更新的功能。

Websocket的应用场景

拿到一个问题,评估考虑是否使用WebSocket的技术方法很简单,总结起来,主要为以下两点:

(1)应用需要提供多个用户相互交流吗?

(2)应用需要动态实时展示服务器端经常变动的数据吗?

如果符合上面的场景,就可以尝试考虑使用WebSocket来进行解决。当前Websocket的主要场景有以下几个。

  • 在线聊天
  • 文档编辑协作
  • 在线游戏
  • 文件类传输

Websocket特点

(1)基于熟悉的 TCP 协议之上,服务端可实现方式多样丰富

(2)能与 HTTP 协议良好的兼容。默认端口也是80和443,握手采用 HTTP 协议,通过协议提升交互实现连接建立

(3)数据报文格式轻量,性能好,通信交互高效。

(4)即支持文本,也可以发送二进制流。

(5)协议标识符:ws,同比与http,https, ws加密后的协议标识是wss。

项目实施中面临的问题和挑战

(1)当前开发技术栈主要是开发restful接口服务,整个开发组都是都习惯于restful服务的接口开发,对Websocket 协议不熟,落地到应用,有很多未知风险及问题。

(2)对安全性考虑,新的协议模式,存在认知盲区。对于习惯的restful接口开发,我们比较熟悉的而且一直在使用的就是OPENAPI统一接入规范,OAUTH进行鉴权。采用WebSocket新的协议来开发接口实现业务需求,怎么保证安全性缺乏先验经验。

(3)在现代多媒体应用中,音视频处理是一个重要的组成部分,音视频处理领域相对独立且较为小众,并非每个开发者都会关注到这个知识点。开发人员在处理音视频这块知识储备不够,经验不足。领域独立小众的特点,并不是每个开发者都会去关注的知识点。

(4)弱网下如何保证消息及时发送成功送达,用户在网络通畅的情况下没问题,一到弱网服务传输就变慢,卡顿。很多场景,用户处于弱网环境下,极易导致消息堵塞,如何保证服务正常是一大难点。

技术实现

搭建基础框架,首先,我们后台服务基于内部开发脚手架SDK, 采用基于java 原生+spring boot混合的方式实现了WebSocket服务基座,提供音视频接收处理服务。整个后台服务同时支持HTTP接口类的服务和Websocket 长连接。HTTP接口服务,主要服务于传统业务交易流程,Websocket连接主要服务需要进行长连接传输的业务场景。

图1 后端wesocket服务框架

WebSockets协议交互过程的每个步骤的详细说明如下:

(1)Client向Server发送Handshake Request(握手请求):Client发送一个HTTP请求,其中包含特定的头部信息,以表明希望升级到WebSocket协议。

(2)Server返回Handshake Response(握手响应):Server接收到握手请求后,会返回一个HTTP响应,其中包含与WebSocket相关的头部信息,以表示握手成功,并升级到WebSocket协议。这个响应通常称为”握手确认”。

(3)Data Transfer(数据传输):一旦握手成功,双方之间建立了持久连接,可以进行全双工的数据传输。Client和Server可以通过该连接发送和接收数据。

(4)WebSocket Frames(WebSocket帧):在WebSocket连接上进行数据传输时,数据被分割成小块,每个小块被封装在WebSocket帧中。WebSocket帧有不同的类型和标志,用于指示消息的开始、结束、类型等信息。

(5)Connection(连接):持久连接保持打开状态,直到任一端关闭连接或发生错误。双方可以随时发送和接收数据,实现实时的数据交换。

图 2 Websocket协议及数据交互过程

后台启动服务后,前端开始来进行建立连接,建立请求到达后台后,后台先进行校验合法性,合法性校验成功后,返回前端链接建立成功。此时前后端 WSS连接通道创建成功。然后前端就可以开始传送视频帧或者图片帧,这一请求俗称推流。推流可以有不同的工具实现,例如ffmpeg,OBS推流,或者前端按照频率截取摄像机图片帧,后端接收前端推的流后进行业务处理,例如保存,转码,合成,录制等服务。交易完成后,前后端开始关闭长连接。在传输视频图片帧的时候还可以进行消息通信,完成我们熟悉的http文本消息发送。

针对安全性,接口安全设计,鉴权方面,参考了现有的OPENAPI,OAUTH鉴权机制,同时针对Websocket连接的特点,增加了其他安全性校验,系统稳健性方面,系统支持当个渠道及总体wss连接数限流,避免单机连接数耗尽。同时我们也加强了对单机WSS总连接数的监控,具体实现及实施过程,想了解可以内部联系沟通讨论。

音视频处理模块,这块我们深感知识缺乏,好在我们保持一种遇到问题解决问题的心态,一步一步摸索,走出了一条在我们熟悉的java 语言下利用 ffmpeg+javacv 方式来处理音视频的道路。例如,我们可以用ffmpeg来进行视频中的音频提取,使用javacv来进行图片到视频的转码录制服务。当前已经调研并实现了绝大数音视频相关的编辑处理服务,并提供标准化接入接口,方便接入及使用。此外在分辨率提升方面也积累了相关经验。

图 3内部实现的音视频处理服务

在系统架构的设计上,我们采取了一种策略性的拆分方法,将系统的各个功能模块进行了细致的拆分和分类。特别是对于那些计算密集,IO密集型的模块,我们将其独立出来,形成了一个独立的子系统,专门负责处理图片、视频帧以及音频等相关的计算任务。这个子系统就是我们的”媒体服务”模块。通过这样的拆分,我们成功地将媒体服务模块与其他的业务交易系统分离开来,这样不仅可以避免两个系统之间的相互干扰,还可以更有效地进行系统的维护和升级。这种拆分方法为系统的稳定运行提供了有力的保障。

图4 内部服务子系统拆分

在当今高度数字化的世界,确保信息在弱网环境下的及时发送和成功送达已经成为了一个重要的挑战。许多用户在日常生活中的许多场景中都可能遇到网络不稳定的情况,如在家中的无线网络覆盖范围边缘、地铁隧道中或山区等。这些问题可能导致消息堵塞,影响用户体验。为了解决这个问题,我们可以采取一系列的策略和技术手段。在报文传输优化方面,最开始我们采用的是request +reponse 的方式,后来在使用过程中,我们发现如果每一帧都回复响应,会导致客户端消息拥塞。当整个链路同时在进行音视频帧传输,文本消息发送过程中,表现更为明显。针对此问题,我们进行了两个方面的优化,首先减少每次交互的报文大小及字段,对端缓存相关业务参数字段,只进行最少次数的传输,只传输必须要的字段。其次我们减少了确认帧报文的发送,从每帧都回复确认帧,改为后台服务每隔一定时间才返回对应帧响应(设计并实现一套合并确认的算法机制),减轻了整个通道消息量,减少前端因对响应报文帧的处理而导致系统卡顿。以上两点优化,一定程度上优化了用户在弱网下的服务体验。

在网络连接的管理策略中,我们设计定义了一套探活机制,该机制能够实时监测前后端服务的状态。一旦发现连接在一定时间内没有响应,我们会立即对其进行剔除,关闭连接,以防止连接数的过度积累,从而确保系统的稳定运行。此外,我们还对系统单机连接总数做了专门监控。持久连接都会在创建后及时进行关闭。连接的创建关闭机制以及监控机制,为系统的高效运行奠定了坚实的基础。

项目启发

(1)积累技术,沉淀技术,多做分享总结

一回生二回熟,越深入了解就越熟悉,就会越得心应手。产出相关文档,相互学习借鉴,减少未知知识壁垒障碍。在调研提升Websocket服务tps时,我们进行对比不同Web容器(tomcat,jetty,netty)性能的分析,得到了不同容器适合的场景;

在websocket下如何保证安全性,我们进行深入分析调研,这些都为未来其他类似业务的开展提供数据及经验以参考,Websocket 服务搭建及应用,也体现了我们脚手架SDK 的灵活性,能够在不同场景切换自如。

(2)稳定为首

如果涉及已有服务改造,为了保证稳定,切换时应该要考虑服务异常降级,考虑支持多协议间降级切换。确保Websocket服务异常的时候能切换到备份服务,如http服务或使用其他服务来承载该服务功能。

(3)敢做敢想慎行

做的时候,就担心图片合成视频可能会是性能瓶颈,就感觉到实施起来比较困难。面对未知时,唯一做的,大胆尝试,小心求证。最后经过多次优化,图片合成视频耗时降低到ms级别,相比业务总体总耗时,这点时间已经不是主要问题,而且我们的服务做到图片视频分辨率可控调整,按需提升。

未来规划

随着当前业务请求Websocket模式调用量上涨,结合当前业务开展遇到的问题,以及客户提出的述求,当前和未来规划如下。

  1. 低带宽。当前Websocket通信模式,客户端带宽占用比较高,Websocket通信模式需要优化带宽,调研新的数据包协议,进一步优化以降低用户的带宽使用。
  2. 高分辨率。某些场景下,WS模式的清晰度还不够,还需要调研进一步提升图片视频的清晰度,以支持客户的对高分辨率的追求。
  3. 丰富的多媒体化。单通道媒体文件优化,当前只有图片通道,后续考虑音频等单连接多数据通路或者多连接多数据通道,同时支持多种媒体文件,如图片帧,音频帧的收发,以便支持更多业务类型。
  4. 低延时。后续考虑调研使用更高性能的GPU进行图片视频转换,进一步提升视频图片处理效率。

粉丝福利, 免费领取C++音视频学习资料包+学习路线大纲、技术视频/代码,内容包括(音视频开发,面试题,FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,编解码,推拉流,srs)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

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

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

相关文章

【Spring Boot 3】动态注入和移除Bean

【Spring Boot 3】动态注入和移除Bean 背景介绍开发环境开发步骤及源码工程目录结构总结动态注入Bean的方法动态移除Bean的方法注意事项背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个…

图像处理 mask掩膜

1,图像算术运算 图像的算术运算有很多种,比如两幅图像可以相加,相减,相乘,相除,位运算,平方根,对数,绝对值等;图像也可以放大,缩小,旋…

(二十一)从零开始搭建k8s集群——kubernates核心组件及功能介绍

前言 Kubernetes是一个可移植、可扩展、开源的平台,用于管理容器化的工作负载和服务,它促进了声明性配置和自动化。Kubernetes容器可以持续开发、集成和部署:可靠且频繁地构建和部署容器镜像,快速有效地回滚;开发与运…

点胶缺陷视觉检测都是怎么检测的?

点胶工艺是许多工业生产中不可或缺的一环,而点胶缺陷的存在往往直接影响到产品质量。为了提升点胶工艺的品质控制,点胶缺陷的视觉检测成为了一个重要的技术手段。 一、点胶缺陷的类型 点胶缺陷主要包括胶点大小不均、位置偏移、漏点、多点等。这些缺陷如…

VS Code搭建远程开发环境的几种情况

VS Code远程开发环境的三种情况: 一、本地桌面系统远程Linux系统 windowswsl是属于这种情况下的一种特殊情况。 使用Remote - SSH插件来解决这种情况 二、本地桌面系统本地Docker环境 windowswslwindows上部署Docker Desktop也是属于这种情况下的一种特殊情况。…

测开面经学习笔记

1. mysql 和 redis的区别? ① 数据存储方式 MySQL:数据以表格的形式以行和列的方式存储在磁盘上,支持复杂的关系型数据模型。Redis:数据存储在内存中,因此具有更快的读写速度,但受到内存容量的限制。 ②…

IntelliJ IDEA 2020.2.4试用方法

打开idea,准备好ide-eval-resetter压缩包。 将准备好的压缩包拖入idea中 选中弹窗中的自动重置选项,并点击重置 查看免费试用时长

启动查看工具总结

启动目标:2s内优秀,2-5s普通,之后的都需要优化,热启动则是1.5s-2s内 1 看下大致串联启动流程: App 进程在 Fork 之后,需要首先执行 bindApplication Application 的环境创建好之后,就开始activ…

【Web前端】Vue核心基础

文章目录 1. Vue简介2. Vue官网使用指南3. 初识Vue3.1 搭建Vue开发环境3.2 HelloWorld案例3.3 el与data的两种写法3.4 MVVM模型3.5 模板语法 4. 数据绑定4.1 v-bind单向数据绑定4.2 v-model双向数据绑定 5. 事件处理5.1 v-on绑定事件5.2 事件修饰符5.3 键盘事件 6. 计算属性6.1…

java实现冒泡排序

目录 算法 概念 算法步骤 代码示例 例题实战 算法 概念 冒泡排序 是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误,就把他们交换过来。走访数列的工作时重复地进行直到没有再需要交换&#…

typescript学习(更新中)

目录 开发环境搭建类型如何声明有哪些类型编译配置文件 开发环境搭建 npm i -g typescripttsc检查是否安装成功 类型如何声明 // 先声明再赋值 let a: number a 1// 直接赋值 let b 1function sum(a: number, b: number): number {return a b } console.log(sum(1, 2))有…

leetcode72. 编辑距离

leetcode72. 编辑距离 题目 思路 dp[i][j] 代表 word1 到 i 位置转换成 word2 到 j 位置需要最少步数,所以, 当 word1[i] word2[j],dp[i][j] dp[i-1][j-1]; 当 word1[i] ! word2[j],dp[i][j] 1 min(dp[i-1][j-1]…

这样用redission分布式锁才优雅-自定义redission分布式锁注解(含spel表达式)

废话后面说,先上干货。 最终的使用效果是这样的: /*** 这里只是一个简单的示例,实际业务中,可能需要根据订单号查询订单信息,然后进行发货操作* 仅仅是为了证明相同订单号不能够同时操作,但是在实际的业务场…

Ubantu 18.04 如何映射IP到公网,外网可以访问

介绍一种简单的方式,就是通过路由侠 inux 系统安装路由侠,可通过两种方式进行,一种是通过直接脚本安装,一种是通过 Docker 安装。 windows下载地址:路由侠-局域网变公网 方式一:通过脚本安装 1、获取安…

java算法第十七天 | ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和

110.平衡二叉树 leetcode链接 思路: 使用后序遍历分别求左右子树的高度,若高度只差大于一,则返回-1,否则返回当前节点的最大高度。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* Tree…

【数据分享】2013-2022年全国范围逐日SO2栅格数据

空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2013-2022年全国范围逐月SO2栅格数据和逐年SO2栅格数据(均可查看之前的文章获悉详情)。 本次我们给大家带来的是2013-2022年全国范围的逐日的SO2栅格数据,原始…

阿里云几核服务器够用?内存多少合适?

阿里云服务器配置怎么选择?CPU内存、公网带宽和系统盘怎么选择?个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例,企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器,阿里云服务器网aliyunfuwuqi.com整…

python基础总复习

Python基础班总复习 一、Python基础语法 1、注释概念 单行注释 # 多行注释 注释内容 ,支持换行 > 在实际工作中,主要用于实现函数说明文档 2、变量的概念 场景:保存数据,所以理论上有数据的地方都有变量! 变…

OJ_二叉排序树

题干 C实现 循环双指针法(一个指向父亲&#xff0c;一个指向待插入结点) #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <queue> using namespace std;struct TreeNode {char data;TreeNode* left;TreeNode* right; };void InsertBST(TreeNode* …

C# OpenCvSharp DNN FreeYOLO 人脸检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 人脸检测 效果 模型信息 Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Float[1, 3, 192, 320] --------------------------------------------------------------- Outp…