@kyanny's blog

商品にならぬ技術は役に立たない - トーマス・エジソン

Ruby で動画を扱うライブラリについて (RVideo, RTranscoder, FLVTool2)

Ruby で動画を扱うライブラリについて少し調べたので書いておく。

ざっと探したところ、 RVideo, RTranscoder がそこそこ有名なようだった。あと変わり種で FLVTool2 というのがあった。他に良いのがあったら教えてください。ちなみにこれらのライブラリで動画の変換 (convert) はやったことがない。

RVideo

http://rvideo.rubyforge.org/ (オススメしない)
http://github.com/newbamboo/rvideo (オススメ)

まず普通に gem install rvideo で手に入るバージョンは古い (0.9.3) ので使わないほうが良い。オフィシャルページ?には 0.9.4 とか書いてあるのにそんなバージョンないし。 Github でいろいろ fork されていて、俺は newbamboo-rvideo を使っている。一番活発に開発されてて fork されたのを取り込んだりもしてて実質中心レポジトリのようにみえる。 newbamboo てのは Rails で仕事してる海外の会社らしい。

gem install newbamboo-rvideo で手に入る newbamboo-rvideo はバージョン 0.9.6 だが、これも github の master とはかなり差があるようだ。 master のソース読みながらいろいろいじってて挙動があわないのでハマった。しかも残念なことにタグ打ってないみたいなのでどのコミットが 0.9.6 なのかわからない。 git log --grep=0.9.6 とかで適当に探したりした。

RVideo::Inspector のインスタンスを作ると各種メタデータがとれる。 RVideo::FrameCapturer でキャプチャ画像を切り出せる。同じインスタンスを使い回せないのがちょっと残念。 FrameCapturer のほうは ffmpeg を叩くコマンドラインをあんまり細かくカスタマイズできなかったので適当に上書きして使ってる。

あと注意点として open4 に依存してるけど gemspec から抜けてるので gem install open4 が必要。これは何らかの方法で作者らに連絡したいと思ってる。

video = RVideo::Inspector.new(:file => '/path/to/movie.mp4')
video.duration #=> 30000 (msec)
video.raw_duration #=> 00:00:30

# メタデータ (というか ffmpeg -i の結果) をとれる
# それを new に渡すとファイルみないのではやい
raw_response = video.raw_response
same_video = RVideo::Inspector.new(:raw_response => raw_response)

# 10秒後のフレームをキャプチャ
RVideo::FrameCapturer.capture!(:input => '/path/to/movie.mp4', :output => '/path/to/capture.jpg' :offset => 10)

ドキュメントはあんまり期待できなそうだけどソースも長くないし FrameCapturer は埋め込みコメントで詳細が書いてある。動画の変換は RVideo::Transcoder でやるんだと思います。

RTranscoder

動画の変換とキャプチャ画像切り出しだけやるライブラリ。あまり良くない。 RVideo::Inspector 相当のものがないので使いづらかった。

FLVTool2

FLV ファイルにメタデータを埋め込むライブラリ。メタデータというのはこういう やつのこと

ffmpeg の ML を読んだりしたが、このメタデータを ffmpeg 単体で埋め込む方法は見つけられなかった。「ffmpeg のオプションでできるよ」とかいうレスも見かけたけど、どのオプションかは言及されていなかった。

$ flvtool2 -U hoge.flv

こんだけ。くわしくは flvtool2 -h を。

まとめ

newbamboo-rvideo がオススメ。メタデータとか不要で単に変換したいだけなら ffmpeg コマンドを直に叩いたほうが良いと思う。