Linuxでデスクトップをライブ配信する

Ustreamニコニコ生放送Linuxのデスクトップを配信するのに必要な物・方法のメモです。

必要な物を用意する手順はDebian Lennyでの環境を元に書いてありますので、適宜読み替えて下さい。

必要な物

ffmpeg

ffmpegでデスクトップのキャプチャが出来ます。

$ ffmpeg -version

してffmpegの情報を表示し、ビルド設定に

 --enable-x11grab

が含まれていればキャプチャ機能が有効になっています。無い場合はこのオプションを付けてffmpegの再ビルドが必要です。debian-multimediaffmpegでは有効になっています。

mjpegtools_yuv_to_v4l

ffmpegでキャプチャしたデータをvloopbackが受け取れるように変換するために使います。

ソースを http://panteltje.com/panteltje/mcamip/mjpegtools_yuv_to_v4l-0.2.tgz からダウンロードし、そのままビルド・インストールします。ビルド前にはMakefileのCFLAGSを編集して最適化オプションなどを変更すると良いでしょう。

vloopbackカーネルモジュール

vloopbackカーネルモジュールはキャプチャソフトからデータを受け取り、それをビデオデバイスとして出力させるために必要です。

ソースはvloopback-sourceとしてパッケージにまとめられています。Lennyには無いのでパッケージを直接ダウンロード・またはsid等から借りてきてこれをインストールします。

ソースをインストールしたら

# m-a a-i vloopback

でモジュールのビルド・インストールが完了します。

配信手順

まずはvloopbackをカーネルに追加してビデオデバイスを作成します。

# modprobe vloopback pipes=1

dmesgでvloopbackが作成したデバイスを確認します。

[23979.234319] [vloopback_init] : video4linux loopback driver v1.3
[23979.241036] [vloopback_init] : Loopback 0 registered, input: video0, output: video1
[23979.241045] [vloopback_init] : Loopback 0 , Using 2 buffers

この例では /dev/video0 が入力、/dev/video1 が出力として作成されています。

次に、デスクトップをキャプチャしてデータをデバイスの入力に送ります。

$ ffmpeg -f x11grab -s 512x384 -r 10 -i :0.0+100,200 -pix_fmt yuv420p -f yuv4mpegpipe - \
    |mjpegtools_yuv_to_v4l /dev/video0

-f x11grab は入力にXの画面のキャプチャを使うことを意味します。-i で画面とキャプチャ位置オフセットを、-s でキャプチャサイズを指定します。キャプチャデータは mjpegtools_yuv_to_v4l で変換してビデオデバイスに流しています。他のオプションや詳細についてはffmpegのドキュメントを参照して下さい。

これで今 /dev/video1 を他のウェブカムと同じようにビデオデバイスとして扱えるようになりました。

/dev/video1 の出力の確認のためにビデオデバイスを表示するソフトを起動してみます。ここでは xawtv を使います。

$ xawtv -geometry 512x384 -c /dev/video1

これでデスクトップが表示されていればOKです。