PHP 8.5 本身不处理视频,仅安全调用 ffmpeg 完成水印等操作;需严格过滤输入、校验路径、正确使用 overlay 坐标(W/H 与 w/h 区分)、处理旋转/SAR、防命令注入,并组合多种 ffmpeg 扰动策略提升防搬运效果。

PHP 8.5 本身不处理视频,必须调用 ffmpeg
PHP 没有内置音视频编解码能力,GD 和 Imagick 只能操作单帧图像。所谓“PHP 加水印”,本质是 PHP 拼出一条 ffmpeg 命令并执行。PHP 8.5 的作用仅限于:接收参数、校验路径、过滤输入、调用 proc_open()、检查返回码、清理临时文件。
直接用 exec() 或 shell_exec() 拼接用户输入是高危操作,极易触发远程命令注入。必须对所有外部输入做 escapeshellarg() 处理,且禁止开放 x=/y= 等自由坐标表达式——只提供预设位置(如 bottom-right)。
- 确保系统已安装
ffmpeg4.0+,且在$PATH中可被 PHP 访问 - 水印图建议用 PNG 格式,带 alpha 通道,尺寸不宜过大(推荐 200×80 像素以内)
- PHP 进程需有读取输入视频、写入输出目录、执行外部命令的权限
- 设置超时:
set_time_limit(300),避免卡死;大视频建议改用异步队列
overlay 滤镜坐标必须分清大小写 W/H vs w/h
水印偏移、消失、变形,90% 出在这里。FFmpeg overlay 滤镜中:W 和 H 是主视频宽高(大写),w 和 h 是水印图宽高(小写)。写反就全错。
比如右下角 10 像素留白,正确写法是 overlay=x=W-w-10:y=H-h-10;若误写成 x=w-w-10,结果恒为 -10,水印直接飞出画布左边界。
立即学习“PHP免费学习笔记(深入)”;
抖音/快手短视频全栈专家。提供内容策划、脚本撰写、爆款拆解、算法运营、带货策略服务。适用于:创作短视频脚本、制定内容选题、分析爆款视频、制定平台运营策略、撰写带货话术、设计标题封面、理解算法逻辑。服务对象:短视频创作者、自媒体运营、品牌方、MCN机构。
- 用
ffprobe -v quiet -show_entries stream=width,height -of csv=p=0 input.mp4提前获取主视频真实尺寸 - 用
identify -format "%w %h" watermark.png(需 ImageMagick)确认水印图尺寸 - 竖屏视频常含
rotate=90元数据,FFmpeg 默认按存储像素贴图,视觉上会“歪”——加-vf "transpose=1"或先用-noautorotate清除旋转标记 - SAR(采样宽高比)不一致也会导致视觉偏移,加
-vf "setsar=1"统一像素比例
文字水印要防中文乱码和时间戳转义
用 drawtext 加文字水印,Linux 下默认字体不支持中文,fontfile 必须显式指定 UTF-8 友好字体路径,如 /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc。Windows 路径含空格或中文?必须用 escapeshellarg() 包裹。
时间戳格式字符串里的冒号 : 在 shell 中有特殊含义,Linux 下必须双反斜杠转义:text='%{localtime:%Y-%m-%d %H\:%M\:%S}';Windows 则只需单反斜杠。
- 测试命令行是否生效:先在终端手动跑一遍完整
ffmpeg命令,确认输出正常再封装进 PHP - 动态文本内容(如用户名)必须过滤控制字符:
preg_replace('/[^\p{L}\p{N}\s._-]/u', '', $text) - 避免文字重叠:用
box=1:boxcolor=black@0.5:boxborderw=5加背景框提升可读性 - 字体大小自适应视频高度:用
fontsize=h/20替代固定值,更适配不同分辨率
防搬运不是加一个 Logo 就完事
抖音 AI 搬运识别不只看水印,更盯帧率、分辨率、SAR、关键帧分布、音频频谱。纯加 logo 水印,系统仍可能判重。真要防搬运,得组合扰动:
- 分辨率微调:把 1080×1920 改成
1072×1912,改变 MD5 和缩放逻辑 - 帧率偏移:用
-r 25.12替代整数帧率,避开模板匹配 - 加轻微旋转:
-vf "rotate=0.02*PI*t"(每秒转 0.02 弧度,肉眼不可见) - 叠加透明画中画:
-i overlay.mp4 -filter_complex "[0][1]overlay=alpha=0.05",透明度 5% - 音频错位:用
-af "adelay=500|500"把左右声道各延 500ms,破坏原声指纹
这些操作都得靠 ffmpeg 滤镜链完成,PHP 只负责把它们安全、可控地串起来。别信“一键防搬运”的封装库——没透彻理解每个参数的物理意义,加了也白加,甚至触发更严审核。


















