结合OBS与MediaMTX实现SRT直播推流完整指南
本文将详细介绍如何结合OBS Studio和MediaMTX(原rtsp-simple-server)实现高性能、低延迟的SRT直播推流解决方案,适用于专业直播、远程制作等场景。
一、系统架构与优势
1. 整体架构
2. 核心优势
- 超低延迟:SRT协议实现<200ms端到端延迟
- 抗丢包能力:前向纠错(FEC)保障30%丢包下流畅传输
- 安全加密:AES-128/256加密支持
- 多协议输出:同时输出SRT/RTMP/HLS/WebRTC
二、环境准备
1. 硬件要求
- 推流端:支持x264/x265编码的CPU(Intel i5+)
- 服务器:4核CPU/8GB RAM/100Mbps带宽
- 网络:建议固定IP或DDNS服务
2. 软件安装
OBS Studio (推流端)
# Ubuntu
sudo add-apt-repository ppa:obsproject/obs-studio
sudo apt update
sudo apt install obs-studio
# Windows
下载 https://obsproject.com/download
MediaMTX (服务器)
# Linux
wget https://github.com/mediamtx/mediamtx/releases/latest/download/mediamtx_linux_amd64.tar.gz
tar -xvzf mediamtx_linux_amd64.tar.gz
sudo mv mediamtx /usr/local/bin/
# Windows
下载 https://github.com/mediamtx/mediamtx/releases
三、MediaMTX服务器配置
1. 基础配置文件 (mediamtx.yml
)
# 监听端口配置
rtmp: disable
rtsp: disable
srt:
enabled: yes
address: :8890 # SRT监听端口
# 路径配置
paths:
obs_stream: # 推流路径名称
srtPublish: yes
srtRead: yes
# 安全设置
publishUser: obs_user
publishPass: "secure_password"
# 转码输出
ffmpeg: ffmpeg -i srt://localhost:8890?streamid=read/obs_stream \
-c:v copy -c:a copy -f flv rtmp://localhost/live/obs_stream \
-c:v libx264 -preset fast -f hls /var/www/hls/obs_stream.m3u8
2. 高级配置选项
paths:
obs_stream:
# SRT参数优化
srtLatency: 200 # 延迟200ms
srtPassphrase: "encryption_key" # AES加密密钥
srtPbkeylen: 32 # 256位加密
# 录制功能
record: yes
recordPath: /recordings/obs_stream_$YYYY$MM$DD.ts
# WebRTC输出
webrtc: yes
webrtcICEServers:
- url: stun:stun.l.google.com:19302
3. 启动服务器
# Linux后台运行
nohup mediamtx /path/to/mediamtx.yml > /var/log/mediamtx.log 2>&1 &
# Windows
mediamtx.exe mediamtx.yml
四、OBS推流配置
1. 安装SRT输出插件
- 下载OBS SRT插件:https://github.com/occ-ai/obs-srt-plugin/releases
- 将下载的
obs-srt-plugin.dll
放入OBS安装目录的obs-plugins\64bit
文件夹
2. OBS推流设置
-
设置 > 输出:
- 输出模式:高级
- 流类型:自定义流媒体服务器
-
SRT参数配置:
服务器: srt://your-server-ip:8890 流密钥: ?streamid=publish/obs_stream # 高级参数 Latency: 200 Passphrase: encryption_key PBKeyLen: 32
-
编码设置:
- 编码器:x264或NVENC
- 码率:4000-8000 Kbps (1080p)
- 关键帧间隔:2秒
- 预设:veryfast或ultrafast
3. 推流优化技巧
-
网络自适应:
- 启用OBS的"动态码率"
- 设置最大比特率偏移:20%
-
SRT参数调优:
# OBS高级设置 TLPKTDrop: yes OheadBW: 25
-
硬件加速:
- NVIDIA显卡:启用NVENC编码
- Intel CPU:使用QSV加速
五、播放端配置
1. 专业播放器拉流
VLC:
srt://server-ip:8890?streamid=read/obs_stream&passphrase=encryption_key
FFplay:
ffplay -fflags nobuffer -i "srt://server-ip:8890?streamid=read/obs_stream"
2. 网页播放器集成
<!-- WebRTC播放 -->
<video id="webrtc-player" controls></video>
<script>
const pc = new RTCPeerConnection({
iceServers: [{ urls: "stun:stun.l.google.com:19302" }]
});
pc.ontrack = e => video.srcObject = e.streams[0];
fetch('http://server-ip:8889/obs_stream/whep', {
method: 'POST',
headers: { 'Content-Type': 'application/sdp' }
})
.then(res => res.text())
.then(sdp => pc.setRemoteDescription({ type: 'offer', sdp }))
.then(() => pc.createAnswer())
.then(answer => pc.setLocalDescription(answer))
.then(() => fetch('http://server-ip:8889/obs_stream/whep', {
method: 'POST',
body: pc.localDescription.sdp,
headers: { 'Content-Type': 'application/sdp' }
}));
</script>
3. 移动端播放
Android (ExoPlayer):
Uri srtUri = Uri.parse("srt://server-ip:8890?streamid=read/obs_stream");
MediaItem mediaItem = new MediaItem.Builder()
.setUri(srtUri)
.setMimeType(MimeTypes.APPLICATION_SRT)
.build();
player.setMediaItem(mediaItem);
player.play();
iOS (FFmpegKit):
let session = FFmpegKit.execute("-i srt://server-ip:8890?streamid=read/obs_stream -c:v copy -c:a copy -f mpegts -")
六、高级功能实现
1. 多路径推流
# mediamtx.yml
paths:
main_stream:
srtPublish: yes
# ...其他配置
backup_stream:
srtPublish: yes
# 备用流配置
2. 集群部署
# 边缘节点配置
paths:
obs_stream:
source: srt://origin-server:8890?streamid=read/obs_stream
sourceOnDemand: yes
3. 云端录制
paths:
obs_stream:
record: yes
recordPath: s3://my-bucket/recordings/$YYYY-$MM-$DD/$NAME.mp4
recordStorage: aws
awsAccessKey: "AKIA..."
awsSecretKey: "secret"
七、监控与诊断
1. MediaMTX控制台
访问 http://server-ip:9999
查看:
- 活动流状态
- 客户端连接
- 带宽使用
2. SRT性能监控
# 使用srt-live-transmit
srt-live-transmit srt://server:8890?streamid=read/obs_stats file://con > stats.log
3. 关键指标
// API获取状态: http://server-ip:9999/v3/stats
{
"path": "obs_stream",
"bytes": 12568742,
"clients": 3,
"srt": {
"latency": 185,
"loss": 0.2,
"retrans": 15
}
}
八、安全加固
1. 防火墙配置
# 开放必要端口
sudo ufw allow 8890/tcp # SRT
sudo ufw allow 8889/tcp # WebRTC API
sudo ufw allow 9999/tcp # 管理界面
2. TLS加密
srt:
enabled: yes
address: :8890
tlsCert: /path/to/cert.pem
tlsKey: /path/to/key.pem
3. 访问控制
paths:
obs_stream:
publishIPs: [192.168.1.0/24, 10.0.0.0/8]
readIPs: ["172.16.0.0/12"]
九、典型问题解决
问题 | 排查步骤 | 解决方案 |
---|---|---|
OBS连接失败 | 1. 检查端口开放 2. 验证流密钥 3. 查看MediaMTX日志 | 开放8890端口,确认streamid格式 |
高延迟(>500ms) | 1. 网络路由检测 2. SRT缓冲区分析 3. 编码延迟 | 调整latency参数,启用FEC |
画面卡顿 | 1. 带宽监测 2. 丢包率统计 3. CPU负载 | 降低码率,启用前向纠错 |
音画不同步 | 1. 时间戳检查 2. 解码器设置 3. 缓冲区配置 | 设置sync_level=1,调整缓冲区 |
十、性能优化建议
1. 网络优化
# MediaMTX配置
srt:
oheadbw: 25 # 25%带宽预留
maxbw: 10000000 # 10Mbps限制
2. 编码优化
- OBS使用NVENC/QSV硬件编码
- 关键帧间隔设为2秒
- 启用B帧(0-2个)
3. 自适应码率
# 使用srt-xtransmit
srt-xtransmit srt://server:8890?streamid=publish/obs_stream \
-b:min 1000k -b:max 8000k -b:step 500k
总结
通过OBS Studio与MediaMTX的结合,我们实现了:
- 超低延迟传输:SRT协议保障<200ms端到端延迟
- 专业级可靠性:前向纠错抗30%丢包
- 多协议输出:同时支持SRT/RTMP/HLS/WebRTC
- 企业级安全:AES加密+IP白名单+访问控制
实际部署建议:
- 生产环境使用TLS加密传输
- 配置DDOS防护和带宽限制
- 启用云端录制和自动备份
- 部署监控告警系统(Prometheus+Alertmanager)
此方案已成功应用于:
- 体育赛事远程制作
- 新闻现场直播
- 企业云制播系统
- 教育直播课堂
通过合理调优,可支持100+并发高清流传输,满足专业级直播制作需求。