众所周知,FFmpeg可以为视频添加水印,主要用来标记视频所属标记,有时也可以兼顾美观,你可能没想到,用FFmpeg可以添加文字水印,可以添加图片水印,可以添加视频水印,还可以添加动态图片水印,可以实现水印的透明,还可以添加多个水印,而这一切都可以通过FFmpeg的诸多filter(可以理解为滤镜)来实现。今天我们来看看FFmpeg如何给图片或视频添加静态和动态的水印吧。
软件:FFmpeg
平台:Windows
静态水印
1.给视频/图片添加文字水印
ffmpeg -i inputfile -vf "drawtext=fontfile=C\\:/windows/fonts/simhei.ttf:text='龙年大吉':fontsize=100:x=(w-tw)/2+50:y=(h-th)/2-50:fontcolor=white@0.5:shadowy=2" -y outfile
-i:表示指定输入文件
inputfile:源文件(视频或图片),需要加水印的文件
-vf:表示设置视频滤镜(vf即video filter得缩写)
fontfile:字体位置(C\\:/windows/fonts/simhei.ttf),汉字可以使用系统字体
text:水印字体
fontcolor:文字颜色
-y:复盖原有文件
outfile:输出的文件
2.给视频/图片添加图片水印
ffmpeg -i inputfile -vf "movie=marklogo.png,scale= 100: 100[watermask]; [in] [watermask] overlay=50:50 [out]" -y outfile
movie:添加滤镜
marklogo:添加的水印图片
scale:水印图片大小,水印长度*水印的高度
overlay:表示滤镜位置,从左上角开始计算
动态水印
动态水印根据时间或输入帧更新水印图片的位置。下面介绍3种水印的实现。
漂移水印
漂移水印会在視窗内连续轨迹移动。实现利用的是随帧数变化赋值不同的x轴,y轴坐标。需要用到变化的量,这里使用随时间变量t。
ffmpeg -i main.mp4 -i overlay.png -filter_complex "overlay=x='abs(main_w-main_w*mod(t/4,2))':y='abs(main_h*mod(t/8,1))'" output.mp4
abs表达式返回绝对值。mod计算两数的余数,目的是限制x,y的最大坐标值。mod参数使用了t变量,即视频的时间值。这里水印将在X轴方向来回弹,y轴上从0到主視窗高度重复。
跳跃水印
跳跃水印的移动轨迹是不连续的,间隔一段时间会出现在視窗的某个位置。实现上可以把变量t往上取整。这样水印在t是整数时才会变化。
ffmpeg -i main.mp4 -i overlay.png -filter_complex "overlay=x='mod(main_h/0.8*ceil(t),main_w)':y='mod(main_w/3*ceil(t/2),main_h)'" output.mp4
同样使用mod防止水印超出視窗。
旋转水印
动态的旋转水印和静态旋转水印都是使用rotate过滤器,不同的是动态需要指定旋转循环以及输出时机。
ffmpeg -i main.mp4 -loop 1 -i overlay.png -filter_complex [1:v]rotate=a='t*PI':ow='rotw(PI/4)':oh='roth(PI/4)':fillcolor='none'[out],[0:v][out]overlay=x=100:y=100:shortest=1 output.mp4
由于水印是静态图片,除了赋值变化的弧度外,还需要通过loop过滤器实现帧循环。
设置循环后水印的帧数变成无限循环,这时输出会一直生成帧。通过指定shortest强制在最短的输入(main.mp4)终止时输出。
水印图片旋转后同样需要重新指定输出宽度高度,以及背景色。
小结:
动态水印使用动态的变量更新水印的x,y坐标。可以使用时间t或帧序数n等。
还没有评论,来说两句吧...