Haskellでのマルチメディアの取り扱い
(この記事はHaskell Advent Calendar 2010の25日目です)
さてHaskell Advent Calendarもいよいよ最終日となりましたD*1とは違うんです。
これまでとちょっと毛色の違う話題として、Hackageで画像・音声・動画のコーデックを調べてみました。
コンテンツ編集ソフト・ゲーム・シミュレーションの可視化等においては、単にデータを右から左に流すだけではなく、ある程度の計算をする必要があり、そこいらのLLに比べてHaskellが優位となり得る点でもあります。ということで独断と偏見によって使えそうなライブラリを選んでみました。
選定基準・記法
基準は以下のとおり。
- 2010/12/30時点でHackageにある。
- 動きそうな雰囲気
- 画像・音声・動画のファイルへの読み書き両方が出来る。メタデータ(IDv3やExif)のみのものは除外。
- マイナーっぽいフォーマット、特定フレームワークに強く依存するのは除外。
- cross-platform(な可能性がある物)
- 役割が競合するものが複数ある場合、使いやすそうな方のみ
記法について:
- ! FFIで外部のライブラリを呼んでいるもの。
- ○ 網羅的(なように見える)。
- M (Ptr aやByteStringを用いて)メモリからの読み込み/書き出し可能
画像
- !M gd: jpeg,png,gifなど
- ! Codec-Image-DevIL: かなりたくさんの形式(http://openil.sourceforge.net/features.php)に対応。但しRGBAのみ。
- ○ bmp: BMPの読み書き。
音声
動画
! hs-ffmpeg: 言わずと知れたffmpegのラッパですが、ドキュメントは無く、ffmpeg-tutorialsのサンプルコードを見て使うしかないようです。上手く使えれば、世の中のほとんどの音声と動画は読み書きできる・・・はず。
まとめ
見てのとおり、pure Haskellのライブラリは圧縮されていない、比較的単純なコーデックが多いです。
画像一般とmidiに関しては問題ないと言えるでしょう。他は、状況に応じて自分でFFIのコードを書かないといけない感じです。
時間の情報を含むデータの取り扱う方法としては、Functional Reactive Programming等がありますが、果たしてこれで実際のアプリケーションが書けるのか、ということがまだ曖昧な状況です。
というわけで、Haskellコミュニティの外でも使われるようなキラーアプリ的なものが出てくれば、この辺りの状況も改善するのではないでしょうか。
2011年のHaskellの発展に期待しましょう。
*1:D Programming Advent Calendar 2010 http://atnd.org/events/10341 (cf. http://bit.ly/h8fib0)