如何实现带宽速度测试的功能?看看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

tecplot 通过数据点、坐标点绘制云图、三维云图

使用坐标点绘制二维云图或三维云图

medicalmask的博客 3万+

大模型辅助意图识别,更懂你的客户洞察平台

通过大量的学习和训练,大模型不仅具备庞大的知识库,更掌握着丰富的语言模式和语义规则,能够精准地理解每一段对话的含义,为每一通对话进行全面、准确的标注。主要来自客户的行为信息,将客户与机构的重要时刻以时间轴的方式呈现出来,掌握客户生命周期的完整脉络,识别一些容易被忽略的重要营销MOT(Moment Of Truth,关键时刻研究)机会,提示理财经理跟进处理。将客户的历史交易数据和埋点系统采集的客户行为数据结合起来,辅以部分内容资讯的偏好探测,综合分析和预测客户在各个维度的喜好程度,实现千人千面的客户推送。

Dezhuzhineng的博客 2161

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

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

郎涯技术 1690

电力电子新手必看:COT控制模式的工作原理与典型应用场景解析

本文深入解析了COT控制模式的工作原理及其在电力电子领域的典型应用。COT控制(恒定导通时间控制)通过固定导通时间机制,解决了传统滞环控制的问题,特别适用于需要快速瞬态响应和高效率的应用场景,如CPU/GPU供电和便携设备电源管理。文章详细介绍了COT控制的核心流程、技术特点及设计实践中的关键考量,帮助电力电子新手快速掌握这一技术。

weixin_30745553的博客 522

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

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

weixin_35724794的博客 1674

Oracle 19c RAC安装踩坑实录:OpenSSH 8.x版本与OUI的“兼容性战争”及一劳永逸的解决思路

本文深入解析Oracle 19c RAC在Linux8环境中部署时遇到的OpenSSH 8.x版本兼容性问题,特别是[INS-06006]错误的根源与解决方案。从协议层分析冲突本质,提供SCP包装器技术、官方补丁应用指南及现代化部署体系构建三种解决方案,帮助企业高效完成RAC安装并规避类似问题。

weixin_42648844的博客 458

避坑指南:ZYNQ平台上AXI 1G/2.5G Ethernet Subsystem实现IEEE1588的5个关键点

本文详细解析了在ZYNQ平台上使用AXI 1G/2.5G以太网子系统实现IEEE1588精密时间协议(PTP)的5个关键避坑点。从硬件选型、Vivado工程配置到Linux驱动适配,提供了实战经验与优化技巧,帮助工程师在工业自动化、电力系统等场景中实现纳秒级时间同步。

weixin_30687051的博客 236

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

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

gitblog_01085的博客 884

C#上位机+YOLO入门:工业视觉检测最小demo(复制就能跑,附完整代码)

新手入门C#上位机+YOLO,最忌讳的是上来就追求“大而全”,结果卡在某个外围功能上,连核心逻辑都没搞懂。这个最小demo的目的就是让大家先掌握“图像预处理→模型推理→结果解析”的核心链路,后续再逐步添加工业场景的功能,这样学习效率会高很多。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 728

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

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

gan8painter的博客 183

C#项目实战——【实例】企业人事管理系统(二):4、数据库与数据表设计;5、创建项目;

(1)展开新建的db_PWMS数据库节点,选中“表”节点,单击鼠标右键,在弹出的快捷菜单中选择“新建表”命令,如下图:(2)在SQL Server 2008管理器的右边显示一个新表,这里输入要创建的表中所需要的字段,并设置主键,如下图:(3)单击“保存”按钮,弹出“选择名称”对话框,如下图,输入要新建的表名“tb_Login”,单击“确定”按钮,即可在数据库中添加一个表。

做有价值的事,积累有价值的笔记! 1621

数字电视中的 Closed Caption (CC) 字幕标准协议

本文将详细介绍 DVB中的 CC 字幕标准协议,包括数据结构格式、字段定义、字段占用比特数以及字段用途。此外,本文还将举例说明如何从 TS 传输流中解析 CC 字幕信息,并组织打包到电视节目中进行显示。

以实战经验介绍行业知识 670

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

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

beishida123的博客 411

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

weixin_33985679的博客 415

IDEA的使用指南

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

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

weixin_34216107的博客 300

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

开源直播系统架构的隐形战场:如何用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、付费专栏及课程。

余额充值