大道至简:仅靠PHP原生函数库,搭建生产级推拉流集群

举报
yd_289128889 发表于 2026/07/01 16:36:32 2026/07/01
【摘要】 一款完全自研、不依赖 Nginx/FFmpeg/SRS 等第三方组件的 PHP 原生 RTMP 直播服务,集 RTMP/HTTP-FLV/WS-FLV/HLS 多协议推拉流、自动录制、点播回放于一体,支持水平扩展至 10万+ 并发。

RTMP Server

纯 PHP 自研轻量级 RTMP 直播服务,零 FFmpeg、Nginx 等第三方流媒体依赖,开箱快速搭建私有化直播平台。
Linux 环境自动启用 event 扩展 epoll 事件驱动;Windows 环境自动降级 select IO 模型,全平台兼容。
项目定位底层基础设施:完整自研 RTMP/HTTP-FLV/WS-FLV 协议栈、异步网络引擎;业务管理、权限、回放管理等上层应用需开发者自行扩展开发。


目录


环境依赖

依赖项 硬性要求说明
PHP >= 8.1,仅支持 CLI 命令行模式运行,不支持 FPM
sockets 扩展 强制必需,底层 TCP/WS/RTMP 通信基础
event 扩展 Linux 强烈推荐安装,启用 epoll 高并发事件模型;Windows 无此扩展,自动降级 select

快速环境部署:项目内置 docker-compose.yml,执行 docker-compose up -d 一键启动完整运行环境。


快速开始

1. 项目安装

composer create-project xiaosongshu/rtmp_server
cd rtmp_server

2. 启动源站主服务

php server.php

启动成功输出示例:

[INFO] RTMP Server started on 0.0.0.0:1935
[INFO] HTTP-FLV/WS-FLV Server started on 0.0.0.0:8501
[INFO] HTTP Static Server started on 0.0.0.0:80

3. 快速推流测试

方式1:浏览器无软件推流

  • 屏幕实时推流:http://<your-server-ip>/push.html
  • 本地 MP4/FLV 文件循环推流:http://<your-server-ip>/flv_push.html

方式2:FFmpeg 标准推流

ffmpeg -re -stream_loop -1 -i video.mp4 -c:v libx264 -c:a aac -f flv rtmp://<your-server-ip>:1935/live/stream

方式3:OBS Studio 推流

  • 服务器:rtmp://<your-server-ip>:1935/live/
  • 串流密钥:stream

方式4:项目内置 PHP 推流客户端

php pusher.php test.mp4 http://<your-server-ip>:8501/live/stream

4. 快速观看直播

浏览器访问:http://<your-server-ip>/index.html


推拉流地址规范

推流地址(OBS/FFmpeg/PHP/Web 统一格式)

协议 标准格式 示例地址
RTMP rtmp://host:1935/{app}/{stream} rtmp://<your-server-ip>:1935/live/stream
HTTP-FLV http://host:8501/{app}/{stream} http://<your-server-ip>:8501/live/stream
WebSocket-FLV ws://host:8501/{app}/{stream} ws://<your-server-ip>:8501/live/stream

字段约束:{app} 应用名、{stream} 频道名仅允许英文、数字、下划线,禁止特殊符号、中文。

直播点播访问地址

实时直播播放地址

协议 访问地址 适用场景
RTMP rtmp://<your-server-ip>:1935/live/stream ffplay、桌面专业播放器
HTTP-FLV http://<your-server-ip>:8501/live/stream.flv PC 浏览器低延迟直播
WebSocket-FLV ws://<your-server-ip>:8501/live/stream.flv 浏览器原生 WebSocket MSE 播放
HLS http://<your-server-ip>:80/hls/live/stream/index.m3u8 移动端、微信内置浏览器

录制点播回放地址

录制文件持久化存储于项目根目录,直播结束自动生成完整文件:

文件类型 存储路径 访问示例
完整合并 MP4 mp4/live/stream/output_merge/stream_full.mp4 http://<your-server-ip>/mp4/live/stream/output_merge/stream_full.mp4
原始 FLV 录制文件 flv/live/stream/index.flv http://<your-server-ip>/flv/live/stream/index.flv
HLS TS 分片目录 hls/live/stream/ 直接使用 m3u8 索引地址播放

Web 页面使用说明

直播播放页面

页面文件 功能说明 访问地址
index.html HTTP-FLV 低延迟直播播放器 http://<your-server-ip>/index.html
play.html HLS 移动端适配播放器 http://<your-server-ip>/play.html
mp4.html MP4 点播专用页面 http://<your-server-ip>/mp4.html
video.html FLV 点播播放器 http://<your-server-ip>/video.html
play_merge.html fMP4 分片点播页面 http://<your-server-ip>/play_merge.html

Web 端推流页面

页面文件 功能说明 访问地址
push.html 浏览器屏幕采集推流(WS-FLV) http://<your-server-ip>/push.html
flv_push.html 本地 MP4/FLV 文件循环推流 http://<your-server-ip>/flv_push.html
push_merge.html 多路直播画面合并推流 http://<your-server-ip>/push_merge.html
push_transcode.html 前端多码率转码推流,适配弱网 http://<your-server-ip>/push_transcode.html

PHP 内置推拉流客户端脚本

脚本 功能 命令示例
pusher.php 命令行文件推流客户端 php pusher.php video.mp4 http://<your-server-ip>:8501/live/stream
puller.php 命令行拉流录制客户端 php puller.php http://<your-server-ip>:8501/live/stream.flv output.flv

项目目录结构

rtmp_server/
├── config/                     # 全局配置文件:端口、多进程、录制、推流鉴权
├── flv/                        # 实时录制 FLV 原始流存储目录
├── mp4/                        # fMP4 分片 & 直播结束合并完整 MP4
├── hls/                        # HLS TS 分片、m3u8 索引文件目录
├── MediaServer/                # RTMP/FLV/WS-FLV 核心协议栈、会话管理
├── Root/                       # 底层异步 IO、Socket 事件驱动引擎
├── record/                     # 客户端配套静态页面资源
├── server.php                  # RTMP 源站主服务启动入口
├── flvGateway.php              # FLV 直播分发网关启动脚本
├── fileGateway.php             # HLS/MP4/静态资源 HTTP 网关
├── forward.php                 # 直播转发客户端
├── pusher.php                  # PHP 推流客户端
├── puller.php                  # PHP 拉流客户端
├── auth_config.php             # 推流鉴权独立配置
├── *.html                      # 全部 Web 推拉流、播放页面
├── docker-compose.yml          # Docker 一键部署配置
└── LICENSE                     # Apache 2.0 开源协议文件

系统整体架构

                                                    【外部推流端】OBS / FFmpeg / Web端
                                                         │
                                   RTMP(1935) / HTTP-FLV/WS-FLV(8501) 推流接入
                                                         │
                                                         ▼
╔══════════════════════════════════════════════════════════════════════════════════════╗
║                              RTMP 源站主服务(流生产核心)                              ║
║                                                                                      ║
║  📥 推拉流接入:RTMP / HTTP-FLV / WS-FLV 三协议兼容,内置推流鉴权校验                  ║
║  🔄 协议转封装:原始流转输出 HTTP-FLV / WS-FLV / HLS / fMP4 / MP4                     ║
║  💾 并行录制任务(完全互不阻塞,可单独开关)                                           ║
║        ┌──────────┬──────────┬──────────┐                                            ║
║        │ FLV裸流录制 │ fMP4实时分片 │ HLS TS分片 │                                      ║
║        └──────────┴──────────┴──────────┘                                            ║
║  📤 实时流输出:对外分发 HTTP-FLVWS-FLVHLS 直播流                                 ║
║  📦 点播产物:fMP4分片缓存,直播结束自动拼接完整MP4文件                                ║
║  📁 内置静态HTTP服务(80端口):低并发场景无需额外网关,直接提供页面、点播文件访问          ║
╚══════════════════════════════════════════════════════════════════════════════════════╝
│
┌───────────────────┼───────────────────┐
│                   │                   │
▼                   ▼                   ▼
HTTP-FLV实时流     HLS静态分片文件      fMP4静态分片文件
│                   │                   │
▼                   ▼                   ▼
┌─────────────┐    ┌──────────────────────────────────────────┐
│ FLV直播网关集群 │    │        静态文件网关集群(fileGateway)    │
│             │    │    托管资源:HLS/fMP4/MP4/FLV/网页静态资源 │
│ ┌─────────┐ │    │                                          │
│ │一级网关  │ │    │ ┌───────┐ ┌───────┐ ┌───────┐           │
│ (8080端口)│ │    │ │网关1 │ │网关2 │ │网关3 │           │
│ └───┬─────┘ │    │ (8100)(8101)(8102) │           │
│     │       │    │ └──┬────┘ └──┬────┘ └──┬────┘           │
│ ┌───┴───┐   │    │    │        │        │                 │
│ ▼   ▼   ▼   │    │    ▼        ▼        ▼                 │
│ ┌─┐ ┌─┐ ┌─┐ │    │ ┌──────────────────────────────────┐   │
│ │子│ │子│ │子│ │    │ │终端播放器客户端                │   │
│ │网│ │网│ │网│ │    │ │MSE/HLS播放器/ffplay/浏览器    │   │
│ │关│ │关│ │关│ │    │ └──────────────────────────────────┘   │
│ └┬─┘ └┬─┘ └┬─┘ │    │                                          │
│  │    │    │   │    └──────────────────────────────────────────┘
│  ▼    ▼    ▼   │
│ ┌────────────┐ │
│ │直播观看客户端│ │
│ │FLV播放器    │ │
│ └────────────┘ │
└─────────────────┘

架构详细说明

  1. 源站主服务(唯一流生产者)
    所有外部推流统一接入源站,完成协议解析、鉴权、多路转封装、并行录制;FLV录制、fMP4切片、HLS切片三个任务线程完全隔离,互不阻塞。
    低并发场景可直接使用内置80端口静态服务,无需部署额外网关。

  2. FLV 直播分发网关
    无转码逻辑,仅做流量转发、GOP关键帧缓存实现播放器秒开;支持横向扩容、多级级联(生产环境建议最多两级,层级越多延迟越高);Linux epoll高并发,Windows仅用于测试。
    高并发场景全部播放器拉流请求走网关,减轻源站主进程连接压力。

  3. 静态文件网关集群
    专门托管HLS、MP4、FLV、前端页面等静态资源,实现读写分离;大规模点播场景必须部署,避免源站被文件IO请求占满。

  4. 直播一体化工具
    本项目支持纯PHP客户端推流,拉流,以及直播转发功能,并提供web前端推流,播放,转码,合流。支持单进程/多进程切换,以及个性化媒体资源工具包xiaosongshu/flv2mp4

分并发部署建议

并发规模 推荐部署方案
低并发(在线播放 < 1000) 仅启动源站server.php,使用内置80、8501端口,无需网关
中等并发(1000 ~ 5000在线) 源站 + 单层FLV网关集群 + 单层静态文件网关集群,Nginx负载均衡
高并发/大型活动直播(>5000在线) 源站 + 多层级FLV网关、静态网关集群,前置负载均衡;万人级活动必须接入商用CDN边缘分发,禁止单服务器承载全部流量

端口常量配置

修改 config/app.php 调整全局服务端口,内置常量定义:

/** HTTP-FLV / WebSocket-FLV 主服务端口 */
define('BASE_FLV_PORT', 8501);
/** RTMP 标准1935端口 */
define('BASE_RTMP_PORT', 1935);
/** 内置静态网页、点播文件HTTP端口 */
define('BASE_WEB_PORT', 80);

录制任务开关配置

config/app.php 独立控制三类录制任务,互不干扰:

define('FLV_TO_RECORD', true);   // 开启实时原始FLV流录制
define('FLV_TO_MP4', true);      // 开启fMP4分片,直播结束自动合并完整MP4
define('FLV_TO_HLS', true);      // 开启HLS TS分片生成

多进程 Worker 配置(IPC 流同步核心)

原理说明

PHP CLI 多进程模型下,每个 Worker 进程内存完全隔离,单个进程收到推流后,其他 Worker 无法读取流数据,因此必须通过 IPC(进程间通信)同步直播流
本项目不使用共享内存、管道等传统系统IPC,自研本地TCP Socket IPC方案:分配一组内部通信端口,收流Worker主动通过内置TCP客户端,将完整流数据复制转发给全部其他Worker,实现全进程流数据共享。

配置代码 config/app.php

/** 总开关:是否启用多进程Worker模式 */
define('ENABLE_MULTI_PROCESS', true);
/** Worker进程数量,建议不超过服务器CPU物理核心数 */
define('WORKER_COUNT', 3);
/** 进程间TCP通信端口起始值,自动依次分配 8502、8503... */
define('COPY_PORT_START', 8502);

关闭多进程(ENABLE_MULTI_PROCESS=false)时,进程数量、内部通信端口配置全部失效,服务运行在单进程模式,无需IPC流同步。

多进程端口负载均衡规则

  1. Linux:系统支持端口复用,多个Worker可同时监听8501主FLV端口,内核自动将播放器连接均衡分发至各Worker;
  2. Windows:系统虽支持SO_REUSEADDR端口复用,但新TCP连接只会固定分配给最先绑定8501的进程,无法原生负载均衡;可借助Nginx反向代理内部通信端口(8502+)实现流量均分;
  3. 内部IPC端口对外可直接访问拉流,用于Windows环境手动负载均衡。

平台性能限制说明

  • Linux:epoll IO模型,单进程支持数千并发长连接,多进程可充分利用多核CPU,生产环境首选;
  • Windows:底层select模型并发上限极低(单进程约256连接),仅用于本地开发调试,禁止线上生产部署。

推流鉴权配置

功能说明

防止非法流覆盖直播间,仅携带合法stream key的推流请求允许接入;播放器拉流无需鉴权。
配置文件 config/auth.php

<?php
return [
    'enabled' => false, // 鉴权总开关
    'publish' => [
        'require_auth' => true, // 推流强制校验密钥
        'stream_keys' => [
            'live_123456',
            'stream_key_abc',
        ],
    ],
    'global' => [
        'allowed_apps' => ['live'], // 允许的应用名
        'deny_apps' => [],
    ],
];

鉴权推流地址写法

通过URL参数key携带密钥:

  1. RTMP
ffmpeg -re -i video.mp4 -f flv rtmp://<your-server-ip>:1935/live/stream?key=live_123456
  1. OBS串流密钥:stream?key=live_123456
  2. HTTP-FLV
ffmpeg -re -i video.mp4 -f flv http://<your-server-ip>:8501/live/stream?key=live_123456
  1. WS-FLV PHP客户端
php pusher.php test.flv "ws://<your-server-ip>:8501/live/stream?key=live_123456"

安全最佳实践

  1. 替换默认密钥,使用32位以上随机字符串;
  2. 公网环境部署启用HTTPS/WSS,避免密钥明文抓包;
  3. 定期轮换stream key,降低泄露风险。
  4. 系统默认关闭了鉴权,若有需要请自行开启

FLV 直播分发网关

功能简介

轻量化流量转发服务,向上游源站拉取HTTP-FLV/WS-FLV流,缓存GOP关键帧实现播放器秒开;支持横向扩容、多级级联分发,分担源站并发压力。

启动命令

# 基础单实例启动
php flvGateway.php 8080 http://<your-server-ip>:8501
php flvGateway.php 8080 ws://<your-server-ip>:8501

# 同层横向扩容多实例
php flvGateway.php 8080 http://<your-server-ip>:8501
php flvGateway.php 8081 http://<your-server-ip>:8501
php flvGateway.php 8082 ws://<your-server-ip>:8501

# 多级级联(不建议超过两级)
php flvGateway.php 8080 http://<your-server-ip>:8501    # 一级网关
php flvGateway.php 8081 http://<your-server-ip>:8080     # 二级网关

# Linux后台静默运行
php flvGateway.php 8080 http://<your-server-ip>:8501 > /dev/null 2>&1 &

网关播放地址格式

http://网关IP:端口/{app}/{stream}.flv
ws://网关IP:端口/{app}/{stream}.flv

示例:http://<your-server-ip>:8080/live/stream.flv

静态文件 HTTP 网关

功能简介

独立静态资源HTTP服务,托管HLS、MP4、FLV、前端页面,分离文件IO与直播流业务,提升高并发点播稳定性。

启动命令

# 单实例启动
php fileGateway.php 0.0.0.0 8100

# 多实例横向扩容
php fileGateway.php 0.0.0.0 8100
php fileGateway.php 0.0.0.0 8101
php fileGateway.php 0.0.0.0 8102

# Linux后台运行
php fileGateway.php 0.0.0.0 8100 > /dev/null 2>&1 &

Nginx 负载均衡反向代理示例

upstream filegateway_cluster {
    server <your-server-ip>:8100;
    server <your-server-ip>:8101;
    server <your-server-ip>:8102;
}
server {
    listen 80;
    server_name media.example.com;
    location ~* \.(m3u8|ts|mp4|m4s|flv|html|css|js)$ {
        proxy_pass http://filegateway_cluster;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

资源访问地址示例

http://<your-server-ip>:8100/index.html
http://<your-server-ip>:8100/hls/live/stream/index.m3u8
http://<your-server-ip>:8100/mp4/live/stream/output_merge/stream_full.mp4

多方式推拉流接入教程

RTMP 推流

OBS、FFmpeg、PHP客户端均兼容标准RTMP协议,地址格式:rtmp://host:1935/{app}/{stream}

HTTP-FLV 推流

适合命令行、程序自动化推流,地址:http://host:8501/{app}/{stream}

WebSocket-FLV 推流

浏览器原生推流方案,延迟最低可达50ms内,使用内置push.html页面即可。

PHP 拉流脚本

用于服务端拉流备份、跨服务器流转:

php puller.php http://<your-server-ip>:8501/live/stream.flv output.flv
php puller.php ws://<your-server-ip>:8501/live/stream.flv output.flv

直播转发教程

本项目提供直播转发功能,可以将直播转发到多路服务器,支持rtmp/ws-flv/http-flv协议推拉流。详细命令见forward.php详解,转发命令示例如下:

php forward.php http://<your-server-ip>:8501/a/b.flv "rtmp://<your-server-ip>:1935/c/d,ws://<your-server-ip>:8501/c/e,http://<your-server-ip>:8501/c/f" 

上面的命令表示将直播流http://<your-server-ip>:8501/a/b.flv 转发推流到 rtmp://<your-server-ip>:1935/c/d,ws://<your-server-ip>:8501/c/ehttp://<your-server-ip>:8501/c/f
,当然你也可以推流到其他任意支持rtmp,ws-flv,http-flv的平台。

工程化建议

pusher.php/puller.php可集成至后端定时任务,实现自动拉流转推、备份录制,不依赖第三方工具,完成全PHP直播业务闭环。

根据您的描述,我设计了一份十万级并发集群部署架构图及其详细说明。该架构突出高可用、弹性伸缩、多活容灾,并强调源/边缘节点角色可互换、自动同步、多备份录制等特性。您可以直接将以下内容作为新章节插入 README(建议放在“系统整体架构”之后)。


十万级及以上并发集群部署架构

┌─────────────────────────────────────────────────────────────────────────────────────────┐
│                                    【第一层:多主播推流层】                               │
│                                                                                         │
│     主播A (OBS/Web/FFmpeg)       主播B (OBS/Web/FFmpeg)      主播N (OBS/Web/FFmpeg)    │
│            │                              │                             │               │
│      ┌─────┼─────┐                 ┌─────┼─────┐                ┌─────┼─────┐        │
│      ▼     ▼     ▼                 ▼     ▼     ▼                ▼     ▼     ▼        │
│    [节点1] [节点2] [节点3]       [节点1] [节点2] [节点3]      [节点1] [节点2] [节点3]     (同时推流至多个源节点,实现推流端容灾)                                             │
└─────────────────────────────────────────────────────────────────────────────────────────┘
                                          │
                                          │ RTMP/HTTP-FLV/WS-FLV 推流接入
                                          ▼
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│                          【第二层:源节点集群(流生产核心)】                              │
│                                                                                         │
│    ┌─────────────┐   ┌─────────────┐   ┌─────────────┐   ┌─────────────┐             │
│    │  源节点 A   │   │  源节点 B   │   │  源节点 C   │   │  源节点 D   │             │
│    │ server.php  │   │ server.php  │   │ server.php  │   │ server.php  │             │
│     (多进程) (多进程) (多进程) (多进程)    │             │
│    │ 录制/分片   │   │ 录制/分片   │   │ 录制/分片   │   │ 录制/分片   │             │
│    └─────┬───────┘   └─────┬───────┘   └─────┬───────┘   └─────┬───────┘             │
│          │                 │                 │                 │                      │
│          └────────┬────────┴─────────────────┴────────┬────────┘                      │
│                   │                                   │                               │
│              ┌────▼────┐                         ┌────▼────┐                          │
│              │ forward │                         │ forward │  ← 自动同步直播流(拉流→推流)│
│              │ 同步    │                         │ 同步    │                          │
│              └────┬────┘                         └────┬────┘                          │
│                   └──────────────┬────────────────────┘                               │
│                                  │                                                    │
                          (所有源节点互为备份,任意节点故障,其他节点继续服务)           │
└──────────────────────────────────┼────────────────────────────────────────────────────┘
                                   │
                                   │ forward 拉流 (从源节点拉取,推至边缘)
                                   ▼
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│                        【第三层:边缘节点集群(流分发与缓存)】                           │
│                                                                                         │
│    ┌─────────────┐   ┌─────────────┐   ┌─────────────┐   ┌─────────────┐             │
│    │  边缘节点 X │   │  边缘节点 Y │   │  边缘节点 Z │   │  边缘节点 W │             │
│    │ server.php  │   │ server.php  │   │ server.php  │   │ server.php  │             │
│     (多进程) (多进程) (多进程) (多进程)    │             │
│    │ 录制/分片   │   │ 录制/分片   │   │ 录制/分片   │   │ 录制/分片   │             │
│    └─────┬───────┘   └─────┬───────┘   └─────┬───────┘   └─────┬───────┘             │
│          │                 │                 │                 │                      │
│          └────────┬────────┴─────────────────┴────────┬────────┘                      │
│                   │                                   │                               │
│              ┌────▼────┐                         ┌────▼────┐                          │
│              │ forward │                         │ forward │  ← 自动从源节点拉流,缓存 │
│              │ 同步    │                         │ 同步    │                          │
│              └─────────┘                         └─────────┘                          │
│                                                                                         │
│  ★ 源与边缘角色动态切换:任一节点可随时升级为源节点(接收主播推流),或降级为边缘节点   │
│  ★ 所有节点均独立录制,实现多副本备份,提高数据可靠性                                   │
└──────────────────────────────────┼────────────────────────────────────────────────────┘
                                   │
                     ┌─────────────┴─────────────┐
                     │                           │
                     ▼                           ▼
┌────────────────────────────┐ ┌────────────────────────────┐
│   【第四层:网关分发层】    │ │   【第四层:网关分发层】    │
│                            │ │                            │
│     flvGateway 集群        │ │     fileGateway 集群       │
│  ┌─────┐ ┌─────┐ ┌─────┐ │ │  ┌─────┐ ┌─────┐ ┌─────┐ │
│  │网关1│ │网关2│ │网关3│ │ │  │网关1│ │网关2│ │网关3│ │
│  └──┬──┘ └──┬──┘ └──┬──┘ │ │  └──┬──┘ └──┬──┘ └──┬──┘ │
│     │       │       │     │ │     │       │       │     │
│     └───────┼───────┘     │ │     └───────┼───────┘     │
│             │             │ │             │             │
    (HTTP-FLV/WS-FLV)   (HLS/MP4/FLV点播/静态页面)│
└─────────────┼─────────────┘ └─────────────┼─────────────┘
              │                             │
              └─────────────┬───────────────┘
                            │
                            ▼
┌─────────────────────────────────────────────────────────────────────────────────────────┐
│                              【第五层:观众终端】                                        │
│                                                                                         │
│   PC浏览器 (MSE/FLV.js)    移动端 (HLS)    ffplay/专业播放器   WebSocket 播放器        │
│                                                                                         │
│   ★ 观众就近接入边缘网关,通过负载均衡(DNS或Nginx)自动分配至最优节点                  │
└─────────────────────────────────────────────────────────────────────────────────────────┘

架构设计核心说明

1. 推流层高可用(容灾)

  • 多路推流:主播可同时向多个源节点(如节点A、B、C)推流,任一节点故障,其他节点仍持有流,观众无感知切换。
  • 推流端自动故障转移:OBS/FFmpeg 可配置备用推流地址,实现主备切换;Web端可通过JavaScript多路推送。

2. 源节点集群(流生产核心)

  • 多活部署:所有源节点均处于活动状态,均能接收推流,且通过 forward.php 互相同步流数据,保证每个源节点都拥有完整流副本。
  • 自动故障转移:任意源节点宕机,其他节点继续提供服务,转发同步链路自动重连,业务不中断。
  • 并行录制:每个源节点独立执行 FLV/fMP4/HLS 录制,实现多份物理备份,防止单点存储丢失。

3. 边缘节点集群(流分发与缓存)

  • 就近拉流:边缘节点通过 forward.php 从源节点拉取直播流,缓存 GOP 关键帧,为观众提供低延迟、秒开播放。
  • 弹性伸缩:根据并发量动态增减边缘节点,支持水平扩展(如应对突发流量)。
  • 角色灵活切换:源节点与边缘节点使用相同代码,可随时通过配置提升为源节点(接收推流)或降级为边缘节点(仅拉流分发),实现资源按需调配。

4. 网关分发层

  • flvGateway 集群:专为 HTTP-FLV/WS-FLV 实时流设计,无转码、纯转发,配合 GOP 缓存实现秒开,支持多级级联,横向扩容应对海量播放器连接。
  • fileGateway 集群:独立托管 HLS 分片、MP4 点播文件、静态页面等资源,与动态流业务分离,避免文件 IO 阻塞直播服务。

5. 观众终端

  • 多协议覆盖:支持 RTMP、HTTP-FLV、WS-FLV、HLS,适配 PC、移动端、Web 等全平台。
  • 智能调度:通过 DNS 轮询、Nginx 反向代理或全局负载均衡(GSLB),将观众请求引导至最近或负载最低的边缘节点,确保体验最优。

6. 数据流走向

  1. 推流:主播 →(多路)→ 源节点集群 → forward 同步到所有源节点。
  2. 拉流(边缘):边缘节点 → forward 从任一源节点拉取 → 缓存 → 服务本地观众。
  3. 播放:观众 → 负载均衡 → flvGateway/fileGateway → 边缘节点(或源节点)→ 获取流数据。
  4. 录制:所有节点(源/边缘)均按配置录制,最终合并为 MP4 供点播回放。

7. 容灾与备份机制

  • 节点级容灾:任何单节点(源或边缘)宕机,转发客户端会自动重连至其他存活节点,流数据不中断。
  • 地域级容灾:若整个机房故障,可通过 DNS 切换至备用机房(需部署多套集群),实现跨地域高可用。
  • 录制备份:每个节点独立存储录制文件,重要直播可选择多个节点同时录制,确保数据不丢失。

8. 扩展性与并发能力

  • 水平扩展:所有层均支持横向扩容,新增节点即可分担负载,无需重启现有服务。
  • 十万级并发:边缘节点与网关层可大规模水平扩展,配合 CDN 边缘加速,可支撑 10万+ 观众同时观看(需保障带宽和服务器资源)。
  • 性能优化:Linux 下 event 扩展(epoll)驱动,单节点可承载数千长连接(视服务器具体配置而定),多节点集群线性提升并发能力。

9. 部署建议

  • 节点间的数据同步通过内置的 forward.php 转播客户端完成。该工具支持从任意源拉取 RTMP/HTTP-FLV/WS-FLV 流,并可同时推送到一个或多个目标节点,
    且在推送时支持携带鉴权参数(如 key)。开发者可根据实际网络拓扑和业务需求,编写调度脚本(例如结合健康检查、负载均衡策略或业务规则)动态配置拉流源地址、
    目标节点列表及转发参数,从而实现节点间的自动化流同步。源节点与边缘节点的角色切换同样依赖外部调度逻辑:建议通过监控节点的系统状态(如 CPU 负载、
    内存占用、活跃连接数、推流数量等)或外部流量分配策略,触发脚本动态调整节点角色,从而实现弹性伸缩、故障转移和容灾切换。整个调度体系可根据实际场景定制,提供高度灵活的生产级部署方案。

常见问题 FAQ

Q1 Windows启动提示缺失event扩展怎么办?

Windows无event扩展,服务自动切换select IO模型,仅需安装sockets扩展即可正常运行,无需额外处理。

Q2 如何确认服务正常启动?

终端输出三条监听日志即代表启动成功:RTMP 1935、FLV 8501、静态80端口。

Q3 推流成功但播放器持续卡顿?

  1. 推流码率、分辨率过高,降低码率/帧率测试;
  2. 服务器CPU满载,开启多进程充分利用多核;
  3. 高并发未部署FLV网关,大量播放器连接占用源站资源;
  4. 服务器上行带宽不足,限制并发在线人数。

Q4 如何停止服务?

终端按下Ctrl + C发送终止信号,或直接关闭运行终端窗口。

Q5 支持哪些第三方推流软件?

全兼容标准RTMP客户端:OBS Studio、FFmpeg、xSplit、移动端RTMP推流SDK。

开源协议

本项目采用 Apache License 2.0 开源协议。
软件按现状提供,不提供任何明示或隐含担保,开发者不对使用本程序产生的直接、间接、衍生损失承担责任,完整条款查看项目根目录LICENSE文件。

附属工具包

项目底层编解码、流转封装能力独立拆分工具包:2723659854/flv2mp4
提供FLV/MP4/fMP4/HLS互转、独立推拉流客户端、网关组件,可单独引入第三方PHP项目使用。

联系方式

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。