webrtc sfu性能壓測

1. 前言

????????不少網友最近私信我,咨詢webrtc sfu服務端性能問題,SRS開源服務能支持多少路webrtc流,mediasoup單房間能支持多少個人,推流能接入多少路,拉流能拉取多少路?720p能支持多少路,360p能支持多少路?

???????這里介紹一下如何測試webrtc sfu服務器的性能,介紹原理和實際操作。最后以srs和mediasoup兩個流行的webrtc sfu開源進行舉例,如何壓測其性能。

????????閱讀后,相信你今后能夠自己針對自己的視頻質量來進行對應的壓測。

2. whip和whep的出現

? ? ? ?webrtc雖然有一套標準協議族:信令sdp交互/stun/dtls/rtp/rtcp等,但是每個開源的sfu都有自己定義的信令交互方式。也就是信令的交互方式都是開源sfu自定義的,比如

  • SRS(國內最流行的流媒體服務器之一)

    https post方式進行sdp交換

  • MediaSoup

    websocket傳輸信令,信令把sdp進行拆分: 1)stun/dtls信息;2)音頻/視頻的rtp/rtcp信息;

????? 這個時候whip協議的規范出來,就提供了一個webrtc信令交互的標準。rfc已經有了draft文檔:?

https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html。

?????? whip全稱: WebRTC-HTTP ingestion protocol,也就是webrtc推流協議,有了這個協議,基本上就有了webrtc的推流標準,很多sfu的開源都支持該協議,客戶端OBS推流也支持該協議(可以用webrtc進行推流,來進行直播)

????? ?whep全稱: WebRTC-HTTP Egress Protocol,就是webrtc拉流協議,下行拉流協議。rfc的draf文檔地址:?

https://www.ietf.org/archive/id/draft-murillo-whep-03.txt。

????? ?本文主要就是基于whip/whep進行webrtc sfu壓測。

3. 基于cpp_streamer工具進行壓測

? ? ? ?cpp streamer是基于C++11開發的音視頻組件,使用者可以把組件串聯起來實現自己的流媒體功能。支持多種媒體格式,流媒體直播/rtc協議。

? ? ? ?網絡開發部分,采用高性能,跨平臺的libuv網絡異步庫。

? ? ? 支持webrtc的推流/拉流,并且代碼并未使用libwebrtc(chrome內部webrtc源碼,依賴較多,庫比較大),而是筆者基于webrtc協議族規范(stun/dtls/rtp/rtcp等)開發的webrtc組件,代碼非常的輕量。

? ? ? ?下面介紹,如何使用cpp_streamer進行壓測。

4. SRS的webrtc性能壓測

? ? ? ?筆者推薦使用開源cpp_streamer進行webrtc壓測,下面介紹兩個方向的壓測:

  • 推流壓測(whip)

  • 拉流壓測(whep)

4.1?推流壓測

4.1.1?媒體源文件? ? ??

壓測的源文件采用mpegts格式,因為其能支持對opus音頻編碼的封裝,具體的要求:

  • 視頻編碼

    H264,?profile必須是baseline;

  • 音頻編碼

    Opus,采樣率48000,通道2

推薦使用ffmpeg生成媒體源文件:

ffmpeg -i src.mp4 -c:v libx264 -r 25 -g 100 -profile baseline -c:a libopus -ar 48000 -ac 2 -ab 32k -f mpegts webrtc.ts

用戶可以自己編碼制作自己想要測試的視頻分辨率,I幀間隔和幀率;

4.1.2?壓測

在linux服務器上編譯后,會生成whip_srs_bench執行文件,執行:

./whip_srs_bench -i webrtc.ts \-o "http://10.0.24.12:1985/rtc/v1/whip/?app=live&stream=1000" \-n 100

注意:

  • -i的參數為測試源文件,mpegts格式,視頻H264 baseline profile,音頻opus且采樣率48000,通道數為2;

  • -o的參數為srs的webrtc地址,地址要加引號,如10.0.24.12是srs的地址,1985是srs的信令http端口號

  • -n為并發whip session個數,也就是推流的個數,推薦小于100,如果需要測試多于100的個數,推薦開啟多個whip_srs_bench命令行,以確保準確度

4.2 拉流壓測

在linux服務器上編譯后,會生成whep_srs_bench執行文件,執行:???????

./whep_srs_bench?\ -i?"http://10.0.8.5:1985/rtc/v1/whip-play/?app=live&stream=1000" \?-n?100
  • -i的參數為srs的webrtc的whep拉流地址,地址要加引號,如10.0.8.5是srs的地址,1985是srs的信令http端口號

  • -n為并發whep session個數,也就是拉流的個數,推薦小于100,如果需要測試多余100的個數,推薦開啟多個whep_srs_bench命令行,以確保準確度

5. Mediasoup性能壓測

5.1?推流壓測

????? ?壓測源文件如何生成,見4.1.1。注意:當前也僅僅支持H264+Opus的編碼格式。

在linux服務器上編譯后,會生成mediasoup_push_bench執行文件,執行:???????

./mediasoup_push_bench -i webrtc.ts \ -o "https://xxxxx.com:4443?roomId=200&userId=1000" \ -n 100
  • -i的參數,webrtc.ts為源文件:mpegts格式,視頻h264 baseline;音頻opus 采樣率48000,通道數為2;

  • -o的參數,mediasoup的broadcaster接入模式,xxxx.com:4443為sfu的域名地址,roomId為房間號,userId為用戶名。

  • -n的參數為整數,測試并發的數量,推薦小于100,如果需要測試大于100的,開啟多個命令行,以保證拉流的準確度;

? ? ? ?mediasoup sfu的demo中,推流有個“坑”,注意:

? ? ? ?推流所在的roomId必須提前存在(也就是websocket端已經有人推流上來),否則broadcaster創建失敗。如果需要房間Id不存在的前提下命令行推流能成功,需要修改mediasoup-demo的源碼server.js,如下:???????

expressApp.param(  'roomId', (req, res, next, roomId) =>??{??  queue.push(async?()?=>??????{??????  consumerReplicas?=?0;????????req.room?=?await?getOrCreateRoom({?roomId,?consumerReplicas?});????????next();??????}).catch((error)?=>??????  {????????  logger.error('room?creation?or?room?joining?failed:%o',?error);??????????reject(error);????????});  });

? ? ? ?原有代碼:在http api檢測roomId的房間是否存在,若不存在,拒絕創建broadcaster;

? ? ? 新代碼: 在http api檢測roomId的房間是否存在,若不存在,創建該roomId的新房間;

5.2 拉流壓測

在linux服務器上編譯后,會生成mediasoup_pull_bench執行文件,執行:???????

./mediasoup_pull_bench?\ -i?"https://xxxxx.com.cn:4443?roomId=100&apid=7689e48c-09ae-48ca-8973-ad5de69de5e8&vpid=aadbbb0b-2e4e-4ed8-8bd6-22e3c50b9fc1"?\?-n?100 \ -l?1.log
  • -i的參數,mediasoup的broadcaster接入模式,xxxx.com:4443為sfu的域名地址,roomId為房間號,apid為推流audio的producerId, vpid為推流video的producerId;

  • -n的參數為整數,測試并發的數量,推薦小于100,如果需要測試大于100的,開啟多個命令行,以保證拉流的準確度;

  • -l的參數為日志文件(可選,如果不填寫,輸出到控制臺)

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

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

相關文章

Spring Boot集成olingo快速入門demo

1.什么是olingo? Apache Olingo 是個 Java 庫,用來實現 Open Data Protocol (OData)。 Apache Olingo 包括服務客戶端和 OData 服務器方面。 Open Data Protocol (開放數據協議,OData) 是用來查詢和更新數據的一種W…

【吊打面試官系列-MyBatis面試題】MyBatis 實現一對多有幾種方式,怎么操作的?

大家好,我是鋒哥。今天分享關于 【MyBatis 實現一對多有幾種方式,怎么操作的?】面試題,希望對大家有幫助; MyBatis 實現一對多有幾種方式,怎么操作的? 有聯合查詢和嵌套查詢。聯合查詢是幾個表聯合查詢,只查詢一次,通過…

觀察矩陣(View Matrix)、投影矩陣(Projection Matrix)、視口矩陣(Window Matrix)及VPM矩陣及它們之間的關系

V表示攝像機的觀察矩陣(View Matrix),它的作用是把對象從世界坐標系變換到攝像機坐標系。因此,對于世界坐標系下的坐標值worldCoord(x0, y0, z0),如果希望使用觀察矩陣VM將其變換為攝像機坐標系下的坐標值localCoord(x…

【滲透入門】HTTP請求包

文章目錄 前言HTTP GET請求包HTTP POST請求包Content-Type 前言 HTTP(HyperText Transfer Protocol)請求包,是Web通信的基礎。HTTP請求包格式主要由以下幾部分組成: 請求行:包含了請求方法(GET、POST、PUT…

32單片機,C語言與匯編聯合編譯的幾種方式

適用編譯器:Keil5 方式一: 單獨創建一個.s匯編文件,在匯編文件內對函數進行EXPORT聲明 r0寄存器是函數傳入的第一個參數,r1寄存器是函數傳入的第二個參數,以次類推。參數最多不確定是到r4為止,還是到r12…

Node.js-path 模塊

path 模塊 path 模塊提供了 操作路徑 的功能,如下是幾個較為常用的幾個 API: 代碼實例: const path require(path);//獲取路徑分隔符 console.log(path.sep);//拼接絕對路徑 console.log(path.resolve(__dirname, test));//解析路徑 let pa…

Robust Regression

最小二乘回歸受數據中的離群點的影響較大,穩健回歸通過降低離群點的影響緩解此問題。M估計法是穩健回歸的重要方法之一,M 估計法的目標函數為: m i n ∑ ρ ( ? i ) m i n ∑ ρ ( y i ? β ^ ? X i ) min\sum\rho(\epsilon_i) min\sum\…

vulhub-activemq(CVE-2016-3088)

在 Apache ActiveMQ 5.12.x~5.13.x 版本中,默認關閉了 fileserver 這個應用(不過,可以在conf/jetty.xml 中開啟);在 5.14.0 版本后,徹底刪除了 fileserver 應用。【所以在滲透測試過程中要確定好 ActiveMQ …

word 使用手冊

word 文檔中如何將下行的指定文字退格到上行中 就像是這樣的 編號:111 密碼:222 編號:123 密碼:321 編號:124 密碼:331 變成 編號:111密碼:222 編號:123密碼&#xff1…

數據結構1:C++實現變長數組

數組作為線性表的一種,具有內存連續這一特點,可以通過下標訪問元素,并且下標訪問的時間復雜的是O(1),在數組的末尾插入和刪除元素的時間復雜度同樣是O(1),我們使用C實現一個簡單的邊長數組。 數據結構定義 class Arr…

華為OD機試 - 來自異國的客人(Java 2024 D卷 100分)

華為OD機試 2024D卷題庫瘋狂收錄中,刷題點這里 專欄導讀 本專欄收錄于《華為OD機試(JAVA)真題(D卷C卷A卷B卷)》。 刷的越多,抽中的概率越大,每一題都有詳細的答題思路、詳細的代碼注釋、樣例測…

新手教學系列——前后端分離API優化版

在之前的文章《Vue 前后端分離開發:懶人必備的API SDK》中,我介紹了通過Object對象自動生成API的方法。然而,之前的代碼存在一些冗余之處。今天,我將分享一個改進版本,幫助你更高效地管理API。 改進版API SDK 首先,讓我們來看一下改進后的代碼: import request from …

深入理解 KVO

在 iOS 中,KVO(Key-Value Observing)是一個強大的觀察機制,它的底層實現相對復雜。KVO 利用 Objective-C 的動態特性,為對象的屬性提供觀察能力。 KVO 的底層實現 1. 動態子類化 當一個對象的屬性被添加觀察者時&am…

6、Redis系統-數據結構-01-String

Redis 數據結構簡介 前言 Redis 是一個高性能的內存數據庫,其關鍵在于其數據結構的設計。Redis 數據結構是指底層實現 Redis 鍵值對中值的數據類型的方式。它包括了以下幾種主要對象: String(字符串)對象:最基本的數…

[C++][CMake][流程控制]詳細講解

目錄 1.條件判斷1.基本表達式2.邏輯判斷3.比較4.文件操作5.其他 2.循環1.foreach2.while 1.條件判斷 在進行條件判斷的時候,如果有多個條件,那么可以寫多個elseif,最后一個條件可以使用else,但是開始和結束是必須要成對出現的&am…

WordPress常見問題及簡要說明

1. 如何安裝WordPress? 簡要說明:WordPress是一個流行的內容管理系統,可以幫助用戶快速搭建網站。安裝WordPress需要以下幾個步驟:下載WordPress安裝包、上傳到服務器、創建數據庫、配置數據庫信息、完成安裝。 2. 如何創建一個新的WordPr…

掌握電量脈搏:WebKit 電池狀態(Battery Status API)支持全解析

掌握電量脈搏:WebKit 電池狀態(Battery Status API)支持全解析 隨著移動設備的廣泛使用,Web 應用對設備的電池狀態信息的需求日益增長。Battery Status API 提供了一種方式,允許 Web 應用訪問設備的電池信息&#xff…

【反悔貪心 反悔堆】1642. 可以到達的最遠建筑

本文涉及知識點 反悔貪心 反悔堆 LeetCode1642. 可以到達的最遠建筑 給你一個整數數組 heights ,表示建筑物的高度。另有一些磚塊 bricks 和梯子 ladders 。 你從建筑物 0 開始旅程,不斷向后面的建筑物移動,期間可能會用到磚塊或梯子。 當…

Spring Boot中的全局異常處理

Spring Boot中的全局異常處理 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們將探討如何在Spring Boot應用中實現全局異常處理,這是保證應用…

VSCode, 請在windows下使用git bash終端

用vscode在windows下調測代碼,運行時默認打開的終端是windows的cmd,很不受我待見。畢竟習慣了linux,習慣了windows下的git bash風格。怎么辦? search,search,research。 先確保windows上安裝了git bash。…