有几种简单的方法可以使用 FFmpeg 截取电影的屏幕截图/缩略图。但是为什么首先要这样做呢?
- 您可能想要为您的视频生成缩略图,并在用户滚动浏览视频时向他显示这些缩略图。
- 或者,您可能想通过并排比较来比较两个视频——这在视频压缩研究中很常见。
FFmpeg 提供了非常简单的技术来提取视频任何位置的屏幕截图或缩略图(或者更确切地说,一种在您选择的任何位置转储帧的方法)。
使用 -frames:v 的单个屏幕截图/缩略图
首先,让我们了解如何使用 FFmpeg 截取单个屏幕截图或缩略图。
ffmpeg -i inputvideo.mp4 -ss 00:00:03 -frames:v 1 foobar.jpeg
理解这个很简单!开始 –
-ss
是seek 命令,它可以用来寻找到正确的位置。为了准确查找,您需要使用输出查找而不是输入查找(即放在-ss
输入序列之前)。指定时间的语法是HH:MM:SS.MILLISECONDS
. 例如,您可以告诉 FFmpeg 寻找到01:02:03
——即电影 1 小时的第 2 分钟的第 3 秒!-frames:v 1
告诉 FFmpeg 只截取一张屏幕截图。请注意,-vframes
已弃用。- 然后,您提到输出文件的名称 (
screenshot_10.jpg
)。
很简单,不是吗?现在您知道如何制作单个缩略图或屏幕截图,让我们转到下一节,了解如何创建常规或周期性缩略图。
调整大小的定期屏幕截图/缩略图
这是 FFmpeg 可以轻松解决的另一个常见用例——如何定期截取屏幕截图/缩略图,并在调整大小后将其存储为 JPG 文件?
这是一个简单的单行代码,可以创建缩略图并为您调整大小。
ffmpeg -i input1080p.mp4 -r 1 -s 1280x720 -f image2 screenshot-%03d.jpg
该-r
命令设置输出帧率(=1),image2
是一个图像文件复用器,用于将视频帧写入图像文件。使用该-s 1280x720
命令,我们可以在将视频帧写入图像之前调整其大小。请注意,输入视频是 1920x1080p 视频。
上面的命令将每 1 秒截取一次屏幕截图。屏幕截图将命名为001
,002
等,因为我们已将格式指定为%3d
.
然而,根据我的经验,我发现这种技术不是帧精确的。
在下一节中,让我们看看更准确的提取缩略图的方法。
每 10 秒截图/缩略图
作为上一节的延伸,让我们做一个快速练习,学习如何使用 FFmpeg 每 10 秒创建一个缩略图。
ffmpeg -i inputvideo.mp4 -vf "select='not(mod(n,300))',setpts='N/(30*TB)'" -f image2 thumbnail%03d.jpg
这里,
select
如果单引号中的表达式计算结果为非零,我们将使用过滤器提取帧。如果表达式为零,则select
过滤器丢弃该帧。mod(A,B)
返回 A 除以 B 后的模数(除法余数)结果。因此,如果我们将 0 除以 300,则得到 0。然后,1/300 为 1,依此类推。not
反转这个结果。因此,如果模数为零,则最终结果为1
。如果模数不为零,则结果计算为zero
。- 基于这个
not
操作,select
过滤器拾取一个帧。
我正在使用的序列的帧速率为30 fps
. 而且,我想要每 10 秒一帧。所以,我必须从每 300 帧中选择一个帧,对吗?这就是为什么我用select='not(mod(n,300))'
正如您在下面的图片库中看到的那样,这为我提供了非常准确的缩略图。单击图像以展开它们并查看时间戳。
根据序列的帧速率,您可以修改显示的命令行。如果您不知道视频的帧速率,可以使用它ffprobe
来查找。
ffprobe -show_entries format=duration globe-with-timestamp.mp4
结论
你有它 – 使用 FFmpeg 生成缩略图和屏幕截图的多种简单方法。您可以选择使用高度精确的帧技术拍摄单个屏幕截图或周期性屏幕截图!
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。