FFmpeg 如何使用 zoompan 的最后一帧进行淡入淡出

FFmpeg 如何使用 zoompan 的最后一帧进行淡入淡出

我的代码可以工作(某种程度上)。要尝试,请输入两张 640*480px 的图像。

或者,查看此处的示例:http://128.199.50.223/videos/test_12_temp.mp4

您可以从 15 秒开始观看来了解该问题。

当您尝试时,您会看到它放大,然后淡出*,然后显示第二张图像。

*问题就出在这里。您会注意到,淡入淡出刚开始时,[交叉淡入淡出] 就接管了。由于 [交叉淡入淡出] 使用的是原始照片,而不是缩放的最后一帧,因此会跳回到缩放之前的图像(至少这是我的理解)。

所以,我的问题是,如何使用 zoompan 的最后一帧(或继续 zoompan)来实现淡入淡出。

代码如下:

ffmpeg \
-loop 1 -i images/25_test/31630738_0.jpg \
-loop 1 -t 10 -i images/25_test/31630738_4.jpg \
-filter_complex \
"[0:v]trim=start=0:end=9,setpts=PTS-STARTPTS,scale=iw*10:ih*10,zoompan=z='min(max(zoom,pzoom)+0.0015,1.5)':d=1:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=640x480[firstclip]; \
 [1:v]trim=start=1,setpts=PTS-STARTPTS,setsar=1/1[secondclip]; \
 [0:v]trim=start=9:end=10,setpts=PTS-STARTPTS[fadeoutsrc]; \
 [1:v]trim=start=0:end=1,setpts=PTS-STARTPTS[fadeinsrc]; \
 [fadeinsrc]format=pix_fmts=yuva420p,fade=t=in:st=0:d=1:alpha=1[fadein]; \
 [fadeoutsrc]format=pix_fmts=yuva420p,fade=t=out:st=0:d=1:alpha=1[fadeout]; \
 [fadein]fifo[fadeinfifo]; \
 [fadeout]fifo[fadeoutfifo]; \
 [fadeoutfifo][fadeinfifo]overlay[crossfade]; \
 [firstclip][crossfade][secondclip]concat=n=3[output]" \
-map [output] videos/output.mp4

缩放还会导致数据对齐和时间方面出现一些问题,但这些问题可能属于另一个问题主题。

谢谢!

答案1

使用

ffmpeg \
-i images/25_test/31630738_0.jpg \
-loop 1 -i images/25_test/31630738_4.jpg \
-filter_complex \
"[0:v]format=yuva420p,scale=iw*10:ih*10,zoompan=z='min(zoom+0.0015,1.5)':d=250:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=640x480[first]; \
 [1:v]format=yuva420p,fade=t=in:st=0:d=1:alpha=1,trim=0:10,setpts=PTS+9/TB[second]; \
 [first][second]overlay" out.mp4

缩放全景图继续进入淡入淡出。yuva420p第一幅图像的缩放全景图实际上并非如此;只是为了提高速度(一点点)而添加的。

上述命令对我来说是可行的,但根据评论,可以添加fifo到过滤链中以避免因处理器速度慢或图像太大而导致帧丢失。

[0:v]format=yuva420p,scale=iw*10:ih*10,zoompan=z='min(zoom+0.0015,1.5)':d=250:x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':s=640x480,fifo[first]; \
[1:v]format=yuva420p,fade=t=in:st=0:d=1:alpha=1,trim=0:10,setpts=PTS+9/TB,fifo[second]; 

相关内容