9.覆盖:画面中的画面

生活中,我们经常使用视频的覆盖技术,这样的例子非常多,比如电视台画面上的左上角处,总是会显示电视台的logo,以表明当前频道是哪个省份的。另一个例子就是在主显示窗口中会有一个嵌入的小窗口,用于显示其他的画面,如视频聊天就经常会用这样技术。这种画面中的画面在很多情况下都很实用,比如要等待视频的某个特定时间点或等待当前的广告过去,就可以将他们放在小窗口中,既能得知当前的实际情况,也可以查看主显示窗口中的其他内容以免烦闷。

本节中,仅包含覆盖的简单示例,更为复杂的例子会在《颜色校正(Color Corrections)》《高级技术(Advanced Techniques)》章节中描述。

注:所谓复杂的例子其实就是和其他 filter 混合使用而已。

覆盖介绍

所谓覆盖技术,就是将一个较小的视频或图片显示在其他较大的视频或图片上。我们使用 overlay filter 来完成覆盖,其详细描述如下:

ffmpeg overlay 透明叠加_高级技术


ffmpeg overlay 透明叠加_ide_02

overlay的命令结构

overlay filter 的命令行结构如下所示,input1是背景输入,input2是前景输入:

ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output

要注意,由于现在必须要有两个输入(视频或者图片),因此我们指定 filtergraphs 时要使用用于多个输入的 -filter_complex 选项,而不使用 -vf 选项。当然,当需要有两个输入时,我们可以使用 movie filter,由它指定第二个输入,这样我们就可以使用 -vf 选项了,此时要用到 filtergraphs 和 link label 的概念:

ffmpeg -i input1 -vf movie=input2[logo];[in][logo]overlay=x:y output

下面的命令中,我们将一个输入分裂成多个输出,然后使用 pad filter 将其中一个填充为更大尺寸的视频,它将在 overlay 中作为输入充当背景。这个命令已经在第一章中的《Filter,filterchains和filtergraphs》一节中介绍过,我们重新将其写出:

ffplay -i i.mpg -vf split[a][b];[a]pad=2*iw[A];[b]hqdn3d[B];[A][B]overlay=w

在角落中放置logo

为了不阻挡视频的正式内容,logo一般会放在屏幕的任一角落中。接下来的四个例子,就是将 pair.mp4 作为输入的背景视频,然后将logo分别放在四个角落中。其中logo的尺寸为 150x140 ,我们不需要知道 pair.mp4的大小(只要远大于logo就行),我们可以使用 overlay 中提供的参数来完成对位置的指定:

ffmpeg overlay 透明叠加_高级技术_03

ffmpeg overlay 透明叠加_高级技术_04

ffmpeg overlay 透明叠加_高级技术_05

ffmpeg overlay 透明叠加_ide_06

在特定时刻显示logo

有些情况下,我们可能需要在视频播放一段时间之后,再去显示一些内容。我们可以使用 -itsoffset 选型来指定显示的时间点。例如,我们在视频播放5秒之后,再去显示红色的logo:

ffmpeg -i video_with_timer.mp4 -itsoffset 5 -i logo.png -filter_complex overlay timer_with_logo.mp4

ffmpeg overlay 透明叠加_ide_07

我们注意到,-itsoffset 是放在第二个输入之前的,如果位置不对,那么覆盖的效果可能会从视频一开始就执行。关于 -itsoffset 选型的更多示例可以在《时间操作(Time Opreations)》一节中查看。另一种延迟logo显示的方法是使用movie filter,它在《高级技术(Advanced Techniques)》一节中描述。

在视频中使用计时器

我们在《视频裁剪(Cropping Video)》一节中,讲解了如何获得计时器。这一节讲述如何将获取到的计时器覆盖在其他的视频上。我们使用一个来自1973年阿波罗17卫星的视频来演示如何覆盖计时器,由于这个视频的长度是29.93秒,因此,我们先获取两个数字的计时器;

ffmpeg -f lavfi -i testsrc -vf crop:61:52:224:94 -t 30 timer.ogg

这样我们就获得了一个小视频,尺寸为61x52,时长为30秒。我们将这个计时器视频放到视频的右上角,视频宽度为512,因此计时器的 x 坐标为 512 - 61 = 451, y 坐标为 0 ,命令如下:

ffmpeg -i start.mp4 -i timer.ogg -filter_complex overlay=451 start1.mp4

ffmpeg overlay 透明叠加_视频播放_08

我们将计时器的尺寸缩小一半,并放置在视频正下方的中心处:

ffmpeg -i start.mp4 -vf movie=timer.ogg,scale=15:14[tm];[in][tm]overlay=248:371 overlay.mp4

ffmpeg overlay 透明叠加_ide_09

现在,计时器就不显眼了。