Skip to content

直播推流完整指南:RTMP/SRT/WebRTC 協定比較與 OBS 設定

想做直播,平台用 RTMP,跨國傳輸用 SRT,即時互動用 WebRTC。每種協定適用場景不同。這篇比較三大直播協定,並介紹 OBS 設定和自架伺服器。

三大直播協定概覽

特性RTMPSRTWebRTC
全名Real-Time Messaging ProtocolSecure Reliable TransportWeb Real-Time Communication
起源Adobe(2002 年)Haivision(2017 年)W3C(2011 年)
底層TCPUDPUDP
延遲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.mp4

SRT 參數

參數意義
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 推流設定

  1. 開啟 OBS → 設定串流
  2. 服務選「自訂」
  3. 伺服器填 rtmp://live.twitch.tv/app/
  4. 串流金鑰填你的金鑰

2. 輸出設定

  1. 設定輸出輸出模式選「進階」
  2. 串流標籤:
    • 編碼器:x264 或 Nvidia NVENC
    • 位元率:2500-6000 kbps(1080p 30fps)
    • 關鍵幀間隔:2 秒
    • 預設:等於位元率或 P5(NVENC)

3. 影片設定

  1. 設定影片
  2. 解析度:1920x1080(或 1280x720)
  3. 幀率:30 或 60

4. 音訊設定

  1. 設定音訊
  2. 取樣率:48 kHz
  3. 位元率:128-160 kbps

OBS 推薦位元率

解析度幀率位元率
1080p60fps4500-6000 kbps
1080p30fps3500-5000 kbps
720p60fps3000-4000 kbps
720p30fps2000-3000 kbps
480p30fps800-1200 kbps

自架直播伺服器

Nginx-RTMP 伺服器

1. 安裝

bash
# Ubuntu/Debian
sudo apt install nginx libnginx-rtmp-module

2. 設定

編輯 /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 nginx

4. 推流和觀看

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.m3u8

詳見 Nginx-RTMP 串流伺服器架設指南

HLS 轉發

直播常用 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

參考資料

Last updated: