使用ffmpeg进行多个截图



我使用下面的代码从视频(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:这是必须的,否则你会得到一堆副本来保持输入帧率
  • 修复输出扩展
  • 缺少.的问题

相关内容

  • 没有找到相关文章

最新更新