RTMP Server纯 PHP 编写的轻量级 RTMP 直播服务无第三方流媒体服务依赖开箱快速搭建私有化直播平台。Linux 环境自动启用 epoll 事件驱动单进程轻松承载 20,000 并发连接Windows 回退 select 模式保证兼容。️ 系统架构【推流端】OBS/FFmpeg │ RTMP 推流(1935) │ ▼ ╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ ║ RTMP 源站主服务器 (核心) ║ ║ ║ ║ 推流接入 RTMP 接收、链接认证 ║ ║ 协议转换 RTMP → HTTP-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 分片支持混合切片和分离切片两种格式直播结束后自动合并为完整 MP4HLS切片实时生成 TS 分片 m3u8 索引移动端兼容独立开关用户可在server.php中分别配置是否开启各录制任务FLV 直播网关集群纯流量转发服务向上拉取 HTTP-FLV 流、缓存 GOP 关键帧实现播放秒开向下分发至终端客户端或下级网关。支持无限层级级联一级网关 → 二级网关 → 三级网关 → … → 客户端支持横向扩容同层级部署多个网关实例通过负载均衡分发流量Linux epoll 高性能单进程可承载 20,000 并发连接Windows 兼容 select 模型静态文件网关集群 (推荐)轻量级 HTTP 静态文件服务器统一托管所有静态资源。适用协议HLS (.m3u8/.ts)、fMP4 (.m4s/.mp4)、MP4 点播文件、FLV 录制文件、Web 播放页面支持横向扩容同层级部署多个网关实例线性提升并发能力支持纵向级联可通过 Nginx 等反向代理对静态文件网关进行多层级流量分发Linux epoll 高性能单进程可承载 20,000 并发连接Windows 兼容 select 模型最佳实践将 HLS/fMP4/MP4 播放路径指向此网关集群实现静态资源读写分离部署建议低并发场景 500 并发直接使用源站内置 HTTP 服务无需额外网关中等并发场景500 – 5,000 并发源站 单层网关集群FLV网关 或 静态文件网关单个网关进程通常即可满足无需多实例高并发场景 5,000 并发源站专注「推流、协议转换、实时录制」FLV 网关多级集群一级网关 → 二级网关 → 客户端静态文件网关多级集群一级网关 → 二级网关 → 客户端每层网关均可横向扩容线性提升并发能力✨ 功能特性完整 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推荐扩展eventLinux 下大幅提升并发性能自动启用 epoll 快速开始1. 安装项目composercreate-project xiaosongshu/rtmp_server2. 配置录制开关server.php// 三个独立录制任务开关可根据需要分别开启/关闭define(FLV_TO_RECORD,true);// 是否实时录制FLV原始文件define(FLV_TO_MP4,true);// 是否实时生成fMP4切片并合并为MP4define(FLV_TO_HLS,true);// 是否实时生成HLS(TS)切片3. 启动源站服务php server.php4. 访问播放低并发场景直接使用源站# 播放页面访问源站内置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 页面的高并发访问。Linux 下单个网关进程即可承载 20,000 连接如需更高负载可通过多实例横向扩展。# 启动单个实例epoll 下直接扛高并发php fileGateway.php0.0.0.08100# 【横向扩容】多实例部署用于超级并发或多机负载php fileGateway.php0.0.0.08100php fileGateway.php0.0.0.08101php fileGateway.php0.0.0.08102# Linux/macOS 后台运行php fileGateway.php0.0.0.08100/dev/null21# 纵向扩容通过 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 直播网关集群Linux 下单个 FLV 网关进程即可稳定支撑近 20,000 路并发播放。# 一级网关拉取源站流php flvGateway.php8080http://源站IP:8501# 横向扩容同层部署多个网关实例php flvGateway.php8081http://源站IP:8501 php flvGateway.php8082http://源站IP:8501# 纵向扩容多级级联php flvGateway.php8080http://源站IP:8501# 一级网关php flvGateway.php8081http://127.0.0.1:8080# 二级网关拉取一级网关php flvGateway.php8082http://127.0.0.1:8081# 三级网关拉取二级网关7. 停止服务操作系统终止命令WindowsCtrl CLinux/macOSkill -9 PID 端口配置修改位置server.php端口通信协议业务用途1935RTMPRTMP 推流、RTMP拉流播放8501HTTP/WebSocketHTTP-FLV / WS-FLV 直播播放 / 静态web播放页也可以访问但是不建议80HTTP静态文件服务 Web播放器页面 FLV 流媒体网关高并发直播分发网关简介轻量化流量分发组件支持无限层级级联部署。从上游源站/上级网关拉取 HTTP-FLV缓存流头与 GOP 关键帧新用户接入秒开并复制流数据下发客户端或子网关。专为中高并发直播场景设计支持横向纵向扩容。网关核心能力 单实例多路流并发转发同时承载不同频道直播分发 无限层级级联一级→二级→三级网关链式扩展⚡ GOP预缓存新连接无需等待关键帧实现秒开播放 上游流断开自动重连终端用户无感知断线 内置运行统计每10秒输出在线人数、上下行流量横向扩容同层增加网关进程/实例线性提升并发纵向扩容多层级级联分散单点压力自适应 IOLinux 自动启用 epoll单进程 20,000 并发Windows 回退 select 保证兼容FLV网关启动命令# 【横向扩容】单层多实例php flvGateway.php8080http://源站IP:8501 php flvGateway.php8081http://源站IP:8501 php flvGateway.php8082http://源站IP:8501# 【纵向扩容】多级级联php flvGateway.php8080http://源站IP:8501# 一级网关php flvGateway.php8081http://127.0.0.1:8080# 二级网关php flvGateway.php8082http://127.0.0.1:8081# 三级网关# 【组合扩容】多级 每级多实例# 一级网关集群php flvGateway.php8080http://源站IP:8501 php flvGateway.php8081http://源站IP:8501# 二级网关集群拉取一级网关php flvGateway.php8180http://127.0.0.1:8080 php flvGateway.php8181http://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 实现轻量无依赖自适应 IOLinux epoll 单进程 20,000 并发Windows select 兼容 最佳实践将 HLS/fMP4/MP4 播放路径指向此网关集群源站只负责写入文件实现读写分离启动命令多进程/多实例分流# 基本启动托管当前目录端口 8100php fileGateway.php0.0.0.08100# 【横向扩容】多实例部署php fileGateway.php0.0.0.08100php fileGateway.php0.0.0.08101php fileGateway.php0.0.0.08102# Linux/macOS 后台运行多个实例php fileGateway.php0.0.0.08100/dev/null21php fileGateway.php0.0.0.08101/dev/null21php fileGateway.php0.0.0.08102/dev/null21Nginx 反向代理配置示例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 推流下载安装 OBS Studio设置 → 推流 → 服务器rtmp://127.0.0.1:1935/live串流密钥stream开始推流FFmpeg 循环推流ffmpeg-re-stream_loop-1-ivideo.mp4-vcodech264-acodecaac-fflv rtmp://127.0.0.1:1935/live/stream 播放地址汇总实时直播地址协议访问链接说明分发建议RTMPrtmp://127.0.0.1:1935/live/stream原生RTMP播放器源站直接提供HTTP-FLVhttp://127.0.0.1:8501/live/stream.flv浏览器低延迟播放通过 FLV 网关集群分发WebSocket-FLVws://127.0.0.1:8501/live/stream.flvWebSocket流式播放通过 FLV 网关集群分发HLShttp://{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.htmlHTTP-FLV低延迟直播HLS直播播放http://{fileGateway_IP}:8100/play.htmlHLS移动端兼容直播合并MP4点播http://{fileGateway_IP}:8100/mp4.html完整MP4文件点播原始FLV点播http://{fileGateway_IP}:8100/video.htmlFLV原生文件点播fMP4分片点播http://{fileGateway_IP}:8100/play_merge.html同时支持音视频混合切片和分离切片播放 实时录制说明录制机制三任务独立并行推流开始后源站同时启动三个独立并行的录制任务互不阻塞┌─────────────────────────────────────────────────┐ │ RTMP 推流 │ └─────────────────────┬───────────────────────────┘ │ ┌─────────────────────┼───────────────────────────┐ │ │ │ ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ FLV录制 │ │ fMP4切片 │ │ HLS切片 │ │ (实时裸流) │ │ (实时分片) │ │ (实时分片) │ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ │ │ │ ▼ ▼ ▼ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │ 完整FLV文件 │ │ fMP4分片集 │ │ TS分片集 │ │ (直播结束) │ │ (直播中) │ │ m3u8索引 │ └───────────────┘ └───────┬───────┘ └───────────────┘ │ │ 直播结束后自动合并 ▼ ┌───────────────┐ │ 完整MP4文件 │ │ (点播回放) │ └───────────────┘任务独立性说明录制任务实时性产出物用途独立开关FLV录制实时完整FLV文件原始格式备份、VLC播放FLV_TO_RECORDfMP4切片实时fMP4分片 → 结束后合并为MP4浏览器MSE播放、点播回放FLV_TO_MP4HLS切片实时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事件驱动含epoll自适应 ├── SabreAMF/ # AMF0/AMF3编解码 ├── server.php # 源站启动入口 ├── fileGateway.php # 静态文件网关支持epoll20k并发 ├── flvGateway.php # FLV直播网关支持epoll20k并发 ├── *.html # Web播放页面 └── README.md 并发性能实测以下测试均在Docker 容器内、ulimit -n 65535的相同环境下完成使用同一压测脚本并发 20,000 个客户端每个客户端持续拉流 5 秒。主服务器RTMP源站当前容器 pids.max: unknown 启动一批1000 个客户端 (共 20 批次) 所有客户端已启动等待完成... 结果 成功: 17,330 失败: 2,670FLV 直播网关当前容器 pids.max: unknown 启动一批1000 个客户端 (共 20 批次) 所有客户端已启动等待完成... 结果 成功: 19,923 失败: 77静态文件网关并发数: 20,000 每客户端持续时间: 5s 批次大小: 1000 结果 成功: 20,000 失败: 0说明主服务器因承载 RTMP 推流、多协议转封装等业务逻辑单进程仍稳定支撑17,330并发成功少量失败源于测试瞬间端口冲撞。FLV 网关专注于纯流转发成功率达到99.6%19,923/20,000接近单机 TCP 端口池上限。静态文件网关极致轻量20,000 并发全部成功零失败。所有组件均自适应操作系统Linux 下自动启用 epoll突破传统 select 的 1024 限制。❓ 常见问题 FAQ1. 单进程为什么能支持 20,000 并发Linux当服务器检测到已安装event扩展自动启用 epoll 事件驱动模型不再受传统select的 1024 文件描述符限制单进程轻松承载 20,000 连接。Windows由于缺少event扩展自动回退为select模型单进程连接数有限~256建议部署多个实例。性能实测在 Docker 容器ulimit -n 65535中静态文件网关20,000 并发零失败FLV 网关成功率 99.6%。2. 网关如何支撑更高并发扩容方式说明示例单进程高性能Linux epoll 模式单进程即可支撑 20k一个 fileGateway 进程扛 20,000 静态请求横向扩容同层部署多实例负载均衡3 个 fileGateway 实例 → 60,000 并发纵向扩容多层级级联一级网关 → 二级网关 → 三级网关…组合扩容横向纵向结合每层 3 实例 × 3 层级 理论 180,000 并发3. 什么时候需要部署网关并发场景部署方案低并发 500仅源站即可源站内置 HTTP 服务直接对外中等并发500 - 5,000源站 单层网关1~2 个实例即可高并发 5,000源站 多级网关集群每层可横向扩展4. FLV网关和静态文件网关的区别网关类型用途处理的资源类型扩展方式FLV直播网关直播流分发HTTP-FLV 实时流横向纵向支持级联静态文件网关静态资源统一托管HLS/fMP4/MP4/FLV静态文件 Web播放页面横向纵向可结合 Nginx5. 如何验证网关并发能力# 使用内置压测脚本20000 并发shplay.sh# 或使用 ab (Apache Bench) 测试静态文件网关ab-n10000-c500http://127.0.0.1:8100/index.html# 使用 wrk 测试 FLV 网关wrk-t4-c1000-d30shttp://127.0.0.1:8080/live/stream.flv 开源协议本项目仅限学习、技术研究使用商用落地风险由使用者自行承担。⚠️ 免责声明部分开源代码取自开源社区涉及版权可联系作者删除项目完全开源免费仅用于技术交流用户任何商用/违法使用造成的法律后果作者不承担连带责任。 联系方式技术咨询、问题反馈邮箱2723659854qq.com