外网访问内网海康威视监控视频的方案:WebRTC + Coturn 搭建

外网访问内网海康威视监控视频的方案:WebRTC + Coturn

需求背景

在仓库中有海康威视的监控摄像头,内网中是可以直接访问到监控摄像的画面,由于项目的需求,需要在外网中也能看到监控画面。

实现这个功能的意义在于远程操控设备的时候可以看到监控画面,方便查看远程操作的效果。

解决方案

海康威视监控摄像头提供的是RTSP视频流,在网上查阅了资料,可以通过WebRTC协议在web页面上显示RTSP视频流。

WebRTC协议实现的最好的开源项目是webrtc-streamer,地址在:https://github.com/mpromonet/webrtc-streamer

由于WebRTC会使用对等连接,所以从外网访问内网的海康威视监控视频的时候就需要中继服务,也就是需要一个 STUN 或 TURN 服务器,其作用是为每个客户端提供 ICE 候选,然后将其转移到远程对等方。

大多数 WebRTC 应用都需要服务器来中继对等方之间的流量,因为客户端之间通常无法建立直接套接字(除非它们位于同一本地网络中)。常见的解决方法是使用 TURN 服务器。该术语代表“Traversal Using Relays around NAT”,是一种用于中继网络流量的协议。

目前,网上有多个 TURN 服务器选项,既有自托管应用(例如开源 COTURN 项目),也有云端提供的服务。

本项目最终采用自托管的COTURN项目,地址在:https://github.com/coturn/coturn

方案示例图如下:

在这里插入图片描述

上图中的Relay server即为turn中继服务器,而STUN server的作用是通过收集NAT背后peer端(即:躲在路由器或交换机后的电脑)对外暴露出来的ip和端口,找到一条可穿透路由器的链路,俗称“打洞”。stun/turn服务器通常要部署在公网上,能被所有peer端访问到,coturn开源项目同时实现了stun和turn服务的功能,是webrtc应用的必备首选。

方案确定了,接下来就是动手实际搭建了。

实际搭建

基于Coturn搭建stun/turn服务器

参考github中readme文档,在云服务器中直接使用apt安装:

step1 更新软件源

$ sudo apt update

step2 安装coturn

$ sudo apt install coturn

step3 修改配置文件

主要修改下面几项关键的配置:

lt-cred-mech

user=<用户名>:<密码>

注意:要把用户名和密码替换成实际的字符串。

step4 停止掉coturn服务

由于安装coturn服务后,默认是会运行该服务的,所以这儿要先停止掉

$ sudo systemctl stop coturn

step5 前台运行turnserver服务器

第一次运行,最好是使用前端运行的方式,如果没有问题的话,再使用后端服务的运行方式。

$ sudo turnserver -r chengdu  --log-file stdout

step6 后端服务的方式运行turnserver

在启动之前要在配置文件中增加realm=chengdu配置项。

$ sudo systemctl start coturn

可以使用journalctl -xeu coturn.service查看后台服务coturn的日志。

step7 验证stun和turn服务正常运行。

找一台可以访问Coturn服务所在ip的机器,然后执行下面的命令:

$ turnutils_uclient -v -u <用户名> -w <密码> <云服务器地址>

注意:turnutils_uclient命令要在安装了coturn服务的机器上才有。

还可以在下面这个网址上验证stun/turn服务是否运行正常。

https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

参考下图,把stun和turn地址设置好,然后点击最下面的“Gather candidates”(收集候选链路)

在这里插入图片描述

云服务器要开放的端口

云服务器需要开发tcp 3478 和 udp 3478端口,方便客户端连接stun和turn服务器。

并且要开放中继端口范围udp 49152-65535。

启动webrtc-streamer

step1 下载webrtc-streamer

从https://github.com/mpromonet/webrtc-streamer/releases/latest下载软件包。

step2 启动webrtc-streamer服务

进入到软件目录,然后执行下面的命令:

./webrtc-streamer -v debug  -H 8800 -s<云主机ip>:3478 -t<用户名>:<密码>@<云主机>:3478

注意:将云主机地址替换成安装coturn服务的云主机公网IP,用户名和密码就是在turnserver.conf中设置的用户名和密码,直接替换就行。

step3 将webrtc-streamer做成开机启动。

这个步骤可以参考Linux添加systemd服务,使用systemctl start xxx启动服务。

前端页面示例代码

index.html文件内容如下:


<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta content="width=device-width, initial-scale=1.0" name="viewport" /><script src="js/webrtcstreamer.js"></script><title>视频监控-测试</title><style> .content{width: 100%;height: 100%;position: absolute;background-color: aliceblue;}.item{width: 49.5%;height: 49.5%;float: left; margin: 3px;}video {width: 100%;height: 100%;object-fit: fill;}</style>
</head><body><div class="content"><div class="item"><video id="video1" muted autoplay loop></video></div><div class="item"><video id="video2" muted autoplay loop></video></div><div class="item"><video id="video3" muted autoplay loop></video></div><div class="item"><video id="video4" muted autoplay loop></video></div></div>
</body>
<script>// let webRtcServer = null;function init() {var videourl1 = "<替换为实际的海康威视RTSP地址1>";let ID1 = "video1";realViewHik(ID1, videourl1)var videourl2 = "<替换为实际的海康威视RTSP地址2>";let ID2 = "video2";realViewHik(ID2, videourl2)var videourl3 = "替换为实际的海康威视RTSP地址3";let ID3 = "video3";realViewHik( ID3, videourl3)var videourl4 = "替换为实际的海康威视RTSP地址4";let ID4 = "video4";realViewHik(ID4, videourl4)}function realViewHik(elem, rtspUrl) {let webRtcServer = new WebRtcStreamer(elem, "http://<webrtc-streamer的ip地址>:8800");let option = "rtptransport=tcp";webRtcServer.connect(rtspUrl, null, option, null)}window.onload = function () {init();}
</script></html>

其中<script src="js/webrtcstreamer.js"></script>是引用的webrtc-streamer中的webrtcstreamer.js文件,该文件在软件包的webrtc-streamer-v0.8.5-Linux-x86_64-Release/html路径下,可以直接拷贝到js目录下使用。

原理解读

WebRTC协议

WebRTC(Web Real-Time Communication)是一种开源技术,旨在通过简单的应用程序接口(API)实现浏览器和移动应用之间的实时音视频通信和数据共享,而无需安装插件或第三方软件。它由Google主导开发,现已成为W3C和IETF的标准。

核心功能

  1. 实时音视频通信
    • 支持浏览器之间直接传输高清视频和音频,延迟低(通常 < 500ms)。
  2. 点对点(P2P)传输
    • 数据直接在用户设备间传输,减少服务器中转,提升效率。
  3. 数据通道(Data Channel)
    • 支持传输任意数据(如文件、游戏指令、文本),类似WebSocket但延迟更低。
  4. 加密传输
    • 默认使用DTLS-SRTP加密,确保通信安全。

关键技术组件

  • MediaStream(getUserMedia)
    访问摄像头和麦克风,获取音视频流。
  • RTCPeerConnection
    建立P2P连接,处理编解码、网络穿透(NAT)和流量控制。
  • RTCDataChannel
    提供双向数据传输,适合低延迟场景(如游戏、文件共享)。
  • ICE/STUN/TURN
    • ICE(Interactive Connectivity Establishment):协调最佳连接路径。
    • STUN:获取公网IP,解决NAT穿透问题。
    • TURN:在中继服务器转发数据,用于严格的防火墙环境。

WebRTC-Streamer建立连接的时序图如下

在这里插入图片描述

WebRTC建立点对点通信的过程如下图所示

设备A 信令服务器 设备B STUN 发送 SDP Offer 转发 Offer 发送 SDP Answer 转发 Answer 获取 ICE Candidate 获取 ICE Candidate 发送 ICE Candidate 发送 ICE Candidate 转发 B的Candidate 转发 A的Candidate 直接建立 P2P 连接 设备A 信令服务器 设备B STUN

参考资料

流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)

史上最详细的webrtc-streamer访问摄像机视频流教程

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

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

相关文章

Redis 8.0正式发布,再次开源为哪般?

Redis 8.0 已经于 2025 年 5 月 1 日正式发布&#xff0c;除了一些新功能和性能改进之外&#xff0c;一个非常重要的改变就是新增了开源的 AGPLv3 协议支持&#xff0c;再次回归开源社区。 为什么说再次呢&#xff1f;这个需要从 2024 年 3 月份 Redis 7.4 说起&#xff0c;因为…

382_C++_在用户会话结束时,检查是否有其他会话仍然来自同一个客户端 IP 地址,没有连接状态设置为断开,否则为连接

之前出现的问题:重启管理机,工作机上面热备连接状态显示未连接 (此时是有一个工作机连接管理机的),所以正常应该是连接状态解决:根因分析: 重启管理机后,管理机给过来的cookie是空的,导致工作机同时存在两个管理机的session,在其中一个超时后,调用回调函数通知会话断开…

大模型系列(五)--- GPT3: Language Models are Few-Shot Learners

论文链接&#xff1a; Language Models are Few-Shot Learners 点评&#xff1a; GPT3把参数规模扩大到1750亿&#xff0c;且在少样本场景下性能优异。对于所有任务&#xff0c;GPT-3均未进行任何梯度更新或微调&#xff0c;仅通过纯文本交互形式接收任务描述和少量示例。然而&…

【网络分析工具】网络工具wireshark、TCPdump、iperf使用详解

这里写目录标题 1. wireshark1.1. 过滤包1.2. 常见分析 2. tcpdump3. iperf 1. wireshark **ip.dst eq 10.0.0.21** 是用于网络流量分析工具&#xff08;例如 Wireshark 或 tcpdump&#xff09;的过滤器表达式。 它的作用是筛选出所有目标IP地址为 10.0.0.21 的数据包 IP.add…

Django rest_framework 信号机制生成并使用token

1、在setting.py 中增加设置 DEFAULT_AUTHENTICATION_CLASSES:[rest_framework.authentication.BasicAuthentication,#基本的用户名密码验证rest_framework.authentication.SessionAuthentication,rest_framework.authentication.TokenAuthentication,# token 认证], INSTALLE…

SQL Server To Paimon Demo by Flink standalone cluster mode

需求&#xff1a;使用 Flink CDC 测试 SQL Server 连接 Paimon 操作&#xff1a;启动 Flink standalone cluster 后&#xff0c;接着启动 Flink SQL Client&#xff0c;则通过 Flink SQL Client 提交 insert & select job 到该 8081 cluster Flink SQL Client 执行案例 -…

MySQL 从入门到精通(四):备份与恢复实战——从逻辑到物理,增量备份全解析

数据是企业的核心资产&#xff0c;而数据库作为数据存储的 “心脏”&#xff0c;其备份与恢复策略直接关系到业务的连续性。本文将结合 MySQL 的日志体系与备份工具&#xff0c;深入讲解逻辑备份、物理备份、增量备份的实战操作&#xff0c;帮助你构建可靠的数据库保护方案。 目…

鸿蒙编译boost整合linux跨平台应用

openharmony deveco 4.1支持armeabi-v7a deveco 5.0后不支持arm32位系统 boost编译 使用deveco的写cmake集成boost boost使用1.88的最新版本&#xff0c;带cmake工具链 https://github.com/boostorg/boost.git boost的源码都在sub_module中 deveco 4.1的版本sdk最高到9&am…

机器视觉的平板电脑屏幕组件覆膜应用

在现代智能制造业中&#xff0c;平板电脑屏幕组件覆膜工序是确保产品外观和功能完整性的重要环节。随着技术的进步&#xff0c;传统的覆膜方式已经无法满足高速度、高精度的生产需求。而MasterAlign视觉系统的出现&#xff0c;将传统覆膜工艺转变为智能化、自动化的生产流程。在…

android-ndk开发(10): use of undeclared identifier ‘pthread_getname_np‘

1. 报错描述 使用 pthread 获取线程名字&#xff0c; 用到 pthread_getname_np 函数。 交叉编译到 Android NDK 时链接报错 test_pthread.cpp:19:5: error: use of undeclared identifier pthread_getname_np19 | pthread_getname_np(thread_id, thread_name, sizeof(thr…

【前端基础】6、CSS的文本属性(text相关)

目录内容 text-decoration&#xff1a;设置文本装饰线text-transform&#xff1a;文本中文字的大小写转换text-indent&#xff1a;首行缩进text-align&#xff1a;设置文本对齐方式 一、text-decoration&#xff1a;设置文本装饰线 常见值&#xff1a; None&#xff1a;没有…

【Ansible】模块详解

一、ansible概述 1.1 ansible介绍 Ansible 是一个基于 Python 开发的配置管理和应用部署工具&#xff0c;近年来在自动化管理领域表现突出。它集成了许多传统运维工具的优点&#xff0c;几乎可以实现 Pubbet 和 Saltstack 所具备的功能。 1.2 ansible能做什么 批量处理。An…

Git实战经验分享:深入掌握git commit --amend的进阶技巧

一、工具简介 git commit --amend是Git版本控制系统的核心补救命令&#xff0c;主要用于修正最近一次提交的元数据。该命令不会产生新的提交记录&#xff0c;而是通过覆盖原提交实现版本历史的整洁性&#xff0c;特别适合在本地仓库进行提交优化。 二、核心应用场景 提交信息…

软考 系统架构设计师系列知识点之杂项集萃(56)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之杂项集萃&#xff08;55&#xff09; 第91题 商业智能关注如何从业务数据中提取有用的信息&#xff0c;然后采用这些信息指导企业的业务开展。商业智能系统主要包括数据预处理、建立&#xff08;&#xff09;、数据分…

Spark任务调度流程详解

1. 核心调度组件 DAGScheduler&#xff1a;负责将Job拆分为Stage&#xff0c;处理Stage间的依赖关系。 TaskScheduler&#xff1a;将Task分配到Executor&#xff0c;监控任务执行。 SchedulerBackend&#xff1a;与集群管理器&#xff08;如YARN、K8s&#xff09;通信&#x…

第04章—技术突击篇:如何根据求职意向进行快速提升与复盘

经过上一讲的内容阐述后&#xff0c;咱们定好了一个与自身最匹配的期望薪资&#xff0c;接着又该如何准备呢&#xff1f; 很多人在准备时&#xff0c;通常会选择背面试八股文&#xff0c;这种做法效率的确很高&#xff0c;毕竟能在“八股文”上出现的题&#xff0c;也绝对是面…

Go语言的逃逸分析是怎么进行的

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

ARM 芯片上移植 Ubuntu 操作系统详细步骤

一、准备工作 &#xff08;一&#xff09;硬件准备 ARM 开发板&#xff1a;确保 ARM 开发板的型号与 Ubuntu 官方支持的 ARM 架构兼容&#xff0c;常见的 ARM 架构有 ARMv7、ARMv8 等。例如树莓派系列开发板&#xff0c;广泛用于 ARM 系统移植&#xff0c;其采用 ARM 架构。存…

两台服务器之前共享文件夹

本文环境 服务器A:ubuntu24.22系统 IP:10.0.8.1 服务器B:ubuntu24.22系统 IP:10.0.8.10 本操作旨在将服务器B的/opt/files目录共享给服务器A得/opt/files 在 B 服务器上设置共享 安装 NFS 服务&#xff1a; sudo apt -y install nfs-kernel-server编辑/etc/exports文件&…

超市销售管理系统 - 需求分析阶段报告

1. 系统概述 超市销售管理系统是为中小型超市设计的信息化管理解决方案&#xff0c;旨在通过信息化手段实现商品管理、销售处理、库存管理、会员管理等核心业务流程的数字化&#xff0c;提高超市运营效率和服务质量&#xff0c;同时为管理者提供决策支持数据。 2. 业务需求分…