WebRTC协议研究

背景

        自己在做一个视频分析项目的时候,需要将后台读取的视频实时抛转到前台web页面显示,本来是用的是MQTT协议,已经可以满足需求。但是在实时上线测试的时候,发现当图片比较大的时候,会存在页面不能实时显示图片的bug,经过各种分析和研究发现,造成这个问题的主要原因是因为图片数据比较大,上传会存在一定的延迟,而MQTT对响应时间有一定的要求,因此无法实时显示,查阅资料建议使用更具有即时性的协议WebRTC。

webRTC协议介绍

        WebRTC(Web实时通信)是一种用于在Web浏览器之间实现实时通信的开放标准和协议。它允许浏览器之间直接建立点对点的音频、视频和数据通信,无需任何插件或第三方软件。

WebRTC协议的核心技术包括:

1.媒体捕获和传输:WebRTC支持从摄像头和麦克风捕获音视频数据,并使用实时传输协议(RTP)将数据传输给对方浏览器。

2.网络传输:WebRTC使用用户数据协议(UDP)和传输控制协议(TCP)来传输音视频数据。它还使用ICE(Interactive Connectivity Establishment)协议来处理网络连接和穿越NAT(网络地址转换)的问题。

3.信令传输:WebRTC需要一个信令服务器来协调浏览器之间的连接。信令服务器负责交换连接信息,如网络地址和传输协议。WebRTC并没有规定具体的信令协议,开发者可以使用自己喜欢的协议,如WebSocket、HTTP或者XMPP。

4.媒体处理和编解码:WebRTC支持多种音视频编解码器,如VP8、VP9、H.264和Opus。它还提供了一些媒体处理功能,如媒体格式转换、流量控制和噪声抑制。

        WebRTC的应用场景广泛,包括实时语音和视频通话、视频会议、屏幕共享、远程教育和在线游戏等。它为Web开发者提供了一种简单和便捷的方式来实现实时通信功能,而不需要依赖于第三方插件或软件。

WebRTC优点 

WebRTC具有以下几个优点:

1.简单易用:WebRTC是一个开放标准和协议,可以直接在现代Web浏览器中使用,无需安装任何插件或第三方软件。开发者可以使用简单的JavaScript API来实现实时通信功能。

2.实时性:WebRTC支持实时音视频传输,可以实现高质量、低延迟的实时通信。这对于实时语音和视频通话、视频会议等应用非常重要。

3.点对点通信:WebRTC支持点对点的通信方式,可以直接在浏览器之间建立连接,无需经过中间服务器。这样可以减少延迟和带宽消耗,并提高隐私性。

4.跨平台支持:WebRTC可以在不同的操作系统和设备上使用,包括Windows、macOS、Linux、Android和iOS等。这使得开发者可以轻松地实现跨平台的实时通信应用。

5.开放标准:WebRTC是一个开放的标准和协议,由W3C和IETF等组织制定和维护。这意味着各种浏览器和设备都可以基于WebRTC实现兼容的实时通信功能。

6.安全性:WebRTC提供了端到端的加密和身份验证机制,可以保护用户的通信数据和隐私。它使用SRTP(Secure Real-time Transport Protocol)来加密音视频数据,并使用DTLS(Datagram Transport Layer Security)来加密信令数据。

总的来说,WebRTC具有简单易用、实时性、点对点通信、跨平台支持、开放标准和安全性等优点,使得它成为实现Web实时通信的理想选择。

示例

import asyncio
import cv2
import numpy as np
import aiortc
from aiortc import MediaStreamTrack, RTCPeerConnection, RTCSessionDescription
from aiortc.contrib.media import MediaBlackhole, MediaStreamError
from aiortc.contrib.media import MediaRecorder
from aiortc.contrib.media import MediaPlayer
from aiortc.contrib.signaling import object_from_string, object_to_string# 创建一个视频轨道类
class VideoTrack(MediaStreamTrack):def __init__(self):super().__init__() # 调用父类构造函数self.video_capture = cv2.VideoCapture(0) # 打开摄像头async def recv(self):try:# 读取摄像头捕获的帧ret, frame = self.video_capture.read()if ret:# 转换帧为JPEG格式ret, jpeg = cv2.imencode('.jpg', frame)if ret:# 将JPEG数据作为媒体流传递给客户端return aiortc.VideoFrame(jpeg.tobytes(), format='jpeg')except MediaStreamError as e:print(e)# 创建一个信令服务器类
class Signaling:def __init__(self):self.pc = Noneself.offer = Noneasync def connect(self):passasync def receive(self):passasync def send(self, message):passasync def on_offer(self, offer):self.pc = RTCPeerConnection()# 添加视频轨道到peer连接self.pc.addTrack(VideoTrack())# 设置远程描述await self.pc.setRemoteDescription(offer)# 创建应答answer = await self.pc.createAnswer()# 设置本地描述await self.pc.setLocalDescription(answer)# 发送应答给客户端return self.pc.localDescriptionasync def on_answer(self, answer):# 设置远程描述await self.pc.setRemoteDescription(answer)async def on_icecandidate(self, candidate):# 添加ICE候选到peer连接await self.pc.addIceCandidate(candidate)# 创建一个信令服务器实例
signaling = Signaling()# 启动信令服务器
async def run_signaling():# 连接到信令服务器await signaling.connect()while True:# 等待收到offeroffer = await signaling.receive()# 处理offeranswer = await signaling.on_offer(offer)# 发送应答到信令服务器await signaling.send(answer)# 等待收到answeranswer = await signaling.receive()# 处理answerawait signaling.on_answer(answer)# 等待收到ICE候选candidate = await signaling.receive()# 处理ICE候选await signaling.on_icecandidate(candidate)# 关闭peer连接await signaling.pc.close()# 运行信令服务器
asyncio.ensure_future(run_signaling())
asyncio.get_event_loop().run_forever()

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

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

相关文章

GLSL着色器入门(持续更新中...)

目录 第一章:OpenGL works with triangles 第二章: Parallel Processing 第章 推荐来自b站的课程004 GLSL is not Javascript_哔哩哔哩_bilibili 第一章:OpenGL works with triangles 当我们谈论GLSL着色器时,其实就是在说怎么…

C语言奇偶数交换排序问题

目录 问题描述如下: move函数的具体实现: main函数 运行效果 代码(注意看注释): 问题描述如下: 给定一个整数数组,要求将其中的奇数元素全部移动到前面,偶数元素全…

Go : ssh操作(四)批处理

简介 有的时候我们不只是进行单纯的上传, 下载, 指令, 而是多个动作的组合操作代码 batch.go package clientimport ("errors""github.com/pkg/sftp""golang.org/x/crypto/ssh" )type BatchCode intconst (…

【深度学习:Foundation Models】基础模型完整指南

【深度学习:Foundation Models】基础模型完整指南 什么是基础模型?基础模型背后的 5 项人工智能原理根据大量数据进行预训练自我监督学习过度拟合微调和快速工程(适应性强)广义的 基础模型的用例基础模型的类型计算机视觉基础模型…

最新版CleanMyMac X4.14.7智能清理mac磁盘垃圾工具

CleanMyMac X是一款专业的Mac清理软件,可智能清理mac磁盘垃圾和多余语言安装包,快速释放电脑内存,轻松管理和升级Mac上的应用。同时CleanMyMac X可以强力卸载恶意软件,修复系统漏洞,一键扫描和优化Mac系统,…

借助GPT理解 “ Android中 点击弹框外部 取消弹框”

在平常的开发工作中 或 阅读技术博客/书籍 时,难免会遇到我们不懂的知识点,网络上搜索的资料 需要有准确性,系统性,可实操性。 这样的资料查询很费时间且还不一定能找到,但是如果借助训练过的的gpt,就会省下…

[Kubernetes]7. K8s包管理工具Helm、使用Helm部署mongodb集群(主从数据库集群)

上一节讲解了[Kubernetes]6. k8s Pod配置管理ConfigMap & Secret以及传递环境变量的使用,k8s的命名空间以及使用kubens管理命名空间的使用,这里来介绍一下Helm的使用 一.Helm相关介绍 1.介绍 在 kubernetes 系统上部署容器化应用时需要事 先手动编写资源配置清单文件 以…

Prometheus实战篇:Prometheus监控docker

Prometheus实战篇:Prometheus监控docker 准备环境 监控docker 为了能够获取到Docker容器的运行状态,用户可以通过Docker的stats命令获取当前主机上运行容器的统计信息,可以查看容器的CPU利用率,内存使用量,网络IO总量以及磁盘IO总量等信息. docker stats除了使用命令以外,用户…

【占用网络】SurroundOcc:基于环视相机实现3D语义占用预测 ICCV 2023

前言 本文分享“占用网络”方案中,来自ICCV 2023的SurroundOcc,它基于环视相机实现3D语义占用预测。 使用空间交叉注意力将多相机图像信息提升到3D体素特征,即3D体素Query到2D图像中查询融合特征的思想。 然后使用3D卷积逐步对体素特征进行…

如何快速断行、分割行、切割行、换行、限制每行字数、平均分割每行字数、序号自动换行、关键字断行等等内容格式整理

首先,需要用到的这个工具: 百度 密码:qwu2蓝奏云 密码:2r1z 打开工具,切换到“文章工作域”(嗯...默认就是) 找到这个,多内容断行分割 点击打开,出现如下窗口设置 相关的…

Netty-Netty基础应用与了解

前言 Netty 的优势 1、 API 使用简单,开发门槛低; 2、功能强大,预置了多种编解码功能,支持多种主流协议; 3、定制能力强,可以通过 ChannelHandler 对通信框架进行灵活地扩展; 4、性能高…

【教程】通过Excel宏/Pandas两种方法来自动添加渐变数据条

这种数据真的很难看懂: 一般会对其画折线图或者数据条,相比起来就非常直观: 但是每一列都要手动这样设置就非常累了,所以这里就用到了VBA宏(或者Pandas)。 VBA宏方法 从这里进入宏: 随便写一个宏名后点创建&#xff1…

PyTorch项目源码学习(1)

PyTorch PyTorch是一个开源的深度学习框架,项目地址 https://github.com/pytorch/pytorch 在学术工作中的使用频率较高。 其主体由C开发,PyTorch是Torch的Python调用版本。学习PyTorch项目源代码的目的在于学习其中的实现方法与技巧,增加训练…

LangChain 69 向量数据库Pinecone入门

LangChain系列文章 LangChain 50 深入理解LangChain 表达式语言十三 自定义pipeline函数 LangChain Expression Language (LCEL)LangChain 51 深入理解LangChain 表达式语言十四 自动修复配置RunnableConfig LangChain Expression Language (LCEL)LangChain 52 深入理解LangCh…

毕业论文idea

三大模块 分级、分类、系统 多看医学图像处理毕业论文。 Swin Transformer的模型表现不如MobileViT 使用高像素的数据集在云服务器上训练时,如果您发现Swin Transformer的模型表现不如MobileViT,这可能由几个因素导致: 模型架构与数据匹配…

机器视觉在OCR字符检测的应用

在产品质量 检测过程中,对于字符、条码等标识信息的识别、读取、检测是非常重要的一部分,比如在食品饮料包装检测中,生产日期 、保质期 、生产批号 、条码等字符信息是产品管理和追溯必不可缺的,因此利用机器视觉技术进行OCR字符采…

【实用技巧】Windows电脑向iPhone或iPad传输视频方法2:有线传输

一、内容简介 本文介绍如何使用 Windows 电脑向 iPhone 或 iPad 传输视频,以 iPhone 为例,iPad的操作方法类似,本文不作赘述。 二、所需原材料 Windows 电脑(有 USB-A 或 USB-C 接口)(桌面或其它文件夹中…

Web组件的使用

文章目录 1 概述2 加载网页加载在线网页加载本地网页 3 网页缩放文本缩放 4 Web组件事件Web组件处理JS confirm事件 5 Web和JavaScript交互启用JavaScriptWeb组件调用JS方法JS调用Web组件方法 6 处理页面导航7 调试网络应用8 参考链接 1 概述 相信大家都遇到过这样的场景&…

Mixtral Moe代码解读

一直对稀疏专家网络好奇,有些专家没被选中,那么梯度是否为0,这一轮被选中有梯度,下一轮没被选中无梯度,模型可以训练收敛吗? 由于每个token都会选择topk个专家,所以在每一轮epoch中,…

python工具-udp-tcp-client-server-demo

python工具-udp-tcp-client-server-demo server tcp-server: python xxx.py -type tcp -ip “127.0.0.1” -port 1234udp-server: python xxx.py -type udp -ip “127.0.0.1” -port 1234 client python xxx.py -type udp -ip “127.0.0.1” -port 1111python xxx.py -type tc…