☰
如何使用php压缩直播和视频
2026/10/14 19:20:42 网站建设 项目流程

🚀 安装

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) 环境
CPUIntel Core i5-14400(10 核 16 线程,6P+4E)Intel Core i5-14400(10 核 16 线程,6P+4E)
内存31.7 GB16 GB
PHP 版本8.1.3 (CLI)8.1.24 (CLI)
运行模式纯 PHP CLI,GOP 分布式多进程纯 PHP CLI,GOP 分布式多进程

注:Linux 环境为 Docker 容器,运行于同一台 i5-14400 物理机上。


二、测试文件信息

文件名时长分辨率帧率视频编码音频编码视频码率音频码率总码率
base3.flv3.02 秒960×54030 fpsH.264 Constrained BaselineAAC LC 48 kHz stereo1024 kb/s163 kb/s1152 kb/s
base.flv48.49 秒960×54030 fpsH.264 Constrained BaselineAAC LC 48 kHz stereo1024 kb/s163 kb/s1176 kb/s
fast.flv410.94 秒960×54030 fpsH.264 Constrained BaselineAAC LC 48 kHz stereo1024 kb/s163 kb/s1116 kb/s

三、转码配置

参数值
输出分辨率480×270
输出帧率15 fps
视频码率0(使用 QP 模式)
QP30
音频码率48 kb/s
编码格式H.264 Constrained Baseline + AAC
分布式模式GOP 分布式多进程
decodeWorkers12 个解码进程
motionWorkers1(每个解码 worker 内嵌 1 个运动估计子进程)
fastMotiontrue
segmentDuration3 秒(仅 HLS)

四、测试结果

4.1 Windows 平台(PHP 8.1.3)
文件时长FLVMP4HLS
base3.flv3.02 s8 s(约 2.65×)8 s(约 2.65×)8 s(约 2.65×)
base.flv48.49 s40 s(约 0.83×)40 s(约 0.83×)40 s(约 0.83×)
fast.flv410.94 s249 s(约 0.61×)256 s(约 0.62×)253 s(约 0.62×)

耗时倍率 = 重编码耗时 ÷ 视频时长。

4.2 Linux (Docker) 平台(PHP 8.1.24)
文件时长FLVMP4HLS
base3.flv3.02 s3 s(约 0.99×)3 s(约 0.99×)3 s(约 0.99×)
base.flv48.49 s26 s(约 0.54×)26 s(约 0.54×)26 s(约 0.54×)
fast.flv410.94 s186 s(约 0.45×)189 s(约 0.46×)191 s(约 0.46×)

耗时倍率 = 重编码耗时 ÷ 视频时长。

  • 测试结果受视频复杂度,计算机硬件性能,计算机负载影响,请依实际测试结果为准。

项目地址:https://github.com/2723659854/flv2mp4

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询