FFMPEG - 在随机位置制作水印

FFMPEG - 在随机位置制作水印

我正在尝试实现以下循环:

  1. 将 logo.png 放置在视频的随机 (x,y) 位置。
  2. 让徽标在 2 秒后淡出。
  3. 等待 30 秒并重复。

在谷歌研究之后我改编了不同的代码并得到了这个:

ffmpeg -i input.mp4 -loop 1 -i logo.png -filter_complex "[1]trim=0:30,fade=in:st=0:d=1:alpha=1,fade=out:st=9:d=1:alpha=1,loop=999:750:0,setpts=N/25/TB[w];[0][w]overlay=shortest=1:x=if(eq(mod(n\,200)\,0)\,sin(random(1))*w\,x):y=if(eq(mod(n\,200)\,0)\,sin(random(1))*h\,y)" output.mp4

但它不能完全满足我的需求(也许我可以删除一些命令)。它只会出现在视频左上角的一小块随机区域中,并且并不总是在 2 秒后淡出。

我应该做哪些更改才能使其正常工作?此外,是否可以降低 logo.png 的不透明度或改用文本?

答案1

我设法编写了一个可行的命令,因此如果有人需要,我会在这里发布。

ffmpeg.exe -i input.mp4 -vf drawtext="fontsize=10:fontfile=/Windows/Fonts/arial.ttf:text='Text Here':x=if(eq(mod(n\,1200)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(n\,1200)\,0)\,rand(0\,(h-text_h))\,y):enable=lt(mod(n\,1200)\,200)" -c:v libx264 -crf 17 -c:a copy output.mp4

参数 t\ 不起作用,这是我使用 ffmpeg 文档中的示例以及社区 Stack 中的答案时遇到的第一个问题。

我花了一些时间才注意到这个问题。可能是 Windows 出了问题。所以我只用了 n\ 来代替,即帧数。

所以现在(x,y)每 1200 帧改变一次

x=if(eq(mod(n\,1200)\,0)\,rand(0\,(w-text_w))\,x):y=if(eq(mod(n\,1200)\,0)\,rand(0\,(h-text_h))\,y)

每 1200 帧显示 200 帧文本

启用=lt(mod(n \,1200)\,200)

感谢这里所有的帮助!

答案2

Stack Overflow 文章中给出了另一种可能更好的表述
ffmpeg - 将动态字母和随机位置水印添加到视频中?

ffmpeg -i input.mp4 \
-vf \
"drawtext=fontfile=font.ttf:fontsize=80:[email protected]:text='studentname': \
 x=if(eq(mod(t\,30)\,0)\,rand(0\,(W-tw))\,x): \
 y=if(eq(mod(t\,30)\,0)\,rand(0\,(H-th))\,y)" \
-c:v libx264 -crf 23 -c:a copy output.mp4

这将每 30 秒随机化一次位置且不重复。

答案3

我发现你的第一个使用徽标的示例非常适合我的用途,我做了一些更改,因此徽标将在整个视频中随机出现,而不仅仅是左上角

ffmpeg -i input.mp4 -loop 1 -i logo.png -filter_complex "[1]trim=0:30,fade=in:st=0:d=1:alpha=1,fade=out:st=9:d=1:alpha=1,loop=999:750:0,setpts=N/25/TB[w];[0][w]overlay=shortest=1:x=if(eq(mod(n\,200)\,0)\,sin(random(1))*W\,x):y=if(eq(mod(n\,200)\,0)\,sin(random(1))*H\,y)" output.mpg

相关内容