ffmpeg - 以相等的时间/间隔从视频创建多个缩略图
问题描述
我需要使用 ffmpeg 在同一时间从视频中创建多个缩略图(例如 12 个)。因此,例如,如果视频是 60 秒 - 我需要每 5 秒提取一次屏幕截图。
我使用以下命令在第 5 秒内获取帧。
ffmpeg -ss 5 -i video.webm -frames:v 1 -s 120x90 thumbnail.jpeg
有没有办法用一个命令获得多个缩略图?
解决方案
获取持续时间(可选)
使用 获取持续时间ffprobe
。这是一个可选步骤,但如果您要编写脚本或自动执行下一个命令,这将很有帮助。
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 input.mp4
示例结果:
60.000000
每 5 秒输出一帧
使用选择过滤器:
ffmpeg -i input.mp4 -vf "select='not(mod(t,5))',setpts=N/FRAME_RATE/TB" output_%04d.jpg
或者
ffmpeg -i input.mp4 -vf "select='not(mod(t,5))'" -vsync vfr output_%04d.jpg
文件将命名为
output_0001.jpg
、output_0002.jpg
、output_0003.jpg
等。有关更多信息和选项,请参阅图像复用器文档。要调整 JPEG 质量,请参阅如何从视频中提取高质量的 JPEG 图像
ffmpeg
?
输出特定数量的等距帧
这将从 60 秒持续时间的输入中输出 12 帧:
ffmpeg -i input.mp4 -vf "select='not(mod(t,60/12))'" -vsync vfr output_%04d.jpg
您必须手动输入输入的持续时间(如上60
例所示)。请参阅下面的自动方法。
用于ffprobe
自动提供持续时间值
重击示例:
input=input.mp4; ffmpeg -i "$input" -vf "select='not(mod(t,$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 $input)/12))'" -vsync vfr output_%04d.jpg
带刻度过滤器
使用比例过滤器的示例:
ffmpeg -i input.mp4 -vf "select='not(mod(t,60/12))',scale=120:-1" -vsync vfr output_%04d.jpg
推荐阅读
- angular - 如何从 JSON 文件中获取数据并显示在网页上
- c# - 除非更改文件扩展名,否则 File.Delete 上的 UnauthorizedAccessException
- python - ValueError:无法为具有形状“(?,2)”的张量“Placeholder:0”提供形状(2、1000、1)的值
- functional-programming - KDB+ 应用条件然后更新表中的多个列
- laravel - VueJS - 方法内的动态函数名称
- shell - 如何找到 IMAP 服务器上的每个非空垃圾文件夹?
- openflow - 多个 IP 地址源的 ovs 流规则
- asynchronous - Kotlin 内部的延迟函数是如何工作的?
- python - Python:确保每个成对距离> =某个最小距离
- sql - 与 group by 合并