使用FFmpeg的缩略图和屏幕截图

2020-10-20 22:37:32

有几种简单的方法可以使用FFmpeg拍摄电影的屏幕截图/缩略图。但是为什么要这样做呢?

您可能希望为视频生成缩略图,并在用户滚动视频时向用户显示这些缩略图。

或者,您可能希望通过并排比较来比较两个视频-这在视频压缩研究中非常常见。

FFmpeg提供了非常简单的技术,可以在视频的任何位置提取屏幕截图或缩略图(或者更确切地说,是一种在您选择的任何位置转储帧的方法)。

首先,让我们了解如何使用FFmpeg拍摄单个屏幕截图或缩略图。

-ss是查找命令,它可用于查找到正确的位置。为了准确查找,您需要使用输出查找而不是输入查找(即,将-ss放在输入序列之前)。指定时间的语法为HH:MM:SS.MILLISECONDS。例如,您可以告诉FFmpeg查找到01:02:03-即电影1小时的2分钟的第3秒!

很简单,不是吗?现在您已经知道了如何生成单个缩略图或屏幕截图,让我们转到下一节,在那里我们将了解如何创建常规或周期性缩略图。

这是FFmpeg可以轻松解决的另一个常见用例-如何定期拍摄屏幕截图/缩略图,并在调整大小后将其存储为JPG文件?

-r命令设置输出帧速率(=1),image2是用于将视频帧写入图像文件的图像文件多路复用器。使用-s 1280x720命令,我们可以在将视频帧写入图像之前调整它们的大小。请注意,输入视频是1920x1080p视频。

上面的命令将每隔1秒截取一张屏幕截图。屏幕截图将命名为001、002等,因为我们已将格式指定为%3D。

然而,根据我的经验,我发现这是不准确的。在接下来的课程中,让我们看看一种更精确的提取缩略图的方法。

作为上一节的扩展,让我们做一个快速练习,学习如何使用FFmpeg每10秒创建一个缩略图。

如果单引号中的表达式的计算结果为非零,则使用选择过滤器来提取帧。如果表达式为零,则选择筛选器将丢弃该帧。

Mod(A,B)返回A除以B后的模数(除法后的余数)结果,因此,如果我们将0除以300,就会得到0。那么,1/300就是1,依此类推。

不反转此结果。因此,如果模数为零,则最终结果为1。如果模数为非零,则结果求值为零。

我使用的序列帧速率为30fps。而且,我要每10秒拍一帧。所以,我必须从每300帧中选择一帧,对吗?这就是为什么我使用SELECT=';而不是(mod(n,300))';

这给了我非常准确的缩略图,就像你在下面的图片库中看到的那样。单击图像将其展开并查看时间戳。

根据序列的帧速率,您可以修改显示的命令行。如果你不知道你的视频的帧率,你可以使用ffbe来找出答案。

现在就有了-使用FFmpeg生成缩略图和屏幕截图的多种简单方法。您可以选择拍摄单张截图或周期性截图,使用高度精确的帧技术!

下次之前,请注意不要忘记分享这篇文章,并查看OTTVerse.com上其余的新闻、文章和教程