我们在使用ffmpeg压缩视屏的时候,为了防止别人盗用视频,经常会使用水印来标明文章版权,可是如果是固定水印的话,容易被人遮挡处理掉,因此我们可以使用移动水印,这样子的水印就没办法轻松的去除了。
首先我们来看一下最终实现的效果:
可以看出来这里的水印是随机移动的,当碰到视频边缘会自动反弹。这个效果的具体实现代码如下:
ffmpeg -i input.mp4 -vf "drawtext=text='hello,mokev.com':fontfile=font.ttf:fontsize=24:fontcolor=white:x=if(eq(mod(trunc(t*50/(w-text_w))\,2)\,0)\,mod(t*50\,w-text_w)\,w-text_w-mod(t*50\,w-text_w)):y=if(eq(mod(trunc(t*50/(h-text_h))\,2)\,0)\,mod(t*50\,h-text_h)\,h-text_h-mod(t*50\,h-text_h))" output.mp4
接下来,我们就要对这段代码的参数进行理解,方便大家根据自己的需求得到更好的效果。
可以看到ffmpeg参数里面有几个变量:
t: 时间(以秒为单位)。
n: 当前帧的编号。
w: 视频宽度。
h: 视频高度。
text_h: 文本的高度。
text_w: 文本的宽度。
我们还使用到了ffmpeg内置的几个函数:
if(cond, true_val, false_val): 条件语句,如果条件为真,则返回 true_val,否则返回 false_val。
trunc(x): 向下取整函数。
eq(a, b): 如果 a 等于 b,则返回 1,否则返回 0。
mod(a, b): 取a除以b的余数。
水印的位置是由x和y决定的,其中我们需要判断x和y是否达到了视频的边界。
x : 如果到达边界的次数为偶数,则 x=mod(t50,w-text_w),否则 x=w-text_w-mod(t50,w-text_w)。
y : 如果到达边界的次数为偶数,则 y=mod(t50,h-text_h),否则 y=h-text_h-mod(t50,h-text_h)。
水印的移动速度是有t*50控制的,这里的50我们可以根据需要调整,t是视频时间参数,由此我们就可以使用ffmpeg在视频上添加随机移动的水印了,速度控制可以有我们自己设定。
这段代码已经满足绝大部分给视频添加水印的需求了,可是有些朋友的需求还远不止于此,例如想让水印出现一段时间,然后消失几秒又在另外一个地方出现,又或者是需要添加图片作为水印来实现跟文字水印一样的效果,其实这些通过ffmpeg统统都可以实现的,迟点我也会给大家分享相关的代码,并且给大家讲解每一段代码的作用。