BatchWM 是一个本地运行的 macOS 批量视频水印工具。它用 Electron 提供桌面界面,用内置 ffmpeg-static 完成视频处理,适合把一组视频统一输出为带文字或图片水印的 H.264/AAC MP4。
当前版本:0.1.3
从 GitHub Releases 下载最新的 macOS 版本。
当前发布流程会在推送 vX.Y.Z 标签后自动构建并上传:
BatchWM-X.Y.Z-mac-arm64.zipBatchWM-X.Y.Z-mac-arm64.zip.sha256
当前构建没有代码签名和 notarization。首次打开时,macOS 可能需要在 Finder 中右键选择“打开”。
- 批量导入视频:支持选择文件,也支持拖入视频队列。
- 自动过滤重复路径和非视频文件。
- 支持格式:
mp4、mov、m4v、avi、mkv、webm。 - 水印来源:自定义文字、内置透明 PNG、自选图片。
- 水印位置:左上、上中、右上、左中、中间、右中、左下、下中、右下。
- 水印参数:透明度、图片宽度比例、文字字号。
- 叠化模式:标准、柔和、提亮、深色、印记。
- 横屏和竖屏预览。
- 批量进度、单个视频状态和整批剩余时间估算。
- 输出目录记忆。
- 输出文件自动追加
_watermarked,遇到重名时自动增加序号。
| 模块 | 说明 |
|---|---|
| Electron | 桌面应用壳、文件选择、IPC、macOS 打包 |
| React | 主界面 |
| Vite | 前端开发和生产构建 |
| ffmpeg-static | 内置 ffmpeg 二进制,不要求用户安装系统 ffmpeg |
| electron-builder | 生成 macOS 应用目录 |
| Node.js test runner | 单元测试 |
| sharp | 生成应用图标资源 |
| lucide-react | 界面图标 |
- Node.js
^20.19.0 || >=22.12.0。 - npm。
- macOS。当前打包脚本只配置了 macOS arm64 应用目录。
安装依赖:
npm cinpm start该命令会同时启动 Vite 开发服务器和 Electron 应用。
也可以分别运行:
npm run dev
npm run electron- 点“添加”或直接拖入视频。
- 选择文字、内置图片或自定义图片水印。
- 设置位置、透明度、大小或字号。
- 选择输出目录。
- 点“开始”处理。
处理完成后,输出文件会写入所选目录,文件名格式为:
原文件名_watermarked.mp4
- 视频编码:
libx264。 - 编码预设:
veryfast。 - 质量参数:
-crf 20。 - 像素格式:
yuv420p。 - 音频编码:
aac,码率192k。 - 启用
+faststart,便于网络播放场景快速起播。 - 如果源视频没有音轨,也会正常输出。
- 图片水印会按视频显示宽度计算尺寸。
- 文字水印会按视频显示高度归一化字号,横竖屏和旋转视频会使用显示尺寸计算。
生成 macOS arm64 应用目录:
npm run pack:mac产物位置:
release/mac-arm64/BatchWM.app
本机覆盖安装:
ditto release/mac-arm64/BatchWM.app /Applications/BatchWM.app当前配置生成的是应用目录,不是签名安装包,也没有配置 notarization。
GitHub Actions 会在 main 分支推送和 pull request 时运行 npm run check。
发布 macOS 版本时,先确认 package.json 中的版本号,然后创建并推送同名标签:
git tag v0.1.3
git push origin v0.1.3标签推送后,.github/workflows/release.yml 会在 GitHub runner 上执行测试、构建、打包,并把 macOS arm64 zip 与 sha256 上传到 GitHub Release。该 workflow 也支持手动运行,输入已有 tag 后会重新构建并覆盖上传同名资产。
运行测试:
npm run test运行生产构建:
npm run build完整检查:
npm run checknpm run check 会先运行 Node 测试,再执行 Vite 生产构建。
BatchWM/
├── electron/
│ ├── main.js # Electron 主进程和 IPC
│ ├── preload.js # 安全暴露给前端的 bridge
│ ├── processor.js # ffmpeg 参数和批量处理
│ └── assets.js # 打包资源路径
├── src/
│ ├── App.jsx # 应用界面
│ ├── main.jsx # React 入口
│ ├── styles.css # 界面样式
│ └── shared/ # 前端和 Electron 共用逻辑
├── test/ # Node 测试
├── scripts/
│ └── generate-icons.mjs
├── build/ # 图标源文件和生成资源
├── 由十力水印.png # 内置水印图片
├── package.json
└── vite.config.js
- 预览和导出共用
src/shared/watermark.js,避免界面预览和 ffmpeg 输出使用两套尺寸规则。 electron/processor.js负责读取视频信息、生成输出路径、拼接 ffmpeg 参数和解析处理进度。electron/preload.js只暴露应用需要的文件选择、路径读取和批量处理接口。- 内置水印图片会在开发环境从项目根目录读取,在打包后从
resources/assets读取。