直播推流完整指南:RTMP/SRT/WebRTC 協定比較與 OBS 設定
想做直播,平台用 RTMP,跨國傳輸用 SRT,即時互動用 WebRTC。每種協定適用場景不同。這篇比較三大直播協定,並介紹 OBS 設定和自架伺服器。
三大直播協定概覽
| 特性 | RTMP | SRT | WebRTC |
|---|---|---|---|
| 全名 | Real-Time Messaging Protocol | Secure Reliable Transport | Web Real-Time Communication |
| 起源 | Adobe(2002 年) | Haivision(2017 年) | W3C(2011 年) |
| 底層 | TCP | UDP | UDP |
| 延遲 | 2-10 秒 | 0.5-5 秒 | 200ms-1 秒 |
| 編碼器 | H.264/AAC | 任何 | VP8/VP9/H.264 |
| 平台支援 | 廣泛 | 增加 | 瀏覽器原生 |
| CDN 支援 | 廣泛 | 增加 | 有限 |
| 使用場景 | 平台直播 | 跨國傳輸 | 即時互動 |
RTMP
概述
RTMP(Real-Time Messaging Protocol)是 Adobe 開發的直播協定。雖然 Adobe 2009 年停止更新,但所有直播平台(YouTube、Twitch、Bilibili)都支援 RTMP 推流。
特點
- 相容性最好:所有直播平台支援
- TCP 基礎:穩定但延遲高
- H.264/AAC:編碼器限制
- FLV 容器:推流格式
FFmpeg RTMP 推流
bash
# 從檔案推流
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -tune zerolatency -c:a aac -f flv rtmp://server/live/stream_key
# 從攝影機推流(Linux)
ffmpeg -f v4l2 -i /dev/video0 -f alsa -i default -c:v libx264 -preset fast -tune zerolatency -c:a aac -f flv rtmp://server/live/stream_key
# 從攝影機推流(macOS)
ffmpeg -f avfoundation -i "0:0" -c:v libx264 -preset fast -tune zerolatency -c:a aac -f flv rtmp://server/live/stream_key參數:
-re:按原始幀率讀取(直播必需)-preset fast:快速編碼-tune zerolatency:低延遲設定-f flv:FLV 容器格式
RTMP 變體
- RTMPS:RTMP over TLS(加密)
- RTMPE:RTMP 加密(Adobe 專有)
- RTMPT:RTMP over HTTP(穿防火牆)
SRT
概述
SRT(Secure Reliable Transport)是 Haivision 開發的開源直播協定。基於 UDP,提供低延遲和抗網路抖動。
特點
- UDP 基礎:低延遲
- 抗網路抖動:自動重傳、擁塞控制
- 加密:AES-128/AES-256
- 可調延遲:0.5-5 秒
FFmpeg SRT 推流
bash
# SRT 推流
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -c:a aac -f mpegts 'srt://server:port?streamid=stream_key'
# 帶加密的 SRT 推流
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -c:a aac -f mpegts 'srt://server:port?streamid=stream_key&passphrase=mysecret'
# SRT 接收
ffmpeg -i 'srt://server:port?mode=listener' -c copy output.mp4SRT 參數
| 參數 | 意義 |
|---|---|
streamid | 串流 ID |
passphrase | 加密密碼 |
latency | 延遲(毫秒) |
mode | 模式(caller/listener) |
payload_size | 封包大小 |
WebRTC
概述
WebRTC(Web Real-Time Communication)是 W3C 標準的即時通訊協定。延遲最低(200ms-1 秒),適合視訊會議、遊戲直播。
特點
- 最低延遲:200ms-1 秒
- 瀏覽器原生:不需外掛
- UDP 基礎:SRTP/DTLS 加密
- P2P 支援:可直接 P2P 連線
WebRTC 元件
- 信令伺服器:交換 SDP 和 ICE 候選
- STUN/TURN 伺服器:NAT 穿透
- 媒體伺服器:多人會議時轉發(如 SFU)
WebRTC 推流(需要伺服器)
WebRTC 推流比 RTMP 複雜,需要信令伺服器。常見方案:
- MediaSoup:Node.js SFU
- Janus:C 語言 SFU
- LiveKit:開源 WebRTC 平台
- Twilio Video:商業 WebRTC 服務
詳見 瀏覽器影片播放原理。
OBS 設定
1. RTMP 推流設定
- 開啟 OBS → 設定 → 串流
- 服務選「自訂」
- 伺服器填
rtmp://live.twitch.tv/app/ - 串流金鑰填你的金鑰
2. 輸出設定
- 設定 → 輸出 → 輸出模式選「進階」
- 串流標籤:
- 編碼器:x264 或 Nvidia NVENC
- 位元率:2500-6000 kbps(1080p 30fps)
- 關鍵幀間隔:2 秒
- 預設:等於位元率或 P5(NVENC)
3. 影片設定
- 設定 → 影片
- 解析度:1920x1080(或 1280x720)
- 幀率:30 或 60
4. 音訊設定
- 設定 → 音訊
- 取樣率:48 kHz
- 位元率:128-160 kbps
OBS 推薦位元率
| 解析度 | 幀率 | 位元率 |
|---|---|---|
| 1080p | 60fps | 4500-6000 kbps |
| 1080p | 30fps | 3500-5000 kbps |
| 720p | 60fps | 3000-4000 kbps |
| 720p | 30fps | 2000-3000 kbps |
| 480p | 30fps | 800-1200 kbps |
自架直播伺服器
Nginx-RTMP 伺服器
1. 安裝
bash
# Ubuntu/Debian
sudo apt install nginx libnginx-rtmp-module2. 設定
編輯 /etc/nginx/nginx.conf:
nginx
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
# 啟用 HLS 轉發
hls on;
hls_path /var/www/hls;
hls_fragment 3;
hls_playlist_length 60;
}
}
}
http {
server {
listen 80;
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /var/www;
add_header Access-Control-Allow-Origin *;
}
location /stat {
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
}
}3. 啟動
bash
sudo systemctl restart nginx4. 推流和觀看
bash
# 推流
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -c:a aac -f flv rtmp://localhost/live/test
# 用 FFplay 觀看 RTMP
ffplay rtmp://localhost/live/test
# 用瀏覽器觀看 HLS
# http://localhost/hls/test.m3u8HLS 轉發
直播常用 RTMP 推流,再轉成 HLS 給瀏覽器播放:
bash
# FFmpeg RTMP 接收並轉 HLS
ffmpeg -i rtmp://localhost/live/test \
-c:v libx264 -preset fast -c:a aac \
-f hls -hls_time 2 -hls_list_size 5 -hls_flags delete_segments \
/var/www/hls/test.m3u8詳見 MP4 轉 M3U8 教學。
進階設定
1. 多位元率直播
bash
# 同時輸出多個位元率
ffmpeg -re -i input.mp4 \
-c:v:0 libx264 -b:v:0 5000k -s:0 1920x1080 \
-c:v:1 libx264 -b:v:1 2500k -s:1 1280x720 \
-c:v:2 libx264 -b:v:2 1000k -s:2 854x480 \
-c:a aac -b:a 128k \
-f hls -hls_time 2 -hls_list_size 5 \
-master_pl_name master.m3u8 \
-var_stream_map "v:0,a:0 v:1,a:1 v:2,a:2" \
-hls_segment_filename "v%v/segment_%03d.ts" \
"v%v/stream.m3u8"2. 備援推流
bash
# 同時推到多個伺服器
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -c:a aac \
-f flv rtmp://primary-server/live/key \
-c:v libx264 -preset fast -c:a aac \
-f flv rtmp://backup-server/live/key常見問題
1. 直播延遲高
原因: 緩衝設定過大
解決方案:
- 用
-tune zerolatency - 降低 HLS 片段長度(
-hls_time 1) - 用 SRT 或 WebRTC 替代 RTMP
2. 直播卡頓
原因: 網路頻寬不足
解決方案:
- 降低位元率
- 降解析度
- 用有線網路
3. 音訊不同步
原因: 編碼延遲不同
解決方案:
bash
# 同步音訊
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -c:a aac -async 1 -f flv rtmp://server/live/key總結
直播協定選擇:
- 平台直播:RTMP(最大相容性)
- 跨國傳輸:SRT(抗網路抖動)
- 即時互動:WebRTC(最低延遲)
快速參考:
- RTMP 推流:
ffmpeg -re -i input.mp4 -c:v libx264 -preset fast -tune zerolatency -c:a aac -f flv rtmp://server/live/key - SRT 推流:
ffmpeg -re -i input.mp4 -c:v libx264 -c:a aac -f mpegts 'srt://server:port?streamid=key' - HLS 轉發:
ffmpeg -i rtmp://server/live/key -f hls -hls_time 2 ... output.m3u8 - 自架伺服器: Nginx-RTMP