Skip to content

直播推流完整指南:RTMP/SRT/WebRTC三大协议对比与OBS实战配置

想做B站直播,不知道OBS怎么配;企业活动要直播,纠结自建还是用云服务;互动直播延迟太高,被观众吐槽;跨地域直播推流不稳,画面经常卡。直播推流这事,技术栈比想象的复杂。今天就把三大协议、OBS配置、服务器搭建、调优技巧一锅端。

直播推流的核心流程

直播推流本质是 音视频采集 → 编码 → 网络传输 → 服务器分发 → 观众播放 的链路:

  1. 采集:摄像头、麦克风、屏幕、视频文件等
  2. 编码:H.264/H.265视频 + AAC音频
  3. 封装:FLV(RTMP)、TS(SRT)、MP4(WebRTC)等
  4. 推流:通过RTMP/SRT/WebRTC协议发送到流媒体服务器
  5. 服务器处理:转码(可选)、录制、转协议(如RTMP转HLS)
  6. 分发:CDN或自建节点
  7. 播放:观众通过HLS、FLV、WebRTC等协议拉流播放

关键瓶颈在两个地方: 推流端的网络上行带宽 + 服务器的处理能力。前者影响画面质量,后者影响观众数量。

三大推流协议横向对比

协议推出年份典型延迟抗丢包编码格式服务端复杂度适用场景
RTMP20022-5秒一般H.264/AAC平台推流标准
SRT20170.5-2秒任意跨地域传输
WebRTC20110.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 是最流行的开源直播软件,免费、跨平台、功能强大。

基础设置

  1. 设置 → 流

    • 服务:选"自定义"
    • 服务器:填平台RTMP地址(如B站:rtmp://live-push.bilivideo.com/live-bmc/
    • 串流密钥:填平台提供的密钥
  2. 设置 → 输出

    • 输出模式:选"高级"
    • 编码器: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,部分平台要求)
  3. 设置 → 视频

    • 基础分辨率:1920x1080(采集分辨率)
    • 输出分辨率:1920x1080 或 1280x720
    • 缩减过滤:Lanczos(高质量)
    • FPS:30 或 60
  4. 设置 → 音频

    • 采样率:48 kHz
    • 编码器:AAC
    • 比特率:128 或 160

推流码率推荐表

分辨率/帧率推荐码率(CBR)最低上行带宽
720p 30fps1800-2500 kbps4 Mbps
720p 60fps2500-3500 kbps5 Mbps
1080p 30fps3500-5000 kbps7 Mbps
1080p 60fps4500-6000 kbps9 Mbps
4K 30fps8000-15000 kbps20 Mbps
4K 60fps12000-20000 kbps28 Mbps

注意: 推流码率不能超过上行带宽的70%,否则会卡顿。先用 Speedtest 测上行带宽。

FFmpeg命令行推流

不想用OBS,可以用FFmpeg命令行推流:

bash
# 推流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
# 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等多种协议:

bash
# 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=test

SRS的优势是配置简单、性能优秀、协议全面,适合中大型直播业务。

方案三:云服务(最省心)

不想自己维护服务器,用云直播服务:

  • 国内:腾讯云直播、阿里云直播、网宿直播
  • 国外:AWS IVS、Mux、Vimeo Live Streaming

优势是一站式服务(推流→转码→分发→播放器),缺点是按流量收费,大规模使用成本高。

直播分发协议对比

观众端拉流的协议选择也很重要:

协议延迟兼容性适用场景
HLS5-30秒全部默认兜底方案
LL-HLS1-2秒iOS 15+、Chrome低延迟直播
HTTP-FLV2-5秒Chrome、Firefox国内B站等平台主流
WebRTC0.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

参考资料

Last updated: