R中高清动画视频的最佳实践

时间:2014-08-24 04:19:07

标签: r animation video knitr

目标是制作一个全屏播放的视频(在1280 x 800显示屏上),其中两个ggplotgrid.arrange()垂直排列。例如:

library(ggplot2)
library(gridExtra)
library(animation)
saveVideo({
  for (i in 1:50) {
    data = data.frame(x=rnorm(1000),y=rnorm(1000))
    plot1 = ggplot(data, aes(x=x, y=y)) + geom_point()
    plot2 = ggplot(data, aes(x=y, y=x)) + geom_point()

    grid.arrange(arrangeGrob(plot1, plot2, heights=c(3/4, 1/4), ncol=1))

    ani.options(interval = 0.05, ani.dev="png", ani.height=800)
  }
},video.name = "test_png.mp4", other.opts = "-b 1000k")

然而,全屏幕视频的质量并不令人满意。我尝试增加"-b 1000k",但在我看来它只会增加文件的大小和输出的定义。

  • 我应该使用哪种设备?
  • 如何增加画布的高度(ani.height=800似乎不会产生任何结果)?

编辑:我使用选项other.opts = "-s 1280x800"尝试了脚本。虽然现在图像更宽,但定义仍然很低。这里是从我的1280x800显示屏中截取的屏幕截图(从上到下)(将视频与菜单栏进行比较):

enter image description here

2 个答案:

答案 0 :(得分:5)

你是专门询问有关动画包的内容,但如果你对另一种方法感兴趣,我可能想看看ffmpeg。

这是我用igraph和ffmpeg编写并在youtube上发布的一个剪辑 - 它提供了高达2160p的分辨率:

https://www.youtube.com/watch?v=Aga9UxMPuFA

这是一个由PNG组成的剪辑,显示两个ggplot()s彼此相邻:

https://www.youtube.com/watch?v=3A4qZdSf7bk

我用于将捕获的PNG粘合在一起的ffmpeg命令是:

ffmpeg 
  -framerate 10     # input frame rate
  -i image%03d.png  # image names (image000.png, ..., image999.png)
  -s:v 1280x720     # video size
  -c:v libx264      # encoder
  -profile:v high   # H.264 profile for video
  -crf 20           # constant rate factor
  -pix_fmt yuv420p  # pixel format
  -r 30             # output frame rate
  clip.mp4   # clip file name

有关如何使用ffmpeg的详细信息,您可以在此处找到: http://www.joyofdata.de/blog/hd-clips-with-ffmpeg-for-youtube-and-vimeo/

答案 1 :(得分:-1)

您可以传递ani.dev="png",而不是传递ani.dev = function(...){png(res=75*grain,...)},其中grain是某个数字> 1.如果您将ani.height(和ani.width(如果给定)乘以相同因子grain,则可以通过此因子有效地提高输出的像素分辨率。

N.B。:上面的默认分辨率75可能与机器有关,我没有看到它的记录。