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.mzph.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。…