当前位置: 首页 > news >正文

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

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


目录

  • 环境依赖
  • 快速开始
  • 推拉流地址规范
  • 直播&点播访问地址
  • Web 页面使用说明
  • 项目目录结构
  • 系统整体架构
  • 端口常量配置
  • 录制任务开关配置
  • 多进程 Worker 配置(IPC 流同步核心)
  • 推流鉴权配置
  • FLV 直播分发网关
  • 静态文件 HTTP 网关
  • 多方式推拉流接入教程
  • 直播转发教程
  • 十万级及以上并发集群部署架构
  • 常见问题 FAQ
  • 开源协议
  • 附属工具包
  • 联系方式

环境依赖

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

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


快速开始

1. 项目安装

composercreate-project xiaosongshu/rtmp_servercdrtmp_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://127.0.0.1/push.html
  • 本地 MP4/FLV 文件循环推流:http://127.0.0.1/flv_push.html
方式2:FFmpeg 标准推流
ffmpeg-re-stream_loop-1-ivideo.mp4-c:vlibx264-c:aaac-fflv rtmp://127.0.0.1:1935/live/stream
方式3:OBS Studio 推流
  • 服务器:rtmp://127.0.0.1:1935/live/
  • 串流密钥:stream
方式4:项目内置 PHP 推流客户端
php pusher.php test.mp4 http://127.0.0.1:8501/live/stream

4. 快速观看直播

浏览器访问:http://127.0.0.1/index.html


推拉流地址规范

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

协议标准格式示例地址
RTMPrtmp://host:1935/{app}/{stream}rtmp://127.0.0.1:1935/live/stream
HTTP-FLVhttp://host:8501/{app}/{stream}http://127.0.0.1:8501/live/stream
WebSocket-FLVws://host:8501/{app}/{stream}ws://127.0.0.1:8501/live/stream

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

直播点播访问地址

实时直播播放地址
协议访问地址适用场景
RTMPrtmp://127.0.0.1:1935/live/streamffplay、桌面专业播放器
HTTP-FLVhttp://127.0.0.1:8501/live/stream.flvPC 浏览器低延迟直播
WebSocket-FLVws://127.0.0.1:8501/live/stream.flv浏览器原生 WebSocket MSE 播放
HLShttp://127.0.0.1:80/hls/live/stream/index.m3u8移动端、微信内置浏览器
录制点播回放地址

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

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

Web 页面使用说明

直播播放页面

页面文件功能说明访问地址
index.htmlHTTP-FLV 低延迟直播播放器http://127.0.0.1/index.html
play.htmlHLS 移动端适配播放器http://127.0.0.1/play.html
mp4.htmlMP4 点播专用页面http://127.0.0.1/mp4.html
video.htmlFLV 点播播放器http://127.0.0.1/video.html
play_merge.htmlfMP4 分片点播页面http://127.0.0.1/play_merge.html

Web 端推流页面

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

PHP 内置推拉流客户端脚本

脚本功能命令示例
pusher.php命令行文件推流客户端php pusher.php video.mp4 http://127.0.0.1:8501/live/stream
puller.php命令行拉流录制客户端php puller.php http://127.0.0.1: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-FLV、WS-FLV、HLS 直播流 ║ ║ 📦 点播产物: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分片,直播结束自动合并完整MP4define('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

<?phpreturn['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-ivideo.mp4-fflv rtmp://127.0.0.1:1935/live/stream?key=live_123456
  1. OBS串流密钥:stream?key=live_123456
  2. HTTP-FLV
ffmpeg-re-ivideo.mp4-fflv http://127.0.0.1:8501/live/stream?key=live_123456
  1. WS-FLV PHP客户端
php pusher.php test.flv"ws://127.0.0.1:8501/live/stream?key=live_123456"

安全最佳实践

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

FLV 直播分发网关

功能简介

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

启动命令

# 基础单实例启动php flvGateway.php8080http://127.0.0.1:8501 php flvGateway.php8080ws://127.0.0.1:8501# 同层横向扩容多实例php flvGateway.php8080http://127.0.0.1:8501 php flvGateway.php8081http://127.0.0.1:8501 php flvGateway.php8082ws://127.0.0.1:8501# 多级级联(不建议超过两级)php flvGateway.php8080http://127.0.0.1:8501# 一级网关php flvGateway.php8081http://127.0.0.1:8080# 二级网关# Linux后台静默运行php flvGateway.php8080http://127.0.0.1:8501>/dev/null2>&1&

网关播放地址格式

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

示例:http://127.0.0.1:8080/live/stream.flv

静态文件 HTTP 网关

功能简介

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

启动命令

# 单实例启动php fileGateway.php0.0.0.08100# 多实例横向扩容php fileGateway.php0.0.0.08100php fileGateway.php0.0.0.08101php fileGateway.php0.0.0.08102# Linux后台运行php fileGateway.php0.0.0.08100>/dev/null2>&1&

Nginx 负载均衡反向代理示例

upstream filegateway_cluster { server 127.0.0.1:8100; server 127.0.0.1:8101; server 127.0.0.1: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://127.0.0.1:8100/index.html http://127.0.0.1:8100/hls/live/stream/index.m3u8 http://127.0.0.1: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://127.0.0.1:8501/live/stream.flv output.flv php puller.php ws://127.0.0.1:8501/live/stream.flv output.flv

直播转发教程

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

php forward.php http://127.0.0.1:8501/a/b.flv"rtmp://127.0.0.1:1935/c/d,ws://127.0.0.1:8501/c/e,http://127.0.0.1:8501/c/f"

上面的命令表示将直播流http://127.0.0.1:8501/a/b.flv转发推流到rtmp://127.0.0.1:1935/c/d,ws://127.0.0.1:8501/c/ehttp://127.0.0.1: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项目使用。

联系方式

  • 邮箱:2723659854@qq.com
  • GitHub:https://github.com/2723659854
http://www.jsqmd.com/news/1106944/

相关文章:

  • Java计算机毕设之基于 SpringBoot 的校园勤工助学岗位管控系统的设计与实现 基于 SpringBoot 的大学生兼职资源共享平台(完整前后端代码+说明文档+LW,调试定制等)
  • 如何利用MeEdu双云架构构建高可用在线教育视频点播平台
  • 提示词的“四要素”,少一个都可能翻车
  • 通达信多版本完美共享方案:一键共用vipdoc盘后数据\+T0002自选股\+全部自定义公式
  • Selenium自动化测试:XPath与CSS Selector定位策略深度解析
  • 八佰里影业影视融合文旅项目启动,打造全新产业生态
  • Halcon 向量到变换矩阵算子对比
  • Claude Sonnet 5 正式发布:模型 ID、价格、上下文变化与接入要点
  • JMeter性能测试实战:精准测量QPS、TPS与吞吐量的完整指南
  • 设置IDEA的内存
  • 生产级机器学习服务:从Notebook到高可用模型推理
  • Java毕设选题推荐:基于 SpringBoot 的高校兼职信息智能推送系统的设计与实现 基于 SpringBoot 的学生校园兼职应聘管理系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 基于AWVS API构建B/S架构漏洞扫描管理平台实战指南
  • 计算机Java毕设实战-基于 SpringBoot 的企业会议室资源调度管理系统的设计与实现 基于 SpringBoot 的智能会议室线上预订管【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 硬件研发避坑|蓝牙BQB认证繁琐?全套认证蓝牙模组,告别射频调试+重复认证
  • 【电赛/毕设天花板】别再调包 SimpleFOC 了!STM32 纯手写 FOC 矢量控制:空间变换、SVPWM 与相电流采样硬核指南
  • 当我们在讨论CQRS时,我们在讨论些神马?
  • XXL-JOB v3.4.0 发布 | OpenClaw集成、合并调度、健壮性及体验增强
  • ulimit永久设置方法
  • AI逆向 - 某众点MTGSIG/某里234醇酸
  • 公司电脑文件如何加密?这几种办法有效又实用
  • 旅商学院线上课程介绍助力旅行社老板打造个人IP与提升业绩技巧
  • 保冷管束用在哪里?六大核心应用场景全梳理
  • 用Claude对MicroPython代码进行AI审查:零基础手把手教你
  • 2026商城网站制作哪家好,哪些方案更适合没有技术团队的商家
  • 【毕业设计】基于 SpringBoot 的会议室占用登记与审批系统的设计与实现 基于 SpringBoot 的单位会议场地预约管理系统(源码+文档+远程调试,全bao定制等)
  • 互联网医院|在线问诊提升医疗服务质量
  • 文件转Base64编码工具
  • 【计算机毕业设计案例】基于 SpringBoot 的工业协作机器人宣传展示系统的设计与实现 基于 SpringBoot 的机器人技术科普门户网站(程序+文档+讲解+定制)
  • 不懂数据库索引的底层原理?那是因为你心里没点b树