视频流媒体服务器搭建:SRS推流、HLS点播与香港VPS直播架构完整教程

香港服务器凭借低延迟和优质网络,是搭建面向大陆用户的直播和点播服务的理想选择。本文基于SRS(Simple Realtime Server)开源流媒体服务器,给出从推流到分发的完整架构方案。

一、流媒体协议选型

协议延迟兼容性适用场景
RTMP1~3s推流端通用OBS推流到服务器(输入协议)
HLS5~30s所有浏览器/App点播、低实时性直播
HTTP-FLV1~3s需要播放器B站等视频网站的直播
WebRTC<500ms现代浏览器视频会议、超低延迟直播
SRT1~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分发,可以支撑大规模直播业务。

THE END