ffmpeg之文字水印、图片水印、画中画、多宫格

2021年01月25日

转载自今日头条号,作者:antonio

前边列出来亲测可用的使用ffmpeg对视频进行文字水印和图片水印的命令代码,进行图片水印的时候,最好先准备一个透明背景的png图片。

D:\ffmpeg\bin\ffmpeg.exe -i D:\zhoujingyubianji.mp4 -i D:\logo.png -filter_complex "[1:v] scale=167:187[logo];[1400:950][logo]overlay=x=0:y=0" D:\3output.mp4
D:\ffmpeg\bin\ffmpeg.exe -i D:\zhoujingyubianji.mp4 -i D:\logo.png -filter_complex "[1:v] scale=167:187[logo];[0:v][logo]overlay=main_w-overlay_w-10:10" D:\2output.mp4
视频图片水印代码
overlay = main_w-overlay_w-10:10 =右上角
overlay = 10:10 =左上角
overlay = 10: main_h-overlay_h-10 = 左下角
overlay = main_w-overlay_w-10:main_h-overlay_h-10 = 右下角

D:\ffmpeg\bin\ffmpeg.exe -i D:\zhoujingyubianji.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='海南仙岛':x=20:y=20" D:\drawtext.mp4
文字水印
x=宽度位置
y=高度位置

D:\ffmpeg\bin\ffmpeg.exe -i D:\zhoujingyubianji.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='海南仙岛':x=20:y=20:fontcolor=green" D;\textgreen.mp4
文字水印并调整文字颜色
fontcolor=后边填上颜色

D:\ffmpeg\bin\ffmpeg.exe -i D:\zhoujingyubianji.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='%{localtime\:%Y-\%m\-%d %H-%M-%s}]':x=0:y=20:fontcolor=green" D:\time.mp4
用时间当水印

D:\ffmpeg\bin\ffmpeg.exe -i D:\zhoujingyubianji.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='海南仙岛':x=20:y=20:enable=lt(mod(t\, 3)\, 1)" D:\enable.mp4
定时显示水印,例如这里是3秒

 

1.添加文字水印

1.1 字段说明

在视频中增加文字水印需要有文字字库处理的相关文件,在编译 FFmpeg 时需要支持 FreeType、FontConfig、iconv,系统中需要有相关的字库,在 FFmpeg 中增加纯字母水印可以使用drawtext滤镜进行支持,下面就来看一下 drawtext 的滤镜参数。如下所示:

(1)text:字符串 ,表示文字。

(2)textfile:字符串,表示文字文件。

(3)box:布尔,表示文字区域背景框(缺省 false)。

(4)boxcolor:色彩,表示可以展示展示字体区域块的颜色。

(5)font:字符串,表示字体名称(默认为 Sans 字体)。

(6)fontsize:整数,表示显示字体的大小。

(7)x:字符串,表示可以缺省为 0。

(8)y:字符串,表示可以缺省为 0。

(9)alpha:浮点数,表示透明度(默认为 1),值从 0~1。

1.2 文字水印实例

(1)将文字的水印加在视频的左上角,命令如下:

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='海南仙岛':x=20:y=20"

(2)将字体的颜色,设置为绿色,命令如下:

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='海南仙岛':fontcolor=green"

(3)调整文字水印的位置,命令如下:

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='海南仙岛':fontcolor=green:x=1500:y=950"

 

(4)修改文字水印透明度,命令如下:修改透明度,值越小,越透明。

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='海南仙岛':fontcolor=green:x=400:y=200:alpha=0.5"

(5)文字水印还可以增加一个框,然后给框加上背景颜色,命令如下:给文字水印加上一个框。这个框的颜色,默认是白色。

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='hello world':fontcolor=green:box=1:boxcolor=yellow"

(6)以本地时间作为水印内容,在 drawtext 滤镜中添加一些特殊用法,在 text 中显示本地当前时间,格式为年月日时分秒的方式。注意:使用 ffmpeg 转码存储到文件时需要加上-re,否则时间不对。

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow"

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='%{localtime\:%Y\-%m\-%d %H-%M-%S}':fontcolor=green:box=1:boxcolor=yellow" out.mp4

注意:转码的时候,最好是加上re,否则就有可能不对。跑马灯、字体颜色及定时显示组合实现,就可以实现一个简单防止视频侵权的效果。

(7)定时显示水印,定时不显示水印,使用 drawtext 与enable配合即可,如下以每3s钟显示一次文字水印。

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "drawtext=fontsize=60:fontfile=FreeSerif.ttf:text='test':fontcolor=green:box=1:boxcolor=yellow:enable=lt(mod(t\,3)\,1)"

注意:在使用 ffmpeg 转码存储到文件时需要加上-re,否则时间不对。

(8)跑马灯效果

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "drawtext=fontsize=100:fontfile=FreeSerif.ttf:text='helloworld':x=mod(100*t\,w):y=abs(sin(t))*h*0.7"

(9)修改字体透明度和颜色

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "drawtext=fontsize=40:fontfile=FreeSerif.ttf:text='antonio':x=mod(50*t\,w):y=abs(sin(t))*h*0.7:alpha=0.5:fontcolor=white:enable=lt(mod(t\,3)\,1)"

2.图片水印

2.1重要参数说明

为视频添加图片水印可以使用movie滤镜,movie滤镜的参数如下所示:

(1)filename:字符串,表示输入的文件名,可以是文件,协议,设备。

(2)format_name, f:字符串,表示输入的封装格式。

(3)stream_index, si:整数,表示输入的流索引编号。

(4)seek_point, sp:浮点数,表示Seek 输入流的时间位置。

(5)streams, s:字符串,表示输入的多个流的流信息。

(6)loop:整数,表示循环次数。

(7)discontinuity:时间差值,表示支持跳动的时间戳差值。

2.2 命令解释

D:\ffmpeg\bin\ffmpeg.exe -i D:\2yunban.mp4 -i D:\logo.png -filter_complex "[1:v] scale=167:187[logo];[v:0][logo]overlay=x=0:y=0" D:\1output.mp4

v:0=右上角

0:v=左上角

上边这一行亲测可用

D:\ffmpeg\bin\ffmpeg.exe -i D:\2yunban.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=1500:y=10[out]" output.mp4

如上命令,字段解释如下:

(1)原始视频文件路径:input.mp4。

(2)水印图片路径:logo.png。

(3)水印位置:(x,y)=(10,10)<=(left,top)距离左侧、顶部各 10 像素。

(4)输出文件路径:output.mp4。

(5)main_w:视频单帧图像宽度。

(6)main_h:视频单帧图像高度。

(7)overlay_w:水印图片的宽度。

(8)overlay_h:水印图片的高度。

这两个watermark需要保持一致。

对应地可以将 overlay 参数设置成如下值来改变水印图片的位置,参数说明如下:

(9)左上角:10:10。

(10)右上角:main_w-overlay_w-10:10。

(11)左下角:10:main_h-overlay_h-10。

(12)main_w-overlay_w-10:main_h-overlay_h-10。

水印图片与主视频

在 FFmpeg 中加入图片水印有两种方式,一种是通过 movie 指定水印文件路径,另外一种方式是通过filter 读取输入文件的流并指定为水印,以下通过movie图片文件去作为水印。

(13)图片 logo.png 将会打入到 input.mp4 视频中,显示在 x 坐标 50、y 坐标 20 的位置。

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "movie=logo.png[logo];[in][logo]overlay=50:10[out]"

注意:由于 logo.png 图片的背景色是白色,所以显示起来比较生硬,如果水印图片是透明背景的,效果会更好。

(14)调整水印图片显示位置

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:10[out]"

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:10[out]"

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=10:main_h-overlay_h-10[out]"

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=main_w-overlay_w-10:main_h overlay_h-10[out]"

(15)添加水印图片,实现跑马灯效果

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "movie=logo.png[watermark];[in][watermark]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*h*0.7[out]"

3.实现画中画

在使用 FFmpeg 处理流媒体文件时,有时需要使用画中画的效果。在 FFmpeg 中,可以通过 overlay 将多个视频流、多个多媒体采集设备、多个视频文件合并到一个界面中,生成画中画的效果。overlay 的参数如下所示:

(1)x:字符串,表示X 坐标。

(2)y:字符串,表示y 坐标。

(3)eof_action:整数,表示遇到 eof 表示时的处理方式,默认为重复。

repeat(值为 0):重复前一帧

endcall(值为 1):停止所有的流

pass(值为 2):保留主图层

(4)shortest:布尔,终止最短的视频时全部终止(默认 false)

(5)format:整数,设置 output 的像素格式,默认为 yuv420。

yuv420, 值为 0

yuv422 ,值为 1

yuv444 ,值为 2

rgb,值为 3

每个参数要用冒号隔开。

从参数列表中可以看到,主要参数并不多,但实际上在 overlay 滤镜使用中,还有很多组合的参数可以使用,可以使用一些内部变量,例如 overlay 图层的宽、高、坐标等。

(6)显示画中画效果

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20[out]"

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:eof_action=1[out]"

D:\ffmpeg\bin\ffplay.exe -i D:\2yunban.mp4 -vf "movie=sub_320x240.mp4[sub];[in][sub]overlay=x=20:y=20:shortest =1[out]"

画中画,就是一个视频里面套另外的视频实现效果,如下图:

使用的滤镜是movie和overlay去做。

(7)显示画中画,并缩放子画面尺寸

D:\ffmpeg\bin\ffmpeg.exe -i D:\2yunban.mp4 -vf "movie=sub_320x240.mp4,scale=640x480[sub];[in][sub]overlay=x=20:y=20[out]"

(8)实现跑马灯效果

D:\ffmpeg\bin\ffmpeg.exe -i D:\2yunban.mp4 -vf "movie=sub_320x240.mp4[test];[in][test]overlay=x=mod(50*t\,main_w):y=abs(sin(t))*main_h*0.7[out]"

4.FFmpeg 实现多宫格处理

还有一种场景为以多宫格的方式呈现出来,除了可以输入视频文件,还可以输入视频流、采集设备等。从前文中可以看出进行视频图像处理时,overlay 滤镜为关键画布,可以通过 FFmpeg建立一个画布,也可以使用默认的画布。如果想以多宫格的方式展现,则可以自己建立一个足够大的画布,下面就来看一下多宫格展示的例子:

D:\ffmpeg\bin\ffmpeg.exe -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v] setpts=PTSSTARTPTS,scale=320x240[upperleft];[1:v]setpts=PTS-STARTPTS,scale=320x240[upperright];[2:v]setpts=PTSSTARTPTS, scale=320x240[lowerleft];[3:v]setpts=PTSSTARTPTS,scale=320x240[lowerright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320[tmp2];[tmp2][lowerleft]overlay=shortest=1:y=240[tmp3];[tmp3][lowerright]overlay=shortest=1:x=320:y=240" out.mp4

1.2.3.4.mp4 为文件路径,out.MP4为输出文件路径,通过 nullsrc 创建 overlay 画布,画布大小 640:480,使用[0:v][1:v][2:v][3:v]将输入的 4 个视频流去除,分别进行缩放处理,然后基于 nullsrc 生成的画布进行视频平铺,命令中自定义 upperleft,upperright,lowerleft,lowerright 进行不同位置平铺。

使用多个复杂的过滤器,upperleft表示左上角,upperright表示右上角,lowerleft表示左下角,lowerright表示右下角。把这4个流与base都叠加在一起。效果如下图所示:

首先是base加上upperleft叠加。形成一个tmp1。

然后tmp1加上upperright叠加,形成一个tmp2。

tmp2再跟lowerleft叠加,形成一个tmp3。

tmp3最后跟lowerright叠加,形成一个输出文件。

有些需求,如果只叠加左上和右上的命令,如下所示:

D:\ffmpeg\bin\ffmpeg.exe -i 1.mp4 -i 2.mp4 -i 3.mp4 -i 4.mp4 -filter_complex "nullsrc=size=640x480[base];[0:v]setpts=PTSSTARTPTS,scale=320x240[upperleft];[1:v]setpts=PTSSTARTPTS,scale=320x240[upperright];[base][upperleft]overlay=shortest=1[tmp1];[tmp1][upperright]overlay=shortest=1:x=320" out2.mp4

 


sicnature ---------------------------------------------------------------------
Your current IP address is: 3.238.233.189
Your IP address location: 美国弗吉尼亚阿什本
Your IP address country and region: 美国 美国
Your current browser is:
Your current system is:
Original content, please indicate the source:
同福客栈论坛 | 蟒蛇科普海南乡情论坛 | JiaYu Blog
sicnature ---------------------------------------------------------------------
Welcome to reprint. Please indicate the source https://myzhenai.com/post/3634.html

2条评论

  • 海南胡说 2022年07月22日在10:10 上午

    添加环绕的水印(飞鸟、走马灯)

    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

    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

  • Percy Taberski 2023年10月19日在1:07 下午

    多平台视频免费去水印,图片增加水印,获取4k高清图片。一步解决微信搜索小程序:宇宇工具箱

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注