视频流媒体服务器搭建:SRS推流、HLS点播与香港VPS直播架构完整教程
香港服务器凭借低延迟和优质网络,是搭建面向大陆用户的直播和点播服务的理想选择。本文基于SRS(Simple Realtime Server)开源流媒体服务器,给出从推流到分发的完整架构方案。
一、流媒体协议选型
| 协议 | 延迟 | 兼容性 | 适用场景 |
|---|---|---|---|
| RTMP | 1~3s | 推流端通用 | OBS推流到服务器(输入协议) |
| HLS | 5~30s | 所有浏览器/App | 点播、低实时性直播 |
| HTTP-FLV | 1~3s | 需要播放器 | B站等视频网站的直播 |
| WebRTC | <500ms | 现代浏览器 | 视频会议、超低延迟直播 |
| SRT | 1~3s | 专业推流工具 | 不稳定网络下的高质量推流 |
典型架构:OBS → RTMP推流 → SRS服务器 → HLS/HTTP-FLV → CDN → 观众
二、Docker安装SRS
<code">mkdir -p /srv/srs/conf && cd /srv/srs
<code"># docker-compose.yml
version: '3.8'
services:
srs:
image: ossrs/srs:5
restart: unless-stopped
ports:
- "1935:1935" # RTMP推流端口
- "8080:8080" # HTTP-FLV/HLS播放端口
- "1985:1985" # HTTP API管理端口
- "8000:8000/udp" # WebRTC UDP端口
volumes:
- ./conf/srs.conf:/usr/local/srs/conf/srs.conf:ro
- ./recordings:/usr/local/srs/objs/nginx/html/recordings # 录像存储
environment:
CANDIDATE: 你的服务器公网IP # WebRTC需要
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:1985/api/v1/versions"]
interval: 30s
timeout: 10s
retries: 3<code"># conf/srs.conf
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
http_api {
enabled on;
listen 1985;
}
rtc_server {
enabled on;
listen 8000;
candidate $CANDIDATE;
}
vhost __defaultVhost__ {
# HLS直播切片
hls {
enabled on;
hls_fragment 3; # 每个TS切片3秒
hls_window 30; # 保留最近30秒(10个切片)
hls_path ./objs/nginx/html;
hls_m3u8_file [app]/[stream].m3u8;
hls_ts_file [app]/[stream]-[seq].ts;
}
# HTTP-FLV(低延迟,约1~3秒)
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
# WebRTC(超低延迟)
rtc {
enabled on;
rtmp_to_rtc on;
rtc_to_rtmp on;
}
# 录像(自动录制所有推流)
dvr {
enabled on;
dvr_apply all;
dvr_plan segment;
dvr_duration 300; # 每5分钟切一个录像文件
dvr_path ./objs/nginx/html/recordings/[app]/[stream]-[timestamp].flv;
}
# 推流鉴权(防止他人蹭推)
http_hooks {
enabled on;
on_publish http://127.0.0.1:8090/api/stream/auth; # 推流时验证密钥
}
}<code">docker compose up -d docker compose logs -f srs
三、推流鉴权服务
<code"># stream-auth.js(Node.js简单鉴权服务)
const express = require('express');
const app = express();
app.use(express.json());
const VALID_KEYS = {
'my-live-stream': 'secret-key-123',
'backup-stream': 'another-secret',
};
app.post('/api/stream/auth', (req, res) => {
const { app: appName, stream, param } = req.body;
// 从推流参数中提取密钥
// OBS推流URL格式:rtmp://server/live/stream-name?key=secret-key-123
const params = new URLSearchParams(param?.replace(/^\?/, '') || '');
const key = params.get('key');
if (VALID_KEYS[stream] && VALID_KEYS[stream] === key) {
return res.json({ code: 0, data: 'auth ok' });
}
console.log(`拒绝未授权推流:${appName}/${stream}`);
return res.status(403).json({ code: 403, data: 'auth failed' });
});
app.listen(8090, '127.0.0.1', () => {
console.log('推流鉴权服务运行在 :8090');
});四、OBS推流配置
<code">OBS Studio → 设置 → 串流 服务:自定义 服务器:rtmp://你的香港VPS IP/live 串流密钥:your-stream-name?key=secret-key-123 推荐编码设置: 编码器:x264 或 NVIDIA NVENC(有GPU) 码率:2000~4000 Kbps(720p)/ 4000~8000 Kbps(1080p) 关键帧间隔:2秒 CPU预设:veryfast(兼顾质量和性能) 配置文件:main 调整参数:tune=zerolatency
五、Nginx代理与HTTPS播放
<code">server {
listen 443 ssl http2;
server_name live.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/live.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/live.yourdomain.com/privkey.pem;
# HLS播放列表和TS切片
location ~* \.(m3u8|ts)$ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
# HLS需要允许跨域(播放器通常在不同域)
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, OPTIONS';
# M3U8不缓存(实时更新)
location ~* \.m3u8$ {
proxy_pass http://127.0.0.1:8080;
add_header Cache-Control "no-cache, no-store";
add_header Access-Control-Allow-Origin *;
}
# TS切片短期缓存
location ~* \.ts$ {
proxy_pass http://127.0.0.1:8080;
expires 30s;
add_header Access-Control-Allow-Origin *;
}
}
# HTTP-FLV流
location ~* \.flv$ {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Connection "";
add_header Access-Control-Allow-Origin *;
}
# SRS API(内部使用,限制访问)
location /api/ {
allow 127.0.0.1;
deny all;
proxy_pass http://127.0.0.1:1985;
}
}六、H5播放器集成
<code">
七、查看直播流状态
<code"># SRS提供HTTP API查询直播状态 # 查看所有在线推流 curl http://localhost:1985/api/v1/streams | python3 -m json.tool # 查看服务器整体状态 curl http://localhost:1985/api/v1/summaries | python3 -m json.tool # 查看在线观看人数 curl "http://localhost:1985/api/v1/clients?start=0&count=100" | python3 -m json.tool
八、CDN分发扩展方案
单台香港VPS带宽有限,百人以上并发观看时,需要接入CDN进行分发:
<code">推流架构(百人以上):
OBS → RTMP推流 → 香港VPS(源站SRS)
↓ RTMP回源
CDN边缘节点(国内/全球)
↓ HLS/HTTP-FLV
观众(分布全球)
配置步骤:
1. 香港VPS的SRS作为源站
2. 在CDN(阿里云/腾讯云/Cloudflare Stream)配置回源地址
3. 推流到源站SRS,CDN自动拉流并分发
4. 观众播放CDN提供的地址,源站带宽消耗极小九、总结
SRS是国内开发者贡献的优秀开源项目,功能完整且性能出色。香港VPS凭借CN2 GIA低延迟特性,是推流服务器的理想部署位置——主播推流延迟低,观众拉流质量好。IDC.Net的香港VPS提供大带宽选项,配合CDN分发,可以支撑大规模直播业务。
版权声明:
作者:后浪云
链接:https://idc.net/help/442856/
文章版权归作者所有,未经允许请勿转载。
THE END
