视频水印
添加文字 / 图片水印 · 位置 / 透明度可调
文字/图片/位置/时间段
添加文字 / 图片水印 · 位置 / 透明度可调
视频处理涉及复杂的解码 / 编码 / 滤镜操作,桌面 FFmpeg(开源 / 免费)是业界事实标准。安装 5 分钟,运行如下命令一次解决:
用 Homebrew,5 秒安装
Debian/Ubuntu/Fedora
无需本地安装
按上方系统对应的命令安装。验证:ffmpeg -version 应输出版本号。
将 input.mp4 改为你的实际视频文件路径。
用终端 (Terminal / cmd / PowerShell) 切到视频所在目录,粘贴命令并回车。
短视频几秒,长视频几分钟。输出文件出现在同目录。
position 公式:W=视频宽 / w=水印宽 / H=视频高 / h=水印高。x=W-tw-20 表示右边距 20px。
了解工具定位 · 使用场景 · 对比优势
给视频添加文字、图片水印,支持自定义位置、透明度与显示时间段。创作者保护原创、企业品牌曝光、视频去重搬运,无需下载软件。基于 FFmpeg 处理,视频上传至服务器后加水印,完成后自动删除原始文件。
视频创作者从公开素材库下载片段时,常被片头/片尾的固定水印遮挡关键画面。本工具支持按时间段裁剪水印(如只去掉前3秒的logo),或通过位置覆盖(右上角矩形区域)精准移除,不破坏主体内容,避免二次剪辑的重复导出画质损失。
在线课程制作人录制课件时,软件自带水印覆盖了公式/代码区域。通过本工具的文字水印功能,可将水印替换为半透明白色文字(如“内部培训用”)并调整至角落位置,同时保留原视频的时间戳和字幕轨道,无需重新录制。
市场部拿到供应商提供的样片,片尾有竞品logo水印。本工具支持图片水印替换:上传公司logo覆盖原位置,同时保留原视频的音频/帧率,输出后直接用于内部审片,避免泄露供应商信息。
搬运影视片段做混剪时,原片字幕区域的水印遮挡了关键对白。本工具支持按时间段(如00:01-00:05)添加自定义文字水印覆盖原区域,或仅对特定时间段的画面做位置偏移,不影响其他段落,适合快速出片。
| 维度 | 本工具 | 竞品 A(Kapwing) | 传统方法(本地软件) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 需上传文件至云端处理 | 文件完全在本地,无网络传输 |
| 处理速度 | 1-3 秒(WASM 加速) | 5-15 秒(含上传+排队+下载) | 数分钟(需安装启动软件,渲染时间) |
| 离线可用 | 支持(浏览器缓存后) | 不支持,必须联网 | 支持,完全离线 |
| 收费模式 | 免费,无使用次数限制 | 免费版有水印+时长限制,付费 $16/月 | 一次性购买软件(如 Final Cut Pro $299) |
| 注册要求 | 无需注册,打开即用 | 需注册账号 | 需安装软件,无注册要求 |
| 操作门槛 | 拖拽上传,点击即可 | 需选择功能模块,学习界面 | 需学习专业软件操作流程 |
| 水印类型 | 文字、图片、位置、时间段 | 文字、图片、位置、时间段 | 文字、图片、位置、时间段(功能相同) |
| 输出格式 | 保持原格式(MP4/MOV/AVI 等) | 仅支持 MP4 输出 | 支持多种格式输出 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 视频文件:demo.mp4 | 水印文字:© 2025 版权所有 | 位置:右下角 | 透明度:50% | 时间段:全程 | 输出文件:demo_watermarked.mp4(视频画面右下角叠加半透明文字水印,持续整个视频) | 典型场景:为原创视频添加版权声明 |
| 视频文件:vlog.mp4 | 水印图片:logo.png | 位置:左上角 | 透明度:80% | 时间段:00:00 - 00:10 | 输出文件:vlog_watermarked.mp4(视频前10秒左上角显示logo水印,之后消失) | 典型场景:视频开头短暂展示品牌Logo |
| 视频文件:long.mp4 | 水印文字:预览版 | 位置:居中 | 透明度:30% | 时间段:全程 | 输出文件:long_watermarked.mp4(视频正中央持续显示半透明“预览版”文字) | 典型场景:视频预览版/样片防盗用 |
| 视频文件:4k_video.mkv | 水印文字:测试 | 位置:右上角 | 透明度:100% | 时间段:00:00:00 - 00:00:01 | 输出文件:4k_video_watermarked.mkv(仅在视频第1帧右上角显示不透明水印) | 边界case:水印时间段极短,仅1帧 |
| 视频文件:empty.mp4 | 水印文字:水印 | 位置:左下角 | 透明度:50% | 时间段:全程 | 错误:输入视频文件为空或无法解码 | 边界case:用户上传了损坏或空视频文件 |
| 视频文件:clip.avi | 水印文字: | 位置:右下角 | 透明度:50% | 时间段:全程 | 错误:水印内容不能为空 | 易错case:用户未填写水印文字也未上传图片 |
| 视频文件:demo.mp4 | 水印文字:© 2025 | 位置:右下角 | 透明度:-10% | 时间段:全程 | 错误:透明度值必须在0-100之间 | 易错case:用户输入了负数透明度 |
上传一张 1920×1080 的 PNG 作为水印,应用到 640×360 的视频上水印图片的宽高不应超过目标视频分辨率的 1/3,建议先缩放至 200×112 再上传FFmpeg 默认不会自动缩放水印图片;超大水印会直接覆盖整个画面,且增加编码计算量。建议预处理水印尺寸。
开始时间填 "100",结束时间填 "200"(意图是第 100 帧到第 200 帧)使用秒数格式:开始时间 "00:00:03.333",结束时间 "00:00:06.667"(对应 25fps 的第 100-200 帧)FFmpeg 时间戳默认解析为秒或 HH:MM:SS.mmm;直接填整数会被当作秒数而非帧号。帧号需用 -vf select 表达式。
在白色背景视频上添加文字水印,只设置 "drawtext=text='测试':fontsize=24"设置 "drawtext=text='测试':fontsize=24:fontcolor=black:box=1:boxcolor=white@0.5"默认字体颜色为白色,在白背景上完全不可见。必须显式指定 fontcolor 和背景框(box/boxcolor)或选择对比色。
设置 x=100 y=50,但视频分辨率是 1920×1080,水印偏左上角使用归一化坐标:x=(w-tw)/2:y=(h-th)/2(居中),或 x=w-tw-10:y=10(右上角留边距)FFmpeg drawtext 的 x/y 默认是像素值,在不同分辨率视频上水印位置会偏移。用 w/tw/h/th 变量可实现自适应定位。
视频总长 30 秒,设置水印显示时间段 "00:00:20" 到 "00:00:40"检查视频时长后设置 "00:00:20" 到 "00:00:30"(结束时间 ≤ 视频总时长)FFmpeg 遇到超出视频时长的时间戳不会报错,但水印会在视频结束后继续渲染,导致输出文件损坏或编码死循环。
上传 JPEG 格式的 logo 作为水印,边缘出现明显锯齿和色块使用 PNG 格式(支持 alpha 通道透明背景),或带透明度的 WebPJPEG 有损压缩会破坏边缘透明度信息,且不支持透明通道。PNG 无损且支持 alpha,更适合叠加在视频画面上。
设置 fontfile='SimSun.ttf',但 FFmpeg 运行环境(如 Docker 容器)没有安装该字体使用系统预装字体(Linux 下用 'Sans' 或 'Serif'),或通过 fontfile 参数上传字体文件路径FFmpeg drawtext 依赖系统字体库;指定不存在的字体名会静默回退到默认字体,导致显示异常或乱码。
公式推导 · 流程图解 · 依据出处
O(x,y,t) = I(x,y) × (1 - α(x,y,t)) + W(x,y,t) × α(x,y,t)
O(x,y,t) — 输出视频在坐标(x,y)时刻t的像素值I(x,y,t) — 原始视频在坐标(x,y)时刻t的像素值α(x,y,t) — 水印在坐标(x,y)时刻t的透明度(0~1)W(x,y,t) — 水印图像在坐标(x,y)时刻t的像素值原始视频帧在像素(100,200)处RGB值为(50,50,50),水印在该位置为(255,0,0),透明度α=0.3。则输出RGB = (50,50,50)×(1-0.3) + (255,0,0)×0.3 = (35,35,35) + (76.5,0,0) ≈ (112,35,35)。
适用于基于像素叠加的静态/动态水印渲染(文字/图片/时间段)。不适用于复杂混合模式(如正片叠底、滤色)或编码级水印(如DCT域嵌入)。来源:计算机图形学alpha混合标准公式(Porter & Duff, 1984)。
3 种主流语言 · 复制即用
import subprocess
import json
# 使用 FFmpeg 为视频添加文字水印(位置:右下角,时间段:5-15 秒)
input_video = "input.mp4"
output_video = "output.mp4"
watermark_text = "示例水印"
# drawtext 滤镜:字体大小 24,白色,5 秒后出现,持续 10 秒
cmd = [
"ffmpeg",
"-i", input_video,
"-vf", f"drawtext=text='{watermark_text}':fontsize=24:fontcolor=white:x=w-tw-10:y=h-th-10:enable='between(t,5,15)'",
"-codec:a", "copy",
output_video
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode != 0:
print("FFmpeg 错误:", result.stderr)
else:
print(f"水印已添加,输出文件: {output_video}")package main
import (
"fmt"
"os/exec"
"strings"
)
func main() {
input := "input.mp4"
output := "output.mp4"
text := "示例水印"
// 使用 FFmpeg drawtext 滤镜添加文字水印(位置:左上角,时间段:0-10 秒)
filter := fmt.Sprintf("drawtext=text='%s':fontsize=20:fontcolor=white:x=10:y=10:enable='between(t,0,10)'", text)
args := []string{"-i", input, "-vf", filter, "-codec:a", "copy", output}
cmd := exec.Command("ffmpeg", args...)
out, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf("FFmpeg 执行失败: %v\n%s\n", err, string(out))
return
}
fmt.Printf("水印已添加,输出文件: %s\n", output)
// 忽略未使用的 import
_ = strings.TrimSpace
}const { execSync } = require('child_process');
const path = require('path');
try {
const input = 'input.mp4';
const output = 'output.mp4';
const text = '示例水印';
// 使用 FFmpeg 添加图片水印(PNG 图片,位置:居中,时间段:2-8 秒)
const cmd = `ffmpeg -i ${input} -i watermark.png -filter_complex "[0:v][1:v]overlay=(W-w)/2:(H-h)/2:enable='between(t,2,8)'[out]" -map "[out]" -codec:a copy ${output}`;
execSync(cmd, { stdio: 'inherit' });
console.log(`水印已添加,输出文件: ${output}`);
} catch (err) {
console.error('FFmpeg 执行失败:', err.message);
}10 个高频疑问