r - 如何制作高平滑、高分辨率的粒子运动动画
问题描述
一段时间以来,我在制作分辨率足够高的短片/动画/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
产生
在上述两种情况下的帧之间的过渡中都会发生令人讨厌的“抖动”(尽管使用 时不太明显gifski
)。
ffmpeg
作为 gif,上面的调整选项有限,所以我怀疑部分解决方案在于使用ffmpeg
. 我想知道的是如何使动画看起来完全平滑而没有任何明显的模糊。这里生成的电影往往非常流畅,但缺乏分辨率。例如,在设置height=1080
并width=1080
输入png()
上述代码后,我们可以运行
fmpeg -i %d.png -s 1080x1080 -c:v libx264 -vf fps=250 -pix_fmt yuv444p out.mp4
如果粒子在小于肉眼可见的时间/空间尺度上移动,并且我们将每秒帧数设置为总帧数,那么帧之间的过渡应该是无缝的,对吧?在大约 2 秒标记处,out.mp4
您会看到某种帧丢失,并且在开始时也是如此。为什么会这样?
问题
- 是否有标准的记录方法来生成涉及大量“点状”粒子的高质量动画/电影?我们需要更多更多的帧吗?
- 如何使用 提高电影的分辨率
ffmpeg
?我应该从 .png 格式更改为矢量化的格式(如果是,如何)?
运行 Fedora v31。
解决方案
利用:
ffmpeg -framerate 250 -i %d.png -c:v libx264rgb -crf 0 out.mp4
- 该视频将可由基于 FFmpeg 的播放器(VLC、mpv、ffplay 等)播放。
- 这避免了缩放,并将输出与输入 PNG 文件相同的宽度 x 高度。
- 图像解复用器的默认帧速率为 25,因此
-framerate
用于否决该帧速率。 - 色彩空间被保留。
- 输出无损。
推荐阅读
- vue.js - 酶计算错误 - 类型错误:无法读取未定义的属性“查找”
- mysql - 如何实时更新两个数据库
- flutter - Flutter:多层堆栈中顶层的自定义滚动视图
- css - Bootstrap - 只是缺少验证样式
- python - 运行 np.genfromtxt() 时出现 MemoryError
- java - SQLite 数据库
- python - 如何迭代直到最长的可迭代用尽。使用 zip_longest 进行迭代
- django - 如何从多对多查询以从模板django中的数据库表中选择特定项目
- android - 此下载链接是否提供了所有组件,例如 sdks?
- oauth-2.0 - Oauth2: best practice to keep access_token fresh?