学会添加水印,只要这一篇就足够

2021-01-18 15:02:44 浏览数 (1)

打算写这样一篇文章很久了,算是对过往的一种总结,也希望能获得更多的反馈继续迭代。在这个人类的主要信息载体已经变为视频的年代,水印的添加也成为了一个许多人不可或缺的技能,对于技术人来讲,那就更不用提。本文详细的介绍了通过FFmpeg为视频添加各种各样的水印的方法,包括文字,时间,图片,多个图片,透明,动图等,实在有些干燥,实在太有用了,真心希望能帮到大家。如果你也觉得有用,就给个反馈,点赞,再看,收藏,转发,关注,打赏,都可以(不要再说下一次一定了),本号作者已饥不择食。

导语

众所周知,FFmpeg可以为视频添加水印,主要用来标记视频所属标记,有时也可以兼顾美观,你可能没想到,用FFmpeg可以添加文字水印,可以添加图片水印,可以添加视频水印,还可以添加动态图片水印,可以实现水印的透明,还可以添加多个水印,而这一切都可以通过FFmpeg的诸多filter(可以理解为滤镜)来实现。行了,不吹他了,我们来看看史上最全的加水印的文章吧。

文章结构

正文

文字水印

在视频中增加文字水印需要准备的条件比较多,需要有文字字库处理的相关文件,在编译FFmpeg时需要支持FreeType, FontConfig, iconv, 系统中需要有相关的字库(官网下载的最新版本可运行版本基本不用再考虑这些问题了)。

在FFmpeg中增加纯字母水印主要使用drawtext滤镜进行操作,drawtext滤镜相关的参数如下:

FFmpeg文字滤镜参数

参数

类型

说明

fontfile

字符串

字体文件

text

字符串

文字

textfile

字符串

文字文件

fontcolor

色彩

字体颜色

box

布尔

文字区域背景框

boxcolor

色彩

展示字体的区域块的颜色

fontsize

整数

显示字体大小

font

字符串

字体名称(默认为Sans字体)

x

整数

文字显示的x坐标

y

整数

文字显示的y坐标

我们来看一个使用drawtext滤镜实现文字水印的例子:

代码语言:javascript复制
ffmpeg -i test.mp4 -vf "drawtext=fontsize=100:fontfile=lazy.ttf:text='hello world':x=20:y=20:fontcolor=green:box=1:boxcolor=yellow" out.mp4

其中,fontsize表示字体大小,fontfile表示字体格式,text中是文字水印显示的具体文字内容,x和y表示的是水印在视频中开始的位置,fontcolor表示水印中字体的颜色,box=1表示有边框,boxcolor表示边框的背景色。

效果如下:

时间水印

FFmpeg不仅可以通过drawtext滤镜使用文字作为水印,文字部分也可以使用当前时间作为显示,只需修改text部分即可。修改后的命令如下:

代码语言:javascript复制
ffmpeg -re -i test.mp4 -vf "drawtext=fontsize=60:fontfile=lazy.ttf:text='%{localtime:%Y-%m-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow" out_time.mp4

使用时间作为水印的显示效果:

定时水印

有时候,我们并不希望视频中的水印一直显示,而是定期显示,FFmpeg也支持这样定期的显示水印,我们直接看一条中每3秒显示一次水印的命令如下:

代码语言:javascript复制
ffmpeg -re -i test.mp4 -vf "drawtext=fontsize=60:fontfile=lazy.ttf:text='{localtime:%Y-%m-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t, 3), 1)" out.mp4

我们依然使用drawtext滤镜,只是增加了enable=lt滤镜,实现3秒显示一次水印的效果。

具体效果如下:

图片水印

当然了,FFmpeg除了可以向视频添加文字水印之外,我们最常见也是最常用的就是向视频添加图片水印了,为视频添加图片水印可以使用movie滤镜,movie滤镜的主要参数如下:

参数

类型

说明

filename

字符串

输入的文件名,可以是文件、协议,设备

format_name,f

字符串

输入的封装格式

stream_index,si

整数

输入的流索引编号

seek_point,sp

浮点数

Seek输入流的时间位置

stream,s

字符串

输入的多个流的流信息

loop

整数

循环次数

discontinuity

时间差值

支持跳动的时间戳差值

我们添加水印一般需要首先生成一个水印,这里推荐一个在线制作水印的网站,供测试用:

http://www.asoft.cn/wm/

生成水印图片之后,我们就可以通过movie滤镜为视频添加水印,命令如下:

代码语言:javascript复制
ffmpeg -i test.mp4 -vf "movie=logo.jpg[wm];[in][wm]overlay=30:10[out]" image_out.mp4

命令中-vf指定了使用滤镜,movie为这里使用的滤镜,overlay滤镜用来描述水印在视频的位置信息。图片水印实现后的效果如下:

当图片的背景色为纯色时(如纯白色),可以使用movie与colorkey滤镜做配合做成半透明效果:

如:

代码语言:javascript复制
ffmpeg -i test.mp4 -vf "movie=logo.jpg,colorkey=white:0.01:1.0 [wm]; [in] [wm] overlay=30:10 [out]" image1_out.mp4

这里实现半透明的效果主要通过colorkey滤镜,来指定前景和背景之间的比例从而实现半透明的效果。

效果:

水印缩放

我们的水印图片的大小有的时候可能相对较大,在视频中显示水印的区域有时候却很小,这个时候我们就需要对水印的大小进行缩放,水印的缩放主要通过scale滤镜来实现,其参数就是缩放后的width和height,看一条添缩放后水印的命令:

代码语言:javascript复制
ffmpeg -i in.mp4 -vf "movie=logo.jpg,scale=50:10,colorkey=white:0.01:1.0 [wm]; [in] [wm] overlay=30:10 [out]" in_out_watermask_scale.mp4

scale=50:10表示把原始水印缩放到100x50大小,效果如下:

视频水印

在一般的认知中,大家可能想不到,也不会使用另外的视频作为视频本身的水印,而实际上从技术的角度来讲,是可以做的到的,同样使用movie滤镜,只需把之前水印图片的文件名,替换成要作为水印的视频的文件名即可,是不是很神奇,哈哈。我们来看一个以视频作为水印的命令:

代码语言:javascript复制
ffmpeg -i in.mp4 -vf "movie=video_watermark.mp4,scale=100:100,colorkey=white:0.01:1.0 [wm]; [in] [wm] overlay=30:10 [out]" in_out_watermark_scale_video.mp4

效果:

多个水印

其实把视频作为视频的水印不算什么,我们还可以为同一个视频添加多个水印,具体添加多少,按照FFmpeg强大的处理能力来讲,理论上没有上限,但是添加太多了,一是命令行看起来会天晕地旋,二是在视频本身添加太多的水印会有一种喧宾夺主的感觉,就很没必要了。我们来看看如何添加多个水印。

命令如下:

代码语言:javascript复制
ffmpeg -i in.mp4 -i logo.png -i logo.png -filter_complex "overlay=5:5, overlay=x=W-w:y=5" in_out_mul_watermark.mp4

添加多个水印,我们使用了filter_complex滤镜,由于是多个,需要多次输入-i,并将视频本身和水印作为输入,同样使用overlay滤镜来表示水印和视频之间的布局关系,上面一条命令是添加两个水印的命令,为简单起见吗,我们添加的是相同的水印,当然你也可以添加不同的水印来试试,具体的效果如下:

我们再试着加4个水印看看效果:

命令:

代码语言:javascript复制
ffmpeg -i in.mp4 -i logo.png -i logo.png -i logo.png -i logo.png -filter_complex "overlay=5:5, overlay=x=400:y=5, overlay=x=5:y=200, overlay=x=400:y=200" in_out_mul_watermark.mp4

效果:

扩展一下,我们还可以把每一个水印实现透明的效果,命令如下:

代码语言:javascript复制
ffmpeg -i in.mp4 -i logo.png -i logo.png -i logo.png -i logo.png -filter_complex "[1:v]scale=160:90,format=yuva444p,colorchannelmixer=aa=0.4[img1];[2:v]scale=160:90,format=yuva444p,colorchannelmixer=aa=0.4[img2];[3:v]scale=160:90,format=yuva444p,colorchannelmixer=aa=0.4[img3];[4:v]scale=160:90,format=yuva444p,colorchannelmixer=aa=0.4[img4];[0:v][img1]overlay=x=5:y=5[01];[01][img2]overlay=x=400:y=5[012];[012][img3]overlay=x=5:y=200[0123];[0123][img4]overlay=x=400:y=200" in_out_mul_watermark.mp4

效果:

动图水印

读到这里,你可能也想到了,除了图片文字,视频,动图(常见gif)作为水印也是很广泛的需求。FFmpeg既然可以将视频作为水印添加,那么将动图作为水印当然也不在话下。先看一个添加gif图循环作为水印的命令:

代码语言:javascript复制
ffmpeg -i in.mp4 -ignore_loop 0 -i dongtu.gif -filter_complex "[1:v]scale=192:108[wm];[0:v][wm]overlay=0:H-h:shortest=1" in_out_dynamic_watermark.mp4

命令中-ignore_loop用来标识是否循环显示动图,动图同样使用-filter_complex滤镜来实现,使用scale缩放,使用overlay标明布局。下面是gif作为动图的效果:

透明水印

对于水印而言,我们想把它加到视频里,但很多时候我们又不希望它影响到原始的视频,这样,水印的透明功能就显得比较不可或缺了。在添加多个水印的部分,我们试着将多个水印实现了透明的效果。一般而言水印图片是自带alpha通道的图片或者说是底色是纯色,如纯白,这些水印要实现透明效果通过colorkey的滤镜一般可以实现。但是往往很多水印图片并不具备这样的条件,对于这种情况,我们也不是束手无策,我们同样可以通过format,colorchannelmixer等滤镜来实现水印的透明效果。先给出一个实现水印透明的命令如下:

代码语言:javascript复制
ffmpeg -i in.mp4 -vf "movie=logo.jpg,format=yuva444p,colorchannelmixer=aa=0.9[wm];[in][wm]overlay=10:30[out]" alpha_out.mp4

滤镜format指定了像素的格式,例子中为yuva444p,a代表的是alpha通道,通过滤镜,首先将原始图片转换为带有透明通道的图片,然后使用colorchannelmixer滤镜将水印与原始视频混合,aa表示水印的透明程度,值为1表示不透明,0表示全透明,下面分别是透明度aa=0.9,aa=0.5,aa=0.1的效果:

图中从左到右依次为aa=0.9,aa=0.5,aa=0.1的效果。

结语

关于使用FFmpeg添加格式各样的水印的方法,这一篇应该已经很全面了,希望能帮到更多的人。点个赞,收个藏,应对将来的不时之需。点在看,分个享,触达更多有需要的人。

往期相关推荐

06——FFmpeg为视频添加水印

07——FFmpeg去除水印

0 人点赞