直播推流完整指南:RTMP/SRT/WebRTC三大协议对比与OBS实战配置
想做B站直播,不知道OBS怎么配;企业活动要直播,纠结自建还是用云服务;互动直播延迟太高,被观众吐槽;跨地域直播推流不稳,画面经常卡。直播推流这事,技术栈比想象的复杂。今天就把三大协议、OBS配置、服务器搭建、调优技巧一锅端。
直播推流的核心流程
直播推流本质是 音视频采集 → 编码 → 网络传输 → 服务器分发 → 观众播放 的链路:
- 采集:摄像头、麦克风、屏幕、视频文件等
- 编码:H.264/H.265视频 + AAC音频
- 封装:FLV(RTMP)、TS(SRT)、MP4(WebRTC)等
- 推流:通过RTMP/SRT/WebRTC协议发送到流媒体服务器
- 服务器处理:转码(可选)、录制、转协议(如RTMP转HLS)
- 分发:CDN或自建节点
- 播放:观众通过HLS、FLV、WebRTC等协议拉流播放
关键瓶颈在两个地方: 推流端的网络上行带宽 + 服务器的处理能力。前者影响画面质量,后者影响观众数量。
三大推流协议横向对比
| 协议 | 推出年份 | 典型延迟 | 抗丢包 | 编码格式 | 服务端复杂度 | 适用场景 |
|---|---|---|---|---|---|---|
| RTMP | 2002 | 2-5秒 | 一般 | H.264/AAC | 低 | 平台推流标准 |
| SRT | 2017 | 0.5-2秒 | 强 | 任意 | 中 | 跨地域传输 |
| WebRTC | 2011 | 0.1-0.5秒 | 强 | VP8/VP9/H.264 | 高 | 互动直播、连麦 |
RTMP:老牌但仍是主流
RTMP(Real-Time Messaging Protocol)是Adobe为Flash开发的协议,Flash已死但RTMP还活着。原因:
- 生态成熟:B站、斗鱼、虎牙、YouTube、Twitch等几乎所有直播平台都支持RTMP推流
- 实现简单:FFmpeg、OBS、XSplit等推流软件默认支持
- 延迟可接受:2-5秒对大部分直播够用
缺点:
- 基于TCP:抗丢包差,弱网环境下卡顿明显
- Adobe已停止维护:协议本身不再演进
- 生态逐渐老化:新协议(SRT、WebRTC)正在替代
结论: 推流到第三方平台,RTMP还是首选。自己做直播系统,可以考虑SRT。
SRT:抗丢包的低延迟选择
SRT(Secure Reliable Transport)是Haivision 2017年开源的传输协议,专为视频流设计:
- 基于UDP:抗丢包强,弱网表现好
- 低延迟:0.5-2秒,比RTMP低
- 加密传输:内置AES-128/256加密
- 跨地域友好:长距离传输延迟稳定
缺点:
- 生态不如RTMP:第三方平台支持有限
- 需要专门服务器:SRT服务器软件(如SRT Live Server)
结论: 适合企业直播、跨地域制作、不稳定网络环境。日常推B站还是用RTMP。
WebRTC:超低延迟的实时通信
WebRTC(Web Real-Time Communication)是Google主导的浏览器实时通信协议:
- 极低延迟:0.1-0.5秒,唯一能做互动直播的协议
- 浏览器原生支持:Chrome、Firefox、Safari、Edge无需插件
- P2P能力:小规模直播可以点对点传输,省服务器
缺点:
- 服务端复杂:需要SFU(Selective Forwarding Unit)服务器,如Janus、mediasoup
- 协议生态碎片化:各家实现略有差异
- 不适合大规模分发:万级观众需要专门CDN支持
结论: 互动直播、连麦、视频会议首选。万人观看的直播还是HLS/FLV分发更稳。
OBS推流配置详解
OBS Studio 是最流行的开源直播软件,免费、跨平台、功能强大。
基础设置
设置 → 流:
- 服务:选"自定义"
- 服务器:填平台RTMP地址(如B站:
rtmp://live-push.bilivideo.com/live-bmc/) - 串流密钥:填平台提供的密钥
设置 → 输出:
- 输出模式:选"高级"
- 编码器:NVIDIA NVENC H.264(如有N卡)> AMD HW H.264(如有A卡)> x264(CPU编码)
- 速率控制:CBR(恒定码率,平台推荐)
- 比特率:1080p 30fps → 4000 kbps(参考下面的码率表)
- 关键帧间隔:2(平台要求2秒一个I帧)
- 预设:P4(NVENC)或 veryfast(x264)
- Profile:high
- B帧:2(NVENC)或 0(x264,部分平台要求)
设置 → 视频:
- 基础分辨率:1920x1080(采集分辨率)
- 输出分辨率:1920x1080 或 1280x720
- 缩减过滤:Lanczos(高质量)
- FPS:30 或 60
设置 → 音频:
- 采样率:48 kHz
- 编码器:AAC
- 比特率:128 或 160
推流码率推荐表
| 分辨率/帧率 | 推荐码率(CBR) | 最低上行带宽 |
|---|---|---|
| 720p 30fps | 1800-2500 kbps | 4 Mbps |
| 720p 60fps | 2500-3500 kbps | 5 Mbps |
| 1080p 30fps | 3500-5000 kbps | 7 Mbps |
| 1080p 60fps | 4500-6000 kbps | 9 Mbps |
| 4K 30fps | 8000-15000 kbps | 20 Mbps |
| 4K 60fps | 12000-20000 kbps | 28 Mbps |
注意: 推流码率不能超过上行带宽的70%,否则会卡顿。先用 Speedtest 测上行带宽。
FFmpeg命令行推流
不想用OBS,可以用FFmpeg命令行推流:
# 推流MP4文件到RTMP服务器
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 4000k -maxrate 4000k -bufsize 8000k -pix_fmt yuv420p -g 60 -c:a aac -b:a 128k -ar 48000 -f flv "rtmp://live-push.example.com/live/streamkey"
# 推流屏幕采集到RTMP(Linux)
ffmpeg -f x11grab -framerate 30 -video_size 1920x1080 -i :0.0 -f alsa -i default -c:v libx264 -preset veryfast -b:v 4000k -g 60 -c:a aac -b:a 128k -f flv "rtmp://live-push.example.com/live/streamkey"
# 推流到SRT服务器
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 4000k -c:a aac -b:a 128k -f mpegts "srt://server.example.com:10080?streamid=live/streamkey"参数解释:
-re:按真实时间速度读取(直播必须)-g 60:关键帧间隔60帧(30fps对应2秒)-pix_fmt yuv420p:兼容性最好的色彩空间-f flv:RTMP用FLV封装-f mpegts:SRT用MPEG-TS封装
更多FFmpeg用法可以看本站 FFmpeg入门实战教程。
流媒体服务器选择
方案一:Nginx-RTMP(轻量级)
Nginx + RTMP模块,适合小规模直播和测试:
# nginx.conf
worker_processes auto;
events {
worker_connections 1024;
}
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
# 开启HLS
hls on;
hls_path /var/www/hls;
hls_fragment 2s;
hls_playlist_length 10s;
}
}
}
http {
server {
listen 80;
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /var/www;
add_header Access-Control-Allow-Origin *;
}
}
}推流到 rtmp://your-server/live/test,观众通过 http://your-server/hls/test.m3u8 拉流播放。
详细搭建教程见本站 Nginx-RTMP流媒体服务器搭建教程。
方案二:SRS(生产级)
SRS 是国产开源流媒体服务器,支持RTMP、HLS、HTTP-FLV、WebRTC等多种协议:
# Docker一键部署
docker run --rm -p 1935:1935 -p 8080:8080 ossrs/srs:5
# 推流
ffmpeg -re -i input.mp4 -c copy -f flv rtmp://localhost:1935/live/test
# 播放
# RTMP: rtmp://localhost:1935/live/test
# HLS: http://localhost:8080/live/test.m3u8
# HTTP-FLV: http://localhost:8080/live/test.flv
# WebRTC: http://localhost:8080/players/whep.html?app=live&stream=testSRS的优势是配置简单、性能优秀、协议全面,适合中大型直播业务。
方案三:云服务(最省心)
不想自己维护服务器,用云直播服务:
- 国内:腾讯云直播、阿里云直播、网宿直播
- 国外:AWS IVS、Mux、Vimeo Live Streaming
优势是一站式服务(推流→转码→分发→播放器),缺点是按流量收费,大规模使用成本高。
直播分发协议对比
观众端拉流的协议选择也很重要:
| 协议 | 延迟 | 兼容性 | 适用场景 |
|---|---|---|---|
| HLS | 5-30秒 | 全部 | 默认兜底方案 |
| LL-HLS | 1-2秒 | iOS 15+、Chrome | 低延迟直播 |
| HTTP-FLV | 2-5秒 | Chrome、Firefox | 国内B站等平台主流 |
| WebRTC | 0.1-0.5秒 | 现代浏览器 | 互动直播 |
国内平台(B站、斗鱼、虎牙)普遍用HTTP-FLV分发,延迟比HLS低、兼容性比WebRTC好。国外平台(YouTube、Twitch)以HLS和LL-HLS为主。
如果你想了解HLS原理,可以看本站 M3U8文件完整指南。
推流调优技巧
1. 编码器选择
- NVIDIA显卡用户:NVENC H.264(GPU编码,CPU占用低)
- AMD显卡用户:AMD AMF H.264
- Intel核显用户:Intel QuickSync H.264
- 无硬件加速:x264编码器,preset用
veryfast平衡速度和质量
2. 关键参数
- 关键帧间隔(gop size):2秒(30fps对应60帧,60fps对应120帧)
- B帧:NVENC用2,x264用0(部分平台要求)
- Profile:high(兼容性好)或 main(更低延迟)
- Rate control:CBR(直播推荐)或 VBR(点播可用)
3. 网络优化
- 用有线网络,避免WiFi
- 上行带宽至少是推流码率的1.5倍
- 路由器开启QoS,优先直播流量
- 关闭后台下载、网盘同步等占用带宽的应用
4. 画质提升
- 码率不要给太低,参考上面的码率表
- 用
yuv420p而非yuv444p(兼容性) - 关闭OBS的"延迟"选项(除非有特殊需求)
- 用
Lanczos缩减过滤,比Bilinear清晰
常见问题速查
| 问题 | 原因 | 解决 |
|---|---|---|
| 推流卡顿 | 上行带宽不足 | 测速,降码率到带宽的70%以内 |
| 画面发灰 | 编码器色彩空间错 | 加 -pix_fmt yuv420p |
| 延迟太高 | 平台默认HLS分发 | 改用HTTP-FLV或LL-HLS |
| 推流掉线 | 网络不稳定 | 启用OBS"自动重连" |
| 画面卡顿但码率正常 | CPU占用过高 | 换NVENC,降preset |
| 音画不同步 | 编码缓冲不一致 | 检查音频采样率(48kHz) |
| 关键帧警告 | 关键帧间隔错 | 设为2秒 |
总结
直播推流三大协议各有定位:RTMP平台推流标准,SRT跨地域专业传输,WebRTC超低延迟互动。日常推B站、YouTube用RTMP即可,专业制作跨地域传输考虑SRT,互动连麦必须WebRTC。
OBS配置记住几个关键参数:硬件编码器、CBR码率控制、关键帧间隔2秒、yuv420p色彩空间、码率参考推荐表。流媒体服务器小规模用Nginx-RTMP,生产环境用SRS或云服务。
快速回顾:
- 协议选择:RTMP(推平台)、SRT(跨地域)、WebRTC(互动)
- 码率参考:1080p 30fps → 4000 kbps
- 关键参数:硬件编码器 + CBR + 关键帧2秒 + yuv420p
- 服务器选择:测试用Nginx-RTMP,生产用SRS