开始输入,可搜索发票、服务、域名、工单,以及 更多...
要为亚洲观众搭建自建直播平台,常见做法是:在香港、东京或新加坡的独立服务器上部署 SRS(或 nginx-rtmp)源站,用 RTMP 或 SRT 推流,输出 HLS 和 WebRTC,再由 CDN 分发给观众。IMIDC 可以提供整套基础设施:香港独立服务器每月 $139 起,走 CN2 GIA 直连大陆;另有日本独立服务器、可通过销售定制的新加坡服务器、10Gbps 上行端口、DDoS 防护以及 IMIDC CDN。
一个直播平台分为四个环节:推流、源站/封装、分发和播放。
典型场景包括线上研讨会和企业全员大会、在线课堂、新品发布和活动直播,以及希望拥有自有品牌、权限控制和录像回放、而不依赖第三方平台的游戏/电竞直播。
推流用 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 都支持,再向观众承诺低延迟。
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)
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% 协议开销。
| 同时在线观众 | 平均码率 | 峰值出口 | 每小时流量 |
|---|---|---|---|
| 50 | 2.5 Mbps | 125 Mbps | 约 56 GB |
| 200 | 2.5 Mbps | 500 Mbps | 约 225 GB |
| 1,000 | 3 Mbps | 3 Gbps | 约 1.35 TB |
| 3,000 | 2 Mbps(多码率混合) | 6 Gbps | 约 2.7 TB |
| 10,000 | 2 Mbps(多码率混合) | 20 Gbps | 约 9 TB |
换算公式:每小时 GB = Mbps × 3600 ÷ 8 ÷ 1000。单台 10Gbps 上行的源站直接服务几百名观众绰绰有余;再往上就应让观众走 CDN,源站只给 CDN 缓存供流。相比之下推流带宽很小:每路 1080p 约 4–6 Mbps。
让 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;
}
}
.m3u8)每个切片都会更新,缓存 1–2 秒即可;切片内容不会变化,可以长期缓存。每场直播都在源站录制,结束后把文件转移到对象存储,用于回放和点播。
# 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 多码率。
源站尽量靠近主播和主要观众,并保护所有公网入口。
| 源站位置 | 主要观众 | 说明 |
|---|---|---|
| 香港 | 中国大陆、香港、大中华区 | CN2 GIA(AS4809)直连大陆,托管无需 ICP 备案 |
| 日本东京 | 日本、韩国、环太平洋 | 日本原生 IP;VPS 可选 CN2 中国优化线路 |
| 新加坡 | 东南亚、印度、大洋洲 | 通过 IMIDC 销售按需开通 |
| 台北 / 首尔 / 曼谷 | 单一国家/地区活动 | 本地原生 IP,适合当地观众 |
根据主播数量、转码负载以及 CDN 承担的流量来确定源站规格。
如果大量观众在中国大陆,通常选香港,因为 IMIDC 香港服务器走中国电信 CN2 GIA 线路。日本和韩国观众适合东京,东南亚适合新加坡;观众分布较杂时,用一个源站加 CDN 即可。
按每人 3 Mbps 计算,峰值出口约 3 Gbps,每小时约 1.35 TB 流量。这种规模应通过 CDN 分发,而不是让源站直接服务观众。
SRS 在一个服务里同时支持 RTMP、SRT、HLS、HTTP-FLV 和 WebRTC,并自带 HTTP API,功能更完整。nginx-rtmp 更轻量,适合简单的 RTMP 转 HLS 场景。
亚秒级延迟需要 WebRTC,而 WebRTC 单观众消耗远高于 HLS,且普通 CDN 无法缓存。多数平台对主播和互动嘉宾用 WebRTC,对大量普通观众用 HLS 或 LL-HLS。
可以。IMIDC 提供可附加在直播源站服务器上的 DDoS 防护。请把预期的活动规模告知销售,以便防护和端口配置与实际流量匹配。
正在规划自己的直播平台?可以从香港独立服务器或东京独立服务器加 IMIDC CDN 起步,或提交工单,由 IMIDC 团队帮你评估源站规格。