PHP通过调用ffmpeg实现视频淡入淡出:用fade滤镜(t=in/out)、st起始时间、d持续时间,结合ffprobe获取时长动态计算,配合escapeshellarg确保命令安全执行。

PHP 本身不能直接处理视频,但可以通过调用系统命令(如 ffmpeg)来实现视频淡入淡出效果。核心思路是:用 PHP 的 exec()、shell_exec() 或 proc_open() 执行 ffmpeg 命令,生成带淡入/淡出的视频文件。
淡入效果(前几秒画面从黑渐显)
ffmpeg 使用 fade 滤镜实现淡入。例如让视频前 2 秒从黑屏逐渐变亮:
- 命令格式:
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=2" -c:a copy output_fadein.mp4 -
t=in表示淡入;st=0表示从第 0 秒开始;d=2表示持续 2 秒 -
-c:a copy表示音频流不重编码(节省时间),前提是输入音频格式兼容输出容器
淡出效果(结尾几秒画面渐隐为黑)
同样用 fade 滤镜,但参数改为 t=out,并设置起始时间(通常为总时长减去淡出时长):
- 先获取视频时长(可用 ffprobe):
ffprobe -v quiet -show_entries format=duration -of csv=p=0 input.mp4 - 假设时长为 60 秒,要最后 3 秒淡出,则
st=57(60−3):ffmpeg -i input.mp4 -vf "fade=t=out:st=57:d=3" -c:a copy output_fadeout.mp4 - 注意:淡出起始时间必须精确,否则可能提前黑屏或无效
同时实现淡入 + 淡出
可在同一个 -vf 中叠加多个 fade 滤镜,用逗号分隔:
立即学习“PHP免费学习笔记(深入)”;
ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=1,fade=t=out:st=59:d=1" -c:a copy output_fadeinout.mp4- 该命令对一个 60 秒视频添加 1 秒淡入 + 1 秒淡出(结尾从第 59 秒开始黑化)
- 若视频长度不固定,建议先用 PHP 调用 ffprobe 获取时长,再动态拼接命令
PHP 调用示例(安全执行)
使用 escapeshellarg() 防止路径含空格或特殊字符导致命令失败:
$input = '/path/to/input.mp4';
$output = '/path/to/output.mp4';
$duration = (float) trim(shell_exec('ffprobe -v quiet -show_entries format=duration -of csv=p=0 ' . escapeshellarg($input)));
$fadeIn = 1;
$fadeOut = 1;
$fadeOutStart = max(0, $duration - $fadeOut);
<p>$cmd = sprintf(
'ffmpeg -i %s -vf "fade=t=in:st=0:d=%s,fade=t=out:st=%.2f:d=%s" -c:a copy %s 2>&1',
escapeshellarg($input),
$fadeIn,
$fadeOutStart,
$fadeOut,
escapeshellarg($output)
);</p><p>$outputLog = shell_exec($cmd);
if (strpos($outputLog, 'error') !== false || !file_exists($output)) {
echo "处理失败:" . htmlspecialchars($outputLog);
} else {
echo "处理完成,已保存到:" . htmlspecialchars($output);
}注意:确保服务器已安装 ffmpeg 和 ffprobe,并赋予 PHP 进程执行权限;生产环境建议加超时控制和错误日志记录。



















