タグアーカイブ:ruby

Rubyで動画を造ろう

実験のために大量の単純な動画が必要になった。Flashなどで一つ一つ丁寧に作るという手はもちろんあった。今考えてみればそれほど時間はかからなかったかも知れないが、最近はもっぱらプログラミングに没頭する日々が多いせいかそういう単純労働をやる気になれない。やれやれ。どうしよう。多少恥ずかしい気分に襲われた。昔、僕ってMaxの名人と言われたことがなかったっけ?MaxとJitterなら出来ると言えば出来る。Maxを使いたいかというと、ふむ、まあ、特に使いたいと思わないのが本音だ。コードを書きたい。いや、コードを書くのが今の自分にとって自然なんだ。 ということで、Rubyでモーショングラッフィクス的な動画が作れないかと挑戦してみた。 この挑戦にとりあえず必要なツールは2つ。まず、描画はRCairoで行う。RCairoはCairoライブラリーのRubyバインディングだ。CairoはIllustratorなどのようにベクトル・グラフィックが描けるかなりパワフルなライブラリーだが、Rubyist Magazineにて日本語の紹介記事が読める。RCairoを使えば、静止画が簡単に書き出せるが動画は無理だから、RCairoで描いた絵をなんとか動画に変換する必要がある。いろいろ試した結果、結局短い動画ならフレームを1つ1つ画像ファイルに出力し、FFmpegでその画像たちを動画に仕上げるという戦略を選んだ。一見面倒な手法に見えるかも知れない。でも意外と楽で、画像を書き出した後、FFmpegでいろいろと圧縮設定を変えたりして動画を手軽に書き直すことができる。 では、まずFFmpegを入手する。便利なツールだからこんなプロジェクト以外にも役立つ。入手方法はいろいろあるが、OSXならHomebrewを使った方がおすすめ。 Homebrewそのもののインストール。ターミナルで以下のコマンドを実行する: ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)" そしてHomebrewの初期処理を行う: brew doctor FFmpegをインストールする: brew install ffmpeg 最後にRCairoもインストールする: gem install cairo それで下準備ができた。早速コードを書こう。とりあえず簡単な絵の画像を書き出してみよう。 require 'cairo' width = 1280 height = 720 pixel_format = Cairo::FORMAT_ARGB32 surface = Cairo::ImageSurface.new(pixel_format, width, height) context = Cairo::Context.new(surface) context.set_source_rgb(0,0.1,0.333) context.rectangle(0,0,width,height) context.fill() surface.write_to_png("test.png") 上記のスクリプトを実行すれば… おおおおお!こんな奇麗な画像が出来上がった。 すばらしい。すばらしい。でも大したことはやっていない。Cairoで描画する前にサーフェイス(面)とコンテキストが必要。絵画で例えるとサーフェイスがキャンバスでコンテキストが筆だ。基本的にコンテキストを通して描画を行う。行7でサーフェイスを作る。その際、ピクセルのフォーマットと画像の幅と高さを指定する。ここで使うピクセルフォーマットは32ビットのRGBA(各チャンネルは8ビット)。 次はいよいよ描画だ。Contextのset_source_rgbメソッドで色を指定する。アルファチャンネルを使用するならset_source_rgbaを使う。ここは奇麗なブルーにする。次の行は長方形を描くように見える。しかし、長方形が描かれるのは次の行のcontext.fill()だ。そう。Illustratorを使っている人なら基礎中の基礎だが、ベクトル絵には「塗り」と「線」がある。英語では塗りのことを「fill」といい、線は「stroke」だ。つまり、ここで長方形を塗るという指示を出している。最後にサーフェイスのwrite_to_pngメソッドでPNGファイルを出力する。 では、何かを動かそう。 require 'cairo' width = 1280 […]