两个图像之间的视频变形,FFMPEG/Minterpolate
Video Morph Between Two Images, FFMPEG/Minterpolate
我正在尝试在 Ubuntu Linux 上的 bash 脚本中使用两帧(png 图像)和 ffmpeg 的 minterpolate 过滤器制作一个快速简单的变形视频。目的是稍后在不同的视频编辑器中使用变形作为相似视频之间的过渡。
它将在 3+ frames/images 上工作,但 仅使用 2 frames/images 时失败。
首先是有效的代码: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 默认回购版本的 ffmpeg,以及静态 64 位 5.0 和 git-20220108-amd64 版本,结果相同。
我也试过用一个2帧的mp4文件作为输入,结果一样。
想法?
这是 ffmpeg 中的错误还是我做错了什么?
我也乐于接受使用其他 Linux 兼容软件创建这样的变形的任何建议。
感谢您的任何见解!
没有记录,但看起来 minterpolate
过滤器至少需要 3 个输入帧。
我们可能会使用 5 个输入帧创建更长的视频,并保留相关部分。
为了获得与仅对两个输入图像应用 Minterpolate 滤波器相同的输出,我们可以使用以下解决方案:
- 定义两个输入流:
将 test02_01.png
设置为第一个输入,将 test02_02.png
设置为第二个输入。
- 每个图像至少循环两次,使用
-stream_loop
(test02_01.png
重复两次,test02_02.png
重复 3 次)。
- 将输入帧速率设置为 0.3 fps(相当于
-r 30
和 setpts=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
:
我正在尝试在 Ubuntu Linux 上的 bash 脚本中使用两帧(png 图像)和 ffmpeg 的 minterpolate 过滤器制作一个快速简单的变形视频。目的是稍后在不同的视频编辑器中使用变形作为相似视频之间的过渡。
它将在 3+ frames/images 上工作,但 仅使用 2 frames/images 时失败。
首先是有效的代码: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 默认回购版本的 ffmpeg,以及静态 64 位 5.0 和 git-20220108-amd64 版本,结果相同。
我也试过用一个2帧的mp4文件作为输入,结果一样。
想法?
这是 ffmpeg 中的错误还是我做错了什么?
我也乐于接受使用其他 Linux 兼容软件创建这样的变形的任何建议。
感谢您的任何见解!
没有记录,但看起来 minterpolate
过滤器至少需要 3 个输入帧。
我们可能会使用 5 个输入帧创建更长的视频,并保留相关部分。
为了获得与仅对两个输入图像应用 Minterpolate 滤波器相同的输出,我们可以使用以下解决方案:
- 定义两个输入流:
将test02_01.png
设置为第一个输入,将test02_02.png
设置为第二个输入。 - 每个图像至少循环两次,使用
-stream_loop
(test02_01.png
重复两次,test02_02.png
重复 3 次)。 - 将输入帧速率设置为 0.3 fps(相当于
-r 30
和setpts=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
: