一段时间以来,我一直在制作具有足够高分辨率的短片/动画/ 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
的操作
运行gifski -o g.gif *.png
会产生
在上述两种情况下,在帧之间的过渡中都会发生令人讨厌的“抖动”(尽管在gifski
中不太明显)。
由于是gif,因此上述内容的调整选项有限,因此我怀疑解决方案的一部分在于使用ffmpeg
。我只想知道如何使动画看起来完全平滑,而没有任何明显的模糊。这里得到的电影趋向于很平滑,但是缺乏分辨率。在上述代码的height=1080
中设置了width=1080
和png()
之后,我们可以运行
fmpeg -i %d.png -s 1080x1080 -c:v libx264 -vf fps=250 -pix_fmt yuv444p out.mp4
如果粒子以小于肉眼可见的时间/空间尺度移动,并且我们将每秒帧数设置为帧总数,那么帧之间的过渡应该是无缝的,对吗?在out.mp4
中大约2秒的标记处,您会看到某种帧掉落,并且类似的情况是在开始时。为什么会这样?
ffmpeg
提高电影的分辨率?我应该从.png格式更改为矢量化格式(如果可以的话,如何更改)?运行Fedora v31。
答案 0 :(得分:1)
使用:
ffmpeg -framerate 250 -i %d.png -c:v libx264rgb -crf 0 out.mp4
-framerate
来否决。