PHP 8.5尚未发布,当前最新稳定版为PHP 8.3,实际应用需基于PHP 8.2+(推荐8.3)配合系统级FFmpeg 6.0+,通过filter_complex中overlay滤镜链及时间变量表达式实现动态logo(缩放、移动、淡入淡出)。

PHP 8.5 尚未发布,目前(2024 年中)最新稳定版是 PHP 8.3,PHP 8.4 处于开发阶段,官方未规划 PHP 8.5 版本。因此,“PHP 8.5”不是有效环境,实际使用需基于 PHP 8.2+(推荐 8.3)配合系统级 FFmpeg 工具。
以下内容基于 PHP 8.3 + 系统已安装 FFmpeg 6.0+ 的真实可行方案,教你用 PHP 调用 FFmpeg 给视频添加动态 logo(如随时间缩放、移动、淡入淡出的水印)。
H3 动态 logo 的核心:用 FFmpeg 的 overlay 滤镜链
PHP 本身不处理视频,而是拼接并执行 FFmpeg 命令。动态 logo 关键在于 overlay 滤镜中的变量表达式(如 t 表示时间,n 表示帧号),配合 scale, fade, translate 等函数实现动画效果。
立即学习“PHP免费学习笔记(深入)”;
例如,让 logo 从左下角滑入、3 秒后淡入、持续显示到结尾:
ffmpeg -i input.mp4 -i logo.png \
-filter_complex " \
[1:v]format=rgba,scale=200:-1,fade=t=in:st=0:d=0.5:alpha=1[logo]; \
[0:v][logo]overlay=x='if(gte(t,3),w*0.1+(t-3)*100,0)':y='H-h-20':shortest=1" \
-c:a copy output.mp4说明:
-
[1:v]是 logo 图层,先转为带 alpha 通道,缩放到宽 200px,加 0.5 秒透明淡入; -
overlay中x表达式实现“3 秒前在屏幕外(x=0),3 秒后每秒右移 100px”; -
y='H-h-20'表示固定距底部 20 像素(H 是主视频高,h 是 logo 高); -
shortest=1确保输出时长以主视频为准。
H3 PHP 中安全执行命令的关键操作
直接 exec() 有风险,需严格过滤路径和参数:
- 使用
escapeshellarg()包裹所有外部输入(文件路径、时长、坐标等); - 视频/图片路径必须是绝对路径,且 PHP 进程有读取权限;
- 建议限制 FFmpeg 最大执行时间(避免卡死),用
proc_open()更可控;
示例代码片段(简化版):
$video = '/var/www/videos/input.mp4';
$logo = '/var/www/logos/brand.png';
$output = '/var/www/videos/output_' . uniqid() . '.mp4';
// 构建滤镜字符串(注意单引号内不能嵌套单引号,用双引号拼接)
$filter = '[1:v]format=rgba,scale=180:-1,fade=t=in:st=0:d=0.3:alpha=1[lg];' .
'[0:v][lg]overlay=x=\'if(gte(t,2),w*0.05+(t-2)*80,0)\':y=\'H-h-30\':shortest=1';
$cmd = sprintf(
'ffmpeg -y -i %s -i %s -filter_complex %s -c:a copy %s 2>&1',
escapeshellarg($video),
escapeshellarg($logo),
escapeshellarg($filter),
escapeshellarg($output)
);
$outputLog = [];
$returnCode = 0;
exec($cmd, $outputLog, $returnCode);
if ($returnCode !== 0) {
error_log("FFmpeg failed: " . implode("\n", $outputLog));
throw new RuntimeException("Video processing failed");
}H3 常见动态效果写法(可直接套用)
✅ logo 循环缩放(呼吸效果):
scale='if(lte(mod(t,3),1.5),iw*0.8,iw*1.2)':ih*0.8✅ logo 从右向左匀速移动(横幅):
x='W-w-(t-1)*120'(1 秒后开始,每秒左移 120px)✅ logo 淡入 → 停留 → 淡出(3 秒总时长):
fade=t=in:st=0:d=0.4:alpha=1,fade=t=out:st=2.2:d=0.4:alpha=1✅ 仅在视频中间 10 秒显示(避免开头结尾干扰):
overlay=...:enable='between(t,30,40)'
H3 注意事项与排错提示
- FFmpeg 必须支持 libfreetype / libass(如需文字动画)或 rgba(png 透明通道),安装时确认
ffmpeg -version | grep configuration含--enable-libfreetype; - PNG logo 必须含 alpha 通道(用 GIMP/Photoshop 保存为“带透明度”的 PNG),否则
fade或overlay会黑底; - PHP 运行用户(如
www-data)需对输入/输出目录有读写权限; - 开发时先在终端手动运行生成的
$cmd,确认效果再集成到 PHP; - 大视频建议加
-preset fast或-crf 23控制编码速度与质量平衡。
不复杂但容易忽略



















