如何在 ffmpeg 中裁剪视频中的移动(叠加)图像?

如何在 ffmpeg 中裁剪视频中的移动(叠加)图像?

我想裁剪移动的图像。裁剪必须随时间移动才能产生平移效果。我尝试使用以下命令:

   ffmpeg -y -i video.mp4 -filter_complex "movie=filename=image.jpg:loop=1[pip:v];[pip:v]trim=start=0.0:duration=5,setpts=PTS-STARTPTS+0/TB[pip:v];[pip:v]scale='if(gte(ih,iw),384,-1):if(gte(ih,iw),-1,216)',crop=384:216:exact=1[pip:v];[pip:v]scale=iw*(1.3):ih*(1.3)[pip:v];[pip:v]crop=384:216:-(in_w-out_w)*(t-(5))/5:0[pip:v];[0:v][pip:v]overlay=main_w-overlay_w-33.333332:main_h-overlay_h-33.333332:enable='between(t,0,0+5)'[outv]" -map [outv] -preset ultrafast -r 29.97 output.mp4

但裁剪保持固定。我认为裁剪时间戳不起作用,因为它是图像。我找不到解决方案,你能帮助我吗?

在此处输入图片描述

答案1

除了使用movie过滤器之外,您还可以添加image.jpg第二个输入,并添加-r以设置帧速率:

ffmpeg -y -i video.mp4 -r 29.97 -loop 1 -i image.jpg...

它定义了的帧速率(重复率)image.jpg,并解决了时间戳问题。


更新的命令行:

ffmpeg -y -i video.mp4 -r 29.97 -loop 1 -i image.jpg -filter_complex "[1:v]trim=start=0.0:duration=5,setpts=PTS-STARTPTS+0/TB[pip:v];[pip:v]scale='if(gte(ih,iw),384,-1):if(gte(ih,iw),-1,216)',crop=384:216:exact=1[pip:v];[pip:v]scale=iw*(1.3):ih*(1.3)[pip:v];[pip:v]crop=384:216:-(in_w-out_w)*(t-(5))/5:0[pip:v];[0:v][pip:v]overlay=main_w-overlay_w-33.333332:main_h-overlay_h-33.333332:enable='between(t,0,0+5)':format=yuv444[outv]" -map [outv] -preset ultrafast -r 29.97 output.mp4

相关内容