使用 ffmpeg,为图片或视频添加自定义的水印,具有动态水印等多种高级功能。

168 天前
 jifengg

hello ,兄弟们,我又来分享我的 ffmpeg 脚本啦。

这次分享的是一个给图片或视频添加水印的功能。

先看效果

模拟 DVD 待机画面( gif ):

高清视频可查看: https://github.com/jifengg/ffmpeg-script/assets/17020523/02c00806-2514-4dc8-9bdf-df53f66f9931

身份证防盗用水印:

定时随机变换水印位置,防止视频盗用: https://github.com/jifengg/ffmpeg-script/assets/17020523/b5ba5de5-ca52-417e-a0b3-dbf43bf6bff4

开源地址

GitHub 地址:https://github.com/jifengg/ffmpeg-script

支持一条命令直接加入多个不同的水印,每个水印的参数均可以单独设置。

这里列出脚本支持的参数,更多的使用方法可以到 github 中查看。

node ffmpeg.watermark.js -i <file|folder> [-o <file|folder> ...]
-preset         <string>    本脚本除了-preset 之外的所有参数,均可以通过传递 preset 文件来设置。
                            如果使用./preset/abc.preset 来设置,则-preset abc 即可。
                            preset 文件的编写请参考 github ( https://github.com/jifengg/ffmpeg-script )。                            
-i              <string>    [必须]要处理的文件或目录
-y                          是否覆盖已经存在的 pbf 文件,默认:false
-h                          显示这个帮助信息
-debug                      是否开启 debug 模式,打印更详细的日志
-[text|file]    <string>    [必须]水印的文本内容或文件路径,必须至少传一组。
                            与 ffmpeg 参数传递规则类似,水印有很多可定义的参数,且支持传多个水印。
                            因此,-text/file 之前的参数是用来设置这一组水印信息的,之后的参数是下一组水印的。
                            如:-fontsize 30 -text 此水印字号为 30 -fontsize 40 -text 此水印字号为 40
-text           <string>    水印的文本内容
  -fontsize     <number>    文字的字号,默认:20
  -fontcolor    <string>    文字颜色,值的格式同 ffmpeg 的 color ,默认:white
  -fontborderwidth
                <number>    文字边框大小,单位像素,默认:0
  -fontbordercolor
                <string>    文字边框颜色,值的格式同 ffmpeg 的 color ,默认:black
  -fontfile     <string>    文字字体文件路径,非 windows 下使用时必传,默认:c:/Windows/Fonts/msyh.ttc (微软雅黑)
-file           <string>    水印文件的路径,支持视频或图片
  -scale        <string>    水印文件的缩放尺寸,值的格式同 ffmpeg 的 scale 过滤器。如“1920:1080”
-alpha          <number>    水印的透明度,取值范围:0.0 - 1.0 ,默认:1.0[完全不透明]
-[left|right|top|bottom]
                <number>    水印的左、右、上、下边距,单位:像素。默认:right=20 ,top=20
-move           <string>    水印的移动方式,可选:dvd 、random ;默认不移动
  -xspeed       <number>    move=dvd 时生效。表示每秒水平移动的像素。默认:400
  -yspeed       <number>    move=dvd 时生效。表示每秒垂直移动的像素。默认:300
  -xstart       <number>    move=dvd 时生效。表示初始水平位置。默认:0
  -ystart       <number>    move=dvd 时生效。表示初始垂直位置。默认:0
  -interval     <number>    move=random 时生效。表示多少秒变换一个位置。默认:10
  -seed         <number>    move=random 时生效。表示随机数种子。不传则随机生成
-repeat                     是否用水印重复填充整个画面,默认:false
  -boxw         <number>    启用填充时,每个水印的宽度,如果水印是-file ,则不能小于-scale 的宽度,默认:200
  -boxh         <number>    启用填充时,每个水印的高度,如果水印是-file ,则不能小于-scale 的高度,默认:100
  -rotate       <number>    启用填充时,每个水印的旋转角度,注意是角度而不是弧度,默认:0

使用 nodejs 是为了支持批量处理,以及将复杂化的命令行用简单的命令来代替。最终是生成一个 ffmpeg 命令行来进行所有处理。 如果你对 ffmpeg 开发也感兴趣,关于这个脚本的技术文章可以查看这里ffmpeg.watermark.md

1469 次点击
所在节点    分享创造
9 条回复
shuxge1223
168 天前
感谢,正需要
jifengg
168 天前
@shuxge1223 使用后欢迎前来反馈
ixinshang
81 天前
op 在什么平台运行的? 在 win 和 linux 下测试了一下,提示各种缺滤镜什么的。
jifengg
80 天前
@ixinshang 我是在 win 下,用静态编译的 ffmpeg.exe 。注意版本号
ixinshang
80 天前
@jifengg 方便分享一下您的 win 的 ffmpeg 吗?
我尝试在 linux 编译,目前处于缺这个缺那的状态。
jifengg
80 天前
ixinshang
80 天前
@jifengg 我测试过,提示还是缺东西。 晚些时候,我去多找几个测试一下。
MoonWalker
71 天前
windows 环境,指定印重复填后运行不起来,请问 OP 用的什么 ffmpeg 版本
jifengg
70 天前
@MoonWalker 我用的是 6 ,你加-debug 看看报错信息,会打印 ffmpeg 的执行命令,你也可以拿出来单独执行看看 ffmpeg 报什么错。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1047363

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX