Composer不能加水印,它只是PHP依赖管理工具;实际需用php-ffmpeg等库调用系统ffmpeg命令行工具处理视频/GIF水印,且需注意路径配置、格式兼容性及常见异常。

Composer 本身不处理视频或动画,也没有内置的 2D 水印叠加功能——它是个 PHP 依赖管理工具,不是视频编辑软件。你看到的“Composer 添加水印”多半是混淆了工具链,实际要做的通常是:用 PHP 调用外部命令行工具(如 ffmpeg)来给动画(GIF / MP4)加 Logo。
为什么不能直接用 Composer 加水印
composer 只负责下载和管理 PHP 包,比如 php-ffmpeg/php-ffmpeg 这类封装库。它自己不会读帧、不会绘图、更不会编码。所谓“用 Composer 加水印”,本质是:先用 composer require php-ffmpeg/php-ffmpeg 装一个 PHP 封装,再靠它背后调用系统已安装的 ffmpeg 二进制程序干活。
- 没装
ffmpeg,光装 PHP 包会报错:FFMpeg\Exception\RuntimeException: Unable to load FFProbe -
php-ffmpeg在 Windows 上默认找不到ffmpeg.exe,需手动配置路径 - GIF 动画加水印容易崩(颜色表、帧延迟、透明通道冲突),MP4 更稳
PHP + ffmpeg 给 MP4 动画加 Logo 的最小可行写法
假设你已有 input.mp4 和 logo.png(建议白底透明 PNG,尺寸 ≤ 200×200),且系统 PATH 中可执行 ffmpeg:
use FFMpeg\FFMpeg;
use FFMpeg\Coordinate\Dimension;
use FFMpeg\Coordinate\Point;
$ffmpeg = FFMpeg::create();
$video = $ffmpeg->open('input.mp4');
// 把 logo 放在右下角,距离边缘 20px
$video->filters()->watermark($video->open('logo.png'), [
'position' => 'relative',
'bottom' => 20,
'right' => 20,
]);
$video->save(new FFMpeg\Format\Video\X264(), 'output.mp4');
- 位置参数支持
top/bottom/left/right+ 数值,或absolute+Point - Logo 图像必须能被
ffmpeg识别(不支持 WebP 作水印,PNG/JPEG 安全) - 如果输出黑屏/无声,大概率是音频流没继承——加
->setAudioCodec('aac')显式指定
给 GIF 动画加水印的现实方案
GIF 是多帧位图序列,php-ffmpeg 对 GIF 输入支持弱,常出错。更可靠的做法是绕过 PHP,直接用 ffmpeg 命令行:
ffmpeg -i input.gif -i logo.png -filter_complex "overlay=main_w-overlay_w-20:main_h-overlay_h-20" output.gif
- PHP 中可用
exec()或shell_exec()调用该命令(注意 shell 注入风险,路径必须过滤) - GIF 输出体积会暴涨,加
-gifflags +transdiff或用gifsicle二次压缩 - 别指望在 GIF 上做半透明缩放——
ffmpeg的scale+overlay组合在 GIF 场景下极易丢帧或变色
真正卡住人的从来不是代码几行,而是 ffmpeg 版本差异、系统缺少字体库(影响文字水印)、PNG Alpha 通道被错误解释、以及 GIF 帧时间戳错乱——这些都不会报“水印失败”,只会静默产出异常文件。











