如何制作高平滑,高分辨率的粒子运动动画

时间:2019-12-04 01:50:20

标签: r animation ffmpeg

一段时间以来,我一直在制作具有足够高分辨率的短片/动画/ 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之类的东西我曾尝试过,但没有找到比它方便或更好的东西了)。我对最终文件的大小或使所有内容看起来尽可能清晰所需的时间也没有任何要求。

转换

对于短gif样式的动画,常见的解决方案是执行类似convert -delay 1 -loop 0 *.png g.gif的操作

enter image description here

gifski

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

boring_gif

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

ffmpeg

由于是gif,因此上述内容的调整选项有限,因此我怀疑解决方案的一部分在于使用ffmpeg。我只想知道如何使动画看起来完全平滑,而没有任何明显的模糊。这里得到的电影趋向于很平滑,但是缺乏分辨率。在上述代码的height=1080中设置了width=1080png()之后,我们可以运行

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

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

问题

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

运行Fedora v31。

1 个答案:

答案 0 :(得分:1)

使用:

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