動画再生の関連技術

デスクトップ環境としてのLinuxは常用していないのだけど、この辺もフォローしておこう。

X11上での出力

純粋に出力部分だけでも以下のような方法がある

  1. X11
  2. X11 Shm extention
  3. Xv extention
  4. Xv extention(XvMC)

負荷は下に行けばいくほど軽くなる。但し一番下はちょっと制約がある。
X11とは普通のX11アプリと同じように動画のフレームを一枚一枚出力する単純なもの。動画のfpsだけ、画像の転送が発生するのでもちろん重い処理。動画は普通コンピュータの画像のようにRGBの色空間で表現せず、YUVなどの情報量を間引ける形式で記録するが、この方式だとこの色空間変換も再生アプリケーション側でやってやる必要がある。欠点だらけの方式のようだが、ネットワーク透過でX11が動く環境ならば基本的にどの環境でも動くはずというメリットはある。
次のX11 shmは名前の通り、shared memoryを使っている方式。単純なX11の描画に比べてmemcpyが削減できるため、少し高速。但しX serverとX Clientが同じ計算機内で動作している必要がある。
Xv extentionとは動画再生専用のX拡張を使ったもの。現在では多くのドライバがサポートしているため、一般的に使われる。色空間変換とスケーリングをビデオカード側でやらせるので、出力段でのCPU負荷には劇的に効果がある。現在使っているX11がXvをサポートしているかはxvinfo(1)というコマンドで問い合わせることができる。Windowsでは3.1の頃に既に実装されていた機能。
最後のXvMCというのはXvへの拡張としてMPEG-1/2の動き補償(Motion Compensation)をハードウェアに実行させる方式。サポートするドライバがやや少なく現時点ではIntel i810、VIAのOpenChrome、NVIDIAのプロプリエンタリドライバなど。コーデックの一部の処理を肩代りさせるため、純粋な出力段の話だけでは済まなくなっている。そのため、ビデオコーデックも専用のものが必要で対応する圧縮方式もMPEG-1/2に限られる。NVIDIAのドライバなどはアプリ側にリンクする.so自体を専用のものを使う必要があるため、使い勝手があまりよくない。この方式を汎用化することで、現代的なコーデックに対応させるのは無理があるらしく今後は利用が減っていきそうな方式。
他にもOpenGLサーフェスとして描画する方式やSDLに描画を任せる方式などもある。前者は体感的にも原理的にもあまり速くならなかった上に、環境を選ぶのであまり一般化しそうにない。後者も内部的には上記の方式のいずれかを上手く選択するだけなので、アプリの書き易さはともかく性能面での優位性はそれほどない。

コーデック

WindowsのようにOS側で整理する主体がないので、各人が勝手に実装している印象

まずはgstreamer。頭に"G"と付くだけあってGNOME由来の技術。一応クロスプラットフォームをうたっていて、WindowsMacでも動くがglibに依存しおり、依存先も引っくるめて全部を持っていけば動くというのが正しい気がする。
各部位がプラガブルになっており、それらを組合せて最終的な出力を得る。開発当初はサポートコーデックも少なく、パフォーマンスも悪いという印象だったが最近はそこそこ使えるようになっているようだ。後述のffmpegプラグインの一つとして扱うことで機能を取り込んでいる。
NokiaのInternet Tabletをデスクトップ環境に使っている。
まだまだ未整備なところもあるけど、標準の土台となるのはこれしか無いようだ。
次がmplayer。文字通り単なるプレーヤで非常に多彩なフォーマットとコーデックをサポートし、動作も速い。ただ、単なる再生ソフトのため外部アプリとしてはGUIのラッパがあるぐらいで、他のソフトと柔軟に連携するような事は想定していないようだ。
単体のプレーヤとしてWindowsMacOS Xでも動き、自前のコーデックで処理するので、いずれの環境でも悪食である意味使い易い。
一部のライブラリはffmpegと共通で、機能も重複する部分がある。ffmpegが直交性やAPIの整備に気を使っているのに比べると、mplayerは今便利に使えて速いソフトを作ろうとしているように見える。Wineのコードを使ってWindowsのDLLをx86/Linux上で使えるようにしたのなどが最たる例。開発は非常に活発で日々コードが更新されているが、定期的なリリースにはあまり拘らないポリシーのようだ。
最後は意外なところ有名になったffmpeg。flv関連の変換で有名になったけど、随分前から存在していて色々なコーデックやフォーマットの相互変換をやるには便利なソフトだった。もともと動画のストリーミングをやるプロジェクトの一部だったはずなのだけど、変換部分だけがどんどん使われるようになってしまった。
肝はmplayerでも使っているコア部分なので、能力としてはmplayer(mencoder)と大差ない。