Vloopback

提供: Oss4art
移動先: 案内検索
URL
http://www.lavrsen.dk/twiki/bin/view/Motion/VideoFourLinuxLoopbackDevice
ライセンス
GPL

概要

vloopback は Linux カーネルモジュールの一種で、video4linux 対応のアプリケーションに別のアプリケーションから映像を流し込むことを可能にする。

普通、video4linux 対応のアプリケーションは、ビデオキャプチャーボードや USB カメラなどの映像入力機器から対応ドライバを経由して 画像を取得する。video4linux の仕組だとこの部分は融通が効かないので、映像はドライバからしか入手できない。 vloopback はその「video4linux対応ドライバ」のフリをするモジュールなのだ。

インストール

まずは vloopback をインストールしておこう。使っているディストリビューションに含まれているものか、無ければ 上記 URL から最新版をダウンロードして、コンパイルする。 使っているカーネルによって対応版が異なるが、ここでは vloopback-0.97-snap2.tar.gz だとしよう。モジュールのコンパイルには、 カーネルのソースツリーが展開されていることが前提となっている。

root 権限で適当なところに展開したら

# cd vloopback-0.97-snap2
# make
# make install

で OK。うまく行かない場合はカーネルソースツリーの名前や場所などが、/lib/modules/内のファイルと整合しているかどうか確かめること。

vloopback をロードする

設定が適切であれば、

modprobe vloopback

でモジュールが組み込まれる。うまく行けば dmesg に

/usr/src/vloopback-0.96a/vloopback.c: Video4linux loopback driver v0.97-snap2
/usr/src/vloopback-0.96a/vloopback.c: Loopback 0 registered, input: video1,output: video2

といった内容が表示される筈だ。これで、アクセス可能なビデオデバイスとして新たに /dev/video2 が加わったことになる。これが例の、 ドライバのフリをしている vloopback である。

vloopback の仕組:パイプライン

dmesg のメッセージをよく読むと、"input: video1,output:video2" と、「input」「output」がそれぞれ表示されていることに気がつく。 このうち、「output」の方は、従来の video4linux ドライバと同様、対応アプリケーションから画像を取得できるデバイスとなる。 では「input」の方はというと、このデバイスにアクセスすることで、アプリケーション側から vloopback に画像を渡すことができるのである。 これを模式図で表わすと、

  /dev/video0 ⇒ 【アプリケーション1】 ⇒ /dev/video1 ⇒ 【vloopback】 ⇒ /dev/video2 ⇒ 【アプリケーション2】

というようになる。ここでのポイントは、アプリケーション2の方は従来のアプリケーションに手を加える必要がないところ。 video4linux 対応でさえあれば録画ソフトだろうがビデオ会議システムであろうが、再コンパイルの必要すらなく使える。

vloopbackに対応させる

さてここで問題となるのが、上の模式図でいう「アプリケーション1」の方だ。というのも、実は vloopback に出力する側のアプリケーションの方はわざわざ アプリケーションを改造しないと映像を流し込むことができないためだ。そしてこれが結構面倒なんである。

vloopback 対応のコードの書き方は vloopback についてくるサンプルをひとまず読んでみていただきたい。大筋では、画像を取得するときと手順は似ていて、 デバイスの初期化→画像サイズの設定→画像データの書き込み、となっている。 これだけならまだ簡単だとも言えるのだが、問題は vloopback から画像を取得するアプリケーション側は、例えば取得する画像サイズやピクセルの形式がマチマチなので、 それらの相手をしようとすると途端にやらなければならないことが増えてしまうのだ。

この辺の作業を簡単にするための工夫はいくつかなされているものの、まだ完結したライブラリとして提供されたという話は聞かない。 それでも何とかしたい方のためのサンプルとして、EffecTV の vloopback 対応コードを参照してほしい。 EffecTV では、ピクセルフォーマットの変換・画像のリサイズ・プッシュ型の画像送出(そして各種映像効果)がサポートされている。 EffecTV のソースパッケージ内の vloopback.c が該当コードとなっている。

パイプラインを実現する他の方法

そもそも vloopback は、ビデオのパイプラインシステムを無理矢理既存の枠組みで実現しようとする、やや不器用な仕組なのであり、そこが問題なのだった。 実のところ、パイプラインを組むためのシステムがいくつも開発されているので、高度なパイプライニングを行うのであれば、それらのシステムを検討した方がいい。 情報をビデオパイプラインにまとめる予定なので、そちらを参照してほしい。