打算写这样一篇文章很久了,算是对过往的一种总结,也希望能获得更多的反馈继续迭代。在这个人类的主要信息载体已经变为视频的年代,水印的添加也成为了一个许多人不可或缺的技能,对于技术人来讲,那就更不用提。本文详细的介绍了通过FFmpeg为视频添加各种各样的水印的方法,包括文字,时间,图片,多个图片,透明,动图等,实在有些干燥,实在太有用了,真心希望能帮到大家。如果你也觉得有用,就给个反馈,点赞,再看,收藏,转发,关注,打赏,都可以(不要再说下一次一定了)
导语
众所周知,FFmpeg可以为视频添加水印,主要用来标记视频所属标记,有时也可以兼顾美观,你可能没想到,用FFmpeg可以添加文字水印,可以添加图片水印,可以添加视频水印,还可以添加动态图片水印,可以实现水印的透明,还可以添加多个水印,而这一切都可以通过FFmpeg的诸多filter(可以理解为滤镜)来实现。行了,不吹他了,我们来看看史上最全的加水印的文章吧。
文章结构
正文
文字水印
在视频中增加文字水印需要准备的条件比较多,需要有文字字库处理的相关文件,在编译FFmpeg时需要支持FreeType, FontConfig, iconv, 系统中需要有相关的字库(官网下载的最新版本可运行版本基本不用再考虑这些问题了)。
在FFmpeg中增加纯字母水印主要使用drawtext滤镜进行操作,drawtext滤镜相关的参数如下:
FFmpeg文字滤镜参数

我们来看一个使用drawtext滤镜实现文字水印的例子:
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部分即可。修改后的命令如下:
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秒显示一次水印的命令如下:
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滤镜的主要参数如下:

我们添加水印一般需要首先生成一个水印,这里推荐一个在线制作水印的网站,供测试用:
http://www.asoft.cn/wm/
生成水印图片之后,我们就可以通过movie滤镜为视频添加水印,命令如下:
ffmpeg -i test.mp4 -vf "movie=logo.jpg[wm];[in][wm]overlay=30:10[out]" image_out.mp4
命令中-vf指定了使用滤镜,movie为这里使用的滤镜,overlay滤镜用来描述水印在视频的位置信息。图片水印实现后的效果如下:

当图片的背景色为纯色时(如纯白色),可以使用movie与colorkey滤镜做配合做成半透明效果:
如:
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,看一条添缩放后水印的命令:
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滤镜,只需把之前水印图片的文件名,替换成要作为水印的视频的文件名即可,是不是很神奇,哈哈。我们来看一个以视频作为水印的命令:
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强大的处理能力来讲,理论上没有上限,但是添加太多了,一是命令行看起来会天晕地旋,二是在视频本身添加太多的水印会有一种喧宾夺主的感觉,就很没必要了。我们来看看如何添加多个水印。
命令如下:
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个水印看看效果:
命令:
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
效果:

扩展一下,我们还可以把每一个水印实现透明的效果,命令如下:
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图循环作为水印的命令:
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等滤镜来实现水印的透明效果。先给出一个实现水印透明的命令如下:
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添加格式各样的水印的方法,这一篇应该已经很全面了,希望能帮到更多的人。点个赞,收个藏,应对将来的不时之需。点在看,分个享,触达更多有需要的人。
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
我正在开发一个创建网络博客的RubyonRails项目。我希望将一个名为featured的boolean数据库字段添加到Post模型中。该字段应该可以通过我添加的事件管理界面进行编辑。我使用了以下代码,但我什至没有在网站上显示另一列。$railsgeneratemigrationaddFeaturedfeatured:boolean$rakedb:migrate我是RubyonRails的新手,非常感谢任何帮助。我的index.html.erb文件中的相关代码(views):FeaturedPost架构.rb:ActiveRecord::Schema.define(:version=>
我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope