ESC

開始輸入,可搜尋發票、服務、域名、工單,以及 更多...

搜尋... Ctrl+K
應用場景與解決方案

面向亞洲觀眾的自建直播:在香港、東京或新加坡伺服器部署 SRS 源站並接入 CDN

8 個步驟 15 分鐘閱讀 10 次閱讀 0
本文目錄

要為亞洲觀眾搭建自建直播平台,常見做法是:在香港、東京或新加坡的獨立伺服器上部署 SRS(或 nginx-rtmp)源站,用 RTMP 或 SRT 推流,輸出 HLS 和 WebRTC,再由 CDN 分發給觀眾。IMIDC 可以提供整套基礎設施:香港獨立伺服器每月 $139 起,走 CN2 GIA 直連大陸;另有日本獨立伺服器、可通過銷售定製的新加坡伺服器、10Gbps 上行埠、DDoS 防護以及 IMIDC CDN。

關鍵資訊
  • 源站機房:香港(CN2 GIA 直連大陸)、日本東京、新加坡(經銷售開通),以及台北、首爾、曼谷。
  • 香港獨立伺服器每月 $139 起;小規模測試源站可用每月 $28 起的日本 VPS。
  • 10Gbps 上行、SSD 儲存,推流入口和源站均可加 DDoS 防護。
  • IMIDC CDN 負責 HLS 分發,源站只需回源給 CDN,而不是直接服務每一位觀眾。
  • 本文講的是自己運營直播平台,而不是 TikTok 賣家的推流網路。

自建直播系統的整體結構

一個直播平台分為四個環節:推流、源站/封裝、分發和播放。

  1. 推流:主播端的 OBS、vMix 或硬體編碼器,通過 RTMP 或 SRT 推送到源站。
  2. 源站:SRS 接收流,可選轉碼成多檔位元速率,切片生成 HLS,提供 WebRTC,並錄製到磁碟。
  3. 分發:CDN 從源站拉取 HLS,把切片快取在離觀眾近的節點。
  4. 播放:HLS 用 hls.js、Video.js 或原生播放器;需要亞秒級互動時用 WebRTC 播放器。

典型場景包括線上研討會和企業全員大會、線上課堂、新品釋出和活動直播,以及希望擁有自有品牌、許可權控制和錄影回放、而不依賴第三方平台的遊戲/電競直播。

推流與播放協議怎麼選

推流用 RTMP 或 SRT,大規模分發用 HLS,只有強互動場景才用 WebRTC。

協議用途典型延遲適用場景
RTMP推流到源站 1–3 秒OBS 和各類編碼器普遍支援
SRT推流可調,亞秒到數秒丟包或跨遠距離上行、外場活動
HLS播放約 6–20 秒經 CDN 面向大量觀眾,全終端相容
LL-HLS播放約 2–5 秒需要較快彈幕互動的活動;需封裝器和 CDN 支援
HTTP-FLV播放約 1–3 秒部分亞洲市場常用的 Web 播放器
WebRTC(WHIP/WHEP)推流與播放1 秒以內互動課堂、拍賣、連麥;單觀眾資源消耗更高

SRS 單個程序即可同時支援 RTMP、SRT、HLS、HTTP-FLV 和 WebRTC。如果確實需要帶分片(partial segments)的 LL-HLS,請先確認封裝器和 CDN 都支援,再向觀眾承諾低延遲。

在獨立伺服器上用 Docker 部署 SRS

SRS 很適合 Docker 部署,需要注意的只有埠、WebRTC 候選 IP 和持久化目錄。

mkdir -p /opt/srs/conf /opt/srs/html /opt/srs/record
# put srs.conf (below) into /opt/srs/conf/srs.conf, then:
docker run -d --name srs --restart unless-stopped \
  -p 1935:1935 -p 1985:1985 -p 8080:8080 \
  -p 8000:8000/udp -p 10080:10080/udp \
  -e CANDIDATE=203.0.113.20 \
  -v /opt/srs/conf/srs.conf:/usr/local/srs/conf/srs.conf \
  -v /opt/srs/html:/usr/local/srs/objs/nginx/html \
  -v /opt/srs/record:/usr/local/srs/objs/record \
  ossrs/srs:5 ./objs/srs -c conf/srs.conf

docker logs -f srs          # watch publish / play events
ufw allow 1935/tcp; ufw allow 8000/udp; ufw allow 10080/udp

一份面向生產環境的 srs.conf,包含 HLS、HTTP-FLV、WebRTC、SRT、錄製和推流鑑權回撥:

listen              1935;
max_connections     3000;
daemon              off;
srs_log_tank        console;

http_api    { enabled on; listen 1985; }
http_server { enabled on; listen 8080; dir ./objs/nginx/html; }
rtc_server  { enabled on; listen 8000; candidate $CANDIDATE; }
srt_server  { enabled on; listen 10080; }

vhost __defaultVhost__ {
    hls {
        enabled         on;
        hls_fragment    2;
        hls_window      12;
        hls_path        ./objs/nginx/html;
        hls_m3u8_file   [app]/[stream].m3u8;
        hls_ts_file     [app]/[stream]-[seq].ts;
        hls_cleanup     on;
    }
    http_remux { enabled on; mount [vhost]/[app]/[stream].flv; }
    rtc        { enabled on; rtmp_to_rtc on; rtc_to_rtmp on; }
    srt        { enabled on; srt_to_rtmp on; }
    dvr {
        enabled     on;
        dvr_plan    session;
        dvr_path    ./objs/record/[app]/[stream]/[2006]-[01]-[02]_[15][04][05].mp4;
    }
    http_hooks {
        enabled     on;
        on_publish  http://127.0.0.1:8085/api/streams/on_publish;
    }
    play { gop_cache on; }
}

用 OBS 或 ffmpeg 推流並測試播放:

# OBS (RTMP):  Server  rtmp://203.0.113.20/live   Stream key  event1?secret=YOUR_KEY
# SRT push from ffmpeg (OBS can also output SRT):
ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast -b:v 4000k -g 60 \
  -c:a aac -b:a 128k -f mpegts \
  "srt://203.0.113.20:10080?streamid=#!::r=live/event1,m=publish"

# Playback URLs
# HLS       http://203.0.113.20:8080/live/event1.m3u8
# HTTP-FLV  http://203.0.113.20:8080/live/event1.flv
# WebRTC    http://203.0.113.20:1985/rtc/v1/whep/?app=live&stream=event1   (WHEP)
  • 編碼器關鍵幀間隔設為 2 秒,與 hls_fragment 2 保持一致。
  • CANDIDATE 必須填寫伺服器公網 IP,否則 WebRTC 播放器無法連線。
  • on_publish 回撥用於讓業務系統校驗推流金鑰:返回 HTTP 200 且內容為 0 表示允許,其他則拒絕。

如需自適應位元速率,可增加一個 ffmpeg 轉碼程序推送額外檔位,再在主播放列表中引用:

# simple ABR ladder: pull the source from SRS and publish 720p + 480p renditions
ffmpeg -i rtmp://127.0.0.1/live/event1 \
  -map 0:v -map 0:a -c:v libx264 -preset veryfast -s 1280x720 -b:v 2500k -g 60 \
     -c:a aac -b:a 128k -f flv rtmp://127.0.0.1/live/event1_720 \
  -map 0:v -map 0:a -c:v libx264 -preset veryfast -s 854x480 -b:v 1000k -g 60 \
     -c:a aac -b:a 96k  -f flv rtmp://127.0.0.1/live/event1_480

更喜歡 nginx-rtmp?它體積小,能完成 RTMP 推流轉 HLS,但不原生支援 SRT 和 WebRTC:

# nginx-rtmp alternative (nginx.conf, top level)
rtmp {
    server {
        listen 1935;
        application live {
            live on;
            hls on;
            hls_path /var/www/hls;
            hls_fragment 2s;
            hls_playlist_length 12s;
            on_publish http://127.0.0.1:8085/api/streams/on_publish;
        }
    }
}

頻寬測算:觀眾數 × 位元速率

峰值出口頻寬 = 同時線上觀眾數 × 平均位元速率,再加約 10% 協議開銷。

同時線上觀眾平均位元速率峰值出口每小時流量
502.5 Mbps125 Mbps約 56 GB
2002.5 Mbps500 Mbps約 225 GB
1,0003 Mbps3 Gbps約 1.35 TB
3,0002 Mbps(多位元速率混合)6 Gbps約 2.7 TB
10,0002 Mbps(多位元速率混合)20 Gbps約 9 TB

換算公式:每小時 GB = Mbps × 3600 ÷ 8 ÷ 1000。單臺 10Gbps 上行的源站直接服務幾百名觀眾綽綽有餘;再往上就應讓觀眾走 CDN,源站只給 CDN 快取供流。相比之下推流頻寬很小:每路 1080p 約 4–6 Mbps。

源站與 IMIDC CDN 對接

讓 CDN 通過 HTTPS 從源站拉取 HLS,切片長快取,播放列表只快取約 1 秒。

# Nginx in front of SRS as the HTTPS origin for the CDN
server {
    listen 443 ssl;
    http2 on;
    server_name origin-live.example.com;
    ssl_certificate     /etc/nginx/ssl/origin-live.crt;
    ssl_certificate_key /etc/nginx/ssl/origin-live.key;

    location ~ \.m3u8$ {
        proxy_pass http://127.0.0.1:8080;
        add_header Cache-Control "max-age=1" always;
        add_header Access-Control-Allow-Origin "*" always;
    }
    location ~ \.(ts|m4s)$ {
        proxy_pass http://127.0.0.1:8080;
        add_header Cache-Control "max-age=86400" always;
        add_header Access-Control-Allow-Origin "*" always;
    }
}
  • 把 origin-live.example.com 之類的域名解析到源站,並在 IMIDC CDN 中設為回源地址;觀眾訪問 CDN 域名。
  • 播放列表(.m3u8)每個切片都會更新,快取 1–2 秒即可;切片內容不會變化,可以長期快取。
  • 付費或私密活動在 CDN 上啟用簽名 URL 或 Token 鑑權。
  • WebRTC 會話保留在源站(或少量區域 SRS 邊緣節點),普通 HTTP CDN 不快取 WebRTC。

錄製與歸檔儲存

每場直播都在源站錄製,結束後把檔案轉移到物件儲存,用於回放和點播。

# move finished recordings to S3-compatible object storage every 10 minutes (cron)
*/10 * * * * rclone move /opt/srs/record s3store:live-archive --min-age 10m --delete-empty-src-dirs

上面配置中的錄製目錄不在公開 Web 目錄下,猜不到 URL 也就下載不到原始錄影。長期歸檔建議放在單獨的儲存伺服器或物件儲存桶中;如需釋出回放,再轉碼成 HLS 多位元速率。

源站選址與 DDoS 防護

源站儘量靠近主播和主要觀眾,並保護所有公網入口。

源站位置主要觀眾說明
香港中國大陸、香港、大中華區CN2 GIA(AS4809)直連大陸,託管無需 ICP 備案
日本東京日本、韓國、環太平洋日本原生 IP;VPS 可選 CN2 中國最佳化線路
新加坡東南亞、印度、大洋洲通過 IMIDC 銷售按需開通
台北 / 首爾 / 曼谷單一國家/地區活動本地原生 IP,適合當地觀眾
  • 源站開通 IMIDC DDoS 防護,遊戲和電競直播尤其容易被攻擊。
  • 只開放必要埠:推流用 1935/10080(最好限製為主播 IP 白名單)、給 CDN 回源的 443 以及 WebRTC 埠。
  • 每場活動輪換推流金鑰,並在推流回撥中校驗。
  • 面向大陸觀眾的直播必須內容合法,且在大陸提供網路視聽直播服務可能涉及單獨的許可要求;本文不構成法律意見。

哪種 IMIDC 方案適合你

根據主播數量、轉碼負載以及 CDN 承擔的流量來確定源站規格。

  • 內部研討會或幾百人以內的課堂:一台香港獨立伺服器或日本獨立伺服器直接提供 HLS。
  • 數千觀眾的公開活動和遊戲直播:帶 DDoS 防護的獨立源站 + IMIDC CDN。
  • 多區域平台:香港和東京源站,新加坡經銷售開通;如有自有 ASN,可用 BGP 與 Anycast 做推流入口。
  • GPU 或高核心轉碼節點、大容量歸檔硬碟:聯絡 IMIDC 銷售定製配置。

常見問題

面向亞洲觀眾自建直播,伺服器放在哪裡最好?

如果大量觀眾在中國大陸,通常選香港,因為 IMIDC 香港伺服器走中國電信 CN2 GIA 線路。日本和韓國觀眾適合東京,東南亞適合新加坡;觀眾分佈較雜時,用一個源站加 CDN 即可。

1000 人同時觀看直播需要多少頻寬?

按每人 3 Mbps 計算,峰值出口約 3 Gbps,每小時約 1.35 TB 流量。這種規模應通過 CDN 分發,而不是讓源站直接服務觀眾。

SRS 和 nginx-rtmp 選哪個?

SRS 在一個服務裡同時支援 RTMP、SRT、HLS、HTTP-FLV 和 WebRTC,並自帶 HTTP API,功能更完整。nginx-rtmp 更輕量,適合簡單的 RTMP 轉 HLS 場景。

幾千名觀眾能做到 1 秒以內的延遲嗎?

亞秒級延遲需要 WebRTC,而 WebRTC 單觀眾消耗遠高於 HLS,且普通 CDN 無法快取。多數平台對主播和互動嘉賓用 WebRTC,對大量普通觀眾用 HLS 或 LL-HLS。

IMIDC 能為直播源站提供 DDoS 防護嗎?

可以。IMIDC 提供可附加在直播源站伺服器上的 DDoS 防護。請把預期的活動規模告知銷售,以便防護和埠配置與實際流量匹配。

正在規劃自己的直播平台?可以從香港獨立伺服器或東京獨立伺服器加 IMIDC CDN 起步,或提交工單,由 IMIDC 團隊幫你評估源站規格。

這篇文章有幫助嗎?

相關教程