如何用FFMPEG给视频加水印

FFMPEG非常强大,加水印真的方便

执行ffmpeg命令时,请确环境变量或者当前环境可以直接调用ffmpeg.exe 这个命令

我个人的做法是将FFMPEG的可执行文件放到一个目录下,将该目录添加到系统环境变量中。这样可以随时随地调用。

个人技术博客: fuqifacai.github.io

更多技术资讯下载: 2img.ai

相关配图由微信小程序【字形绘梦】免费生成

如何用FFMPEG给视频加水印

1 最简单加水印

ffmpeg -hide_banner -i src.mp4 -i watermark.png -filter_complex “overlay=x=0:y=0” target.mp4 -y

上述命令重要参数解释

  • src.mp4 原视频
  • watermark.png 你要显示的水印图片
  • target.mp4 增加水印后输出的视频
  • x=0:y=0 在视频内容的左上角x=0,y=0的位置放置水印

效果如下

如何用FFMPEG给视频加水印

更多控制:

下面的命令将水印放在视频的右下角10个间距的地方

ffmpeg -i src.mp4 -i watermark.png -filter_complex “overlay=W-w-10:H-h-10:alpha=0.5” target.mp4

其中 W 和 H 表示视频画面的宽度和高度,w 和 h 分别表示水印图片的宽度和高度。

alpha=0.5 表示设置水印透明度为 0.5。

2 旋转水印

ffmpeg -i src.mp4 -loop 1 -i watermark.png -lavfi “[1:v]format=rgba,rotate=’PI/2*t:c=0x00000000:ow=hypot(iw,ih):oh=ow'[out];[0:v][out]overlay=10:10” -shortest target.mp4 -y

上述命令重要参数解释:

  • 调整水印宽高,根据勾股定律计算图片对角长度(hypot),将这个值设置为水印的宽高,这样,图片无论如何旋转,都不会超过设定的宽高,也就不会出现图片部分丢失的情况了
  • 将图片显示的像素格式转换为rgba格式,最后的a表示透明度,如此一来,c=0x00000000的作用就是将图片旋转后的背景变为白色且完全透明,这样就不会遮挡视频了
  • -loop 1 循环
  • overlay=10:10 水印位置
如何用FFMPEG给视频加水印

3 更多水印行为控制和表现

更多的一些控制行为有

  • 水印本身变化
  • 水印显示时间变化
  • 水印位置变化

水印本身变化

方法一: 用一个运动的gif图片,不停循环播放即可。 ffmpeg -hide_banner -i src.mp4 -ignore_loop 0 -i watermark.gif -filter_complex overlay -shortest target.mp4 -y

第二种解决方案是使用movie滤镜,同样是让gif循环播放,虽然这种方式复杂点,不过这种解决方案支持视频水印,命令如下: ffmpeg -hide_banner -i src.mp4 -vf "movie=watermark.gif:loop=0,setpts=N/FRAME_RATE/TB[out];[0:v][out]overlay=x=main_w-overlay_w:y=0" -shortest target.mp4 -y 上面的命令有两个地方比较关键:

  • loop=0,setpts=N/FRAME_RATE/TB :设置水印gif无限循环
  • -shortest :将输出文件的时长设置为第一个视频文件的时长,如果不设置,你会发现命令会一直执行根本不会停下来,因为gif图的循环是无限的

这样gif图/短视频就会一直不停的播放了。

当然,如果希望水印播放一次就不播放了,那就设置上面的eof_actionpass就可以了,如下: ffmpeg -hide_banner -i src.mp4 -i watermark.gif -filter_complex "overlay=x=0:y=0:eof_action=pass" target.mp4 -y

当然,如果视频一开始就播放且只播放一次,假如水印比较短可能根本就没被注意就过去了,这时可以设置水印出现的延迟时间,使用-itsoffset选项,如下: ffmpeg -hide_banner -i src.mp4 -itsoffset 3 -i watermark.gif -filter_complex "overlay=x=0:y=0:eof_action=pass" target.mp4 -y 这样,视频播放3秒后,水印才会出现。

水印显示时间变化

设置水印显示时长

ffmpeg -hide_banner -i src.mp4 -i watermark.png -filter_complex "overlay=enable='lte(t,5)'" target.mp4 -y 上面命令作用是:让水印只显示5秒,5秒后消失。

设置水印显示时间段

ffmpeg -hide_banner -i src.mp4 -i watermark.png -filter_complex "overlay=enable='between(t,5,10)'" target.mp4 -y 上面的命令作用是:让水印在视频的5~10秒时间段内显示

设置两个水印轮番出现

ffmpeg -i src.mp4 -i doggie1.png -i watermark.png -filter_complex "overlay=enable='lte(mod(t,10),4)',overlay=enable='gt(mod(t,10),6)'" target.mp4 -y 上面的命令作用是:第一个水印显示4秒后消失,2秒后第二个水印显示4秒后消失。

水印位置变化

设置水印随时间向右移动

ffmpeg -i src.mp4 -ignore_loop 0 -i watermark.gif -lavfi "overlay=x=t*20" -shortest target.mp4 -y 上面命令的作用是:让水印每秒向右移动20像素,直到消失。

设置水印每隔10秒钟从左移动右直至消失

ffmpeg -i src.mp4 -ignore_loop 0 -i watermark.gif -lavfi "overlay=enable='mod(t,10)':x='100*mod(t,10)-w'" -shortest target.mp4 -y

4 添加马赛克

如果需要给视频或图片添加马赛克,可以使用 boxblur 滤镜。该滤镜将指定区域变成模糊效果,从而达到马赛克的效果。

ffmpeg -i src.mp4 -filter_complex “[0:v]boxblur=20[blur];[blur]crop=200:200:300:300,boxblur=20[cropped];[0:v][cropped]overlay=300:300” target.mp4

其中[0:v]boxblur=20[blur] 表示对视频画面进行模糊处理,模糊半径为 20 像素,保存为一个中间变量 blur。[blur]crop=200:200:300:300,boxblur=20[cropped] 表示对模糊后的视频画面进行裁剪,只保留左上角起始坐标为 (300, 300),宽高为 200 的区域,并再次进行模糊处理,保存为一个中间变量 cropped。

最后使用 overlay 滤镜将原始视频和裁剪后的带马赛克画面叠加在一起

5 去除水印

如果视频中的水印和马赛克无法通过软件工具进行剔除,可以在视频上添加其他的图层来遮盖住这些区域。

准备好需要添加的图层,可以是一张图片、一段文字或另一个视频等。

在命令行中输入以下命令:

ffmpeg -i src.mp4 -i watermark.png -filter_complex “[0:v][1:v] overlay=x=W-w-10:y=10” -c:a copy target.mp4

[0:v][1:v] 表示将输入文件和图层文件作为滤镜链的两个输入,overlay=x=W-w-10:y=10 表示使用 overlay 滤镜将图层添加到视频画面的指定位置上,这里的 (x, y) 表示图层左上角相对于视频画面左上角的距离,W 和 w 分别表示视频画面和图层的宽度。-c:a copy 表示保留视频文件中的音频流。

有任何问题,请二维码添加技术交流群。探讨更多AIGC能力

海量AI知识文库,大家一起飞。 技术交流群

一张照片如何生成简易数字人视频 - 喂饭教程

AIGC训练营 公众号

一张照片如何生成简易数字人视频 - 喂饭教程

RA/SD 衍生者AI训练营。发布者:稻草人,转载请注明出处:https://www.shxcj.com/archives/8796

(0)
上一篇 2025-01-22 1:34 下午
下一篇 2025-02-07 3:56 下午

相关推荐

发表回复

登录后才能评论
本文授权以下站点有原版访问授权 https://www.shxcj.com https://www.2img.ai https://www.2video.cn