WebRTC 服務器之Janus概述和環境搭建

1 概述

? ? ? ? ? Janus 是由 Meetecho 開發的通用 WebRTC 服務器,它為構建 WebRTC 應用程序提供了一個模塊化框架。服務器目標:Janus WebRTC 網關被設計為輕量級、通用的 WebRTC 服務器,除了實現以下方法外,它本身不提供任何功能:

  • 設置與瀏覽器的 WebRTC 媒體通信
  • 在客戶端和服務器之間交換 JSON 消息
  • 在瀏覽器和服務器端應用程序邏輯之間中繼 RTP/RTCP 和消息

????????實際功能是在瀏覽器通過 Janus 核心連接的服務器端插件中實現的。這種模塊化架構允許占用空間小,同時提供最大的靈活性。

1.1 主要特點

  • 模塊化架構:將核心 WebRTC 功能與應用程序特定邏輯分離
  • 輕量級核心:用 C 語言編寫,占用空間小
  • 插件系統:可通過各種應用程序(視頻會議、流媒體、SIP 網關等)的插件進行擴展
  • 多種傳輸機制:支持 HTTP/REST、WebSockets、RabbitMQ、MQTT 和 Unix 套接字
  • 會話管理:處理連接、WebRTC 會話和插件附件
  • 媒體處理:處理媒體協商、編碼和傳輸
  • 錄制功能:支持錄制 WebRTC 會話

2 janus搭建

云服務器端口開放(本地虛擬機環境則關閉防火墻即可)需要在安全組開放端口:

TCP/UDP 3478

UDP 30000-60000

2.1基礎環境

sudo aptitude install libmicrohttpd-dev libjansson-dev libnice-dev libsofia-sip-ua-dev libopus-dev libogg-dev libcurl4-openssl-dev pkg-config gengetopt libtool automake libglib2.0-dev cmake libconfig-dev libssl-dev doxygen graphviz libavcodec-dev libavformat-dev libswscale-dev libavutil-dev

2.2 源碼安裝依賴

2.2.1 安裝 WebSocket

git clone https://github.com/warmcat/libwebsockets.git
cd libwebsockets
git branch -a 查看選擇最新的穩定版本, 
git checkout v4.3.0 切換到較新穩定版本
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..
make && sudo make install

2.2.2 安裝 libsrtp

git clone https://gitee.com/MediaNext/libsrtp.git
cd libsrtp
git checkout v2.3.0
./configure --prefix=/usr --enable-openssl
make shared_library && sudo make install

2.2.3 安裝libmicrohttpd

wget https://ftp.gnu.org/gnu/libmicrohttpd/libmicrohttpd-0.9.71.tar.gz
tar zxf libmicrohttpd-0.9.71.tar.gz
cd libmicrohttpd-0.9.71/
./configure
make
sudo make install

2.2.4安裝nginx

wget http://nginx.org/download/nginx-1.15.8.tar.gz
tar xvzf nginx-1.15.8.tar.gz
cd nginx-1.15.8/# 配置,一定要支持https
./configure --with-http_ssl_module make
sudo make install 

2.3 編譯 Janus

git clone https://github.com/meetecho/janus-gateway.git
git tag 查看當前的 tag,選擇最新穩定的版本v0.10.4
git  checkout v0.10.4
sh autogen.sh
./configure --prefix=/opt/janus --enable-websockets --enable-post-processing 
make
sudo make install

3 配置文件和運行janus

3.1 基礎環境配置

3.1.1 基于https生成ssl證書

mkdir -p ~/cert
cd ~/cert
# CA私鑰
openssl genrsa -out key.pem 2048
# 自簽名證書
openssl req -new -x509 -key key.pem -out cert.pem -days 1095

3.1.2設置全局域名IP對應關系

后面需要填寫一大堆ip,為了方便修改ip我們在 Ubuntu 中將 IP 作為全局域名的常見設置。

vim?/etc/hosts

#新增域名 格式你的云服務器ip+本地環境的域名。后續填寫域名即可
#本地就用127.0.0.1
117.111.111.111 janusserver.com

3.1.3修改nginx配置文件

janus服務器程序文件夾在/opt/janus/

基于nginx配置文件重定向至 /opt/janus/share/janus/demos

# HTTPS serverserver {listen       443 ssl;server_name  localhost;# 配置相應的keyssl_certificate      /home/ubuntu/cert/cert.pem;ssl_certificate_key  /home/ubuntu/cert/key.pem;ssl_session_cache    shared:SSL:1m;ssl_session_timeout  5m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {# 指向janus demo所在目錄root   /opt/janus/share/janus/demos;index  index.html index.htm;}}

啟動nginx

sudo /usr/local/nginx/sbin/nginx

然后通過訪問?https://127.0.0.1/?。可以看到界面,但此時還不能正常通話。

3.1.4?安裝和啟動coturn

打洞服務器,本地測試可忽略。

sudo apt-get install libssl-dev
sudo apt-get install libevent-dev#git clone https://github.com/coturn/coturn 
#cd coturn
# 提供另一種安裝方式turnserver是coturn的升級版本
wget http://coturn.net/turnserver/v4.5.0.7/turnserver-4.5.0.7.tar.gz
tar xfz turnserver-4.5.0.7.tar.gz
cd turnserver-4.5.0.7./configure 
make && sudo make installsudo nohup turnserver -L 0.0.0.0 --min-port 50000 --max-port 60000  -a -u 用戶名:密碼-v -f -r nort.gov &

3.2 janus 配置文件之Video room功能

janus配置

janus安裝目錄在/opt/janus。文件結構:

./bin

./etc

./include

./lib

./share

可執行文件

janus配置文件

janus頭文件

janus庫

存放腳本或者文檔,web demo也在這里

需要配置的文件為(目錄/opt/janus/etc/janus)先備份。先把.sample后綴的文件拷貝成jcfg后綴

# 進到對應的目錄
cd /opt/janus/etc/janus
# 拷貝文件cp janus.jcfg.sample janus.jcfgcp janus.transport.http.jcfg.sample janus.transport.http.jcfgcp janus.transport.websockets.jcfg.sample janus.transport.websockets.jcfgcp janus.plugin.videoroom.jcfg.sample janus.plugin.videoroom.jcfgcp janus.transport.pfunix.jcfg.sample janus.transport.pfunix.jcfgcp janus.plugin.streaming.jcfg.sample	 janus.plugin.streaming.jcfgcp janus.plugin.recordplay.jcfg.sample janus.plugin.recordplay.jcfgcp janus.plugin.voicemail.jcfg.sample janus.plugin.voicemail.jcfgcp janus.plugin.sip.jcfg.sample janus.plugin.sip.jcfgcp janus.plugin.nosip.jcfg.sample janus.plugin.nosip.jcfgcp janus.plugin.textroom.jcfg.sample  janus.plugin.textroom.jcfgcp janus.plugin.echotest.jcfg.sample janus.plugin.echotest.jcfg

3.2.1 配置janus.jcfg

#大約202行左右,設置udp端口范圍。
rtp_port_range = "50000-60000"
# 237行
stun_server = janusserver.comstun_port = 3478nice_debug = false
# 大概267行 填寫云服務器外網ip地址
nat_1_1_mapping = janusserver.com#打洞服務器配置大概274行
# credentials to authenticate...turn_server = janusserver.comturn_port = 3478turn_type = "udp"turn_user = 用戶名turn_pwd = 密碼
rtp_port_range = "50000-60000"

3.2.2 配置janus.transport.http.jcfg

general: {json = "indented"                              base_path = "/janus"                    threads = "unlimited"                  http = true                                            port = 8088                                           https = true                                   secure_port = 8089                             
}certificates: {cert_pem = "/root/cert/cert.pem"cert_key = "/root/cert/key.pem"#cert_pwd = "secretpassphrase"#ciphers = "PFS:-VERS-TLS1.0:-VERS-TLS1.1:-3DES-CBC:-ARCFOUR-128"
}

3.2.3 配置janus.transport.websockets.jcfg?

general: {json = "indented"                             ws = true                                             ws_port = 8188                                 wss = true                                             wss_port = 8989                       
}
certificates: {cert_pem = "/root/cert/cert.pem"cert_key = "/root/cert/key.pem"#cert_pwd = "secretpassphrase"#ciphers = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
}

3.3 修改.js文件,指定wss協議

/opt/janus/share/janus/demos/videoroomtest.js

var server = "wss://" + window.location.hostname + ":8989";

3.4 配置coturn地址

本地測試無需打洞,部署云服務且使用打洞才需要這一步。

/opt/janus/share/janus/demos/videoroomtest.js

這里要寫你的服務器ip,使用本地域名方式解析不出來

#83行添加server: server,iceServers :[{urls: ["turn:127.0.0.1(這里要寫你的服務器ip,使用域名解析不出來):3478?transport=udp","turn:127.0.0.1(同理):3478?transport=tcp"      ],username: "jbj",credential: "123456"},{urls: ["stun:127.0.0.1:3478"]}],success: function() 

3.5?運行

涉及服務啟動有點多,在這里進行總結。

#nginx啟動
sudo /usr/local/nginx/sbin/nginx  
#啟動coturn
sudo nohup turnserver -L 0.0.0.0 --min-port 50000 --max-port 60000  -a -u 用戶名:123456 -v -f -r nort.gov &
#jauns運行
/opt/janus/bin/janus --debug-level=5 --log-file=$HOME/janus-log

訪問

https://IP/
或者
https://IP/videoroomtest.html

4.效果?

學習資料分享

0voice · GitHub

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78367.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

19:常見的Halcon數據格式

遍歷文件夾與文件選擇 1)遍歷文件夾: list_files( : : Directory, Options : Files) Directory:目錄(文件夾路徑) Options:選項 files 指定搜索的格式為文件 directories 指定搜索的格式為文件夾 re…

QML圖像提供器 (Image Provider)

QML 中的圖像提供器是一種自定義圖像加載機制,允許你從非文件源(如數據庫、網絡或程序生成的內容)提供圖像數據。 主要類型 QQuickImageProvider - 基礎圖像提供器 QPixmapImageProvider - 提供 QPixmap 圖像 QImageImageProvider - 提供 …

計算機視覺與深度學習 | 雙目立體匹配算法理論+Opencv實踐+matlab實踐

雙目立體匹配 一、雙目立體匹配算法理論與OpenCV、matlab實踐一、雙目立體匹配理論二、OpenCV實踐三、優化建議四、算法對比與適用場景二、雙目立體匹配算法理論及Matlab實踐指南一、雙目立體匹配理論二、Matlab實踐步驟三、算法對比與優化建議四、完整流程示例五、常見問題與解…

AI國學智慧語錄視頻,條條視頻10W+播放量

家人們!圖書類帶貨玩法真的非常多,之前也分享過蠻多,例如情感語錄、育兒教育、爆款圖書金句類、AI歷史人物解說類等等。 本期繼續來分享一個對于普通人來說,上手相當簡單,容易起號,可作為長線深耕的AI帶貨…

echart圖表使用

2、接口編寫 該部分代碼定義了UserController控制器類,用于處理與用戶相關的請求。包含一個用于跳轉頁面的方法和一個返回用戶詳細數據(以 JSON 格式呈現)的接口。前者負責將用戶導航至指定頁面,后者通過構建ChartVO對象并填充數…

Android短信監控技術實現:合法合規的遠程采集方案

一年經驗的全棧程序員,目前頭發健在,但不知道能撐多久。 該項目已成功部署并穩定運行于企業生產環境,如需個性化定制方案,歡迎聯系作者進行深度合作。 文章目錄 前言 一、頁面設計 1.頁面顯示 2.代碼實現 二、具體代碼實現 1.添加…

前端跨域問題怎么在后端解決

目錄 簡單的解決方法: 添加配置類: 為什么會跨域 1. 什么是源 2. URL結構 3. 同源不同源舉🌰 同源例子 不同源例子 4. 瀏覽器為什么需要同源策略 5. 常規前端請求跨域 簡單的解決方法: 添加配置類: packag…

【中間件】brpc_基礎_execution_queue

execution_queue 源碼 1 簡介 execution_queue.h 是 Apache BRPC 中實現 高性能異步任務執行隊列 的核心組件,主要用于在用戶態線程(bthread)中實現任務的 異步提交、有序執行和高效調度。 該模塊通過解耦任務提交與執行過程,提…

java學習之數據結構:一、數組

主要是對數組所有的東西進行總結,整理 適合小白~ 目錄 1.什么是數組 1.1數組定義 1.2數組創建 1)靜態創建 2)動態創建 1.3數組遍歷 1)for和while遍歷 2)foreach遍歷 2.數組越界問題及解決 2.1數組越界問題 2…

[Survey]SAM2 for Image and Video Segmentation: A Comprehensive Survey

BaseInfo TitleSAM2 for Image and Video Segmentation: A Comprehensive SurveyAdresshttps://arxiv.org/abs/2503.12781Journal/Time2503Author四川大學,北京大學 1. Introduction 圖像分割專注于識別單個圖像中的目標、邊界或紋理,而視頻分割則將這…

用Maven定位和解決依賴沖突

用Maven定位和解決依賴沖突 一、依賴沖突的常見表現二、定位沖突依賴的4種方法2.1 使用Maven命令分析依賴樹2.2 使用IDE可視化工具2.3 使用Maven Enforcer插件2.4 運行時分析 三、解決依賴沖突的5種方案3.1 排除特定傳遞依賴3.2 統一指定版本(推薦)3.3 使…

穿越數據森林與網絡迷宮:樹與圖上動態規劃實戰指南

在 C 算法的浩瀚宇宙中,樹與圖就像是神秘的迷宮和茂密的森林,充滿了未知與挑戰。而動態規劃則是我們探索其中的神奇羅盤,幫助我們找到最優路徑。今天,就讓我們一起深入這片神秘領域,揭開樹與圖上動態規劃的神秘面紗&am…

UDP / TCP 協議

目錄 一、前言: 數據封裝與分用: 二、網絡協議分層模型: 三、UDP / TCP 協議 UDP 協議: 1、UDP 協議段格式: 2、UDP 的特點: TCP 協議: 1、TCP 協議段格式: 2、TCP 協議的十…

Python 實現的運籌優化系統數學建模詳解(動態規劃模型)

相關代碼鏈接:https://download.csdn.net/download/heikediguoshinib/90713747?spm1001.2014.3001.5503 一、引言 在計算機科學與數學建模的廣闊領域中,算法如同精密的齒輪,推動著問題的解決與系統的運行。當面對復雜的優化問題時&…

langfuse本地安裝

目錄 安裝命令項目準備用openai測試 安裝命令 本地(docker compose):使用 Docker Compose 在你的機器上于 5 分鐘內運行 Langfuse。 # 獲取最新的 Langfuse 倉庫副本 git clone https://github.com/langfuse/langfuse.git cd langfuse# 運行 …

每天學一個 Linux 命令(35):dos2unix

每天學一個 Linux 命令(35):dos2unix 命令簡介 dos2unix 是一個用于將 Windows/DOS 格式的文本文件轉換為 Unix/Linux 格式的實用工具。它主要處理行尾符的轉換(將 CRLF 轉換為 LF),同時也能處理編碼問題和字符集轉換。這個命令在跨平臺文件共享、代碼遷移和系統管理場…

第6章 Python 基本數據類型詳解(int, float, bool, str)細節補充

文章目錄 Python 基本數據類型深入解析(int, float, bool, str)一、整型(int)的底層機制二、浮點型(float)的陷阱與解決方案三、布爾型(bool)的底層本質四、字符串(str)的不可變性與優化五、類型間的隱式轉換與陷阱六、性能優化與工具總結:關鍵細節與最佳實踐Python…

19. LangChain安全與倫理:如何避免模型“幻覺“與數據泄露?

引言:當AI成為企業"數字員工"時的責任邊界 2025年某金融機構因AI客服泄露用戶信用卡信息被罰款2300萬美元。本文將基于LangChain的安全架構與Deepseek-R1的合規實踐,揭示如何構建既強大又安全的AI系統。 一、AI安全風險矩陣 1.1 2025年最新威…

Java快速上手之實驗六

1. 編寫ItemEventDemo.java,當選中或取消選中單選鈕、復選鈕和列表框時顯示所選的結果。 2.編寫GUIExample.java,當選中或取消選中單選鈕、復選鈕時在標簽中顯示相應結果。 import javax.swing.*; import java.awt.*; import java.awt.event.…

QT6 源(72):閱讀與注釋單選框這個類型的按鈕 QRadioButton,及各種屬性驗證,

&#xff08;1&#xff09;按鈕間的互斥&#xff1a; &#xff08;2&#xff09;源碼來自于頭文件 qradiobutton . h &#xff1a; #ifndef QRADIOBUTTON_H #define QRADIOBUTTON_H#include <QtWidgets/qtwidgetsglobal.h> #include <QtWidgets/qabstractbutton.h>…