1. SRS初识:从零开始搭建流媒体服务器
第一次接触SRS(Simple Realtime Server)是在去年的一次线上直播项目中,当时客户要求搭建一个低延迟的RTMP推流环境。作为一款开源的流媒体服务器,SRS以其轻量级和高性能的特点迅速吸引了我的注意。与Nginx-RTMP相比,SRS在功能完整性和协议支持上有着明显优势,特别是对WebRTC和SRT协议的原生支持,这在当下实时交互场景中尤为重要。
SRS的核心优势在于其模块化设计。主程序仅约10MB大小,但通过灵活的配置可以支持RTMP、HLS、HTTP-FLV、WebRTC等多种流媒体协议。我特别喜欢它的"all-in-one"设计理念——单个二进制文件包含全部功能,无需额外安装依赖库。这对于需要快速部署的生产环境来说简直是福音,还记得第一次用./objs/srs -c conf/srs.conf命令启动服务时,看到控制台输出"start success"的兴奋感。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境部署实战:Ubuntu下的完整安装指南
2.1 系统准备与依赖安装
在Ubuntu 20.04 LTS上部署时,建议先更新系统并安装基础开发工具:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential git
特别提醒:如果服务器位于国内,建议先配置好镜像源。我曾遇到过因网络问题导致编译失败的情况,后来发现是某些依赖包下载超时。可以通过修改/etc/apt/sources.list替换为阿里云或清华源解决。
2.2 源码编译安装
从GitHub克隆最新代码(建议使用4.0分支,稳定性更好):
bash复制git clone -b 4.0release https://github.com/ossrs/srs.git
cd srs/trunk
编译时有个关键细节:默认配置会启用所有功能模块,如果只需要基础RTMP功能,可以通过--with-rtmp-only参数精简编译:
bash复制./configure --with-rtmp-only && make
注意:生产环境建议使用Release模式编译,添加
--release参数可以优化性能。我在测试环境曾用Debug模式运行,当并发量超过500时CPU占用明显偏高。
2.3 服务配置与管理
核心配置文件conf/srs.conf需要重点关注几个参数:
nginx复制listen 1935; # RTMP默认端口
max_connections 1000; # 最大连接数
daemon on; # 守护进程模式
启动服务后,强烈建议配置systemd管理:
bash复制sudo cp ~/srs/trunk/usr/lib/systemd/system/srs.service /etc/systemd/system/
sudo systemctl enable --now srs
3. 推流与拉流全流程解析
3.1 RTMP推流实战
使用OBS推流时,服务器地址格式为:
code复制rtmp://[服务器IP]/live/[流名称]
关键验证步骤:
- 在OBS设置中填写正确的推流密钥
- 检查SRS日志确认流已接入
- 通过
netstat -tulnp | grep 1935确认端口监听正常
常见问题排查:
- 若出现"connect failed",先检查防火墙设置
- 推流延迟高时可调整OBS的输出码率和关键帧间隔
- 我曾遇到音频编码不兼容的情况,将AAC改为MP3后解决
3.2 多协议拉流方案对比
SRS支持三种主流播放协议:
- HTTP-FLV(推荐)
- 地址格式:
http://[IP]:8080/live/[流名].flv - 延迟约1-3秒,兼容性好
- 地址格式:
- HLS
- 地址格式:
http://[IP]:8080/live/[流名].m3u8 - 延迟通常5-10秒,适合点播
- 地址格式:
- WebRTC
- 需要HTTPS环境
- 延迟可控制在500ms内
实测数据对比(同一直播流):
| 协议类型 | 平均延迟 | CPU占用 | 兼容性 |
|---|---|---|---|
| HTTP-FLV | 1.8s | 12% | 高 |
| HLS | 7.2s | 8% | 最高 |
| WebRTC | 0.4s | 22% | 中 |
4. 生产环境调优经验
4.1 性能优化参数
在conf/srs.conf中添加以下配置可显著提升性能:
nginx复制worker_processes auto; # 自动匹配CPU核心数
events {
worker_connections 10240;
}
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
内存管理技巧:
- 对于长时间运行的直播,建议设置
chunk_size 4096减少内存碎片 - 当出现内存持续增长时,可以启用
grace_final_wait off快速释放资源
4.2 高可用方案
我设计的双机热备方案:
- 主备服务器均部署SRS
- 使用Nginx做负载均衡和故障转移
- 通过keepalived实现VIP漂移
关键配置示例(Nginx部分):
nginx复制upstream srs_cluster {
server 192.168.1.100:1935;
server 192.168.1.101:1935 backup;
}
server {
listen 1935;
proxy_pass srs_cluster;
}
4.3 监控与日志分析
SRS内置了HTTP API,可以通过http://[IP]:1985/api/v1/获取实时数据。我常用的几个端点:
/versions查看版本信息/summaries获取摘要统计/clients查看当前连接客户端
日志分析技巧:
bash复制# 查找错误日志
grep -E "error|fail" ./objs/srs.log
# 统计推流IP
awk '/RTMP publish/{print $8}' ./objs/srs.log | sort | uniq -c
5. 进阶功能探索
5.1 WebRTC低延迟方案
启用WebRTC需要额外配置:
nginx复制rtc_server {
enabled on;
listen 8000; # UDP端口
candidate $CANDIDATE_IP;
}
前端播放器推荐使用官方srs-player:
html复制<script src="//cdn.jsdelivr.net/npm/srs-player@1.0.7"></script>
<srs-player rtc_url="webrtc://[IP]/live/[流名]"></srs-player>
5.2 云端部署实践
在AWS EC2上部署时需要注意:
- 安全组需开放1935(TCP)、8000-9000(UDP)端口
- 实例类型建议选择计算优化型(如c5.large)
- EBS存储需要至少50GB空间用于日志和录像
我曾用t3.small实例测试,当并发超过200时会出现明显的性能瓶颈。后来切换到c5.xlarge后,即使800并发也能稳定运行。
5.3 SRS集群方案
大规模应用需要考虑集群部署,SRS支持边缘-源站架构:
- 源站服务器处理推流和转码
- 边缘节点分布在不同区域负责分发
- 通过HTTP API实现动态调度
典型集群配置示例:
nginx复制# 源站配置
origin_cluster {
mode remote;
origin 127.0.0.1:1935;
}
# 边缘节点配置
edge_cluster {
mode local;
origin [源站IP]:1935;
}
6. 踩坑记录与解决方案
6.1 时间戳异常问题
现象:播放时出现音画不同步
根因:某些摄像头推流时携带了错误的时间戳
解决方案:
- 在SRS配置中启用
mix_correct on - 或使用FFmpeg中转时添加
-use_wallclock_as_timestamps 1
6.2 内存泄漏排查
曾遇到连续运行7天后内存耗尽的情况,通过以下步骤定位:
- 使用
valgrind --tool=memcheck检测 - 发现是HLS切片缓存未及时释放
- 通过设置
hls_cleanup on和hls_window 300解决
6.3 跨域访问问题
Web端播放时出现CORS错误,需要添加HTTP头:
nginx复制http_server {
crossdomain on;
headers {
"Access-Control-Allow-Origin" "*";
"Access-Control-Allow-Methods" "GET,POST,OPTIONS";
}
}
7. 生态工具链整合
7.1 与FFmpeg配合使用
常用转码命令示例:
bash复制ffmpeg -i rtsp://[摄像头IP] -c:v libx264 -preset ultrafast \
-f flv rtmp://[SRS-IP]/live/stream1
7.2 监控系统集成
Prometheus监控配置:
yaml复制scrape_configs:
- job_name: 'srs'
metrics_path: '/api/v1/summaries'
static_configs:
- targets: ['[SRS-IP]:1985']
7.3 录制与点播方案
启用录制功能:
nginx复制vhost __defaultVhost__ {
dvr {
enabled on;
dvr_path ./objs/nginx/html/[app]/[stream]/[timestamp].flv;
}
}
8. 版本升级与迁移
从3.0升级到4.0的注意事项:
- 配置文件语法有变化,需要转换
- HTTP API端点路径调整
- 新增的WebRTC模块需要额外依赖
建议的升级步骤:
- 在新服务器部署新版本
- 使用Nginx做流量切换
- 并行运行一段时间后下线旧服务
9. 安全加固措施
9.1 鉴权配置
RTMP推流鉴权示例:
nginx复制vhost __defaultVhost__ {
security {
enabled on;
allow publish [客户端IP];
secret my_password;
}
}
9.2 HTTPS配置
生成证书并配置:
bash复制openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout server.key -out server.crt
SRS配置:
nginx复制http_server {
https {
enabled on;
listen 443;
key ./server.key;
cert ./server.crt;
}
}
10. 性能基准测试
在我的测试环境中(8核16G云服务器):
- RTMP推流:单进程支持1200+并发
- HTTP-FLV播放:2000+并发时CPU占用约65%
- 内存占用:每1000连接约消耗1.2GB
压力测试方法:
bash复制# 使用srs-bench工具
./sb_rtmp_publish -i [输入文件] -c 100 -r rtmp://[IP]/live/test
测试结果分析要点:
- 关注
connect time和first packet time - 当出现超时时检查网络延迟
- 高并发下注意观察系统负载均衡情况
