如何实现带宽速度测试的功能?看看srs开源服务器的实现

开源免费推流工具实测:OBS、FFmpeg、SRS覆盖直播全链路 音视频传输是直播系统的核心,而推流与拉流作为其中关键环节,直接决定了直播的稳定性和体验。无论是桌面端采集、命令行自动化,还是服务端分发,开源工具都提供了低成本、高可控的解决方案。OBS Studio以图形化界面胜任采集与导播,FFmpeg凭借灵活的命令行成为自动化推流和拉流的瑞士军刀,SRS作为高性能流媒体服务器则负责协议转换与海量分发。理解这三者如何协同工作,能够帮助开发者快速搭建从摄像头到手机浏览器的完整直播链路。在实际工程中,RTMP用于推流,HTTP-FLV与HLS用于拉流,合理配置关键帧间隔、码率 阅读详情

一、总结如下几点:

  1. 通过send函数和recv函数计算发送和接收的总字节数,并通过发送和接收的时间段来计算收发比特率。简单的计算为totalsizes/totaltimeduration。
  2. 如何封装发送的数据也是有讲究的,可以自定义一个增量算法,让每次发送的测试数据自动增长。
  3. 每个包发送的时间间隔是否需要设置?这个要看客户端实现,如果是select模型,可以不设置,直到socket出错后重置后继续发送(比如前面介绍的飞秋源码发送文件的实现),有些客户端实现每次send函数中间会sleep一个很小的时间,让sendbuf充分的处理数据后再继续写另一个包的数据,比如sleep个5ms之类的,但测试速度我觉得不合适这么用。
  4. 发送测试数据的总时间,可以自己定义。

二、srs服务器代码分析

(1)测试带宽函数,收发数据的关键代码如下

int SrsBandwidth::do_bandwidth_check(SrsKbpsLimit* limit)
{
    int ret = ERROR_SUCCESS;

    SrsBandwidthSample play_sample;
    SrsBandwidthSample publish_sample;
    
    // timeout for a packet.
    _rtmp->set_send_timeout(play_sample.duration_ms * 1000 * 2);
    _rtmp->set_recv_timeout(publish_sample.duration_ms * 1000 * 2);

    // start test.
    srs_update_system_time_ms();
    int64_t start_time = srs_get_system_time_ms();
    
    // sample play
    srs_info("start play test.");
    
    if ((ret = play_start(&play_sample, limit)) != ERROR_SUCCESS) {
        srs_error("bandwidth play check failed. ret=%d", ret);
        return ret;
    }
    if ((ret = play_checking(&play_sample, limit)) != ERROR_SUCCESS) {
        srs_error("bandwidth play check failed. ret=%d", ret);
        return ret;
    }
    if ((ret = play_stop(&play_sample, limit)) != ERROR_SUCCESS) {
        srs_error("bandwidth play check failed. ret=%d", ret);
        return ret;
    }
    
    srs_info("stop play test. kbps=%d", play_sample.kbps);
    
    // sample publish
    srs_info("start publish test.");
    
    if ((ret = publish_start(&publish_sample, limit)) != ERROR_SUCCESS) {
        srs_error("bandwidth publish check failed. ret=%d", ret);
        return ret;
    }
    if ((ret = publish_checking(&publish_sample, limit)) != ERROR_SUCCESS) {
        srs_error("bandwidth publish check failed. ret=%d", ret);
        return ret;
    }
    if ((ret = publish_stop(&publish_sample, limit)) != ERROR_SUCCESS) {
        srs_error("bandwidth publish check failed. ret=%d", ret);
        return ret;
    }
    
    srs_info("stop publish test. kbps=%d", publish_sample.kbps);

    // stop test.
    srs_update_system_time_ms();
    int64_t end_time = srs_get_system_time_ms();

    srs_trace("bandwidth ok. duartion=%dms(%d+%d), play=%dkbps, publish=%dkbps", 
        (int)(end_time - start_time), play_sample.actual_duration_ms, 
        publish_sample.actual_duration_ms, play_sample.kbps, 
        publish_sample.kbps);
    
    if ((ret = finial(play_sample, publish_sample, start_time, end_time)) != ERROR_SUCCESS) {
        return ret;
    }
    
    st_usleep(_SRS_BANDWIDTH_FINAL_WAIT_MS * 1000);
    srs_info("BW check finished.");

    return ret;
}

解析:

    首先服务器发送伪装rtmp packet给客户端,然后根据发送的数据大小和实际持续时间来计算kbps。

    然后服务器接收客户端发送回来的伪装rtmp packet数据,计算接收的kbps。

(2)发送数据

int SrsBandwidth::play_checking(SrsBandwidthSample* sample, SrsKbpsLimit* limit)
{
    int ret = ERROR_SUCCESS;

    // send play data to client
    int size = 1024; // TODO: FIXME: magic number
    char random_data[size];
    memset(random_data, 'A', size);

    int data_count = 1;
    srs_update_system_time_ms();
    int64_t starttime = srs_get_system_time_ms();
    while ((srs_get_system_time_ms() - starttime) < sample->duration_ms) {
        st_usleep(sample->interval_ms);
        
        // TODO: FIXME: use shared ptr message.
        SrsBandwidthPacket* pkt = SrsBandwidthPacket::create_playing();

        // TODO: FIXME: magic number
        for (int i = 0; i < data_count; ++i) {
            std::stringstream seq;
            seq << i;
            std::string play_data = "SRS band check data from server's playing......";
            pkt->data->set(seq.str(), SrsAmf0Any::str(play_data.c_str()));
        }
        data_count += 2;

        if ((ret = _rtmp->send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
            srs_error("send bandwidth check play messages failed. ret=%d", ret);
            return ret;
        }
        
        limit->send_limit();
    }
    srs_update_system_time_ms();
    sample->calc_kbps(_rtmp->get_send_bytes(), srs_get_system_time_ms() - starttime);
    srs_info("BW check send play bytes over.");
    
    return ret;
}

其中:

     会先设置一个计划发送持续时间sample->duration_ms(3秒),即while((srs_get_system_time_ms()-starttime) < sample->duration_ms)中的duration_ms。

    封装的数据是根据发送包的序列不断增长的。

// TODO: FIXME: magic number
for (int i = 0; i < data_count; ++i) {
    std::stringstream seq; 
    seq << i;
    std::string play_data = "SRS band check data from server's playing......";
    pkt->data->set(seq.str(), SrsAmf0Any::str(play_data.c_str()));
}
data_count += 2;

(3)包间间隔发送时间,即st_usleep(sample->interval_ms)的休眠时间设置0,如下代码可见interval_ms被初始化为0,后面没有对interval_ms进行改变。

SrsBandwidthSample::SrsBandwidthSample()
{
    duration_ms = _SRS_BANDWIDTH_SAMPLE_DURATION_MS;
    kbps = interval_ms = actual_duration_ms = bytes = 0;
}

(4)设置了一个速度上限,如果大于 1000kbps的速度,则休息一下(100ms)。代码如下:

#define _SRS_BANDWIDTH_LIMIT_INTERVAL_MS 100
void SrsKbpsLimit::send_limit()
{
    _kbps->sample();
    while (_kbps->get_send_kbps() > _limit_kbps) {
        _kbps->sample();
        st_usleep(_SRS_BANDWIDTH_LIMIT_INTERVAL_MS * 1000);
    }
}

三、详细请看srs_lib_bandwidth.hpp和srs_lib_bandwidth.cpp这两个文件。

四、最后看看官网的测试速度

H.265+SRS6.0服务器部署实战:从编译到推流全流程解析 本文详细解析了从编译到推流的H.265+SRS6.0服务器部署全流程。通过实战演示,指导读者如何编译支持H.265的SRS 6.0流媒体服务器,并搭配定制版FFmpeg实现高效的RTMP over H.265推流,旨在构建一个能显著节省带宽成本的现代流媒体服务基础。 阅读详情

相关推荐

SRS流媒体服务器搭建与OBS推流实战指南

本文详细介绍了如何从零搭建SRS流媒体服务器并与OBS配合实现RTMP推流的完整流程。涵盖服务器部署、配置优化、OBS设置技巧及常见问题排查,特别推荐使用StreamCaster进行协议转换,帮助开发者快速构建低延迟、高性能的直播解决方案。

weixin_42561040的博客 285

国标GB28181 SRS部署与端口优化实战

本文详细介绍了使用开源流媒体服务器SRS搭建国标GB28181视频监控平台的实战指南。内容涵盖从环境准备、源码编译、关键配置文件解析,到端口规划、防火墙配置及生产环境部署优化的全流程。重点解析了SRS的GB28181模块安装配置,并提供了常见问题排查与性能优化方案,帮助用户快速构建稳定高效的视频联网系统。

weixin_29196891的博客 664

Docker部署SRS流媒体服务器:从镜像到推拉流全指南

流媒体服务器是音视频传输体系中的核心基础设施,在直播、互动课堂、视频监控等场景中有着广泛应用。传统部署方式常因依赖库冲突和版本管理问题而变得复杂低效,容器化技术则通过环境封装与资源隔离显著降低了搭建与运维门槛。SRS作为一款成熟的开源流媒体服务器,支持RTMP、HLS、WebRTC、SRT等多种协议,具备高性能与高可扩展性,适合自建直播平台或进行音视频技术验证。本文从容器化部署的基础概念出发,详细讲解如何快速拉取SRS镜像、挂载自定义配置、启动容器并验证RTMP推流、HLS播放及WebRTC低延迟链路,同时

weixin_29597551的博客 201

srs之带宽检测

1.配置srs的启动配置文件 vhost bandcheck.srs.com {     enabled         on;     chunk_size      65000;     bandcheck {         enabled         on;         key             "35c9b402c12a7246868752e2878f7e0e"

zjqlovell的专栏 2104

Docker部署SRS流媒体服务器:从推流到WebRTC的完整实践

在实时音视频领域,流媒体服务器是支撑直播、连麦、监控等业务的核心基础设施。SRS作为一款高性能的开源流媒体服务器,通过统一收编RTMP、HTTP-FLV、HLS与WebRTC等协议,解决了多端播放兼容与低延迟传输的难题。然而传统源码编译部署依赖繁杂、回滚困难,而Docker容器化部署将环境依赖封装为镜像,一条命令即可拉起服务,显著降低上手门槛。本文从Docker部署SRS的工程实践出发,讲解端口规划、compose配置、candidate参数设置、推流鉴权回调及常见故障排查,帮助开发者快速构建生产可用的实时

weixin_34192816的博客 194

用Docker部署SRS流媒体服务器:从RTMP到WebRTC的完整实践

流媒体服务器是实时音视频系统的核心基础设施,而Docker容器化技术为快速部署与跨环境一致性提供了高效方案。SRS作为开源流媒体服务器,支持RTMP、HLS、WebRTC等主流协议,结合Docker Compose可实现秒级环境搭建与版本回滚。本文从容器化部署的底层逻辑切入,讲解端口规划、镜像配置、推拉流验证、鉴权与WebRTC低延迟联调,并延伸至FFmpeg转流、摄像头RTSP接入等生产实践,帮助开发者快速构建完整直播链路。

weixin_33826609的博客 251

srs直播内网拉流带宽飙升问题记录

客户端从srs拉流,发现外网客户端拉流,cpu和带宽都正常。然而内网客户端拉流,拉流人数超过5人以上,带宽就会迅速飙升。经过排查公司内网环境,发现内网环境做了带宽限制,当客户端拉流带宽超过一定大小后,就限制拉流。用srs-bench进行srs压测,vlc播放器srs拉流,以及客户端srs拉流。缺陷:网络异常,srs不进行丢包重传,此时会出现马赛克,卡顿等问题。srs部署在云服务器上,32核cpu,64G内存,带宽300M.优势:内网及外网的网络正常情况下,直播拉流正常,带宽消耗少。

littleboy_IT 2591

保姆级教程:用OBS+RTMP+SRS在Android上实现视频流虚拟摄像头(附完整源码)

本文提供了一份详细的Android视频流虚拟摄像头开发教程,涵盖从OBS推流到RTMP服务器搭建(SRS/Nginx-RTMP)、YUV数据转换到Android相机预览的全流程实现。通过系统级开发方法,解析Camera HAL层修改、FFmpeg拉流解码等核心技术,并附完整源码,帮助开发者快速构建高性能虚拟摄像头解决方案。

weixin_30338481的博客 462

SRS带宽不足下内存泄漏

最近解决了SRS中的一个bug,特此记录一下。 SRS(4.0)服务器上,使用RTMP推流,在网页端用webrtc拉流。设置低带宽场景下存在内存大幅度持续不断上涨现象,应该是有内存泄漏。

吴尼玛cs 1586

STM32 移植LwIP 实现网线插拔自动恢复

STM32 移植LwIP 之后,能正常联网通讯,但是发现2个问题, 1、上电初始化前,未插入网线,之后就无法获取到IP地址(DHCP) 2、正常通讯过程中,拔掉网线,然后插回去,不知道如何复位 先看一下LWIP初始化代码 /** * LwIP initialization function */ int MX_LWIP_Init() { /* Initilialize the LwIP stack with RTOS */ tcpip_init( NULL, NULL );

tiantangmoke的博客 8074

OpenClaw 最强技能 self-improving-agent 详解:让 AI 从错误中自主学习

self-improving-agent 是 OpenClaw 生态中最受欢迎的技能插件,下载量突破 268k。它能让 AI 记住犯过的错误和解决方案,实现持续自我改进。本文深入讲解其工作原理、安装配置和实战案例。测试数据显示:部署流程时间从 15 分钟降到 2 分钟(87%↓),API 调试时间从 2 小时降到 20 分钟,数据库查询编写时间减少 90%。文章包含完整架构图、配置文件示例、3 个详细实战案例和性能测试数据,适合开发者、运维和数据分析师使用。

qq_38610923的博客 3635

《直播从零开始》SRS 带宽测试

视频很卡,播放不了,缓冲区突然很大,推流上不来,都有可能是带宽过低,SRS支持测试客户端到服务器的带宽。 SRS配置 SRS配置一般是单独加一个vhost支持测速。SRS的带宽测试默认配置位于安装目录下的conf/bandwidth.conf。譬如: listen 1935; vhost __defaultVhost__ { } vhost bandcheck.srs.com { enabled on; chunk_size 65000;

郎涯技术 1690

科研绘图神器Origin中文版安装后还是英文?手把手教你三步搞定界面汉化

本文详细介绍了Origin软件安装后界面仍显示英文的解决方案,包括基础语言切换、注册表修改和序列号破解三种方法。通过逐步指导,帮助用户快速实现界面汉化,提升科研绘图效率。特别针对教育版用户提供了有效的语言锁定解除方案。

weixin_42524708的博客 1135

srs流媒体服务器性能,srs流媒体服务器 配置

srs流媒体服务器 配置 内容精选换一换SRS是一款开源流媒体,适合直播以及低延时流媒体领域,但是从来不设限,可以应用在直播、视频会议、在线教育等场景。同时视频领域还有两大块、广电和视频监控,随着互联网的迅速发展,视频监控设备上云的需求越来越多,以前还可以私有化局域网里面搞一搞,但是随着移动互联网的发展,视频监控有大量的移动端直播需求,来自:博客流媒体解决方案 Live555 (C++) 流媒体平...

weixin_35724794的博客 1674

B站自动答题协议分析

使用Python写了一个自动答题机器人!基于接口协议实现且包含点选验证码识别

吴秋霖的博客 2654

Captcha must be filled out,解决Kaggle新用户注册无法弹出验证提示的问题

Captcha must be filled out

weixin_46713695的博客 5万+

SRS AV1编码支持:下一代开源视频编码标准应用

你还在为直播带宽成本居高不下而烦恼吗?还在纠结如何在有限带宽下提升视频画质吗?本文将为你介绍SRS(Simple RTMP Server)对AV1编码的支持方案,通过新一代开源视频编码标准,帮助你在降低带宽成本的同时,提供更清晰的视频体验。读完本文,你将了解AV1编码的优势、SRS如何配置AV1支持以及实际应用场景。 ## AV1编码简介 AV1(AOMedia Video 1)是由开放媒体联...

gitblog_01085的博客 884

YOLOv5_DeepSORT_Pytorch训练自己的多目标跟踪模型

1 准备 环境配置:https://blog.youkuaiyun.com/weixin_50008473/article/details/115250986?spm=1001.2014.3001.5501 YOLOv5_DeepSORT_Pytorch代码地址: https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch DeepSORT论文:https://arxiv.org/pdf/1703.07402.pdf 2 训练目标检测模型 训练自己的目标检测模

weixin_50008473的博客 1万+

H265直播省带宽实战:SRS+FFmpeg配置指南与避坑大全

本文详细介绍了如何通过H265编码技术优化直播带宽,结合SRS服务器和FFmpeg的配置指南,提供实战操作步骤与常见问题解决方案。H265相比H264可节省约50%带宽,特别适合4K/8K超高清直播场景,同时涵盖VLC等播放器的兼容性测试与性能优化建议。

gan8painter的博客 183

手把手教你学Simulink——基于电机驱动系统的场景实例:轮毂电机在电动汽车中的分布式驱动控制仿真

本文详细介绍了基于MATLAB/Simulink和Simscape Electrical的电动汽车轮毂电机分布式驱动控制系统建模方法。内容包括系统结构设计(轮毂电机、逆变器、控制器等模块)、完整的建模过程(从基础模块导入到车辆动力学建模)、控制器设计与转矩分配策略实现,以及仿真参数设置与结果分析。通过仿真验证了该分布式驱动系统在速度跟踪、转弯性能等方面的优异表现,为电动汽车驱动系统的研究与开发提供了有效的仿真验证平台。文中还提供了相关代码示例和资料推荐,是学习Simulink电机控制系统建模的实用指南。

MHD0815的博客 4914

推理篇第3节:TensorRT基础——Builder、Engine、ExecutionContext生命周期

TensorRT模型优化与推理流程摘要 TensorRT是NVIDIA的深度学习推理优化器,通过Builder、Engine和ExecutionContext三阶段实现高效推理。Builder负责编译模型,执行图优化和kernel选择;Engine是优化后的推理计划;ExecutionContext管理运行时执行。编译期进行重量级优化(如算子融合、kernel调优),运行时快速执行。TensorRT 10.x引入新API,推荐使用buildSerialized方法。构建流程包括创建Builder、网络定义、

PeterPan的博客 503

SRS 与 ZLMediaKit Docker 镜像对比及 SRS 使用指南

在宿主机创建配置文件srs.conf启动容器时挂载配置:场景推荐方案快速搭建测试用 RTMP 直播流SRS需要接入 RTSP 摄像头或 GB28181 设备ZLMediaKit需要极低延迟直播(< 500ms)SRS(WebRTC)或 ZLMediaKit大规模 CDN 分发SRS开发深度定制的流媒体业务ZLMediaKit纯测试模拟流,不想折腾SRS + FFmpeg Docker 方案。

beishida123的博客 412

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

从零搭建直播回放系统:基于SRS的流媒体录制与点播实践

流媒体技术是支撑现代直播与视频点播服务的核心,其基本原理是通过特定的传输协议(如RTMP、HLS)将音视频数据从源端实时分发至客户端。在技术价值上,它实现了低延迟、高并发的实时互动体验,并衍生出录制回放这一关键应用场景,广泛应用于内容存档、在线教育、企业培训等领域。本文聚焦于直播回放系统的工程实现,详细解析如何利用热门的SRS流媒体服务器与Docker容器化技术,快速构建一个具备自动录制、存储管理和点播播放能力的私有化系统,涵盖从环境部署、功能测试到性能监控的完整实践路径。

weixin_33985679的博客 415

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Docker部署SRS流媒体服务器:从零搭建实时直播系统

实时音视频传输已经成为互联网应用的基础能力,无论是在线教育、直播带货还是视频会议,都依赖于稳定高效的流媒体服务器。SRS作为一款高性能的开源实时视频服务器,支持RTMP、HTTP-FLV、HLS、WebRTC等多种协议,能够实现从推流到分发的完整链路。然而传统编译安装方式依赖多、耗时长,Docker容器化技术则提供了开箱即用的部署体验。通过Docker可以快速拉起SRS服务,简化运维流程,并利用容器隔离特性实现环境一致性。从流媒体分发原理出发,介绍如何利用Docker部署SRS,完成端口规划、配置挂载、推流

weixin_34216107的博客 300

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

开源直播系统架构的隐形战场:如何用FFmpeg和SRS打造抗流量洪峰防线?

本文深入探讨了开源直播系统在高并发场景下的架构设计,重点介绍了如何利用FFmpeg动态码率调节和SRS智能负载均衡技术构建抗流量洪峰的防线。通过实战案例和性能数据,展示了开源技术栈在直播系统中的高效应用,帮助开发者应对突发流量挑战。

time3的博客 117

流媒体服务器选型指南:SRS与MediaMTX深度对比与部署实践

流媒体服务器是实时音视频传输的核心组件,负责接收、分发和协议转换。其原理基于推拉流协议(如RTMP、RTSP、WebRTC)和并发管理,技术价值在于保障低延迟、高并发与跨平台兼容。在直播、安防监控、在线教育等场景中,选型需权衡协议支持、部署复杂度与运维成本。本文围绕SRS和MediaMTX两大热门方案,从架构、协议、性能到实操部署进行深度对比,并提供选型决策框架与调优经验,帮助团队根据业务场景做出合适选择。

weixin_33796205的博客 370
上一篇: 动态dll接口定义的常用规范和载入方法
下一篇: srs开源流媒体服务器中gop_cash是如何实现的?
fripy
博客等级 码龄16年 113粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值