PHP通过调用系统FFmpeg实现视频转GIF,需确保FFmpeg已安装且PHP有执行权限;推荐两步法(palettegen+paletteuse)保证色彩准确,并用escapeshellarg()防护命令注入。

PHP 本身不直接处理视频,但可以通过 exec()、shell_exec() 等函数调用系统已安装的 FFmpeg 命令行工具来完成视频转 GIF 的任务。关键在于写对 FFmpeg 命令,并确保 PHP 有执行权限和环境支持。
确保 FFmpeg 已正确安装并可被 PHP 调用
在终端运行:
ffmpeg -version
若返回版本信息,说明已安装。再确认 PHP 进程能否调用它(尤其在 Web 环境下):
- Linux/macOS:检查 web 用户(如
www-data或_www)是否有权限执行ffmpeg - Windows:确保
ffmpeg.exe在系统 PATH 中,或使用绝对路径(如C:\ffmpeg\bin\ffmpeg.exe) - PHP 安全限制:确认
disable_functions没禁用exec、shell_exec等函数
基础命令:视频截取 + 缩放 + 转 GIF
直接用 FFmpeg 生成高质量 GIF 需两步(推荐):先提取帧为调色板(palette),再用该调色板生成 GIF,避免颜色失真:
# 第一步:生成调色板 ffmpeg -y -ss 00:00:01 -t 3 -i input.mp4 -vf "fps=15,scale=320:-1:flags=lanczos,palettegen" -vframes 1 palette.png <h1>第二步:用调色板生成 GIF</h1><p>ffmpeg -y -ss 00:00:01 -t 3 -i input.mp4 -i palette.png -lavfi "fps=15,scale=320:-1:flags=lanczos [x]; [x][1:v] paletteuse" output.gif
说明:
- -ss 00:00:01:从第 1 秒开始截取
- -t 3:截取时长 3 秒
- fps=15:控制 GIF 帧率(10–20 较常见)
- scale=320:-1:宽度设为 320,高度等比缩放
- palettegen/paletteuse:提升色彩还原度,避免条纹或色块
PHP 中安全执行命令(带错误处理)
不要拼接用户输入!务必过滤路径、转义参数:
立即学习“PHP免费学习笔记(深入)”;
$input = '/path/to/input.mp4';
$output = '/path/to/output.gif';
$palette = '/tmp/palette_'.uniqid().'.png';
<p>// 验证输入文件存在且是视频(简单判断)
if (!is_file($input) || !exif_imagetype($input) === false) {
die('无效视频文件');
}</p><p>// 构建并转义命令(Linux 示例)
$cmd1 = sprintf(
'ffmpeg -y -ss 00:00:01 -t 3 -i %s -vf "fps=15,scale=320:-1:flags=lanczos,palettegen" -vframes 1 %s 2>&1',
escapeshellarg($input),
escapeshellarg($palette)
);</p><p>$cmd2 = sprintf(
'ffmpeg -y -ss 00:00:01 -t 3 -i %s -i %s -lavfi "fps=15,scale=320:-1:flags=lanczos [x]; [x][1:v] paletteuse" %s 2>&1',
escapeshellarg($input),
escapeshellarg($palette),
escapeshellarg($output)
);</p><p>// 执行
$output1 = shell_exec($cmd1);
$output2 = shell_exec($cmd2);</p><p>// 清理临时调色板
@unlink($palette);</p><p>if (strpos($output2, 'failed') !== false || !is_file($output)) {
error_log("GIF 生成失败: $output2");
die('转换失败,请检查日志');
}替代方案:用 GIF 输出代替 palette(适合简单需求)
如果对画质要求不高,可用单命令快速生成(但易偏色):
ffmpeg -y -ss 00:00:01 -t 3 -i input.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -f gif output.gif
PHP 中同样需 escapeshellarg() 处理路径,并捕获输出判断成败。



















