ESC

开始输入,可搜索发票、服务、域名、工单,以及 更多...

搜索... Ctrl+K
应用场景与解决方案

面向亚洲观众的自建直播:在香港、东京或新加坡服务器部署 SRS 源站并接入 CDN

8 个步骤 15 分钟阅读 7 次阅读 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 团队帮你评估源站规格。

这篇文章有帮助吗?

相关教程