日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

Rで動画を作ってみた

以前の日記で動画を作る話をした。
とりあげたanimationパッケージはRのグラフィクスをパラパラ漫画のように動画に仕上げるパッケージです。

じゃあ、逆に動画を取り込んで、Rで加工できるの?という話。
実はこれ、TokyoR#20でAnimation using Rという動画がすごいという話題がモチベーション。


僕ならどうするか?と考えると。

  • Rは統計環境なので、全部Rで作る必要が無いと思う
  • animationパッケージもffmpegやImagemagicが走ってるので、そのまま使う
  • 動画も音楽も結局はパラパラ漫画なので、コマ毎に加工してまとめる

とするかなあ。

  • 動画と音源を取ってくる

著作権とかあるかもしれないので、今回は実データは載せられませんが。
動画は以前の日記のコードを使います。こんどはaviで出力してみる。

> library(animation)
> # ffmpegの絶対パスを通す
> oopts = ani.options(ffmpeg = "/usr/bin/ffmpeg")
> #oopts = ani.options(ffmpeg = "c:/ffmpeg/bin/ffmpeg.exe") # windowsだとこんな 感じ
> 
> saveVideo({
+ par(mar = c(3, 3, 1, 0.5), mgp = c(2, 0.5, 0), tcl = -0.3, cex.axis = 0.8, cex.lab = 0.8, cex.main = 1)
+ # 画像の切り変わるスピードを調整
+ ani.options(interval=.5, nmax=1000)
+ for(i in c(1:50,49:1)){
+ y <- x <- seq(-i, i, length= 50)
+ z <- outer(x, y, function(x, y) { r <- sqrt(x^2+y^2); 10 * sin(r)/r })
+ persp(x, y, z, theta=30, phi=30, expand=0.5, col=terrain.colors(50), border=NA)
+ }
+ }, video.name = "test.avi", other.opts = "-b 600k")

で、こんな感じ。

  • 動画を画像に分割する

これはffmpegに任せればいい

#このとき、%05dは5桁の連番にするおまじない。
#因みに3分の動画は1秒60コマとして、60x60x3=10,800枚必要です。
ffmpeg -i test.avi -f image2 -vcodec mjpeg output%05d.jpg

#コマ数を変えたいときはオプション-rをつける。
#-r 1なら1秒60コマで、減らすなら1以下にする。
ffmpeg -i test.avi -f image2 -vcodec mjpeg -r (number) output%05d.jpg

これでjpeg画像が99枚できたと思います。

  • 画像を読み込んで加工

画像を読み込むパッケージは色々ありますが、biOpsパッケージが多機能と思う。
ここでは

    • 画像をグレースケールにする
    • 画像にRのロゴを入れます。

Rのロゴはaddlogo関数を使います。ここのコードを使いました。

> library(pixmap)
> rlogo <- read.pnm(system.file("pictures/logo.ppm", package = "pixmap")[1])
> 
> library(biOps)
> output <- dir(pattern="jpg$")
> for(i in seq(output)){
+ dat <- readJpeg(output[i])
+ dat <- pixmapGrey(dat)
+ jpeg(output[i])
+ plot(dat)
+ x <- seq(-120,530,length.out=25)
+ addlogo(rlogo,px=c(0,100)+rep(x,4)[i],py=c(0,100))
+ dev.off()
+ }
  • 動画として出力

これはanimationパッケージでもできる。
でも、バックでffmpegが走っているだけなので、ffmpegに任せてしまう。

#オプション-vcodec mjpegはMotion JPEG出力を指定します。
#JPEGを動画にする時はmjpegがいいらしいです。
#オプション-sameqは画像の解像度を変えないということ。
ffmpeg -i output%05d.jpg -vcodec mjpeg -sameq output.avi

#画像サイズを変更するときはオプション-sを指定する。
#動画の画面サイズが640x480になる。
ffmpeg -i output%05d.jpg -vcodec mjpeg -sameq -s 640x480 out.avi

#1秒間のコマ数はオプション-rになりますが、デフォルトは25コマです。
#これは1秒60コマということ。
ffmpeg -r 60 -i output%05d.jpg -vcodec mjpeg -sameq output.avi

で、こんな感じ。

  • 音楽をつける

手元に適当な音楽があれば

#オプション-iで画像と音楽を指定するだけ。
#オプション-sameqは上と解像度の調整。
ffmpeg -i output.avi -i music.mp3 -sameq output.flv

とすれば、いいかな?

もし、更に音源を編集したいならtuneRパッケージを使ってもいいかも。