php调用ffmpeg为视频加时间戳水印需使用drawtext滤镜,指定字体路径、格式化时间(如%{localtime:%h:%m:%s}),右下角定位,并确保ffmpeg编译支持fontconfig;php中须用escapeshellarg()防护路径,捕获错误输出。

PHP 调用 FFmpeg 给视频加时间戳水印,核心是用 exec() 或 shell_exec() 执行 FFmpeg 命令,配合 drawtext 滤镜动态渲染当前帧对应的时间(支持格式化显示,如 %H:%M:%S)。关键在于确保服务器装好 FFmpeg、权限正确、路径安全,并处理好中文或特殊字符问题。
确认环境与基础命令
先在服务器终端运行以下命令验证 FFmpeg 是否可用且支持 drawtext:
ffmpeg -version<br>ffmpeg -filters | grep drawtext
若提示 Unknown filter 'drawtext',说明编译时未启用 fontconfig(尤其 CentOS/Alpine 常见),需重装带 fontconfig 支持的 FFmpeg,或改用静态编译版(如从 https://johnvansickle.com/ffmpeg/ 下载)。
基础时间戳水印命令(PHP 可执行)
以下命令将时间戳以白色字体、黑边、右下角位置叠加到视频上:
ffmpeg -i input.mp4 -vf "drawtext=fontfile=/path/to/DejaVuSans.ttf:fontsize=24:fontcolor=white:borderw=2:bordercolor=black:x=w-tw-10:y=h-th-10:text='%{localtime:%H\:%M\:%S}'" -c:a copy output.mp4
-
fontfile:必须指定绝对路径的 TTF 字体文件(Linux 常用
/usr/share/fonts/dejavu/DejaVuSans.ttf;Windows 用C:/Windows/Fonts/msyh.ttc等) -
text='%{localtime:%H\:%M\:%S}':双反斜杠是 PHP 字符串转义所需,实际传给 FFmpeg 的是
%{localtime:%H:%M:%S} - -c:a copy:音频流直接复制,不重新编码,加快处理速度
-
x/y 定位:
w-tw表示“画面宽减文字宽”,h-th表示“画面高减文字高”,实现右下角自适应
PHP 安全调用示例(含错误捕获)
避免直接拼接用户输入,使用 escapeshellarg() 处理路径,捕获输出便于调试:
$input = '/var/www/videos/input.mp4';
$output = '/var/www/videos/output_with_time.mp4';
$font = '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf';
// 构建命令(注意双反斜杠)
$cmd = sprintf(
'ffmpeg -i %s -vf "drawtext=fontfile=%s:fontsize=24:fontcolor=white:borderw=2:bordercolor=black:x=w-tw-15:y=h-th-15:text='%%{localtime:%%H\\:%%M\\:%%S}'" -c:a copy %s 2>&1',
escapeshellarg($input),
escapeshellarg($font),
escapeshellarg($output)
);
exec($cmd, $output_lines, $return_code);
if ($return_code !== 0) {
error_log("FFmpeg failed: " . implode("
", $output_lines));
die("视频加水印失败,请检查日志");
}
echo "完成,输出路径:{$output}";
进阶:动态起始时间或帧率适配
如果希望时间戳从 00:00:00 开始计时(而非系统时间),改用 pts 时间戳:
-
text='Time: %{pts:hms}'→ 显示从视频开头起经过的时长(HH:MM:SS) -
text='Frame: %{frame_num}'→ 显示当前帧序号 - 添加
enable='between(t,10,60)'可让水印只在第 10~60 秒显示
对高帧率视频,可加 rate=1 限制 drawtext 每秒刷新一次,减少性能开销。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











