我使用下面的代码从视频(s)在某个时间截图,但我想知道如何采取多个截图(4-5或更多)从一个视频(s)在1个命令。可以是指定时间,也可以是随机时间/时间间隔。
#!/bin/bash
for f in *.mkv
do
ffmpeg -i "$f" -ss 00:02:05 -frames:v 1 -q:v 2 "done/${f%.*}.jpg"
done
按照用户@kesh建议尝试以下命令,但收到错误
#!/bin/bash
for f in *.mkv
do
ffmpeg -vsync vfr -i "$f" -vf select="'eq(n,2988)+eq(n,4302)'" "done/${f%.*}.jpg"
done
错误:
Stream mapping:
Stream #0:0 -> #0:0 (hevc (native) -> mjpeg (native))
Press [q] to stop, [?] for help
[Parsed_select_0 @ 0x55e693319c80] [Eval @ 0x7ffcd4efd840] Missing ')' or too many args in '"eq(n'
[Parsed_select_0 @ 0x55e693319c80] Error while parsing expression '"eq(n'
[AVFilterGraph @ 0x55e693df0d00] Error initializing filter 'select' with args '"eq(n'
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #0:0
Conversion failed!
如果你知道帧速率(并且它是恒定的),那么你可以使用select
滤波器和帧索引。
ffmpeg -vsync vfr -i input -vf select='eq(n,3750)+eq(n,5400)' capture_%d.jpg
这里,假设fps= 30,0:02:05 * 30 = 125 * 30 = 3750和00:03:00 = 180 * 30 = 5400。+
为or
逻辑运算符。参见表达式docs
如果您只在视频的早期部分捕获,您可能需要添加-t
输入选项以在更早的时候停止运行。
(更新:)
- 原始版本错过了
-vsync vfr
:这是必须的,否则你会得到一堆副本来保持输入帧率 - 修复输出扩展 缺少
.
的问题