今天介绍一下colorkey滤镜。通过使用这个滤镜,可以把图像中指定的颜色(或者在一定相似度范围内)的像素替换成透明色——说白了,就是把符合条件的像素抠掉。

官网说明:http://ffmpeg.org/ffmpeg-filters.html#colorkey

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

ffmpeg 如何潜入到java代码里 ffmpeg key_抠图

假如我们有这样一个纯绿背景色的logo,想要把它叠加在视频上,并且叠加时去除背景色。使用FFmpeg可以这么来做:

ffmpeg -i D:\MTest\bear_short.mp4 -i D:\MTest\slogan.png -filter_complex "[1:v]colorkey=0x00FF00:0.01:1[ckout];[0:v][ckout]overlay[out]" -map "[out]" -map 0:a D:\MTest\cktest1.mp4

意思是:在bear_short.mp4这个视频上叠加一张图片slogan.png(注:overlay后面没有带x/y参数时,默认叠加在视频的左上角)。colorkey的三个参数:0x00FF00表示绿色,0.01是相似度,表示只抠除RGB值严格等于0x00FF00的像素,混合比例是1。最后把合成的音视频数据写入cktest1.mp4。

使用ffplay播放cktest1.mp4,效果如下:

ffmpeg 如何潜入到java代码里 ffmpeg key_FFmpeg_02

为了加深对“相似度”这个参数的理解,我们对logo的背景色做一下处理,让它不那么纯。然后重复执行上述FFmpeg命令行,得到的效果如下:

ffmpeg 如何潜入到java代码里 ffmpeg key_colorkey_03

ffmpeg 如何潜入到java代码里 ffmpeg key_FFmpeg_04

怎么解决这个问题呢?其实很简单,只要将相似度参数改成0.5即可,如下:

ffmpeg -i D:\MTest\bear_short.mp4 -i D:\MTest\slogan2.png -filter_complex "[1:v]colorkey=0x00FF00:0.5:1[ckout];[0:v][ckout]overlay=x=W-w:y=H-h[out]" -map "[out]" -map 0:a D:\MTest\cktest2.mp4

我们顺便练习一下,在overlay后面指定x和y参数,让logo出现在右下角:

ffmpeg 如何潜入到java代码里 ffmpeg key_抠图_05

上面演示的是在视频上叠加图片的例子。那么,能不能反过来呢,在一张大的背景图片上叠加视频,并且对视频进行抠图处理?当然也是可行的!

假设我们的源视频是这样的:

ffmpeg 如何潜入到java代码里 ffmpeg key_抠图_06

事先提取视频的背景色大致是0x646464,相似度指定为0.3,执行的命令行如下:

ffmpeg -i D:\MTest\BKG.JPG -i D:\MTest\Src.mp4 -filter_complex "[1:v]colorkey=0x646464:0.3:0.1[ckout];[0:v][ckout]overlay[out]" -map "[out]" D:\MTest\cktest3.mp4

混合后的实际效果:

ffmpeg 如何潜入到java代码里 ffmpeg key_FFmpeg_07

本文完。