PHP无法直接将PHP文件转为MP4;实际仅两类场景:①合并PHP生成的图像序列为MP4;②用PHP调用FFmpeg转换真实视频文件为MP4。PHP 本身不能直接“把 PHP 文件转成 MP4”,这是个常见误解。`.php` 是服务器端脚本文件,不是视频格式;所谓“php转mp4”,实际场景只有两类: ✅ 把**PHP 动态生成的图像序列(如 GD/Imagick 输出的 PNG)合成为 MP4**; ✅ 或者更常见的:**用 PHP 调用 FFmpeg,把真正的视频文件(如 AVI、MOV、WEBM)转成 MP4**。 下面直奔实操重点。
exec() 调 ffmpeg 是最轻量、最可控的方式绝大多数生产环境都走这条路——不依赖扩展,不引入 Composer 包,只要系统装了 FFmpeg,一行 exec() 就能启动转码。
ffmpeg -version 能在 PHP 进程环境下执行(注意:Web 服务器用户如 www-data 可能没权限或没 PATH)escapeshellarg() 包裹文件路径,否则含空格
、中文、特殊字符的路径会直接失败2>&1 重定向,否则错误全丢进黑洞,$output 数组里啥也看不到$returncode 为 0 才算成功,非 0 时一定要读 $output 看具体报错(比如 “No such file”、“Permission denied”、“Invalid data found”)&1',
escapeshellarg($input),
escapeshellarg($output)
);
exec($cmd, $output_lines, $return_code);
if ($return_code !== 0) {
error_log('FFmpeg failed: ' . implode("\n", $output_lines));
die('转码失败,请检查日志');
}
?>
php-ffmpeg/php-ffmpeg 扩展适合中大型项目如果你需要链式操作(截图、裁剪、加水印、多轨道混音)、批量任务管理、或想屏蔽命令行细节,这个 Composer 包值得上。
ffmpeg 和 ffprobe 二进制,所以系统 FFmpeg 还是得装好FFMpeg::create(['ffmpeg.binaries' => '/usr/local/bin/ffmpeg']),避免找不到命令set_time_limit(0))、内存限制(ini_set('memory_limit', '512M'))网上大量示例写 ffmpeg -i input.php output.mp4,这根本跑不通——FFmpeg 会报 Invalid data found when processing input。
input.php 不是视频,是文本源码;FFmpeg 无法从中解析帧或音轨file_put_contents() 解出二进制,但这属于自造轮子,毫无必要像 Zencoder、AWS Elastic Transcoder、Cloudflare Stream 这类 API 方案,适合你不想运维 FFmpeg、视频源在对象存储、或需要全球 CDN 分发的场景。
立即学习“PHP免费学习笔记(深入)”;
exec("ffmpeg -version", $o, $r) 在你的 PHP 环境里跑通,后面所有事才真正开始。