ffmpeg - FFMPEG:如何更快地拍摄 3000 张快照?
问题描述
我有一个长度为 200 分钟的视频。
并且还获得了将要拍摄的每个快照的时间戳。
我尝试使用 ffmpeg 通过以下命令拍摄快照。
但是,它非常慢,每个快照大约需要 10 秒。
有什么办法可以加快速度吗?谢谢。
操作系统:win10;电脑:英特尔 NUC8i5
ffmpeg -i 1.mp4 -ss 00:00:04 -vframes 1 000004.jpg
ffmpeg -i 1.mp4 -ss 00:00:08 -vframes 1 000008.jpg
ffmpeg -i 1.mp4 -ss 00:00: 12 -vframes 1 000012.jpg
ffmpeg -i 1.mp4 -ss 00:00:16 -vframes 1 000016.jpg
ffmpeg -i 1.mp4 -ss 00:00:17 -vframes 1 000017.jpg
ffmpeg -i 1. mp4 -ss 00:00:20 -vframes 1 000020.jpg
ffmpeg -i 1.mp4 -ss 00:00:24 -vframes 1 000024.jpg
ffmpeg -i 1.mp4 -ss 00:00:26 -vframes 1 000026 .jpg
ffmpeg -i 1.mp4 -ss 00:00:28 -vframes 1 000028.jpg
ffmpeg -i 1.mp4 -ss 00:00:32 -vframes 1 000032.jpg
ffmpeg -i 1.mp4 -ss 00: 00:36 -vframes 1 000036.jpg
ffmpeg -i 1.mp4 -ss 00:00:38 -vframes 1 000038.jpg
ffmpeg -i 1.mp4 -ss 00:00:43 -vframes 1 000043.jpg
解决方案
如果时间戳的间隔不规则(从您的示例看来就是这种情况),您可以使用选择过滤器:
ffmpeg -i 1.mp4 -filter:v \
"select='lt(prev_pts*TB\,4)*gte(pts*TB\,4) \
+lt(prev_pts*TB\,12)*gte(pts*TB\,12) \
+lt(prev_pts*TB\,17)*gte(pts*TB\,17) \
+lt(prev_pts*TB\,28)*gte(pts*TB\,28) \
+lt(prev_pts*TB\,43)*gte(pts*TB\,43)'" \
-vsync drop out/%03d.jpg
这将抓取指定时间戳的帧,如果在该精确时间戳处没有帧,它将抓取下一帧。
推荐阅读
- javascript - vue.js 箭头键绑定问题
- reactjs - React 允许某些 url 的服务器端渲染
- assembly - 这些代码行在 x86 汇编中意味着什么?
- javascript - 使用 Javascript 和 Canvas 重复绘图
- django - 无效的 HTTP_HOST 标头:提供的域名无效——使用容器名称向 dockerized django 应用程序请求
- .net - 如何使用 ImageResizer 插件添加 Access-Control-Allow-Origin 标头
- azure - Power bi 服务在 Azure 中不可用
- r - 将文件从 Sharepoint 导入到 R
- jquery - Jquery 日期选择器没有在文本字段的焦点上触发
- node.js - 我无法处理猫鼬中的填充