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

外网访问内网海康威视监控视频的方案: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 更新软件源

$ sudoapt update 

step2 安装coturn

$ sudoaptinstall 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文件内容如下:

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metacontent="width=device-width, initial-scale=1.0"name="viewport"/><scriptsrc="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><divclass="content"><divclass="item"><videoid="video1"mutedautoplayloop></video></div><divclass="item"><videoid="video2"mutedautoplayloop></video></div><divclass="item"><videoid="video3"mutedautoplayloop></video></div><divclass="item"><videoid="video4"mutedautoplayloop></video></div></div></body><script>// let webRtcServer = null;functioninit(){var videourl1 ="<替换为实际的海康威视RTSP地址1>";letID1="video1";realViewHik(ID1, videourl1)var videourl2 ="<替换为实际的海康威视RTSP地址2>";letID2="video2";realViewHik(ID2, videourl2)var videourl3 ="替换为实际的海康威视RTSP地址3";letID3="video3";realViewHik(ID3, videourl3)var videourl4 ="替换为实际的海康威视RTSP地址4";letID4="video4";realViewHik(ID4, videourl4)}functionrealViewHik(elem, rtspUrl){let webRtcServer =newWebRtcStreamer(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信令服务器设备BSTUN发送 SDP Offer转发 Offer发送 SDP Answer转发 Answer获取 ICE Candidate获取 ICE Candidate发送 ICE Candidate发送 ICE Candidate转发 B的Candidate转发 A的Candidate直接建立 P2P 连接设备A信令服务器设备BSTUN

参考资料

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

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

Read more

【博客之星】GIS老矣尚能饭否?WebGIS项目实战经验与成果展示

【博客之星】GIS老矣尚能饭否?WebGIS项目实战经验与成果展示

目录 一、最前面的话 二、前言  1、关于“夜郎king” 3、GIS的“老骥伏枥” 4、WebGIS的“新程启航” 三、WebGIS技术简介 1、前、后技术简介 2、系统功能架构 四、WebGIS项目应用效果 1、应急灾害 2、交通运输 3、智慧文旅 4、其它项目 五、未来与展望 1、云计算+数据存储 2、GIS+AI融合 一、最前面的话         在这个快速迭代的数字时代,技术如同潮水般汹涌而来。每一次代码的敲击、每一行算法的优化,都是我们探索未知的足迹。技术的力量是背后清晰的思路与逻辑;技术的本质,从来不是冰冷的代码,而是温暖人心的智慧。

SpringBoot+Vue Web手工艺品销售系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

SpringBoot+Vue Web手工艺品销售系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】

摘要 随着互联网技术的快速发展,电子商务已成为现代商业活动的重要组成部分。手工艺品作为一种独特的文化载体和艺术表现形式,具有较高的收藏和使用价值,但其销售渠道仍以线下为主,限制了市场的拓展。传统的手工艺品销售模式存在信息不对称、交易效率低等问题,亟需通过数字化手段优化销售流程。基于此,开发一个高效、便捷的手工艺品在线销售平台具有重要意义。该平台能够整合手工艺品资源,为买卖双方提供便捷的交易渠道,同时通过数据分析优化用户体验,推动手工艺品行业的数字化转型。关键词:手工艺品、电子商务、数字化转型、在线销售、SpringBoot。 本系统采用前后端分离的架构设计,后端基于SpringBoot框架实现,提供高效的RESTful API接口,确保系统的稳定性和可扩展性;前端采用Vue.js框架,结合Element UI组件库,实现用户友好的交互界面。系统主要功能包括用户注册与登录、商品分类展示、购物车管理、订单支付、评价反馈等模块,同时支持管理员对商品和订单的增删改查操作。数据库采用MySQL存储数据,并通过Redis缓存提升系统性能。系统通过JWT实现用户身份认证,确保数据安全性。关键词:

手把手教你完成libwebkit2gtk-4.1-0安装配置(Ubuntu 22.04)

从零搞定 libwebkit2gtk-4.1-0 安装:Ubuntu 22.04 下的实战避坑指南 你有没有遇到过这样的场景?写好了一个基于 GTK 4 的本地 Web 应用,信心满满地在 Ubuntu 22.04 上运行,结果终端弹出一行红色错误: error while loading shared libraries: libwebkit2gtk-4.1.so.0: cannot open shared object file 别急——这不是你的代码出了问题,而是系统里少了关键运行时库: libwebkit2gtk-4.1-0 。 这个库是现代 Linux 桌面开发中“嵌入网页”的核心技术组件。它让你能在原生应用里无缝展示 HTML 内容,比如 Markdown

Bugku-web(bp)

Bugku-web(bp)

WriteUp1 题目信息 解题思路 打开页面,是一个登录页面 源码审计发现是个 form 表单提交 抓包,随便填写个密码提交观察 右键发送到重放器 点击发送 观察响应结果 发现有个 success.php 的页面,根据 JS 代码的 window.location.href 后面的地址知道,应该是访问服务器根路径下的 success.php 文件并携带查询参数 code 不等于 bugku10000 它才会走到 else,它来帮我们跳转到 success.php 并携带一个 code 所以猜测当账户密码正确时,会返回一个正确的code,错误时会返回bugku10000 猜测代码如下: <?php // 获取提交的账号和密码 $username = $_POST['username'