以前の日記で動画を作る話をした。
とりあげた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パッケージを使ってもいいかも。