当前位置: 首页 > 知识库问答 >
问题:

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

吴欣然
2024-05-31
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秒

共有1个答案

湛博易
2024-05-31

当使用 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 的日志输出,以获取更多关于转场效果和输出时长的详细信息。

 类似资料:
  • 我已经在PC上使用pip ffprobe命令安装了ffprobe,并从这里安装了ffmpeg。 然而,我仍然在运行这里列出的代码时遇到麻烦。 我尝试使用下面的代码,但没有成功。 有人知道怎么了吗?我没有正确引用目录吗?是否需要确保和视频文件位于特定位置? 如果这个问题有点基本的话,我很抱歉。所有我需要的是能够迭代一组视频文件,并获得他们的开始时间和结束时间。 谢谢!

  • 使用指南 - 统计设置 - 转化设置 - 时长转化 指访客在网站的停留时间超过指定时长,便会记为一次转化。 在“管理”->“转化设置”->“基本转化设置”中进行设置,需要手动点击“开启”项,然后设置时长。

  • 本文向大家介绍Java通过调用FFMPEG获取视频时长,包括了Java通过调用FFMPEG获取视频时长的使用技巧和注意事项,需要的朋友参考一下 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,li

  • 我一直在使用ffmpeg将音频从一种格式转换为另一种格式,并更改音频的比特率。当我尝试使用命令将aac音频转换为mp3音频时: ffmpeg-我有一些音频。aac-c:mp3-b:128k SomeOutputPath。mp3 一切正常工作,输出音频与输入音频长度相同(6分15秒)。 但是,当我尝试使用类似的命令将其转换为aac音频时: ffmpeg-我有一些音频。aac-c:aac-b:128k

  • 我试图转换一个实时的rtmp流到hls流。 我看了之后有了一些想法 提前谢谢...

  • 大家好,我有一个像youtube这样的视频托管网站,我允许上传几乎所有类型的视频,但我想将所有上传的视频转换为mp4格式 我可以做到这一点,我的代码在下面 这段代码将非mp4视频转换为mp4,并获得缩略图和正确的持续时间,但问题是,如果我上传大约100mbs的flv或mkv格式,这个过程需要非常长的时间,比如超过2-3小时。 如果你需要看完整的代码,请给我一些更好的建议 完整代码: 问题:上面的F