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 中提取多个连续帧
- 重新缩放 B 的每一帧并将其叠加在“背景”(A 的帧)之上
例如,我想从 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
但是我想知道这是否可能
- 将上述命令组合成一个有效的 ffmpeg 命令(而不是两个带有
&&
运算符的命令)
- 不将
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
我有两个视频,A 和 B。我想:
- 在某个时间点从A中提取一个帧,作为“背景”
- 从同一时间点 开始,从 B 中提取多个连续帧
- 重新缩放 B 的每一帧并将其叠加在“背景”(A 的帧)之上
例如,我想从 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
但是我想知道这是否可能
- 将上述命令组合成一个有效的 ffmpeg 命令(而不是两个带有
&&
运算符的命令) - 不将
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