WebRTC 服務器之Janus架構分析

1. Webrtc三種類型通信架構

1.1? 1 對 1 通信

1 對 1 通信模型設計的主要?標是盡量讓兩個終端進?直聯,這樣即可以節省服務器的資源,?可以提? ?視頻的服務質量。WebRTC ?先嘗試兩個終端之間是否可以通過 P2P 直接進?通信,如果?法直接通信 的話,則會通過 STUN/TURN 服務器進?中轉,如下圖:

?1.2? 多對多通信

Mesh 架構:適合剛學習 WebRTC 的場景,簡單易實現,但實際應用中因上行帶寬占用大、線性資源占用等問題,超過 4 人時問題明顯,幾乎無人在真實場景中使用。

MCU 架構:硬件 MCU 曾在視頻會議廣泛應用,技術成熟,但價格昂貴,且隨著互聯網發展逐步被淘汰;軟 MCU 如 FreeSWITCH 雖存在,但因 CPU 消耗大,真正使用者不多。

SFU 架構:近年來流行,是 WebRTC 多方通信媒體服務器的主流架構,具有高靈活性和高性能,配合 Simulcast 或 SVC 模式可更好地適應不同網絡和終端,被多數公司采用。

Janus的多方視頻通話使用VideoRoom插件,采用SFU架構。

mesh(P2P)SFUMCU
延遲最低(直連)中等(服務器中轉)最高(處理流程復雜)
帶寬消耗上行壓力大(N2增長)下行壓力大(服務器承擔)整體最低(單一流)
擴展性差(適合1:1)優(適合中小型會議)一般(適合大型會議)
服務器成本低(僅需穿透輔助)中(高帶寬需求)高(計算+帶寬雙重壓力)
終端要求需處理多流解碼需多流解碼能力僅需解碼單一流
靈活性高(端到端控制)高(自由訂閱流)低(布局固定)
典型應用微信語音、Skype 1:1Zoom、騰訊會議傳統硬件視頻會議系統
特點多對多,Mesh 結構發布訂閱混流集合

?

?1.2.1 架構優點

架構

方案

優勢
Mesh 架構

- 無需中轉服務器,直接利用 WebRTC 通信模型,無需額外開發媒體服務器,降低了開發成本和復雜度。

- 充分利用客戶端的帶寬資源,將服務器端的帶寬壓力分散到各客戶端,節省了服務器成本。

- 原有通信模型的簡潔性,這種架構充分利用了現有的 WebRTC 通信模型,結構相對簡單,易于實現和維護。

MCU 架構

- 技術成熟,在硬件視頻會議領域應用廣泛,技術相對成熟可靠,能夠提供穩定的通信服務。

- 兼容性強,作為音視頻網關,通過解碼、再編碼可以屏蔽不同編解碼設備之間的差異化,滿足更多客戶的集成需求,提升用戶體驗和產品競爭力。

- 統一畫面輸出,將多路視頻混合成一路,所有參與者看到的是相同的畫面,有助于提供一致的客戶體驗。

SFU 架構

- 低資源消耗,數據包直接轉發,不需要進行編解碼操作,對 CPU 資源消耗很小,降低了服務器的硬件成本和運營成本。

- 低延遲,數據包直接轉發極大地降低了延遲,提高了通信的實時性,適合對實時性要求較高的應用場景。

- 靈活性高,可以根據終端下行網絡狀況進行流控,如根據帶寬、網絡延時情況選擇性地丟棄一些媒體數據,以保證通信的連續性,更好地適應不同的網絡狀況和終端設備。

- 支持多種模式,許多 SFU 實現支持 SVC 模式和 Simulcast 模式,能夠更好地適配 WiFi、4G 等不同網絡狀況,以及 Phone、Pad、PC 等不同終端設備,提高了系統的兼容性和可用性。

????????Simulcast 模式就是指視頻的共享者可以同時向 SFU 發送多路不同分辨率的視頻流(?般為三路, 如 1080P、720P、360P)。? SFU 可以將接收到的三路流根據各終端的情況?選擇其中某?路發送出 去。例如,由于 PC 端?絡特別好,給 PC 端發送 1080P 分辨率的視頻;?移動?絡較差,就給 Phone 發送 360P 分辨率的視頻。?Simulcast 模式對移動端的終端類型?常有?,它 可以靈活??智能地適應不同的?絡環境。??????

?????????SVC( Scalable Video Coding) 是可伸縮的視頻編碼模式。與 Simulcast 模式的 SVC 模式是 同時傳多路流不同, 在視頻編碼時做“ ?腳” 。它在視頻編碼時將視頻分成多層—— 核?層、中間層和擴展層。上層依賴于底層,?且越上層越清晰,越底層越模糊。在帶寬不好的情況下,可以只傳輸核?層在帶寬充?的情況下,可以將三層全部 傳輸過去。

??

?2. Janus 系統架構

????????Janus 被設計為通用的 WebRTC 服務器,專注于模塊化和可擴展性。它提供必要的 WebRTC 基礎設施,同時將特定的應用程序邏輯委托給插件。這種分離使 Janus 變得輕量級和靈活,無需更改內核即可支持廣泛的用例。

架構的關鍵原則:

  • 模塊化設計:核心組件通過定義明確的接口清晰分離
  • 基于插件的可擴展性:所有特定于應用程序的邏輯都在插件中實現
  • 多傳輸支持:用于客戶端交互的多種通信協議
  • 媒體和信令分離:WebRTC 媒體處理和信令邏輯之間的明確分離

全局架構圖如下:

2.1 核心組件

????????Janus 核心處理 WebRTC 和會話管理基礎知識,提供插件和傳輸構建的基礎基礎設施。

2.1.1?會話和句柄模型

Janus 中最重要的架構概念之一是 session/handle 模型:

  • 會話:表示用戶與 Janus 的連接
  • Handle:表示用戶與特定插件之間的連接
  • PeerConnection:與句柄關聯的 WebRTC 連接
  • transaction:表示當前消息信息的唯一句柄

這種關系在用戶、插件和媒體連接之間建立了明確的分離。客戶端與 Janus 創建會話。在此會話中,客戶端可以附加到多個插件(創建句柄)。每個句柄都有自己的 WebRTC PeerConnection,用于管理媒體交換。

2.1.2?會話管理

會話是客戶端連接到 Janus 的核心抽象。會話管理系統處理:

  • 會話創建和銷毀
  • 會話超時(可配置,默認 60 秒)
  • 會話聲明(在傳輸斷開連接后恢復會話)

每個會話都包含句柄,這些句柄是會話和插件實例之間的橋梁。會話層維護客戶端與其插件附件之間的關系。

2.1.3 Media Handl管理

Janus 的媒體處理層負責 WebRTC 連接和媒體處理。ICE (Interactive Connectivity Establishment) 組件處理:

  • 候選人聚集和交流
  • NAT 遍歷
  • 連接建立
  • 用于安全連接的 DTLS 協商
  • 用于加密媒體的 SRTP

??????

媒體路徑處理:

  • RTP/RTCP 數據包從?routing 到plugins
  • SDP offer/answer 處理
  • 媒體統計和監控
  • 數據包重傳的 NACK 處理
  • TWCC(全交通擁堵控制)

2.2 插件系統

????????Janus 提供了一個插件架構,允許開發人員在不修改核心代碼庫的情況下實現各種 WebRTC 應用程序。插件向 Janus 核心注冊,并為消息處理和媒體處理等事件實施回調。內核僅負責 WebRTC 連接和數據包路由,而插件則決定媒體會發生什么并實現應用程序邏輯。

Janus 包含的常見插件:

  • VideoRoom:用于多方視頻會議的選擇性轉發單元 (SFU)
  • AudioBridge:具有混音功能的音頻會議
  • 流式處理:媒體流式處理(RTP、RTSP、HLS 源)
  • SIP:用于 WebRTC 到 SIP 互作性的 SIP 網關
  • EchoTest:用于測試 WebRTC 功能的簡單 echo 測試插件
  • TextRoom:基于數據通道的文本聊天室
  • RecordPlay:WebRTC 會話的錄制和播放

插件 API 公開了允許插件執行以下作的函數:

  • 接收和發送媒體 (RTP/RTCP)
  • 與客戶交換消息
  • 管理 WebRTC 連接
  • 處理 SDP offers/answers
  • 通過 Data Channel 發送和接收數據

2.3?傳輸層

????????傳輸層提供客戶端和 Janus 服務器之間的通信通道。可以同時使用多種傳輸機制,從而靈活地選擇客戶端連接到 Janus 的方式。

  • HTTP/REST:用于請求-響應交互的傳統 REST API
  • WebSockets:實時雙向通信
  • RabbitMQ:基于消息隊列的通信
  • MQTT:輕量級發布-訂閱消息傳遞
  • Unix 套接字:同一臺機器上的進程間通信

???????

?所有傳輸都實現相同的 API,無論底層協議如何,都為核心提供一致的接口。這允許客戶端選擇最適合其需求的傳輸機制。

傳輸層負責:

  • 身份驗證請求(如果已配置)
  • 解析和驗證 JSON 消息
  • 將請求路由到適當的會話/句柄
  • 將事件和響應返回給客戶端

2.4 事件處理程序

????????事件處理程序為外部應用程序提供了一種監視和響應 Janus 中發生的事件的方法。這些事件可以包括會話創建/銷毀、媒體統計、特定于插件的事件等。事件處理程序(如傳輸和插件)在啟動時動態加載,并在內核中注冊。它們從核心接收事件,并將其轉發到外部系統進行監控、記錄或處理。

2.5 實用程序和工具

2.5.1?實用程序

????????Janus 提供了多種后處理工具,用于將錄音轉換為可以使用常見媒體播放器播放的標準格式。實用程序允許您將 Janus Media Recorder () 文件轉換為標準媒體格式。

Supported Output Formats??支持的輸出格式

輸入編解碼器輸出擴展名描述
VP8/VP9.webm, .mkvWebM 容器格式用于 VP8/VP9 視頻
H.264.mp4, .mkvMP4/Matroska 容器用于 H.264 視頻
H.265.mp4, .mkvMP4/Matroska 容器用于 H.265 視頻
AV1.mp4, .mkvMP4/Matroska 容器用于 AV1 視頻
Opus.opus, .ogg, .mkaOpus 音頻的各種容器
G.711.wavWAV 容器用于 G.711 音頻
G.722.wavWAV 容器用于 G.722 音頻
L16.wavWAV 容器用于 L16(PCM)音頻
文本數據.srt數據通道文本的 SRT 字幕格式

基本用法:

./janus-pp-rec /path/to/source.mjr /path/to/destination.[opus|ogg|mka|wav|webm|mkv|mp4|srt]
#分析錄制信息而不進行處理:
./janus-pp-rec --json /path/to/source.mjr    # Print JSON header
./janus-pp-rec --header /path/to/source.mjr  # Parse header only
./janus-pp-rec --parse /path/to/source.mjr   # Parse without processing

Janus 還包括用于在 Janus 錄音和數據包捕獲格式之間進行轉換的實用程序:

  • mjr2pcap:將 Janus 記錄轉換為 PCAP 格式,以便在 Wireshark 等工具中進行分析
  • pcap2mjr:將 PCAP 文件轉換為 Janus 錄制格式

?2.5.2 測試工具

????????Janus 提供了測試工具來驗證 WebRTC 網關的功能和性能。aiortc 測試套件!該目錄包含使用 WebRTC 功能測試庫的基于 Python 的測試工具。test/aiortc

測試套件的 Python 依賴項:

websockets==15.0
aiortc==1.10.1

可以使用提供的幫助程序腳本執行測試套件:

./test_aiortc.sh echo.py ws://localhost:8188/

3.1 數據流架構

????????下圖說明了在典型的 WebRTC 交互期間通過 Janus 架構的完整數據流。此流程展示了 Janus 的不同層如何協同工作以處理 WebRTC 信令、媒體交換和特定于應用程序的邏輯。各個組件之間的干凈分離實現了靈活性和可擴展性。

英文版:?

學習資料分享

0voice · GitHub

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

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

相關文章

數字化轉型進階:26頁華為數字化轉型實踐分享【附全文閱讀】

本文分享了華為數字化轉型的實踐經驗和體會。華為通過數字化變革,致力于在客戶服務、供應鏈、產品管理等方面提高效率,并把數字世界帶入每個組織,構建萬物互聯的智能世界。華為的數字化轉型愿景是成為行業標桿,通過推進數字化戰略、構建面向業務數字化轉型的IT組織陣型、堅…

Hal庫下備份寄存器

首先要確保有外部電源給VBAT供電 生成后應該會有這兩個文件(不知道為什么生成了好幾次都沒有,復制工程在試一次就有了) 可以看到stm32f407有20個備份寄存器 讀寫函數 void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t Backup…

使用 Vue3 + Webpack 和 Vue3 + Vite 實現微前端架構(基于 Qiankun)

在現代前端開發中,微前端架構逐漸成為一種流行的解決方案,尤其是在大型項目中。通過微前端,我們可以將一個復雜的單體應用拆分為多個獨立的小型應用,每個子應用可以獨立開發、部署和運行,同時共享主應用的基礎設施。本…

【c++】【STL】list詳解

目錄 list的作用list的接口構造函數賦值運算符重載迭代器相關sizeemptyfrontbackassignpush_frontpop_frontpush_backpop_backinserteraseswapresizeclearspliceremoveremove_ifuniquemergesortreverse關系運算符重載(非成員函數) list的模擬實現結點類迭…

Redis持久化:

什么是Redis持久化: Redis 持久化是指將 Redis 內存中的數據保存到硬盤等持久化存儲介質中,以便在 Redis 服務器重啟或出現故障時能夠恢復數據,保證數據的可靠性和持續性。Redis 提供了兩種主要的持久化方式:RDB(Redi…

VBA 64位API聲明語句第009講

跟我學VBA,我這里專注VBA, 授人以漁。我98年開始,從源碼接觸VBA已經20余年了,隨著年齡的增長,越來越覺得有必要把這項技能傳遞給需要這項技術的職場人員。希望職場和數據打交道的朋友,都來學習VBA,利用VBA,起碼可以提高…

在pycharm profession 2020.3將.py程序使用pyinstaller打包成exe

一、安裝pyinstaller 在pycharm的項目的Terminal中運行pip3 install pyinstaller即可。 安裝后在Terminal中輸入pip3 list看一下是否成功 二、務必在在項目的Terminal中輸入命令打包,命令如下: python3 -m PyInstaller --noconsole --onefile xxx.py …

Unity SpriteRenderer(精靈渲染器)

🏆 個人愚見,沒事寫寫筆記 🏆《博客內容》:Unity3D開發內容 🏆🎉歡迎 👍點贊?評論?收藏 🔎SpriteRenderer:精靈渲染器 💡Sprite Renderer是精靈渲染器,所有…

2.LED燈的控制和按鍵檢測

目錄 STM32F103的GPIO口 GPIO口的作用 GPIO口的工作模式 input輸入檢測 -- 向內檢測 output控制輸出 -- 向外輸出 寄存器 寄存器地址的確定 配置GPIO口的工作模式 時鐘的開啟和關閉 軟件編程驅動 LED 燈 硬件 軟件 軟件編程驅動 KEY 按鍵 硬件 軟件 按鍵消抖 代碼 STM32F…

Flink 的狀態機制

在實時流處理領域,狀態管理是構建復雜業務邏輯的核心能力。Apache Flink 通過統一的狀態抽象和高效的容錯機制,為開發者提供了從毫秒級窗口聚合到 TB 級歷史數據關聯的全場景支持。本文將深入剖析 Flink 狀態機制的底層原理,結合實際案例展示…

【查看.ipynp 文件】

目錄 如何打開 .ipynb 文件? 如果確實是 .ipynp 文件: .ipynp 并不是常見的 Jupyter Notebook 文件格式。通常,Jupyter Notebook 文件的擴展名是 .ipynb(即 Interactive Python Notebook)。如果你遇到的是 .ipynb 文…

Runnable組件重試機制降低程序錯誤率

一、LangChain 重試機制深度解析 當構建生產級AI應用時,with_retry() 機制可有效提升系統容錯性,典型應用場景包括: API調用頻率限制時的自動恢復模型服務臨時不可用的故障轉移網絡波動導致的瞬時異常處理 參數詳解與配置策略 1. 參數配置…

k8s筆記——kubebuilder工作流程

kubebuilder工作流程 Kubebuilder 工作流程詳解 Kubebuilder 是 Kubernetes 官方推薦的 Operator 開發框架,用于構建基于 Custom Resource Definitions (CRD) 的控制器。以下是其核心工作流程的完整說明: 1. 初始化項目 # 創建項目目錄 mkdir my-opera…

Java框架“若依RuoYi”前后端分離部署

運行環境 Eclipse IDE for Enterprise Java and Web Developers 下載Eclipse解壓Eclipse到文件夾 Maven 下載Maven解壓Maven到文件夾配置環境變量MAVEN_HOME為Maven安裝位置配置環境變量path為%MAVEN_HOME%\bin Redis 下載Redis解壓Redis到文件夾配置環境變量path為Redis安裝位…

游戲引擎學習第249天:清理調試宏

歡迎大家,讓我們直接進入調試代碼的改進工作 接下來,我們來看一下上次停留的位置。如果我沒記錯的話,上一場直播的結尾我有提到一些我想做的事情,并且在代碼中留下了一個待辦事項。所以也許我們今天首先做的就是解決這個問題。但…

二極管反向恢復的定義和原理

二極管的反向恢復定義 二極管的反向恢復是指二極管從正向導通狀態切換到反向阻斷狀態時,電流從正向變為負向并最終回到零所需的時間。具體過程如下: 正向導通:當二極管正向偏置時,電流可以順利通過,此時二極管處于導…

音視頻開發技術總結報告

音視頻開發技術總結報告 一、音視頻開發基礎 1、音頻基礎 聲音原理 聲波特性:頻率、振幅、波長人耳聽覺范圍:20Hz-20kHz聲音三要素:音調、音量、音色 數字音頻基礎 采樣率:常見44.1kHz、48kHz、96kHz量化位數:8bit、…

中間件和組件

文章目錄 1. 前言2. 中間件介紹3. 組件介紹4. 區別對比5. 簡單類比6. 總結 中間件和組件 1. 前言 中間件和組件是軟件開發中兩個重要的概念,但它們的定位和作用完全不同。中間件解決的事通信、跨系統、安全等問題,組件是解決具體業務模塊,提高…

AI超級智能體教程(五)---自定義advisor擴展+結構化json輸出

文章目錄 1.自定義攔截器1.2自定義Advisor1.2打斷點調試過程1.3Re-reading Advisor自定義實現 2.戀愛報告開發--json結構化輸出2.1原理介紹2.1代碼實現2.3編寫測試用例2.4結構化輸出效果 1.自定義攔截器 1.2自定義Advisor spring里面的這個默認的是SimpleloggerAdvisor&#…

02_使用 AES 算法實現文件加密上傳至阿里云、解密下載

02_使用 AES 算法實現文件加密上傳至阿里云、解密下載 一、文件上傳下載接口 controller 層 RestController RequestMapping("/api/common/file") Api(tags "公共文件上傳") AllArgsConstructor Slf4j public class FileV2Controller {private final Os…