1. 为什么需要双协议推流?
RTMP和RTSP是直播领域最常见的两种流媒体协议,但很多新手往往只熟悉RTMP。我刚开始做直播时也踩过坑,用RTMP推游戏画面到某平台,结果观众反馈延迟高达8秒。后来尝试RTSP协议,延迟直接降到2秒内,这个经历让我意识到协议选择的重要性。
RTMP协议诞生于Adobe公司,采用TCP传输,优势是兼容性极强。几乎所有直播平台都支持RTMP ingest(输入),就像直播界的"普通话"。但它有个致命缺点:延迟通常在5秒以上。我测试过用RTMP推流《英雄联盟》比赛,当主播已经完成三杀时,观众才看到团战开始。
RTSP协议则像直播界的"专业术语",采用UDP传输,天生具备低延迟特性。实测在局域网环境下,RTSP延迟可以控制在500ms以内。去年帮朋友搭建电竞直播系统时,我们就是用RTSP协议实现了主播与观众的实时互动。不过它的缺点是配置复杂,需要额外安装插件。
2. RTMP推流全流程实战
2.1 搭建RTMP服务器
推荐用Nginx搭配RTMP模块搭建服务器,这是我验证过最稳定的方案。在Ubuntu 20.04上实测步骤如下:
# 安装依赖 sudo apt update sudo apt install -y build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev # 下载源码 wget http://nginx.org/download/nginx-1.21.6.tar.gz wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.2.tar.gz # 解压并编译 tar -zxvf nginx-1.21.6.tar.gz tar -zxvf v1.2.2.tar.gz cd nginx-1.21.6 ./configure --add-module=../nginx-rtmp-module-1.2.2 --with-http_ssl_module make sudo make install配置Nginx时有个关键点:在/usr/local/nginx/conf/nginx.conf末尾添加这段:
rtmp { server { listen 1935; chunk_size 4096; application live { live on; record off; # 推流鉴权密钥 publish_notify on; on_publish http://localhost/auth; } } }启动服务后别忘记开防火墙端口:
sudo ufw allow 1935/tcp sudo /usr/local/nginx/sbin/nginx2.2 OBS核心参数配置
在OBS设置界面的"推流"选项卡中,服务类型选择"自定义",服务器地址填:
rtmp://你的服务器IP/live流密钥建议使用复杂字符串,我常用"直播名称_时间戳"的MD5值,比如:
stream_key=$(echo -n "game_$(date +%s)" | md5sum | cut -d' ' -f1)视频编码参数直接影响画质和流畅度。经过多次测试,推荐以下配置:
- 编码器:x264
- 码率控制:CBR
- 比特率:2500Kbps(1080P)
- 关键帧间隔:2秒
- CPU预设:veryfast
音频设置容易被忽视,但影响巨大。建议:
- 采样率:48kHz
- 声道:立体声
- 比特率:160kbps
- 编码器:AAC
3. RTSP推流进阶指南
3.1 插件安装避坑指南
官方插件obs-rtspserver最新版是v2.2.0,但我在Windows 11上实测发现内存泄漏问题。推荐使用v2.1.1稳定版,下载后按以下步骤安装:
- 关闭OBS所有进程
- 将data/obs-plugins复制到OBS安装目录
- 把obs-plugins/64bit下的dll文件复制到对应目录
- 运行regsvr32注册相关组件
常见问题排查:
- 如果启动OBS后看不到RTSP菜单,检查插件目录权限
- 出现端口冲突时,用
netstat -ano|findstr "554"查看占用进程 - 推流卡顿可以尝试修改MTU值:
netsh interface ipv4 set subinterface <ID> mtu=1400
3.2 服务器参数优化
在OBS的"工具→RTSP服务器"设置中,这几个参数需要特别注意:
[Server] Port=8554 Authentication=false EnableMulticast=false [Stream] NamePrefix=live/ EnableVideo=true EnableAudio=true VideoCodec=H264 AudioCodec=AAC实测发现开启鉴权会导致VLC播放异常,建议内网环境关闭。如果必须开启,可以用这个Python脚本生成鉴权头:
import base64 print("Authorization: Basic " + base64.b64encode(b"username:password").decode())4. 双协议性能对比测试
在千兆局域网环境下,我用同一台PC同时推RTMP和RTSP流,测试数据如下:
| 指标 | RTMP | RTSP |
|---|---|---|
| 平均延迟 | 4.2s | 0.8s |
| CPU占用 | 12% | 15% |
| 内存占用 | 180MB | 210MB |
| 抗丢包能力 | 强 | 弱 |
| 最大分辨率 | 4K | 1080P |
测试过程中发现个有趣现象:当网络出现30%丢包时,RTMP画面会卡顿但声音持续,RTSP则直接断流。这是因为TCP会重传丢失的数据包,而UDP直接丢弃。
对于不同场景的协议选择建议:
- 电商直播:RTMP(需要稳定性)
- 游戏直播:RTSP(需要低延迟)
- 教育直播:双协议同时推(主用RTMP,备用RTSP)
5. 常见问题解决方案
推流失败问题:先检查OBS日志(帮助→日志文件),常见错误码:
- 1004:服务器连接失败
- -2:编码器初始化失败
- 500:鉴权错误
我遇到最棘手的是一次RTSP推流花屏问题,最终发现是NVIDIA驱动BUG。解决方案:
- 在OBS快捷方式目标后添加
--disable-gpu - 设置→视频→渲染器改为"Direct3D 11"
- 关闭Windows游戏模式
音画不同步问题:通常由于时间戳错误导致。可以尝试:
- 在来源属性中勾选"使用设备时间戳"
- 高级设置里将"音视频同步"改为"系统时钟"
- 降低视频帧率到30fps
移动端适配技巧:在RTSP服务器配置中添加:
[Adaptive] MobileBitrate=800000 MobileResolution=640x360 MobileFPS=15这样当检测到移动设备时,会自动降低码率和分辨率。实测可节省40%带宽消耗,同时保证画面可接受。