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.xdnf.cn/news/1474190.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

生成式AI的短板在于“Token”的存在

生成式AI模型处理文本的方式与人类不同。理解它们基于“token”的内部环境,可能有助于解释一些奇怪行为和固有局限性。 从小型设备上的Gemma到OpenAI领先行业的GPT-4o,大多数模型都是基于一种称为Transformer的架构。由于Transformer在将文本与其他类型…

git把本地分支的提交到自己的远程分支,然后合并特定远程分支

1、首先,把本地更改的代码放到暂存区:git add . 2、把暂存区的代码进行提交:可以直接在控制台提交也可以使用代码git commit -m "进行的操作的注释" 提交前: 提交后: 3、使用git pull拉取代码(这…

(南京观海微电子)——MOS管原理及应用区别

MOS管: 全称为金属氧化物半导体场效应管(Metal Oxide Semiconductor Field Effect Transistor),也被称为MOSFET(Metal-Oxide-Semiconductor Field-Effect Transistor)。它是一种半导体器件,常用…

图论·Day01

P3371 P4779 P3371 【模板】单源最短路径(弱化版) 注意的点: 边有重复,选择最小边!对于SPFA算法容易出现重大BUG,没有负权值的边时不要使用!!! 70分代码 朴素板dijsk…

【pytorch20】多分类问题

网络结构以及示例 该网络的输出不是一层或两层的,而是一个十层的代表有十分类 新建三个线性层,每个线性层都有w和b的tensor 首先输入维度是784,第一个维度是ch_out,第二个维度才是ch_in(由于后面要转置),没有经过softmax函数和…

Fast R-CNN(论文阅读)

论文名:Fast R-CNN 论文作者:Ross Girshick 期刊/会议名:ICCV 2015 发表时间:2015-9 ​论文地址:https://arxiv.org/pdf/1504.08083 源码:https://github.com/rbgirshick/fast-rcnn 摘要 这篇论文提出了一…

基于java+springboot+vue实现的校园外卖服务系统(文末源码+Lw)292

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,外卖信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…

Stream流真的很好,但答应我别用toMap()

你可能会想,toList 和 toSet 都这么便捷顺手了,当又怎么能少得了 toMap() 呢。 答应我,一定打消你的这个想法,否则这将成为你噩梦的开端。 让我们先准备一个用户实体类。 Data AllArgsConstructor public class User { priv…

昇思MindSpore学习总结十——ResNet50迁移学习

1、迁移学习 (抄自CS231n Convolutional Neural Networks for Visual Recognition) 在实践中,很少有人从头开始训练整个卷积网络(使用随机初始化),因为拥有足够大小的数据集相对罕见。相反,通常…

LLM - 循环神经网络(RNN)

1. RNN的关键点:即在处理序列数据时会有顺序的记忆。比如,RNN在处理一个字符串时,在对字母表顺序有记忆的前提下,处理这个字符串会更容易。就像人一样,读取下面第一个字符串会更容易,因为人对字母出现的顺序…

Linux应用---信号

写在前面:在前面的学习过程中,我们学习了进程间通信的管道以及内存映射的方式。这次我们介绍另外一种应用较为广泛的进程间通信的方式——信号。信号的内容比较多,是学习的重点,大家一定要认真学,多多思考。 一、信号概…

【AI资讯】可以媲美GPT-SoVITS的低显存开源文本转语音模型Fish Speech

Fish Speech是一款由fishaudio开发的全新文本转语音工具,支持中英日三种语言,语音处理接近人类水平,使用Flash-Attn算法处理大规模数据,提供高效、准确、稳定的TTS体验。 Fish Audio

驾校管理系统设计

驾校管理系统设计旨在提高驾校运营效率、学员管理、教练安排、考试预约、财务结算等方面的能力。以下是一个基本的设计框架,包括关键模块和数据表设计: 1. 系统架构设计 前端界面:提供给学员、教练和管理员使用的Web界面或移动应用&#xf…

【高中数学/基本不等式】当x是正实数时,求函数f(x)=x/(1+x^2)的最大值?

【问题】 当x是正实数时&#xff0c;求函数f(x)x/(1x^2)的最大值&#xff1f; 【解答】 解&#xff1a; f(x)x/(1x^2)1/(x1/x))<1/2倍根号下(x*1/x)1/2 所以函数在[0,∞)的区域最大值为0.5 【函数图像】 f(x)x/(1x^2)是奇函数&#xff0c;没有断点&#xff0c;是可以…

idea推送到gitee 401错误

在idea上推送时遇到这样的问题&#xff0c;解决方法如下&#xff1a; 在https://的后面加上 用户名:密码 然后再提交就ok啦&#xff01;

使用qt creator配置msvc环境(不需要安装shit一样的宇宙第一IDE vs的哈)

1. 背景 习惯使用Qt编程的童鞋&#xff0c;尤其是linux下开发Qt的童鞋一般都是使用qt creator作为首选IDE的&#xff0c;通常在windows上使用Qt用qt creator作为IDE的话一般编译器有mingw和msvc两种&#xff0c;使用mingw版本和在linux下的方式基本上一样十分简单&#xff0c;不…

Alt与Tab切换窗口时将Edge多个标签页作为一个整体参与切换的方法

本文介绍在Windows电脑中&#xff0c;使用Alt与Tab切换窗口时&#xff0c;将Edge浏览器作为一个整体参与切换&#xff0c;而不是其中若干个页面参与切换的方法。 最近&#xff0c;需要将主要使用的浏览器由原本的Chrome换为Edge&#xff1b;但是&#xff0c;在更换后发现&#…

数据结构与算法笔记:实战篇 - 剖析微服务接口鉴权限流背后的数据结构和算法

概述 微服务是最近几年才兴起的概念。简单点将&#xff0c;就是把复杂的大应用&#xff0c;解耦成几个小的应用 。这样做的好处有很多。比如&#xff0c;这样有利于团队组织架构的拆分&#xff0c;比较团队越大协作的难度越大&#xff1b;再比如&#xff0c;每个应用都可以独立…

mybatis-plus参数绑定异常

前言 最近要搞个发票保存的需求&#xff0c;当发票数据有id时说明是发票已经保存只需更新发票数据即可&#xff0c;没有id时说明没有发票数据需要新增发票&#xff1b;于是将原有的发票提交接口改造了下&#xff0c;将调用mybatis-plus的save方法改为saveOrUpdate方法&#xff…

从零开始实现大语言模型(四):简单自注意力机制

1. 前言 理解大语言模型结构的关键在于理解自注意力机制(self-attention)。自注意力机制可以判断输入文本序列中各个token与序列中所有token之间的相关性&#xff0c;并生成包含这种相关性信息的context向量。 本文介绍一种不包含训练参数的简化版自注意力机制——简单自注意…