FFMPEG 从视频中提取 1 帧,从其他视频中提取连续帧,并使用一个命令将后者覆盖在前者上

FFMPEG extract 1 frame from video, consecutive frames from other video and overlay the latter on the former with one command

我有两个视频,A 和 B。我想:

例如,我想从 A 中提取一张静止图像,并在其上叠加来自 B 的 20 个连续帧,一次一个,从而产生 20 个图像,它们都具有相同的静止背景(帧来自 A),但每个都有不同的叠加层(一次来自 B 的一个连续帧)。

我可以使用以下两个命令来完成此操作:

ffmpeg -ss 730.250 -i A.mkv -frames:v 1 still.jpg

ffmpeg -y
  -i still.jpg
  -ss 730.250 -i B.mkv -frames:v 20
  -filter_complex "[1:v]scale=iw/3:-1[tmp],[0:v][tmp]overlay[out]"
  -map [out] out%d.jpg

但是我想知道这是否可能

  1. 将上述命令组合成一个有效的 ffmpeg 命令(而不是两个带有 && 运算符的命令)
  2. 不将 still.jpg 保存在磁盘上,而是将提取的帧直接提供给过滤器

我试过以下方法:

ffmpeg -y
  -ss 730.250 -i A.mkv -frames:v 1 -f null -
  -ss 730.250 -i B.mkv -frames:v 20
  -filter_complex "[1:v]scale=iw/3:-1[tmp],[0:v][tmp]overlay[out]"
  -map [out] out%d.jpg

哪个有效,但不是我想要的方式。 A 的帧未保存在磁盘上,但生成的 20 张图像不正确;叠加层符合预期,但“背景”的行为方式与叠加层相同(每个背景由一个连续的 A 帧组成,一次一个,而不是指定时间点的一个静止帧)。

如何获得与前两个命令相同的结果?

使用 trim 过滤器仅使用每个输入的所需持续时间。

ffmpeg -y -ss 730.250 -i A.mkv -ss 730.250 -i B.mkv -filter_complex "[1:v]trim=end_frame=20,scale=iw/3:-1,settb=1/25,setpts=N/25/TB[tmp];[0:v]trim=end_frame=1,settb=1/25,setpts=0[base];[base][tmp]overlay[out]" -map [out] -vsync 0 -enc_time_base 1/25 out%d.jpg