キャプチャしたビデオを偽のWebカメラとして使用して、無料のストリーミングサイトを使用してLinuxデスクトップ(のウィンドウ)のライブストリームを作成したいと思います。ウィンドウズにはこれのための多くのツールがあります。 ffmpegを使用すると、特定のウィンドウで入力をキャプチャできますが、フラッシュで使用できる偽のWebカメラスタイルのデバイスにビデオを出力する方法が見つかりません。
誰かがこれを行う方法(またはソフトウェア)を推奨できますか?
v4l2loopback をインストールできます。これは、ウェブカメラをシミュレートするカーネルモジュールです。それをロードします:
modprobe v4l2loopback
次に、ffmpegなどのプログラムを使用して、デバイス/ dev/video0にビデオストリームを送信する必要があります。デスクトップをキャプチャし、ffmpegで/ dev/video0に転送するには、次のコマンドラインを使用できます。
ffmpeg -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -vcodec rawvideo -pix_fmt yuv420p -threads 0 -f v4l2 /dev/video0
別のフレームレートが必要な場合は、-rの値を15から別の値に変更します。解像度は-sパラメータで選択されます。画面の左上隅からのオフセットを指定する場合は、-iパラメーターに "-i:0.0 + x、y"の形式で渡します。ここで、xとyはそれぞれ水平オフセットと垂直オフセットです。
mplayerでv4l2loopback を使用します。
make
およびsu -c 'make install'
)、su -c 'modprobe v4l2loopback'
でモジュールをロードし、次に、v4l2loopbackソースフォルダーのファイルexamples/yuv4mpeg_to_v4l2.c
の1行を
v.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420;
に
v.fmt.pix.pixelformat = V4L2_PIX_FMT_YVU420;
このフォルダでmake
を実行します。
次に、examples
ディレクトリから次のように実行します。
mkfifo /tmp/pipe # only needed once, as long as you do not delete the file /tmp/pipe
./yuv4mpeg_to_v4l2 < /tmp/pipe &
mplayer movie.mp4 -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
ここで、movie.mp4
をビデオファイルの名前に置き換えます。 /dev/video0
をループバックデバイスに置き換えます。
MPlayerは、stdinからでも、あらゆるWebストリーム、あらゆる種類のビデオファイルを再生できます。ドイツのニュースサイトである http://www.tagesschau.de のファイルでテストしました。
TS=$(wget "http://www.tagesschau.de/multimedia/video/" -q -O - | grep --regexp='http.*\.webm"' | sed -e 's%.*href="%%' -e 's%\.webm".*%\.webm%')
./yuv4mpeg_to_v4l2 < /tmp/pipe &
mplayer $TS -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
$ TSの代わりに-
(標準入力を表す)を置くことができます。そして、mplayerの前で、ffmpegコマンドが出力をstdoutにリダイレクトします。だから次のようなもの:
./yuv4mpeg_to_v4l2 < /tmp/pipe &
fmpeg -someOptions ... -o - | mplayer - -vf scale=480:360 -vo yuv4mpeg:file=/tmp/pipe
あなたはあなたのffmpegコマンドがどのように見えるか知らなかったので、最後のものをテストしませんでした。
どのディストリビューションを使用していますか? ArchでのWebCamStudioと、LivestreamのWebベースの「スタジオ」を組み合わせて成功しました。でも、使ってからしばらく経ちました。
正確に何をしようとしていますか? x11grabでコンパイルされたffmpegはデスクトップを記録できます。私はそれをUstreamにプッシュするのに限られた成功しかありませんでしたが、再び久しぶりで、私がしていたことはもううまくいかないと思います。
デスクトップではなくファイルをストリーミングするだけの場合(「ウィンドウ」、つまり「VLC」と言っていると思います)、ライブストリームで動作するように正しい方向に向けることができます(たぶん、 Ustream)。実験を通してこれを行う方法を不器用に考えています。それは素晴らしいことではありませんが、ライブストリームで動作します。
Justin.tvには、VLCからサービスにストリーミングできるスクリプトもあります。
http://apiwiki.justin.tv/mediawiki/index.php/Linux_Broadcasting_API
まず、appear.inはおそらく手間をかけずに必要なことを行います(私は提携していません): http://appear.in/
第二に、最近Linuxのサポートを追加したOBSを使用してTwitchまたは他のサービスにストリーミングできます(!): https://obsproject.com/
OBSは、Ubuntuでのスクリーンキャプチャ中のシステムサウンドとオーディオ入力の多重化というはるかに難しい問題も解決します(これまでに見つけたuniverse
リポジトリの何も解決していません)。
Unix-yの素晴らしいソリューションはありません。しかし、それらは現実の世界で私のために働いた。
実世界のライブカメラをシミュレートするもう1つの方法は、udp://
を使用することです。例えば:
# (make sure you use the correct screen number, in my case it was :1, not :0)
ffmpeg -re -f x11grab -r 15 -s 1280x720 -i :0.0+0,0 -map 0:v -c:v libx264 -f mpegts udp://localhost:50000
ビデオは以下によって受信されます:
ffmpeg -i udp://localhost:50000 -f mpegts video.ts
さらに、単に目的のライブカメラをシミュレートすることである場合(コンピュータービジョンパイプラインのテストに関して)、ネイティブフレームレート-re
オプション、ループ-stream_loop -1
オプション、および静的ファイルを使用できます。
VIDE0=./static-video.mp4
ffmpeg -re -stream_loop -1 -i $VIDEO -map 0:v -f mpegts udp://localhost:50000
-re
オプションに関する公式のffmpeg情報:
-re(入力)ネイティブフレームレートで入力を読み取ります。主にグラブデバイスまたはライブ入力ストリームのシミュレーションに使用されます(たとえば、ファイルから読み取る場合)。実際のグラブデバイスやライブ入力ストリーム(パケット損失の原因となる可能性がある場合)では使用しないでください。デフォルトでは、ffmpegは入力をできるだけ速く読み込もうとします。このオプションは、入力の読み取りを、入力のネイティブフレームレートまで遅くします。リアルタイム出力(ライブストリーミングなど)に役立ちます。