在当今数字化时代,流媒体技术已成为日常生活的重要组成部分。无论是娱乐、教育还是商业领域,直播都发挥着重要作用。而SRS作为一款国产开源的高性能流媒体服务器,正成为构建直播平台的首选。

1. SRS流媒体服务器概述

SRS(Simple RTMP Server)是一款开源的实时视频服务器,专门用于流媒体直播和点播应用。它支持多种流媒体协议,包括RTMPWebRTCHLSHTTP-FLVSRTMPEG-DASHGB28181等。

SRS采用典型的发布(推流)和订阅(播放)服务器模型,与FFmpeg、OBS、VLC、WebRTC等客户端配合使用,提供音视频流的接收和分发能力。

作为一款国产开源项目,SRS在国内外得到了广泛的应用,具有高性能、低延迟、易扩展等特点,适用于各种规模的流媒体应用。

2. SRS的核心功能与特性

SRS的强大功能使其成为流媒体领域的佼佼者:

  • 多协议支持:支持RTMP、WebRTC、HLS、HTTP-FLV、SRT等主流流媒体协议,满足不同场景的需求
  • 协议转换:支持互联网广泛应用的音视频协议转换,比如可以将RTMP或SRT转成HLS或HTTP-FLV或WebRTC等协议
  • 高性能:采用高效的事件驱动架构,能够处理大量并发连接,适合生产环境部署
  • 低延迟:针对实时通信场景优化,支持WebRTC等低延迟协议,延迟可达500毫秒以下
  • 运营级:提供完整的API接口和配置选项,方便开发者根据实际需求进行定制和优化

3. SRS的安装与配置

3.1 环境准备与依赖安装

以Linux环境(如华为欧拉系统)为例,首先安装SRS所需的依赖包:

# 更新系统包
yum update

# 安装SRS依赖
yum install git
yum install patch

3.2 下载与编译SRS

执行以下命令从Gitee下载SRS源码并编译:

# 进入源码目录
cd /usr/local/src

# 从gitee下载SRS源码(使用develop分支)
git clone -b develop https://gitee.com/ossrs/srs.git

# 进入SRS主干源码目录
cd srs/trunk

# 配置SRS
./configure

# 编译SRS
make

命令执行完毕后,SRS的可执行程序srs将在srs/trunk/obj目录下生成。

3.3 配置与启动SRS

SRS有多个配置文件,根据不同的协议和使用场景选择合适的配置:

# 进入配置目录
cd /usr/local/src/srs/trunk/conf

编辑配置文件srs.conf,在vhost __defaultVhost__部分添加关键配置:

vhost __defaultVhost__ {
    # 开启缓存关键帧
    gop_cache on;
}

注意gop_cache一定要设置为on,否则客户端拉流找不到关键帧就无法渲染画面。

启动SRS服务:

# 进入SRS主干目录
cd /usr/local/src/srs/trunk

# 启动SRS服务
./objs/srs -c conf/srs.conf

检查服务是否正常启动,确认以下端口是否开启:

  • 1935端口:用于RTMP协议,访问"rtmp://"开头的直播地址需要
  • 8080端口:用于HTTP协议,访问"http://"开头的直播地址需要

4. SRS多协议实战

4.1 RTMP协议推拉流

RTMP(Real-Time Messaging Protocol)是Adobe推出的流媒体协议,虽然它是较早期的协议,但仍然被广泛使用。

使用FFmpeg进行RTMP推流:

ffmpeg -re -stream_loop -1 -i "/usr/local/src/test/2018s.mp4" -vcodec h264 -f flv rtmp://127.0.0.1/live/test

参数说明:

  • -re:以原生帧率读取输入
  • -stream_loop -1:无限循环输入视频
  • -i:指定输入文件路径
  • -vcodec h264:使用H264视频编码器
  • -f flv:指定输出格式为FLV

注意:SRS不支持RTSP推流,只支持RTMP推流。

使用VLC播放器进行拉流测试,可以使用以下任一地址:

  • RTMP地址:rtmp://服务器IP/live/test
  • HTTP-FLV地址:http://服务器IP:8080/live/test.flv
  • HLS地址:http://服务器IP:8080/live/test.m3u8

需要把上述地址中的"服务器IP"替换为流媒体服务器实际的公网地址。

4.2 SRT协议推拉流

SRT(Secure Reliable Transport)是一种新兴的开源流媒体传输协议,专注于安全可靠的流传输,特别适合在不稳定的网络环境中使用。

SRS在编译和启动时默认支持SRT,查看SRS专用于SRT服务的配置文件srt.conf,可以找到SRT部分的配置信息:

srt_server {
    enabled on;
    listen 10080;
    maxbw 1000000000;
    connect_timeout 4000;
    peerlatency 0;
    recvlatency 0;
    latency 0;
    tsbpdmode off;
    tlpktdrop off;
    sendbuf 2000000;
    recvbuf 2000000;
}

从配置中可见,SRS默认把10080端口分配给SRT协议。

启动SRT协议的SRS流媒体服务器:

cd /usr/local/src/srs/trunk
./objs/srs -c conf/srt.conf &

使用FFmpeg进行SRT推流:

ffmpeg -re -stream_loop -1 -i "/usr/local/src/test/cctv5.ts" -c copy -f mpegts 'srt://127.0.0.1:10080?streamid=#!::r=live/test,m=publish'

注意:SRS对SRT源文件的封装格式有要求,不仅要求源文件为ts格式,还要求推流格式也为ts格式,所以ffmpeg命令中添加了"-f mpegts"表示转换成mpeg的ts流格式。

使用ffplay进行SRT拉流:

ffplay -i 'srt://服务器IP:10080?streamid=#!::r=live/test,m=request'

SRT地址中的参数说明:

  • r=live/test:表示SRT的服务名称叫做"live/test"
  • m=publish:表示该地址用于推流
  • m=request:表示该地址用于拉流

4.3 WebRTC推拉流

WebRTC(Web Real-Time Communication)是一种支持实时音视频通信的开放标准,它允许在浏览器之间直接建立点对点连接,实现低延迟、高质量的音视频传输。

将SRS流媒体服务器与WebRTC技术相结合,可以实现更加灵活、高效的流媒体传输。具体架构中,SRS可以作为信令服务器,负责处理WebRTC连接的建立和管理;而WebRTC则负责实际的音视频数据传输。

实现WebRTC推拉流的基本步骤:

  1. 搭建SRS流媒体服务器:安装并配置SRS服务器,参考SRS官方文档进行WebRTC相关配置

  2. 集成WebRTC:在Web应用中集成WebRTC功能,可以使用WebRTC的JavaScript库(如adapter.js)

  3. 信令交互:在SRS和WebRTC之间建立信令交互机制,可以通过WebSocket、HTTP等协议实现

  4. 推拉流操作:通过WebRTC进行音视频数据的推拉流操作

5. SRS生产环境配置

5.1 关键配置优化

在生产环境中,需要针对SRS进行一系列优化配置:

GOP缓存配置
GOP(Group of Pictures)缓存是影响播放体验的关键配置。在配置文件中确保开启GOP缓存:

vhost __defaultVhost__ {
    gop_cache on;
}

日志配置
合理的日志配置对生产环境至关重要:

srs_log_tank file;
srs_log_file ./objs/srs.log;
srs_log_level trace;

5.2 负载均衡与集群

当业务超过单台流媒体服务器的承受能力时,就会遇到负载均衡问题。SRS支持多种负载均衡策略:

基于DNS的负载均衡:通过DNS轮询或HTTP-DNS实现流媒体服务器的服务发现

边缘-源站架构:采用分层架构,边缘节点从源站拉流,减轻源站压力

端口重用(REUSEPORT):通过多进程方式增加节点的负载而不会增加层

负载均衡需要考虑的关键指标:

  • CPU消耗:直播场景一般属于IO密集型场景,CPU一般不会首先成为瓶颈;而在RTC中却是IO和计算都很密集
  • 网络带宽:传输流媒体时需要消耗网络带宽,是IO密集型场景的主要瓶颈
  • 磁盘IO:如果开启录制和HLS功能,磁盘将成为关键瓶颈
  • 内存消耗:相对而言,内存是流媒体服务器中消耗较少的资源

5.3 监控与维护

建立完善的监控体系对生产环境至关重要:

关键监控指标

  • 系统资源:CPU使用率、内存使用、磁盘IO、网络带宽
  • SRS特定指标:连接数、推流数、拉流数、消息队列长度
  • 业务指标:推流成功率、延迟、卡顿率

日志分析
定期分析SRS日志,识别异常模式和性能瓶颈。

6. SRS性能优化

6.1 资源优化策略

针对SRS服务器的资源优化,需要考虑以下方面:

CPU优化

  • 对于直播场景,SRS是单核架构,最多使用100%CPU
  • 监控系统总CPU和SRS进程CPU,超过80%认为过载
  • 考虑使用多台服务器分流负载

网络带宽优化

  • 监控服务器出口带宽使用情况
  • 根据客户端网络状况自适应调整码率
  • 使用边缘节点分散带宽压力

磁盘优化

  • 如需录制和HLS,考虑使用内存盘暂存文件
  • 定期清理过期日志和录制文件
  • 避免挂载网络磁盘,防止STW(世界暂停)问题

内存优化

  • 监控内存使用,防止泄露
  • 合理配置缓存大小,平衡内存和CPU使用

6.2 流媒体特定优化

连接管理

  • 合理配置超时时间,避免僵尸连接
  • 优化连接建立和断开流程

协议选择策略

  • 低延迟场景:优先使用WebRTC或SRT协议
  • 兼容性要求高:使用RTMP或HTTP-FLV
  • 移动端适配:使用HLS或MPEG-DASH

7. 常见问题与解决方案

7.1 推流问题

推流失败

  • 检查SRS服务是否正常运行
  • 确认防火墙设置,开放1935(RTMP)、10080(SRT)等端口
  • 验证推流地址格式是否正确

推流不稳定

  • 检查网络带宽是否足够
  • 调整FFmpeg参数,降低码率或帧率
  • 检查源视频格式是否兼容

7.2 拉流问题

无法播放

  • 确认GOP缓存已开启(gop_cache on)
  • 检查拉流地址是否正确
  • 验证客户端支持的协议格式

播放卡顿

  • 检查服务器带宽是否充足
  • 调整GOP大小,减少关键帧间隔
  • 优化视频编码参数

7.3 性能问题

高并发下服务不稳定

  • 考虑部署边缘节点分担负载
  • 优化系统内核参数
  • 增加服务器资源或实例数

延迟过高

  • 选择低延迟协议如WebRTC或SRT
  • 调整缓冲区大小,平衡延迟和流畅性
  • 优化网络路径,减少中间环节

8. 实际应用案例

8.1 在线教育直播平台

在线教育场景对直播的实时性和互动性要求较高,可以采用SRS+WebRTC方案:

  • 教师端使用OBS或自定义推流软件进行推流
  • SRS负责流转发和协议转换
  • 学生端通过Web浏览器使用WebRTC观看,实现低延迟互动
  • 同时生成HLS录制文件,供回放使用

8.2 大型活动直播

对于大型活动直播,需要高并发和稳定性:

  • 采用边缘-源站分层架构,通过多个边缘节点分散压力
  • 使用SRT协议进行远距离推流,保证传输稳定性
  • 多CDN分发,提高不同地区的观看体验
  • 实时监控各节点状态,动态调整负载

8.3 监控视频流传输

监控场景对实时性和可靠性要求高:

  • 使用GB28181协议接入监控设备
  • SRS进行协议转换和流分发
  • 关键视频使用SRT协议传输,防止网络波动影响
  • 集成智能分析算法,实时识别异常情况

结语

SRS作为一款功能强大、性能优异的开源流媒体服务器,为各种直播场景提供了可靠的解决方案。通过本文的介绍,相信读者已经对SRS有了全面的了解,能够从零开始搭建和优化SRS流媒体服务。

随着5G和AI技术的发展,流媒体技术将在更多领域发挥重要作用。掌握SRS这一强大工具,将为你在流媒体领域的开发和工作提供有力支持。不断实践和探索,逐步深入理解SRS的各项高级特性和优化技巧,最终打造出稳定、高效、满足业务需求的流媒体平台。

更多推荐