外網訪問內網海康威視監控視頻的方案: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.pswp.cn/diannao/82666.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82666.shtml
英文地址,請注明出處:http://en.pswp.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. 業務需求分…