使用PHP搭建rtmp直播流媒体服务

RTMP Server

纯 PHP 编写的轻量级 RTMP 直播服务,无第三方流媒体服务依赖,开箱快速搭建私有化直播平台。

🏗️ 系统架构

  【推流端】OBS/FFmpeg
 │ RTMP 推流(1935)
 │ ▼╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║                                                         RTMP 源站主服务器 (核心)                                                 ║
║                                                                                                                              ║
║ 📥 推流接入 RTMP 接收、链接认证 ║║ 🔄 协议转换 RTMPHTTP-FLV / WebSocket-FLV / HLS / fMP4 / MP4                                                             ║║ 💾 实时录制 ┌──────────────┬──────────────┬──────────────┐                                                                 ║║               │  FLV录制 │  fMP4切片 │  HLS切片 │ 三个独立并行任务 ║║                 (实时裸流)    (实时分片)    (实时分片)  │                                                                   ║
║               └──────────────┴──────────────┴──────────────┘                                                                 ║
║ 📤 直播输出 HTTP-FLV(8501) / WebSocket-FLV / HLS实时流 / fMP4实时流 ║║ 📦 点播产出 fMP4切片实时生成 → 直播结束后自动合并为完整MP4                                                                   ║
║ 📁 静态服务   源站内置HTTP服务(80端口),可直接提供静态文件访问(适用于低并发场景) ║╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
 │ ┌───────────────────────┼───────────────────────┐ │                       │                       │ ▼                       ▼                       ▼ HTTP-FLV(8501)           HLS(TS/m3u8)           fMP4(切片)
  实时流输出                静态文件                 静态文件
 │                       │                       │ │                       │                       │ ▼                       ▼                       ▼┌─────────────────┐     ┌─────────────────────────────────────────────────┐
│  FLV 网关集群 │     │ 静态文件网关集群 (fileGateway)        ││                 │     │ 🎯 托管:HLS / fMP4 / MP4 / FLV / Web页面 ││  ┌───────────┐  │     │                                                 │
│  │ 一级网关 │  │     │  ┌───────────┐  ┌───────────┐  ┌───────────┐   ││   (8080)    │  │     │  │ 网关节点1  │  │ 网关节点2  │  │ 网关节点3  │   │
│  └─────┬─────┘  │     │   (8100) (8101) (8102)    │   │
│        │        │     │  └─────┬─────┘  └─────┬─────┘  └─────┬─────┘   │
│  ┌─────┴─────┐  │     │        │              │              │         │
│  ▼     ▼     ▼  │     │        ▼              ▼              ▼         │
│ ┌───┐ ┌───┐ ┌───┐│     │   ┌──────────────────────────────────────┐    │
│ │子 │ │子 │ │子 ││     │   │ 客户端 (Client)              │    ││ │网 │ │网 │ │网 ││     │   │   HLS播放器 / MSE播放器 / 点播请求 │    ││ │关 │ │关 │ │关 ││     │   └──────────────────────────────────────┘    ││ └─┬─┘ └─┬─┘ └─┬─┘│     │                                                 │
│   │     │     │  │     └─────────────────────────────────────────────────┘
│   ▼     ▼     ▼  │
│ ┌──────────────┐ │
│ │ 客户端 │ ││ │ FLV播放器 │ ││ └──────────────┘ │
└─────────────────┘

架构说明

  • 源站服务:唯一流生产节点,负责 RTMP 推拉流接入、多协议转封装。FLV录制、fMP4切片、HLS切片三个任务完全独立并行运行,互不阻塞。

  • 源站静态能力:源站内置 HTTP 服务(默认80端口),可直接提供静态文件访问。低并发场景下无需额外部署网关,开箱即用。

  • 实时录制机制

    • FLV录制:实时保存原始裸流,直播结束后得到完整FLV文件
    • fMP4切片:实时生成音视频 fMP4 分片(支持混合切片和分离切片两种格式),直播结束后自动合并为完整 MP4
      • HLS切片:实时生成 TS 分片 + m3u8 索引(移动端兼容)
    • 独立开关:用户可在 server.php 中分别配置是否开启各录制任务
  • FLV 直播网关集群:纯流量转发服务,向上拉取 HTTP-FLV 流、缓存 GOP 关键帧实现播放秒开,向下分发至终端客户端或下级网关。

    • 支持无限层级级联:一级网关 → 二级网关 → 三级网关 → … → 客户端
    • 支持横向扩容:同层级部署多个网关实例,通过负载均衡分发流量
    • 单进程限制:Windows 约 256 连接/进程,Linux 约 1024 连接/进程(受限于 select 事件轮询机制)
  • 静态文件网关集群 (推荐):轻量级 HTTP 静态文件服务器,统一托管所有静态资源。

    • 适用协议:HLS (.m3u8/.ts)、fMP4 (.m4s/.mp4)、MP4 点播文件、FLV 录制文件、Web 播放页面
    • 支持横向扩容:同层级部署多个网关实例,线性提升并发能力
    • 支持纵向级联:可通过 Nginx 等反向代理对静态文件网关进行多层级流量分发
    • 单进程限制:Windows 约 256 连接/进程,Linux 约 1024 连接/进程
    • 最佳实践:将 HLS/fMP4/MP4 播放路径指向此网关集群,实现静态资源读写分离
  • 部署建议

    • 低并发场景(< 500 并发):直接使用源站内置 HTTP 服务,无需额外网关
    • 中等并发场景(500 - 5000 并发):
      • 源站 + 单层网关集群(FLV网关 或 静态文件网关)
      • 网关开启多进程/多实例,前端配置负载均衡
    • 高并发场景(> 5000 并发):
      • 源站专注「推流、协议转换、实时录制」
    • FLV 网关多级集群:一级网关 → 二级网关 → 客户端
    • 静态文件网关多级集群:一级网关 → 二级网关 → 客户端
      • 每层网关均可横向扩容,线性提升并发能力

并发能力说明

组件 单进程最大连接数 扩展方式 集群理论最大并发
RTMP 源站 约 1024 (Linux) 不支持多进程 ~1024
FLV 网关 约 1024 (Linux) 多进程 + 多级级联 + 横向扩容 1024 × N × M
静态文件网关 约 1024 (Linux) 多进程 + 多级级联 + 横向扩容 1024 × N × M

实际并发能力取决于:服务器硬件配置、网络带宽、业务逻辑复杂度、PHP 配置等因素。上述数值为理论最大值,建议生产环境预留 30% 缓冲。

✨ 功能特性

  • 🎥 完整 RTMP 推拉流:全协议实现,支持标准 publish / play 指令
  • 📡 HTTP-FLV / WebSocket-FLV:浏览器低延迟直播方案
  • 🧩 HLS 自动分片:实时生成 m3u8 + TS,全平台移动端兼容
  • 📦 fMP4 实时切片 + 自动合并:直播时实时生成 fMP4 分片,直播结束自动合并为完整 MP4
  • 🎬 双 fMP4 格式支持:同时支持音视频混合切片和音视频分离切片两种格式
  • 💾 FLV 独立录制:实时保存原始 FLV 裸流,与 fMP4/MP4 解耦
  • 🎛️ 独立任务开关:FLV录制、fMP4切片、HLS切片可分别独立配置启用/禁用
  • 🖥️ 内置多套Web播放器:开箱即用,支持 FLV/HLS/MP4/混合fMP4/分离fMP4 播放
  • 🚀 可级联 FLV 流媒体网关:无限层级分流、GOP缓存秒开、断流自动重连,支撑高并发直播场景
  • 📁 静态文件网关:统一托管 HLS/fMP4/MP4 录制资源及播放页面,支撑高并发点播场景
  • 🐳 Docker 一键部署:快速拉起测试环境
  • 原生纯PHP实现:不依赖任何第三方流媒体程序

📋 环境依赖

  • PHP >= 8.1(仅 CLI 命令行模式运行)
  • 必须启用扩展:sockets
  • 可选推荐开启:pcntl(Linux/macOS,优化进程管理)

🚀 快速开始

1. 安装项目

composer create-project xiaosongshu/rtmp_server

2. 配置录制开关(server.php

// 三个独立录制任务开关,可根据需要分别开启/关闭
define('FLV_TO_RECORD', true);   // 是否实时录制FLV原始文件
define('FLV_TO_MP4', true);      // 是否实时生成fMP4切片并合并为MP4
define('FLV_TO_HLS', true);      // 是否实时生成HLS(TS)切片

3. 启动源站服务

php server.php

4. 访问播放(低并发场景直接使用源站)

# 播放页面访问(源站内置HTTP服务)
http://127.0.0.1/index.html      # FLV直播页面
http://127.0.0.1/play.html       # HLS直播页面
http://127.0.0.1/mp4.html        # MP4点播页面
http://127.0.0.1/play_merge.html # fMP4分片点播页面(支持混合/分离两种格式)

5. 中等/高并发场景:部署静态文件网关集群(推荐)

适用场景:HLS(.ts/.m3u8)、fMP4(.m4s/.mp4)、MP4 点播文件以及 Web 页面的高并发访问。可有效分担源站压力,支持横向+纵向扩容。

单进程限制:Windows 约 256 连接,Linux 约 1024 连接(受限于 select 模型)

# 启动多个进程实例(横向扩容)
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/macOS】后台运行多个实例
php fileGateway.php 0.0.0.0 8100 > /dev/null 2>&1 &
php fileGateway.php 0.0.0.0 8101 > /dev/null 2>&1 &
php fileGateway.php 0.0.0.0 8102 > /dev/null 2>&1 &

# 纵向扩容:通过 Nginx 反向代理多级分发
# 一级 Nginx -> 二级 fileGateway (8100/8101/8102) -> 三级 fileGateway ...

访问示例(通过静态文件网关):

http://127.0.0.1:8100/play.html       # 通过网关访问HLS播放页
http://127.0.0.1:8100/hls/live/stream/index.m3u8  # 通过网关访问HLS

6. 中等/高并发场景:部署 FLV 直播网关集群

适用场景:HTTP-FLV 实时直播流的高并发分发。

# 一级网关:拉取源站流
php flvGateway.php 8080 http://源站IP:8501

# 横向扩容:同层部署多个网关实例
php flvGateway.php 8081 http://源站IP:8501
php flvGateway.php 8082 http://源站IP:8501

# 纵向扩容:多级级联
php flvGateway.php 8080 http://源站IP:8501      # 一级网关
php flvGateway.php 8081 http://127.0.0.1:8080   # 二级网关(拉取一级网关)
php flvGateway.php 8082 http://127.0.0.1:8081   # 三级网关(拉取二级网关)

7. 停止服务

操作系统 终止命令
Windows Ctrl + C
Linux/macOS kill -9 PID

🔧 端口配置(修改位置:server.php

端口 通信协议 业务用途
1935 RTMP RTMP 推流、RTMP拉流播放
8501 HTTP/WebSocket HTTP-FLV / WS-FLV 直播播放 / 静态web播放页也可以访问,但是不建议
80 HTTP 静态文件服务 + Web播放器页面

🚀 FLV 流媒体网关(高并发直播分发)

网关简介

轻量化流量分发组件,支持无限层级级联部署。从上游源站/上级网关拉取 HTTP-FLV,缓存流头与 GOP 关键帧,新用户接入秒开,并复制流数据下发客户端或子网关。专为中高并发直播场景设计,支持横向+纵向扩容。

网关核心能力

  • 📡 单实例多路流并发转发,同时承载不同频道直播分发
  • 🔄 无限层级级联,一级→二级→三级网关链式扩展
  • ⚡ GOP预缓存,新连接无需等待关键帧,实现秒开播放
  • 🔁 上游流断开自动重连,终端用户无感知断线
  • 📊 内置运行统计,每10秒输出在线人数、上下行流量
  • 🚀 横向扩容:同层增加网关进程/实例,线性提升并发
  • 🚀 纵向扩容:多层级级联,分散单点压力

单进程限制

操作系统 最大连接数 说明
Windows ~256 受限于 select 模型,FD_SETSIZE 限制
Linux ~1024 可通过重新编译 PHP 调整上限
macOS ~1024 同 Linux

生产环境建议:单进程连接数达到上限的 70% 时,应增加网关实例进行分流。

FLV网关启动命令

# 【横向扩容】单层多实例
php flvGateway.php 8080 http://源站IP:8501
php flvGateway.php 8081 http://源站IP:8501
php flvGateway.php 8082 http://源站IP:8501

# 【纵向扩容】多级级联
php flvGateway.php 8080 http://源站IP:8501      # 一级网关
php flvGateway.php 8081 http://127.0.0.1:8080   # 二级网关
php flvGateway.php 8082 http://127.0.0.1:8081   # 三级网关

# 【组合扩容】多级 + 每级多实例
# 一级网关集群
php flvGateway.php 8080 http://源站IP:8501
php flvGateway.php 8081 http://源站IP:8501
# 二级网关集群(拉取一级网关)
php flvGateway.php 8180 http://127.0.0.1:8080
php flvGateway.php 8181 http://127.0.0.1:8081

网关播放地址规范

http://网关IP:端口/{应用名}/{频道名}.flv

示例:

# 一级网关
http://127.0.0.1:8080/live/stream.flv
# 二级网关
http://127.0.0.1:8081/live/stream.flv

调试日志

网关启动脚本添加 $gateway->debug = true;,开启全量详细运行日志。

📁 静态文件网关 fileGateway.php(高并发点播资源托管)

网关简介

轻量级 HTTP 静态文件服务器,统一托管所有静态资源。对于 HLS、fMP4、MP4 等基于文件的协议,这是推荐的播放方式。支持横向+纵向扩容,可支撑大规模点播并发。

核心能力

  • 📁 统一托管所有静态资源(录制文件 + 播放页面)
  • 🔗 横向扩容:多实例部署,负载均衡分发流量
  • 🔗 纵向扩容:多层级级联(如 Nginx + fileGateway + 后端存储)
  • 📊 内置访问日志,便于统计分析
  • 🚀 纯 PHP 实现,轻量无依赖
  • 💡 最佳实践:将 HLS/fMP4/MP4 播放路径指向此网关集群,源站只负责写入文件,实现读写分离

单进程限制

操作系统 最大连接数 说明
Windows ~256 受限于 select 模型
Linux ~1024 可通过多进程/多实例突破

启动命令(多进程/多实例分流)

# 基本启动(托管当前目录,端口 8100)
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

# 【纵向扩容】多级级联(结合 Nginx)
# Nginx 配置示例见下文

# Linux/macOS 后台运行多个实例
php fileGateway.php 0.0.0.0 8100 > /dev/null 2>&1 &
php fileGateway.php 0.0.0.0 8101 > /dev/null 2>&1 &
php fileGateway.php 0.0.0.0 8102 > /dev/null 2>&1 &

Nginx 反向代理配置示例

upstream filegateway_cluster {
 # 横向扩容:多个 fileGateway 实例
 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://网关IP:端口/{文件相对路径}

示例:

# Web 播放页面(通过静态网关访问)
http://127.0.0.1:8100/index.html      # FLV直播页面
http://127.0.0.1:8100/play.html       # HLS直播页面
http://127.0.0.1:8100/mp4.html        # MP4点播页面
http://127.0.0.1:8100/video.html      # FLV点播页面
http://127.0.0.1:8100/play_merge.html # fMP4分片点播页面

# 录制资源访问
http://127.0.0.1:8100/hls/live/stream/index.m3u8
http://127.0.0.1:8100/mp4/live/stream/output_merge/init.mp4
http://127.0.0.1:8100/mp4/live/stream/output_merge/stream_full.mp4
http://127.0.0.1:8100/flv/live/stream/20240101_120000.flv

📡 推流接入教程

RTMP推流地址格式

rtmp://127.0.0.1:1935/{应用名}/{频道名}
  • 应用名:示例 live
  • 频道名:示例 stream
  • 仅支持英文、数字命名

推流示例

OBS Studio 推流

1. 下载安装 OBS Studio
2. 设置 → 推流 → 服务器:rtmp://127.0.0.1:1935/live
3. 串流密钥:stream
4. 开始推流

FFmpeg 循环推流

ffmpeg -re -stream_loop -1 -i "video.mp4"  -vcodec h264 -acodec aac -f flv  rtmp://127.0.0.1:1935/live/stream

📺 播放地址汇总

实时直播地址

协议 访问链接 说明 分发建议
RTMP rtmp://127.0.0.1:1935/live/stream 原生RTMP播放器 源站直接提供
HTTP-FLV http://127.0.0.1:8501/live/stream.flv 浏览器低延迟播放 通过 FLV 网关集群分发
WebSocket-FLV ws://127.0.0.1:8501/live/stream.flv WebSocket流式播放 通过 FLV 网关集群分发
HLS http://{fileGateway_IP}:8100/hls/live/stream/index.m3u8 安卓/iOS移动端首选 必须通过 fileGateway 分发

点播回放地址(录制完成后)

文件类型 访问地址(必须通过 fileGateway) 说明
合并MP4点播 http://{fileGateway_IP}:8100/mp4/live/stream/output_merge/stream_full.mp4
混合fMP4分片点播(MSE) http://{fileGateway_IP}:8100/mp4/live/stream/output_merge/init.mp4
分离音视频fMP4点播 http://{fileGateway_IP}:8100/mp4/live/stream/output_separate/audio_init.mp4
原始FLV点播 http://{fileGateway_IP}:8100/flv/live/stream/20240101_120000.flv

高并发场景下:必须使用静态文件网关集群(如 127.0.0.1:8100/8101/8102),通过负载均衡分发,实现静态资源读写分离。

Web 播放页面

页面用途 访问地址(推荐通过 fileGateway) 说明
FLV直播播放 http://{fileGateway_IP}:8100/index.html HTTP-FLV低延迟直播
HLS直播播放 http://{fileGateway_IP}:8100/play.html HLS移动端兼容直播
合并MP4点播 http://{fileGateway_IP}:8100/mp4.html 完整MP4文件点播
原始FLV点播 http://{fileGateway_IP}:8100/video.html FLV原生文件点播
fMP4分片点播 http://{fileGateway_IP}:8100/play_merge.html 同时支持音视频混合切片和分离切片播放

💾 实时录制说明

录制机制(三任务独立并行)

推流开始后,源站同时启动三个独立并行的录制任务,互不阻塞:

 ┌─────────────────────────────────────────────────┐ │                  RTMP 推流 │ └─────────────────────┬───────────────────────────┘ │ ┌─────────────────────┼───────────────────────────┐ │                     │                           │ ▼                     ▼                           ▼ ┌───────────────┐     ┌───────────────┐           ┌───────────────┐ │   FLV录制 │     │   fMP4切片 │           │   HLS切片 │   (实时裸流)  (实时分片)  (实时分片)   │
 └───────┬───────┘     └───────┬───────┘           └───────┬───────┘ │                     │                           │ ▼                     ▼                           ▼ ┌───────────────┐     ┌───────────────┐           ┌───────────────┐ │ 完整FLV文件 │     │  fMP4分片集 │           │   TS分片集 │   (直播结束)  (直播中)     │           │  + m3u8索引 │ └───────────────┘     └───────┬───────┘           └───────────────┘ │ │ 直播结束后自动合并
 ▼ ┌───────────────┐ │ 完整MP4文件 │   (点播回放)   │
 └───────────────┘```

### 任务独立性说明

| 录制任务 | 实时性 | 产出物 | 用途 | 独立开关 |
| ------------ | ---------- | -------------------------- | -------------------------- | --------------------- |
| **FLV录制**  | 实时 | 完整FLV文件 | 原始格式备份、VLC播放 | `FLV_TO_RECORD`       |
| **fMP4切片** | 实时 | fMP4分片 → 结束后合并为MP4 | 浏览器MSE播放、点播回放 | `FLV_TO_MP4`          |
| **HLS切片**  | 实时 | TS分片 + m3u8              | 移动端兼容、HLS直播 | `FLV_TO_HLS`          |

## 📁 项目目录结构

rtmp_server/
├── flv/ # FLV原始录制文件(FLV_TO_RECORD)
├── mp4/ # MP4/fMP4转码产物(FLV_TO_MP4)
├── hls/ # HLS TS分片+m3u8索引(FLV_TO_HLS)
├── MediaServer/ # RTMP核心协议、推拉流会话逻辑
├── Root/ # 底层异步IO、Socket事件驱动
├── SabreAMF/ # AMF0/AMF3编解码
├── server.php # 源站启动入口
├── fileGateway.php # 静态文件网关
├── flvGateway.php # FLV直播网关
├── *.html # Web播放页面
└── README.md

❓ 常见问题 FAQ

1. 单进程为什么只能支持 1024 个连接?

  • 原因:PHP 原生 socket select 模型受限于 FD_SETSIZE 宏定义(默认 1024)
  • 解决方案
    • 横向扩容:部署多个网关进程/实例
    • 纵向扩容:多层级级联
    • 编译 PHP 时调整 FD_SETSIZE 值(不推荐,可能引发稳定性问题)

2. 网关如何支撑高并发?

扩容方式 说明 示例
横向扩容 同层部署多实例,负载均衡 3 个 fileGateway 实例,每个 1024 连接 → 3072 并发
纵向扩容 多层级级联 一级网关(1024) → 二级网关(1024×N) → 三级网关…
组合扩容 横向+纵向结合 每层 3 实例 × 3 层级 = 理论 9216 并发

3. 什么时候需要部署网关?

并发场景 部署方案
低并发(< 500) 仅源站即可,源站内置 HTTP 服务直接对外
中等并发(500 - 5000) 源站 + 单层网关集群(2-5 个实例)
高并发(> 5000) 源站 + 多级网关集群(每层多实例)

4. FLV网关和静态文件网关的区别?

网关类型 用途 处理的资源类型 扩展方式
FLV直播网关 直播流分发 HTTP-FLV 实时流 横向+纵向,支持级联
静态文件网关 静态资源统一托管 HLS/fMP4/MP4/FLV静态文件 + Web播放页面 横向+纵向,可结合 Nginx

5. 如何验证网关并发能力?

# 使用 ab (Apache Bench) 测试静态文件网关
ab -n 10000 -c 500 http://127.0.0.1:8100/test.html

# 使用 wrk 测试 FLV 网关
wrk -t4 -c1000 -d30s http://127.0.0.1:8080/live/stream.flv

📄 开源协议

本项目仅限学习、技术研究使用;商用落地风险由使用者自行承担。

⚠️ 免责声明

1. 部分开源代码取自开源社区,涉及版权可联系作者删除;
2. 项目完全开源免费,仅用于技术交流;
3. 用户任何商用/违法使用造成的法律后果,作者不承担连带责任。

📧 联系方式

技术咨询、问题反馈邮箱:2723659854@qq.com

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!