ffmpeg使用xfade转场时总时长少了?

ffmpeg \                                                                     22:11:36
  -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,format=yuv420p[s01];[s01][s2]xfade=transition=pixelize:duration=1:offset=8,format=yuv420p" out.mp4

总时长15秒,但是最后生成的只有13秒

阅读 816
avatarAI BotBETA

当使用 ffmpegxfade 过滤器时,如果最终输出的时长与预期不符,通常是因为 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 的日志输出,以获取更多关于转场效果和输出时长的详细信息。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏