这个系列文章我们来介绍一位海外工程师如何探索 FFmpeg Basics 音视频技术,对于想要开始学习音视频技术的朋友,这些文章是份不错的入门资料,这是第 9 篇:FFmpeg 画中画 – overlay。
—— 来自公众号“关键帧Keyframe”的分享
Overlay 视频技术经常被使用。常见的例子包括放置在电视屏幕上的电视频道标志,通常位于右上角,用于标识特定频道。另一个例子是画中画功能,可以在主屏幕的一个角落显示一个小窗口。小窗口包含选定的电视频道或其他内容,而主屏幕上则播放节目——这在等待特定内容或跳过广告时非常有用。
本章仅包含简单的 overlay 示例,更复杂的例子在颜色校正和高级技术章节中。
1、关于 overlay 的介绍
视频 overlay 是一种技术,可以在(通常是较大的)背景视频或图像上显示前景视频或图像。我们可以使用下表中描述的覆盖视频滤波器:
| 描述 | 在指定位置覆盖第一个输入 |
|---|---|
| 语法 | overlay[=x:y[[:rgb={0, 1}]] 参数 x 和 y 是可选的,默认值为 0。rgb 参数是可选的,取值为 0 或 1。 |
| \\\********* | 参数描述 |
| x | 从左上角起的水平坐标,默认值为 0 |
| y | 从左上角起的垂直坐标,默认值为 0 |
| rgb | rgb = 0…输入的颜色空间保持不变,默认值 rgb = 1…输入的颜色空间设置为 RGB |
| \\\********* | 可在 x 和 y 表达式中使用的变量 |
| main_w 或 W | 主输入宽度 |
| main_h 或 H | 主输入高度 |
| overlay_w 或 w | 覆盖输入宽度 |
| overlay_h 或 h | 覆盖输入高度 |
2、overlay 命令结构
视频覆盖命令的结构如下,其中 input1 是视频背景,input2 是前景:
ffmpeg -i input1 -i input2 -filter_complex overlay=x:y output
请注意,这里使用的是 -filter_complex 选项,而不是 -vf 选项,因为我们有两个输入源(通常是视频文件或图像)。但是,使用带有链接标签的 filtergraph,我们可以使用一个电影视频源,该源包含第二个输入,并且只使用 -vf 选项:
ffmpeg -i input1 -vf movie=input2[logo];[in][logo]overlay=x:y output
另一种方法是将一个输入拆分为多个输出,并使用 pad 滤波器创建更大的背景。此背景在 filterchain 中作为覆盖滤波器的第一个输入,此方法已在第一章的过滤器、过滤链和过滤器图部分中描述。

3、角落的 Logo
为了让内容保持可见,标志通常被放置在屏幕的四个角落之一。以下四个示例使用 pair.mp4 视频作为第一个输入,其中包含一对婚礼物品,第二个输入是包含文本 M+P(例如,Mary 和 Peter)的红色心形。视频分辨率为 1280×720 像素,标志大小为 150×140 像素,但我们不需要这些尺寸来计算标志的位置。标志的左上角(x 和 y 坐标)的正确位置由背景和前景的宽度和高度决定:
W H – 宽度和背景高度(视频)
w h – 宽度和前景高度(标志)
4、Logo 在左上角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay pair1.mp4

5、Logo 在右上角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w pair2.mp4
6、Logo 在右下角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=W-w:H-h pair3.mp4
7、Logo 在左下角
ffmpeg -i pair.mp4 -i logo.png -filter_complex overlay=0:H-h pair4.mp4
8、Logo 在指定时间显示
在某些情况下,例如当视频包含一个特别的介绍时,可以使用 -itsoffset 选项在时间间隔后添加标志(或其他源到覆盖层)。例如,在开始的 5 秒后,在蓝色背景上添加一个红色标志,我们可以使用以下命令:
ffmpeg -i video_with_timer.mp4 -itsoffset 5 -i logo.png ^ -filter_complex overlay timer_with_logo.mp4

在第二个输入之前直接输入 -itsoffset 选项非常重要,否则覆盖效果将从输出的开始处开始。有关 -itsoffset 选项的更多示例,请参见时间操作章节。使用电影滤波器延迟标志的其他方法在高级技术章节中有介绍。
9、视频计时器
此示例使用了 1973 年的公共领域 NASA 视频,记录了阿波罗 17 号从月球表面的发射。视频时长为 29.93 秒,分辨率为 512×384 像素。我们使用一个两位数的计时器,就像裁剪视频章节中的数字一样。
以下命令可以生成 timer.ogg 视频文件:
ffmpeg -f lavfi -i testsrc -vf crop=61:52:224:94 -t 30 timer.ogg
现在我们有一个 61×52 像素的小视频,显示计时器从 0 到 30 秒。此视频将覆盖在阿波罗 17 号月球发射视频的右上角,命令如下:
ffmpeg -i start.mp4 -i timer.ogg -filter_complex overlay=451 startl.mp4
计时器的 x 坐标为 512 – 61 = 451,y 坐标为 0。

下一个命令将计时器缩放到 1/2,并将其置于底部中心:
ffmpeg -i start.mp4 -vf movie=timer.ogg,scale=15:14[tm];^ [in][tm]overlay=248:371 overlay.mp4

现在计时器几乎看不见了。我们使用一个名为 [tm] 的标签作为缩放滤波器的输出板,以便将改变大小的计时器作为覆盖滤波器的第二个输入,第一个输入是由默认 [in] 标签表示的 start.mp4 文件。
10、其他 overlay 示例
其他使用了 overlay 技术的示例包括:
- FFmpeg 基本介绍章节中的过滤器、过滤链和过滤器图部分。
- 图像处理章节中的切片、旋转和覆盖图像部分。
- 麦克风和网络摄像头章节中的使用两个摄像头部分。
- 颜色校正章节。
- 高级技术章节中将额外媒体输入添加到 filtergraph 的部分。
音视频方向学习、求职,欢迎加入我们的星球
丰富的音视频知识、面试题、技术方案干货分享,还可以进行面试辅导

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。