首页 > 解决方案 > 如何制作高平滑、高分辨率的粒子运动动画

问题描述

一段时间以来,我在制作分辨率足够高的短片/动画/GIF 时遇到了麻烦。我将使用 R 生成一些帧作为随机示例,但如果在其他地方我应该创建帧以提供更好的结果,我也会对此感兴趣。

创建框架

我感兴趣的动画类型涉及在页面上移动的一些“粒子”云。通常有大量的粒子,我希望它们的运动尽可能平滑。作为一个随机示例,考虑 R 代码(使用基本图形,而不是ggplot2因为保存大量帧要快得多)

N <- 500
nFrames <- 250
points <- pracma::randp(n=N, r=1)
rot <- function(p, a) { return(cbind(p[,1]*cos(a) - p[,2]*sin(a), p[,1]*sin(a) + p[,2]*cos(a))) }
cols <- colorRampPalette(c("red", "green", "blue"))(nFrames)
ang <- seq(0, pi, length=N)

# Save frames
png(filename="%d.png")
par(mar=c(0,0,0,0))
for (i in seq(1,N,length=nFrames)) 
        plot(sqrt(i)*rot(points, ang[i]), xlim=sqrt(N)*c(-1,1),  ylim=sqrt(N)*c(-1,1), cex=0.5, pch=19, col=cols[i], asp=1, xaxs="i")

dev.off()

帧到动画

有许多工具可用于将每一帧链接到一个动画中(在 R 中gganimate,我也尝试过类似的东西,但没有发现比以下更方便或更好)。我对生成的文件大小或使所有内容看起来尽可能清晰所需的时间也没有任何要求。

兑换

convert -delay 1 -loop 0 *.png g.gif对于短 gif 风格的动画,一个常见的解决方案是做一些类似的事情

在此处输入图像描述

吉夫斯基

运行gifski -o g.gif *.png产生

无聊_gif

在上述两种情况下的帧之间的过渡中都会发生令人讨厌的“抖动”(尽管使用 时不太明显gifski)。

ffmpeg

作为 gif,上面的调整选项有限,所以我怀疑部分解决方案在于使用ffmpeg. 我想知道的是如何使动画看起来完全平滑而没有任何明显的模糊。这里生成的电影往往非常流畅,但缺乏分辨率。例如,在设置height=1080width=1080输入png()上述代码后,我们可以运行

fmpeg -i %d.png -s 1080x1080 -c:v libx264 -vf fps=250 -pix_fmt yuv444p out.mp4

如果粒子在小于肉眼可见的时间/空间尺度上移动,并且我们将每秒帧数设置为总帧数,那么帧之间的过渡应该是无缝的,对吧?在大约 2 秒标记处,out.mp4您会看到某种帧丢失,并且在开始时也是如此。为什么会这样?

问题

  1. 是否有标准的记录方法来生成涉及大量“点状”粒子的高质量动画/电影?我们需要更多更多的帧吗?
  2. 如何使用 提高电影的分辨率ffmpeg?我应该从 .png 格式更改为矢量化的格式(如果是,如何)?

运行 Fedora v31。

标签: ranimationffmpeg

解决方案


利用:

ffmpeg -framerate 250 -i %d.png -c:v libx264rgb -crf 0 out.mp4
  • 该视频将可由基于 FFmpeg 的播放器(VLC、mpv、ffplay 等)播放。
  • 这避免了缩放,并将输出与输入 PNG 文件相同的宽度 x 高度。
  • 图像解复用器的默认帧速率为 25,因此-framerate用于否决该帧速率。
  • 色彩空间被保留。
  • 输出无损。

推荐阅读