两张图片之间的视频变形,FFMPEG/Minterpolate

3

我正在使用ffmpeg的minterpolate滤镜,在Ubuntu Linux上的bash脚本中,使用两个帧(png图像)制作快速简易的变形视频。意图是在不同的视频编辑器中,将这些变形用作类似视频之间的过渡。

这将适用于3个或更多框架/图像,但仅使用2个框架/图像时失败

首先是可行的代码:3个框架/图像

这是使用三个1080p png文件:

test01_01.png test01_02.png test01_03.png

input01="test01_%02d.png"

ffmpeg -y -fflags +genpts -r 30 -i $input01 -vf "setpts=100*PTS,minterpolate=fps=24:scd=none" -pix_fmt yuv420p "test01.mp4"

这需要一些处理时间,然后创建一个约为3秒的414kb MP4视频,其中包含从第一帧开始变形到第二帧,然后再变形到第三帧。

无法运行的代码:2帧

这仅使用两个相同的1080p PNG文件:

test02_01.png test02_02.png

input01="test02_%02d.png"

ffmpeg -y -fflags +genpts -r 30 -i $input01 -vf "setpts=100*PTS,minterpolate=fps=24:scd=none" -pix_fmt yuv420p "test02.mp4"

这几乎立即创建了一个262 字节 的损坏mp4文件。除了帧数之外没有任何区别。

我尝试过的事情:

我尝试过使用Ubuntu默认仓库版本的ffmpeg,以及静态64位的5.0和git-20220108-amd64版本,结果都一样。

我还尝试使用两帧mp4文件作为输入,结果也是一样。

想法?

这是ffmpeg的一个bug吗,还是我做错了什么?

我也愿意听取有关在Linux上使用其他兼容软件创建此类转换的建议。

谢谢您的任何见解!


这并没有记录,但是看起来“minterpolate”滤镜至少需要3个输入帧。 - Rotem
为什么不使用专门的变形工具:https://stackoverflow.com/questions/13734714/given-a-pair-of-images-how-to-automatically-create-an-animation-sequence-morphi/71198395#71198395 - kallaballa
1个回答

4

虽然没有文档记载,但看起来minterpolate滤镜至少需要3个输入帧。

我们可以使用5个输入帧创建一个更长的视频,并保留相关部分。

为了获得与只使用两个输入图像应用Minterpolate滤镜相同的输出,我们可以使用以下解决方案:

  • 定义两个输入流:
    test02_01.png设置为第一个输入,将test02_02.png设置为第二个输入。
  • 使用-stream_loop循环每个图像至少两次
    test02_01.png重复两次,test02_02.png重复3次)。
  • 将输入帧速率设置为0.3 fps(相当于-r 30setpts=100*PTS)。
    输入参数如下:-r 0.3 -stream_loop 1 -i test02_01.png -r 0.3 -stream_loop 2 -i test02_02.png
  • 使用concat滤镜连接两个输入流。
  • minterpolate滤镜应用于连接输出。
    以上阶段的输出是一个开头有几秒钟冗余和结尾有几秒钟冗余的视频。
  • 使用trim滤镜保留相关部分。
    在末尾添加setpts=PTS-STARTPTS(建议在使用trim滤镜时这样做)。

建议的命令:

ffmpeg -y -r 0.3 -stream_loop 1 -i test02_01.png -r 0.3 -stream_loop 2 -i test02_02.png -filter_complex "[0][1]concat=n=2:v=1:a=0[v];[v]minterpolate=fps=24:scd=none,trim=3:7,setpts=PTS-STARTPTS" -pix_fmt yuv420p test02.mp4

演示输出(作为动画GIF):
进入图像描述


test02_01.png:
进入图像描述

test02_02.png:
进入图像描述


哇!我从来没有想到过!谢谢你!而且演示图片的选择也很棒!:3 - InverseTelecine
我想让它适用于可变数量的文件。我尝试了这个,但它不起作用。ffmpeg -y -r 0.3 -stream_loop 1 -i %d.jpg -r 0.3 -stream_loop 2 -filter_complex "[0][1]concat=n=2:v=1:a=0[v];[v]minterpolate=fps=24:scd=none,trim=3:7,setpts=PTS-STARTPTS" -pix_fmt yuv420p test02.mp4你有什么解决办法吗? - Christian
1
@Christian 首先尝试使用简单的命令:ffmpeg -y -r 0.3 -i %03d.jpg -vf "minterpolate=fps=24:scd=none" -pix_fmt yuv420p test02.mp4。上述答案的大部分复杂性是由于 minterpolate 过滤器无法处理仅有两个输入帧的情况。 - Rotem
太棒了,它可以工作。然而,效果本身非常模糊。当它从一个图像变形到另一个图像时,中间的时间看起来非常可怕,并且分散了实际图像的注意力。是否有可能:a) 使动画更加清晰;b) 在显示实际图像的同时加快动画速度? - Christian
还有一个问题。似乎模式%d.jpg只能读取图像0-9。如果我想读取图片0-999.jpg,我应该使用什么模式? - Christian
@Christian 关于morph,我不知道。对于文件模式,在Linux中尝试使用glob模式。在Windows中,我不知道 - 将文件重命名为001.jpg、002.jpg等,并使用%03d。使用concat demuxer与文本文件也可能有效。 - Rotem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接