用于生成与视频长度相关的固定数量图像的 FFmpeg 标志

FFmpeg Flags for generating fixed amount of images related to video length

我正在使用这个命令:

ffmpeg -i file.mp4 -vf fps=1/60 -s 274x175  thumb%d.png

每分钟从视频中提取 1 帧。 我想学习如何做的是: 从视频中提取总共 10 张图像,无论其长度与视频的距离有关。

示例:

1.If 视频长度为 15 分钟(900 秒)它会从每 90 秒的视频中提取一张图像。 2.If 视频长度为 22 分钟(1320 秒)它会从每 132 秒的视频中提取一张图像。

还有一件事,是否可以使用 ffmpeg 设置这些图像的输出质量或限制每个图像的最大尺寸(如文件大小,不是 尺寸)会被输出吗?

没有真正的方法可以做到这一点,因为 FFmpeg 并不真正 "know" 每个流的确切长度。但是,如果你事先 运行 ffmpeg -i input,你可以使用它来 "guess" 流的长度(基于容器是什么)并使用它,我想。

你必须编写脚本。

快速简单的方法

将从 ffprobe:

获取持续时间
$ ffprobe -v error -select_streams 0:v -show_entries format=duration -of default=nw=1 input.mkv 
duration=600.032000

但是,这可能不准确。

持续时间可以是 "fragile"

如果您的输入被损坏或损坏,它可能 return 不正确的持续时间。 (您可以通过使用 dd 截断它来使用某些格式对其进行测试。)如果您确信您的输入没有问题,那么 ffprobe 可能是一种快速简便的方法。

一种更慢但更可靠的方法

如果您发现 ffprobe return 值不正确,那么您必须完全解码文件:

$ ffmpeg -i input -f null -

解析控制台输出的倒数第二行,您将看到列出的实际持续时间如下所示:

time=00:04:44.95

这几乎是瞬间完成的,也可能需要很多秒。这需要多长时间取决于您的输入持续时间、输入复杂性和您的硬件。

图像质量

你问过:

is it possible to use ffmpeg to set output quality of those images

PNG

不,因为它是无损的。您可以使用 -compression_level 选项控制压缩量,但 ffmpeg 已经默认使用最高压缩。

JPG

是的,使用 -q:v-b:v-q:v 合理的测试范围是 2-8:值越高,质量越低,文件越小。