1

我正在尝试在 Ubuntu Linux 上的 bash 脚本中使用带有 ffmpeg 的 mininterpolate 过滤器的两帧(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"

这需要一些处理时间,然后创建一个 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 默认 repo 版本的 ffmpeg,以及静态 64 位 5.0 和 git-20220108-amd64 版本,结果都相同。

我还尝试使用 2 帧 mp4 文件作为输入,结果相同。

想法?

这是ffmpeg中的错误还是我做错了什么?

我也愿意接受任何关于使用其他 Linux 兼容软件创建这样的变形的建议。

感谢您的任何见解!

4

1 回答 1

1

它没有记录,但看起来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使用过滤器连接两个输入流。
  • minterpolatefiler 应用于级联输出。
    上述阶段的输出是一个开头冗余秒数很少,结尾冗余秒数很少的视频。
  • 应用trim过滤器以保留相关部分。在末尾
    添加(如使用修剪过滤器时推荐的那样)。setpts=PTS-STARTPTS

建议的命令:

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
在此处输入图像描述

于 2022-02-21T16:12:46.763 回答