SRS流媒体服务器WebRTC推拉流实战:从零搭建到避坑指南(含Chrome配置)
在实时音视频通信领域,WebRTC技术正以前所未有的速度改变着行业格局。作为开源流媒体服务器的佼佼者,SRS(Simple Realtime Server)凭借对WebRTC的深度支持,成为开发者搭建低延迟直播系统的首选方案。本文将带您从零开始,完整搭建一个支持WebRTC推拉流的SRS服务器环境,并针对Chrome浏览器的特殊配置需求提供详细解决方案。
1. 环境准备与SRS服务器部署
1.1 系统要求与依赖安装
在开始之前,请确保您的系统满足以下基本要求:
- 操作系统:Ubuntu 18.04+/CentOS 7+(推荐Ubuntu 20.04 LTS)
- 内存:至少2GB(4GB以上可获得更好性能)
- 网络:稳定的公网IP地址(NAT环境需额外配置)
安装必要的编译工具和依赖项:
# Ubuntu/Debian系统 sudo apt update && sudo apt install -y git g++ make cmake perl python3 # CentOS/RHEL系统 sudo yum install -y git gcc-c++ make cmake perl python31.2 SRS源码编译与安装
获取最新版SRS源码并编译:
git clone https://github.com/ossrs/srs.git cd srs/trunk ./configure --rtc=on --h265=on --hls=on make -j$(nproc)提示:
--rtc=on参数确保启用WebRTC支持,-j$(nproc)表示使用所有CPU核心加速编译。
编译完成后,验证安装是否成功:
./objs/srs -v # 应输出类似信息:SRS/4.0.263(Leo)2. WebRTC服务器配置详解
2.1 基础配置文件解析
SRS的WebRTC功能主要通过rtc.conf配置文件控制。以下是关键配置项的详细说明:
rtc_server { enabled on; listen 8000; # UDP端口 candidate 192.168.1.100; # 替换为您的公网IP } vhost __defaultVhost__ { rtc { enabled on; rtmp_to_rtc on; # 允许RTMP转WebRTC rtc_to_rtmp on; # 允许WebRTC转RTMP stun_timeout 30; # 会话超时时间(秒) } }关键参数对比表:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| rtmp_to_rtc | bool | off | 启用RTMP转WebRTC能力 |
| rtc_to_rtmp | bool | off | 启用WebRTC转RTMP能力 |
| stun_timeout | int | 30 | ICE候选收集超时时间 |
| nack | bool | on | 启用丢包重传机制 |
| twcc | bool | on | 启用传输层拥塞控制 |
2.2 启动服务器与端口检查
使用以下命令启动SRS服务器:
./objs/srs -c conf/rtc.conf验证必要端口是否开放:
netstat -tulnp | grep -E '1935|8000|8080|1985' # 应显示如下端口监听状态: # tcp6 0 0 :::1935 :::* LISTEN # udp 0 0 0.0.0.0:8000 0.0.0.0:* # tcp6 0 0 :::8080 :::* LISTEN # tcp6 0 0 :::1985 :::* LISTEN3. WebRTC推拉流实战操作
3.1 RTMP推流与WebRTC拉流
首先使用FFmpeg进行RTMP推流测试:
ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency \ -c:a aac -f flv rtmp://your_server_ip/live/stream1通过SRS内置的WebRTC播放器测试拉流:
http://your_server_ip:8080/players/rtc_player.html?stream=stream13.2 WebRTC推流特殊配置
由于浏览器安全策略限制,WebRTC推流需要HTTPS环境或特殊配置。以下是各平台的解决方案:
Windows平台Chrome配置:
- 右键Chrome快捷方式选择"属性"
- 在"目标"字段末尾追加:
--ignore-certificate-errors --unsafely-treat-insecure-origin-as-secure="http://your_server_ip:8080" - 重新启动Chrome
macOS/Linux临时解决方案:
# 使用自签名证书创建本地HTTPS代理 openssl req -x509 -newkey rsa:4096 -nodes -keyout key.pem -out cert.pem -days 365配置Nginx反向代理:
server { listen 443 ssl; server_name your_domain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://localhost:8080; } }4. 常见问题排查与性能优化
4.1 黑屏问题诊断流程
检查ICE候选收集:
// 在浏览器控制台检查ICE状态 pc.oniceconnectionstatechange = e => console.log(pc.iceConnectionState);验证SDP交换:
- 确保offer/answer交换完整
- 检查SDP中的
candidate字段是否包含有效公网IP
网络连通性测试:
# 测试UDP端口连通性 nc -zv -u your_server_ip 8000
4.2 延迟优化参数调整
在rtc.conf中添加以下优化参数:
vhost __defaultVhost__ { rtc { # 降低关键帧间隔 gop_cache off; # 启用UDP传输优化 transport cc on; # 调整Jitter Buffer大小 jitterbuffer_latency 200; } }不同场景下的推荐配置:
| 场景 | gop_cache | transport | jitterbuffer_latency |
|---|---|---|---|
| 视频会议 | off | cc on | 200-300ms |
| 游戏直播 | on | cc on | 100-150ms |
| 教育直播 | off | cc off | 300-500ms |
5. 高级应用场景扩展
5.1 多房间会议系统实现
通过SRS的RESTful API动态管理房间:
# 创建房间 curl -X POST http://localhost:1985/api/v1/rooms -d '{"room":"meeting001"}' # 获取房间列表 curl http://localhost:1985/api/v1/rooms5.2 云端录制与回放
配置录制模块:
vhost __defaultVhost__ { dvr { enabled on; dvr_path /data/rec/[app]/[stream]/[timestamp].flv; dvr_plan session; } }使用FFmpeg进行格式转换:
ffmpeg -i recording.flv -c copy -f mp4 output.mp4在实际项目部署中,我们发现Chrome 94+版本对UDP传输的优化效果显著,配合SRS 4.0的TWCC算法,在跨国传输场景下能将延迟稳定控制在400ms以内。对于企业级应用,建议结合CDN边缘节点部署,进一步降低区域间传输延迟。