ffmpeg斜向倾斜文字水印功能,命令行实现,铺满全屏,可变文字

        最近要做一个视频叠加文字水印的功能,要求是水印斜向铺满全屏,并且文字水印是用户的名字即可变的。这个首先想到的是ffmpeg通过命令行自然是可完成的。发现使用滤镜的drawtext字段可以实现叠加文字,然而该字段drawtext并没有可以旋转角度的参数,这就十分头疼了。

        百度一番无果后,只能想到从别的地方生成一张做好斜向文字水印的图片,然后再叠加到视频上就可以,但是这样挺麻烦的,包括后期图片的传输控制等。但是经过一番研究之后,终于完成所需效果,先放我的成果图出来。(PS:这里要感谢大师兄demo级的指引,才让我有思路去突破)

  

目录

一、例子解析,滤镜学习

0、滤镜的连接

1、color

2、drawtext

3、rotate

4、colorkey

5、overlay

二、测试与理解

1、如果把colorkey去掉

 2、fillcolor改动

 3、画布改动

三、开始操作,解决问题

1、水印多行问题

2、水印铺满全屏问题

 3、白色文字的坑


一、例子解析,滤镜学习

ffmpeg -i ~/Movies/objectC/facebook.mp4 -filter_complex "color=White:s=400x400[v1];[v1]drawtext=fontfile=/Library/Fonts/Songti.ttc:text='这是什么东西?':x=60:y=50:fontsize=20[o1];[o1]rotate=a=-PI*30/180:fillcolor=White@0[o1];[o1]colorkey=White:0.01:1[o2];[0:v][o2]overlay=x=(W-w)/2:y=(H-h)/2" -y b.mp4 

这里大致的效果就是将文字以某个角度,叠加在x=(W-w)/2:y=(H-h)/2的坐标上

先学习一下这几个滤镜

官方解释可以看链接:FFmpeg Filters Documentation

0、滤镜的连接

        我们会看到滤镜里有[v1] [o1] 这些中括号,这代表着输入和输出的pad,可以理解为给输入输出打上一个标志,当滤镜不是顺序执行的时候,有这个标志能很好的指定输入源。里面的字符都是自定义的。除了[0:v] 这个代表的是0通道的视频数据。

        各个滤镜之间用逗号分隔,也可用[xx]+分号分隔。而滤镜期间的冒号,是设置当前滤镜的属性。

1、color

        color=White:s=400x400。

        这里指的是填充一个白色,而这个冒号接的是属性s,就是size大小为400x400,这里就形成了一块画布。

2、drawtext

        drawtext=fontfile=/Library/Fonts/Songti.ttc:text='这是什么东西?':x=60:y=50:fontsize=20

         这里指添加一个文字,fontfile是选择字体库,text是文字内容,x,y是在画面上的坐标,fontsize是文字大小。

3、rotate

        rotate=a=-PI*30/180:fillcolor=White@0

        这里a是一个旋转的角度,很简单就不说了,这个fillcolor呢就是一个填充的功能里面有2个参数,@左边是填充的一个颜色值,@右边是一个透明度,为0则是完全透明。

4、colorkey

        colorkey=White:0.01:1

        是一个抠图的滤镜,上面的意思就是抠掉白色。一共有三个参数。第一个(color)用于指定要抠掉的颜色;第二个(similarity)是相似度,意思是“差不多”的像素也会被抠掉,取值范围 [0.01 - 1],数值越小,颜色匹配时越严格,极端情况下比如取值为0.01就是只抠除第一个参数指定颜色的像素;第三个(blend)是混合比例,取值范围 [0 - 1],实际测下来效果不明显。

5、overlay

        overlay=x=(W-w)/2:y=(H-h)/2

        overlay是图层叠加的意思,这里计算了水印叠加的位置。

二、测试与理解

这里看懂了命令后,整个流程就是先弄一块画布,然后设置文字水印,然后旋转,将旋转的其他地方填充白色,然后抠图将画布和其他地方的填充色扣调,就只展示出了黑色字体,最后叠加在视频上输出。如果不懂就做做测试。(忽略一些截图不好,留出的黑边)

1、如果把colorkey去掉

就不会把白色的扣掉了,但是为什么是多边形呢

 2、fillcolor改动

我们把fillcolor改为fillcolor=Red@1,就知道为什么上面是多边形了。因为我们定了个400x400的画布,当前面把画布旋转之后,超出画布之外的白色矩形就会被切割了。因为之前是@0,是透明的,所以当红色的变透明之后,就是上面的那幅图。

 3、画布改动

画布是必须的吗?如果把画布去掉会怎么样?文字就依附在视频上,让视频进行旋转了,所以必须让一块画布进行旋转。

三、开始操作,解决问题

1、水印多行问题

        由于是很多行水印,这里好像没法使用换行,网上搜到使用\n\r\f\v等都无法有效换行,回车换行在实际命令行中不适用,所以只能采取多个drawtext来实现。

2、水印铺满全屏问题

在测试的时候,发现水印被限制在画布中,无法在黑色区域显示。上面有说到rotate旋转的问题,那只能放大画布,然后裁剪中心区域。这里就是数学运算了。我原视频是704x576,所以我设置我画布为910x910即可。

光是这样还不行,不然你会发现水印左上角还是没铺满。

因为你没裁剪啊,否则默认使用910x910的左上角区域。所以旋转之后得加上crop=704:576,默认居中裁剪,如下图是完成的。

再加上抠图后效果就出来了。后续把文字补全就可以了。

 3、白色文字的坑

我这要求的是白色的字体,改了fontcolor=white之后,白布也要改成其他颜色,我随便改成功了绿色,诶嘿,单纯,文字出来会带绿。。。

 为什么会这样呢,我放大文字看了之后,发现是边缘的绿色估计是抠图的时候抠不全。那我就想给文件加个描边,欸嘿,单纯,还是无法掩盖。

 那我干脆画布就直接用黑色不就行了,欸嘿,可以了

 但是!我这里用的字体大小是fontsize=30,字体太大了,fontsize=20会比较好一点,然而20的会被虚化一些,效果不是很好。

这时候只需要加个描边就好了borderw=1:bordercolor=black,第三行是描边的,效果比第二行没描边的好很多。

注:应很多私信我的码友,现已公开为粉丝可见,但是就不公开完整示例命令行了。搵食不易,觉得有用请多多打赏,支持博主的输出。

 

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值