🚀 安装
composerrequire xiaosongshu/flv2mp4🔥 H.264 解码 + 缩放 + 重编码
支持 Baseline Profile 的 H.264 解码、缩放、重新编码,为以下场景提供核心能力:
技术定位:这是一个完整的H.264 像素处理管道(解码 → 处理 → 编码),不依赖 FFmpeg,纯 PHP 实现。
flv/mp4/hls压缩转码
以下是示例代码:
require_once__DIR__.'/vendor/autoload.php';ini_set('memory_limit','2048M');$config=['width'=>360,'height'=>360,'bitrate'=>0,'fps'=>15,'audioBitrate'=>48000,'qp'=>30,'watermark'=>false,'watermarkFile'=>__DIR__."/watermark_80x16.yuv",'fastMotion'=>true,'motionWorkers'=>1,'decodeWorkers'=>12,'segmentDuration'=>3,];# flv -> hls(new\Xiaosongshu\Flv2mp4\Recode\PurePhpHlsGenerator($config,__DIR__.'/hls/output',true,))->processFlv(__DIR__.'/test.flv');# flv -> flv(new\Xiaosongshu\Flv2mp4\Recode\FlvRecoder($config,true))->processFlv(__DIR__.'/test.flv',__DIR__.'/output.flv');# mp4 -> mp4(new\Xiaosongshu\Flv2mp4\Recode\Mp4Recoder($config,true))->processMp4($mp4File,__DIR__.'/output1.mp4');- 添加水印的时候,文件名格式:(watermark_{width}x{height}.yuv)。
- 重编码模块提供了YUV 像素级操作接口,你可以基于此实现自定义功能,如添加字幕、画中画、视频拼接等。
直播压缩转码
本项目支持将直播flv流压缩并转码hls,以适配移动端弱网络场景。示例代码如下:
<?phprequire_once__DIR__.'/vendor/autoload.php';ini_set('memory_limit','2048M');$pullUrl='rtmp://127.0.0.1:1935/a/b';$config=['width'=>480,'height'=>270,'bitrate'=>0,'fps'=>10,'qp'=>30,'audioBitrate'=>64000,'motionWorkers'=>1,'decodeWorkers'=>12,'segmentDuration'=>3,'fastMotion'=>true,'outputDir'=>__DIR__.'/hls/live_rtmp/','watermark'=>false,'watermarkFile'=>__DIR__."/watermark_80x16.yuv",'maxRetries'=>5,'retryDelay'=>3,'connectTimeout'=>10,'idleTimeout'=>30,'queueMaxBytes'=>83886080,'duration'=>120,'tlsVerify'=>false,];(new\Xiaosongshu\Flv2mp4\Manage\Flv2HlsCompact($pullUrl,$config))->run();- 当前项目直播压缩转码,实测无延迟,满足直播需求,具体性能与服务器性能密切相关,你可以根据自己的服务器配置调整以上参数。
motionWorkers和decodeWorkers输入分辨率越高,越应增加 decodeWorkers;输出分辨率越高,越应增加 motionWorkers。两者之和不要超过服务器逻辑处理器数(运动估计进程是解码进程的子进程)。- 测试使用 OBS 推流:输入 960×540、30fps、每 1 秒一个关键帧、Baseline Profile、H.264 + AAC;输出 480×270、15fps、HLS 切片 3 秒。连续运行 30 分钟无跳帧、无积压。
- ⚠️ 直播压缩转码仅支持 CLI 模式运行,请勿在 FPM 请求中直接调用,否则会阻塞 Web 服务的 worker 进程。
已支持的重编码特性
- I 帧解码与编码(完全精确,INF dB)
- P 帧解码与编码(Baseline Profile)
- 帧内预测:4x4(9种模式)+ 16x16(4种模式)
- 帧间预测:P 帧运动估计(菱形搜索优化)
- 1/4 像素精度:6-tap 滤波器插值
- CAVLC 熵编码(Baseline Profile)
- 分辨率缩放(解码后 YUV 缩放 → 重新编码)
- 码率控制(通过 QP 参数调节)
- B 帧支持(计划中,需扩展至 Main Profile 并实现双向预测)
- CABAC 熵编码(计划中,Main Profile 支持)
性能测试报告
一、测试环境
| 项目 | Windows 环境 | Linux (Docker) 环境 |
|---|---|---|
| CPU | Intel Core i5-14400(10 核 16 线程,6P+4E) | Intel Core i5-14400(10 核 16 线程,6P+4E) |
| 内存 | 31.7 GB | 16 GB |
| PHP 版本 | 8.1.3 (CLI) | 8.1.24 (CLI) |
| 运行模式 | 纯 PHP CLI,GOP 分布式多进程 | 纯 PHP CLI,GOP 分布式多进程 |
注:Linux 环境为 Docker 容器,运行于同一台 i5-14400 物理机上。
二、测试文件信息
| 文件名 | 时长 | 分辨率 | 帧率 | 视频编码 | 音频编码 | 视频码率 | 音频码率 | 总码率 |
|---|---|---|---|---|---|---|---|---|
base3.flv | 3.02 秒 | 960×540 | 30 fps | H.264 Constrained Baseline | AAC LC 48 kHz stereo | 1024 kb/s | 163 kb/s | 1152 kb/s |
base.flv | 48.49 秒 | 960×540 | 30 fps | H.264 Constrained Baseline | AAC LC 48 kHz stereo | 1024 kb/s | 163 kb/s | 1176 kb/s |
fast.flv | 410.94 秒 | 960×540 | 30 fps | H.264 Constrained Baseline | AAC LC 48 kHz stereo | 1024 kb/s | 163 kb/s | 1116 kb/s |
三、转码配置
| 参数 | 值 |
|---|---|
| 输出分辨率 | 480×270 |
| 输出帧率 | 15 fps |
| 视频码率 | 0(使用 QP 模式) |
| QP | 30 |
| 音频码率 | 48 kb/s |
| 编码格式 | H.264 Constrained Baseline + AAC |
| 分布式模式 | GOP 分布式多进程 |
| decodeWorkers | 12 个解码进程 |
| motionWorkers | 1(每个解码 worker 内嵌 1 个运动估计子进程) |
| fastMotion | true |
| segmentDuration | 3 秒(仅 HLS) |
四、测试结果
4.1 Windows 平台(PHP 8.1.3)
| 文件 | 时长 | FLV | MP4 | HLS |
|---|---|---|---|---|
base3.flv | 3.02 s | 8 s(约 2.65×) | 8 s(约 2.65×) | 8 s(约 2.65×) |
base.flv | 48.49 s | 40 s(约 0.83×) | 40 s(约 0.83×) | 40 s(约 0.83×) |
fast.flv | 410.94 s | 249 s(约 0.61×) | 256 s(约 0.62×) | 253 s(约 0.62×) |
耗时倍率 = 重编码耗时 ÷ 视频时长。
4.2 Linux (Docker) 平台(PHP 8.1.24)
| 文件 | 时长 | FLV | MP4 | HLS |
|---|---|---|---|---|
base3.flv | 3.02 s | 3 s(约 0.99×) | 3 s(约 0.99×) | 3 s(约 0.99×) |
base.flv | 48.49 s | 26 s(约 0.54×) | 26 s(约 0.54×) | 26 s(约 0.54×) |
fast.flv | 410.94 s | 186 s(约 0.45×) | 189 s(约 0.46×) | 191 s(约 0.46×) |
耗时倍率 = 重编码耗时 ÷ 视频时长。
- 测试结果受视频复杂度,计算机硬件性能,计算机负载影响,请依实际测试结果为准。
项目地址:https://github.com/2723659854/flv2mp4