当使用 ffmpeg
的 xfade
过滤器时,如果最终输出的时长与预期不符,通常是因为 xfade
过滤器的使用方式导致输入片段之间产生了重叠或裁剪。在您的命令中,每个图片都被循环播放了5秒,并且您使用了 xfade
来在图片之间添加转场效果。
问题可能在于 offset
参数的使用上。offset
参数定义了转场效果开始的时间点(以秒为单位),相对于当前输入流(即 [s0]
或 [s01]
)的开始位置。在您的命令中,第一个 xfade
过滤器的 offset
设置为4秒,这意味着转场效果会在第一个图片播放到第4秒时开始,持续到第5秒(因为 duration
设置为1秒)。第二个 xfade
过滤器的 offset
设置为8秒,这意味着转场效果会在第一个 xfade
过滤器的输出(即 [s01]
)播放到第8秒时开始。
由于每个图片的原始时长是5秒,并且转场效果的 duration
是1秒,那么第一个 xfade
过滤器的输出 [s01]
将是一个6秒长的视频流(5秒的第一个图片 + 1秒的转场效果),紧接着是第二个图片。然后,第二个 xfade
过滤器的 offset
设置为8秒,这实际上已经超出了 [s01]
的长度(6秒),导致第二个 xfade
过滤器可能没有正确工作,或者 ffmpeg
在处理时自动进行了裁剪。
为了解决这个问题,您需要重新计算 offset
参数,确保它们与输入流的时长相匹配。如果您的目标是每个图片播放5秒,并且每个转场效果持续1秒,那么第一个转场应该在第4秒开始,第二个转场应该在第一个图片播放完毕(即第5秒)后立即开始,即偏移量应该是5秒加上第一个转场的时长1秒,也就是6秒。
以下是修改后的命令:
ffmpeg \
-loop 1 -t 5 -i 1.jpeg \
-loop 1 -t 5 -i 1.jpeg \
-loop 1 -t 5 -i 1.jpeg \
-filter_complex "[0]scale=500:500[s0];[1]scale=500:500[s1];[2]scale=500:500[s2];[s0][s1]xfade=transition=pixelize:duration=1:offset=4[s01];[s01][s2]xfade=transition=pixelize:duration=1:offset=9,format=yuv420p" out.mp4
请注意,第二个 xfade
过滤器的 offset
现在是9秒,这是因为第一个 xfade
过滤器的输出 [s01]
是6秒长(5秒的图片 + 1秒的转场效果),所以第二个转场应该在第9秒开始。
此外,确保您的 ffmpeg
版本支持 xfade
过滤器以及您使用的所有参数。如果问题仍然存在,您可能需要检查 ffmpeg
的日志输出,以获取更多关于转场效果和输出时长的详细信息。