纯 PHP 8.1+ 实现的轻量级媒体处理工具包,零外部依赖(无需 FFmpeg)。
支持 FLV、FMP4、MP4、HLS 互转,直播流网关、推流、拉流、转播,以及 H.264 解码 + 缩放 + 重新编码(Baseline Profile)。
composer require xiaosongshu/flv2mp4
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
ini_set('memory_limit', '512M');
$file = __DIR__ . '/test.flv';
// 1. FLV → 混合 fMP4 切片
\Xiaosongshu\Flv2mp4\Client::runFlv2Fmp4Mixed($file, __DIR__ . '/output_merge');
// 2. FLV → 分离 fMP4 切片(音视频独立)
\Xiaosongshu\Flv2mp4\Client::runFlv2Fmp4Separate($file, __DIR__ . '/output_separate');
// 3. FLV → HLS
\Xiaosongshu\Flv2mp4\Client::runFlv2Hls($file, __DIR__ . '/hls');
// 4. HLS → FLV
\Xiaosongshu\Flv2mp4\Client::runHls2Flv(__DIR__ . '/hls/index.m3u8', __DIR__ . '/output.flv');
// 5. MP4 → FLV
\Xiaosongshu\Flv2mp4\Client::runMp42Flv(__DIR__ . '/test.mp4', __DIR__ . '/output.flv');
// 6. FLV → MP4
\Xiaosongshu\Flv2mp4\Client::runFlv2Mp4($file, __DIR__ . '/output.mp4');
// 7. fMP4 → FLV(混合/分离均支持)
\Xiaosongshu\Flv2mp4\Client::runFmp42Flv(__DIR__ . '/output_merge/index.m3u8', __DIR__ . '/output.flv');
支持多级代理部署,实现高并发直播流转发。新建文件flvGateway.php,内容如下:
<?php
require_once __DIR__ . '/vendor/autoload.php';
$gateway = new \Xiaosongshu\Flv2mp4\manage\FlvGateway(8080, 'http://127.0.0.1:8501');
$gateway->debug = true;
$gateway->start();
启动flv网关
php flvGateway.php
轻量级 HTTP 文件服务器,支持目录浏览开关。新建文件fileGateway.php,内容如下:
<?php
require_once __DIR__ . '/vendor/autoload.php';
$server = new \Xiaosongshu\Flv2mp4\manage\FileGateway( '0.0.0.0',8100,__DIR__,false);
$server->debug = true;
$server->start();
启动file网关
php fileGateway.php
支持 HTTP-FLV、WS-FLV、RTMP 三种协议,倍速推流、断线重连。新建文件pusher.php,内容如下:
require_once __DIR__ . '/vendor/autoload.php';
ini_set('memory_limit', '2048M');
$pusher = new \Xiaosongshu\Flv2mp4\Manage\PusherManage(__DIR__."/test.flv", "http://127.0.0.1:8501/live/stream", 1.0, false);
$pusher->start();
启动推流
php pusher.php
从直播流拉取并保存为本地 FLV,适合录制或调试。新建文件puller.php,内容如下:
require_once __DIR__ . '/vendor/autoload.php';
ini_set('memory_limit', '2048M');
$puller = new \Xiaosongshu\Flv2mp4\Manage\PullerManage("ws://127.0.0.1:8501/live/stream.flv", __DIR__."/pull_record.flv", 0, false);
$puller->start();
启动拉流客户端
php puller.php
一路拉流,同时转发至多个目标地址(支持协议混用)。新建文件forward.php,内容如下:
require_once __DIR__ . '/vendor/autoload.php';
ini_set('memory_limit', '2048M');
$forwarder = new \Xiaosongshu\Flv2mp4\Flv\FlvForwardClient("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"], 0, true);
$forwarder->start();
启动转播客户端
php forward.php
支持 Baseline Profile 的 H.264 解码、缩放、重新编码,为以下场景提供核心能力:
| 应用场景 | 说明 |
|---|---|
| 多码率 HLS | 将单路 FLV 转码为多分辨率 HLS 切片(自适应码率) |
| FLV 重编码 | 修改分辨率、码率后重新输出为 FLV |
| MP4 重编码 | 修改分辨率、码率后重新输出为 MP4 |
| 格式转换 | FLV ↔ MP4 转换时重新编码(而非仅封装) |
| 水印叠加 | 解码 YUV → 叠加 PNG/文字水印 → 重新编码输出 |
| 画质增强 | 解码后应用滤镜(锐化、降噪等)→ 重新编码 |
| 分辨率适配 | 将高分辨率视频降采样为多档分辨率输出 |
| 码率控制 | 将高码率视频重新编码为指定目标码率 |
技术定位:这是一个完整的 H.264 像素处理管道(解码 → 处理 → 编码),不依赖 FFmpeg,纯 PHP 实现。
以下为flv转码多码率hls示例:
<?php
require_once __DIR__ . '/vendor/autoload.php';
ini_set('memory_limit', '2048M');
$profiles = [
// 不同码率分别配置
'240p' => [
'width' => 426, // 或 424,保持 16:9 比例即可
'height' => 240,
'bitrate' => 300000, // 300 Kbps(视频码率)
'fps' => 24,
'audioBitrate' => 48000, // 48 Kbps
'qp' => 30, // 保持 30 以确保稳定性
'watermark'=>true, // 是否添加水印
'watermark_file'=> __DIR__."/src/Static/watermark_80x16.yuv",// 水印文件
]
];
$generator = new \Xiaosongshu\Flv2mp4\Recode\PurePhpHlsGenerator($profiles, __DIR__ . '/hls/output');
$generator->processFlv(__DIR__ . '/input.flv');
echo "索引地址: hls/output/master.m3u8\n";
echo "所有处理完成!\n";
将flv使用新的码率编码
<?php
require_once __DIR__ . '/vendor/autoload.php';
ini_set('memory_limit', '2048M');
$config = [
'width' => 320, // 目标宽度,0 = 保持原分辨率
'height' => 180, // 目标高度,0 = 保持原分辨率
'bitrate' => 150000, // 目标码率(bps),0 = 使用 QP 模式
'fps' => 15, // 目标帧率
'qp' => 30, // QP 质量参数(码率为 0 时生效)
'watermark'=>true, // 是否添加水印
'watermark_file'=> __DIR__."/src/Static/watermark_80x16.yuv",// 水印文件
];
$recoder = new \Xiaosongshu\Flv2mp4\Recode\FlvRecoder($config);
$recoder->setMaxFrames(50); // 可选:限制处理帧数
$recoder->processFlv(__DIR__ . '/input.flv', __DIR__.'/output.flv');
echo "flv重编码完成\r\n";
将mp4文件使用新的码率编码
<?php
require_once __DIR__ . '/vendor/autoload.php';
ini_set('memory_limit', '2048M');
$config = [
'width' => 320, // 目标宽度,0 = 保持原分辨率
'height' => 180, // 目标高度,0 = 保持原分辨率
'bitrate' => 150000, // 目标码率(bps),0 = 使用 QP 模式
'fps' => 15, // 目标帧率
'qp' => 30, // QP 质量参数(码率为 0 时生效)
'watermark'=>true, // 是否添加水印
'watermark_file'=> __DIR__."/src/Static/watermark_80x16.yuv",// 水印文件
];
$recoder = new \Xiaosongshu\Flv2mp4\Recode\Mp4Recoder($config);
$recoder->setMaxFrames(50); // 可选:限制处理帧数
$recoder->processMp4(__DIR__ . '/input.mp4', __DIR__ . '/output.mp4');
echo "mp4重编码完成\r\n";