作为一个在研究或咨询项目中使用 FFmpeg 的人,我曾面临过从视频中提取帧的需求。无论您是需要抓取第一帧、提取所有帧,还是获取带有特定时间戳的精确帧,FFmpeg 都能满足您的需求。
今天,我想与大家分享如何使用 FFmpeg 通过相应的命令行提取帧。
使用 FFmpeg 提取帧的基本命令
以下是使用 FFmpeg 提取帧的最基本命令行。
以下命令行将为视频的每一秒钟提取一帧。因此,如果视频长度为 1 分钟,那么在运行此命令的文件夹中将有 60 张 PNG 图像。
ffmpeg -i input.mp4 -vf "fps=1" frame%04d.png
以下是每个元素的作用:
-i input.mp4
:该参数指定输入文件,本例中为 “input.mp4″。您可以用视频文件的名称替换 “input.mp4″。-vf "fps=1"
: vf “代表视频过滤器。在这里,我们指定的过滤器为 “fps=1″,这意味着我们将从视频中提取每秒一帧的内容。frame%04d.png
: 命令的这一部分是输出结果。%04d是一个占位符,每输出一帧,占位符从1开始递增。因此,帧将被保存为frame0001.png、frame0002.png,以此类推。
值得注意的是,输出帧是 PNG 格式,这是一种无损格式,可以保持原始质量。
不过,如果你喜欢,也可以指定其他格式,如 JPEG。只需将文件类型更改为 “jpg “或 “jpeg”,FFmpeg 就会以 JPEG 压缩格式保存输出。
在下一节中,我将向你展示如何控制 JPEG 图像的质量。
将帧提取为 JPEG 格式
为保持提取帧的原始质量,应使用无损格式(如 PNG 图像),正如我们在上一节中所展示的。
不过,在处理高分辨率视频时,PNG 文件可能会变得相当大。
解决这一问题的办法是使用 JPEG 格式,但将质量设置为最高。下面的命令就能实现这一目的:
ffmpeg -i input.mp4 -q:v 1 frame%04d.jpg
参数 -q:v 1
设置输出图像的质量。质量值范围从 1(最高质量)到 31(最低质量)。对于 JPEG 输出,文件大小与质量值成反比,即质量值越低,文件大小越大。
好了,现在,你很可能不想提取视频每一秒的帧。也许你只想提取第一帧,对吗?在下一节中,我们将学习如何做到这一点。
使用 FFmpeg 提取视频的第一帧
下面我们来看看如何使用 FFmpeg 从视频中提取第一帧。
在需要视频缩略图或预览的情况下,该命令非常方便。
实现这一功能的命令是:
ffmpeg -i input.mp4 -frames:v 1 output.png
在这里,-frames:v 1
参数完成了所有艰巨的工作。它告诉 FFmpeg 在提取完一个视频帧后停止。
请注意,顺序很重要;如果将 -frames:v 1 放在 -i input.mp4 之前,它将无法正常工作。
FFmpeg: 提取所有帧到 PNG
在某些情况下,您可能需要提取视频中的所有帧。FFmpeg 可通过以下命令直接完成这项任务:
ffmpeg -i input.mp4 frame%04d.png
该命令与我们之前讨论过的基本帧提取命令非常相似,但有一点不同–我们省略了 -vf “fps=1 “参数。省略参数意味着 FFmpeg 将提取每一帧,而不是每秒提取一帧。
但使用该命令时要小心。
如果你以 60 帧/秒的速度拍摄了 1 小时的视频,你的文件夹中就会瞬间出现 60 分钟 * 60 秒 * 60 帧/秒 = 216000 张 PNG 图像!
我不小心在一个 3 小时的测试片段中运行了这条命令,结果我的硬盘被提取的图片塞得满满的!所以,不要轻易使用这条命令,也不要不考虑输出的大小。
提取带有精确时间戳的帧
最后,让我们来讨论一种稍微复杂的情况–提取特定时间戳下的精确帧。下面的命令就可以做到这一点:
ffmpeg -ss 00:01:00 -i input.mp4 -frames:v 1 output.png
-ss 00:01:00 部分使该命令与众不同。它指示 FFmpeg 向前搜索视频的 1 分钟标记。格式为 HH:MM:SS。
请记住,您可以修改时间戳,以满足您的确切需求。参数 -frames:v 1 可确保在指定的时间戳处只提取一个帧。
本文为原创稿件,版权归作者所有,如需转载,请注明出处:https://www.nxrte.com/jishu/30204.html