現在、FireWireで接続された3つのminiDVカメラからオンラインストリーミングを開発していますが、これはお客様のニーズに非常によく似ています。
クイックヒント:vlc + flowplayer / jw player
まず、オンラインストリーミングで使用できるビデオ形式はFLVとh264の2つです。FLVはトランスコードが簡単で、h264はサイズ/品質比が優れていますが、トランスコードはCPUをはるかに消費します。どちらもWebページのFlash Playerで表示できます。
第二に、ストリーミングインフラストラクチャ。ラップトップからの帯域幅は制限されているので(カップルMbpsの上限)、サーバーにストリームを取得し、そこでクライアントに再ストリームする必要があります。したがって、ストリームはサーバーに1回流れ、そこからクライアントにN回流れます。ラップトップのインターネット接続について説明していないため、シナリオは2つのセクションに分かれています。
ラップトップがパブリックIPアドレスで接続されているか、ラップトップにポートをNAT変換できます。このシナリオは、サーバーからラップトップに簡単に接続できるため、はるかに簡単です。大きな欠点は、1つの場所(1つのIPアドレス)にバインドされることです。
ラップトップはパブリックIアドレスに接続されていません。これは少し注意が必要ですが、サーバーにSSHで接続し、十分なアップロードができるネットワークであれば動作します(1 Mbpsで十分です)。
使用シナリオに関係なく、インフラストラクチャーは次のようになります
CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
- Client 1
- Client 2
- Client N
ラップトップからのストリーミング
ウェブカメラからビデオをキャプチャします。ローカルに接続されたウェブカメラからストリームをキャプチャしたことはありませんが、V4L経由でストリームを実行する方法の例は多数あります。例:
Webcam Setup。あなたが興味を持つべきである唯一の部分は次のとおりです。
laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"
Webカメラに接続するVLCコマンドの最初の部分です。詳細については、前述のHOWTOを参照してください。特に、「ビデオグループ」部分と、/ dev / videoおよび/ dev / audioへの正しいデバイスパスを確認します。これらはラップトップで異なる場合があります。
ビデオをFLVにトランスコードします。CPUの負荷が少ないため、個人的にFLVを使用しています。私が使用するトランスコード文字列はこれです:
--sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'
MPGAオーディオを使用してビデオストリームをFLV形式にトランスコードします(私のUbuntuではMP3は使用できません)。サンプルレートは何らかの形で必須であり、それなしでは機能しません。ただし、22050のような小さいサイズを選択できます。これにより、ビデオストリームが「そのまま」トランスコードされるため、スケールは1:1になります。幅と高さのパラメータ、またはスケールのパラメータを追加できます。VLCのドキュメントをご覧ください。
ラップトップからストリーミングします。次に、サーバーが接続するローカルストリームを作成する必要があります。
:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}
これにより、VLCストリームが0.0.0.0:8081/stream.flvにバインドされます。コマンド全体は次のようになります。
laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2" --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}:std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8081/stream.flv}'
サーバーでの再ストリーミング
サーバーでストリームをキャプチャし、再ストリームします。繰り返しますが、VLCを使用してキャプチャとストリーミングを行います。使用方法は、この投稿の早い段階からのインフラストラクチャシナリオに基づいています。示したように、ラップトップ上のVLCは、いくつかのポートでビデオをストリーミングします。このポートはサーバーからアクセス可能でなければなりません。ラップトップのパブリックIPアドレスまたはNATポートがある場合、telnetでテストできます。
server$ telnet public_ip_address 8081
「接続タイムアウト」以外は、ラップトップのストリームに接続できることを明らかにします。パブリックIPアドレスを持っていない場合、またはポートをNAT変換できない場合は、その逆を行う必要があります。ラップトップからサーバーにSSH接続し、ラップトップポートをサーバーにリモート転送できます。正しいSSHコマンドは次のとおりです。
laptop$ ssh your_user@server_ip_address -R 8081:127.0.0.1:8081
このマジックコマンドは、ラップトップポート8081をサーバーポート8081に「バインド」します。つまり、サーバーで8081に接続すると、SSHトンネルを介してラップトップポート8081にサイレント接続します。クールだよね?
server$ vlc http://localhost:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'
または、パブリックIPアドレスまたはNATポートでの場合:
server$ vlc http://public_ip_address:8081/stream.flv --sout '#std{access=http{mime=video/x-flv},mux=ffmpeg{mux=flv},dst=0.0.0.0:8082/stream.flv}'
ラップトップの部分のように、サーバー上のVLCはポート8082にバインドされています。なぜ8081ではなく8082ですか?8081はすでにSSHリモートフォワードによって取得されています。最初の例のようにトランスコード部分を使用しないのはなぜですか?ビデオはすでに適切な形式になっているため、私たちがしなければならないことは、そのままストリーミングするだけです。
テスト。どちらの例でも、VLCを介してストリームを表示することで機能をテストできます。ローカルストリームをテストできます。
laptop$ vlc http://localhost:8081/stream.flv
また、サーバーのストリームをテストできます。
laptop$ vlc http://server_ip_address:8082/stream.flv
どちらの場合でも、ウェブカメラの入力が表示されます。
Webでストリームを表示する
ほとんどの場合に機能するWeb上のストリームの表示は、Flash Playerを介して行われます。JW PlayerとFlowplayerの 2つの製品を試用しましたが、これらは非営利的な使用には無料です。私はFlowplayerを使いましたが、その理由は覚えていません。おそらくプラグイン(これは使用しません:)か、より良いドキュメントのためです。
WebページでVLCからFLVストリームを表示する方法については、VLCをWeb サイトにasfとFlashでストリーミングする方法について説明します。
トラブルシューティング
発生する多くの問題に注意してください。すべてのものと同様に、最初に読んでください。VLCは非常におしゃべりなプログラムなので、問題の場所がわかります。...使用することを学ぶ、パラメータ--soutスペルミスのコーデックを、行方不明、ビデオ/オーディオデバイスにアクセスするためのアクセス権に問題がある可能性がありiftop
など、データが実際にネットワークを通して流れかどうかを確認するために