web-dev-qa-db-ja.com

Linuxサーバーからライブビデオをストリーミングする方法

これが私がやりたいことです。周りを見回しましたが、正解は見つかりませんでした。 Ubuntu/MySQL/Apacheを使用してWebサイトを実行しているLinuxボックスがあります。自分の静的IPも持っています。つまり、ウェブホスティングを使用していません。ラップトップ(おそらくWindowsを実行している)上のWebカメラからLinuxサーバーにビデオフィードをストリーミングしたいのですが、私のWebサイトの1つのユーザーが、ストリーミングされているビデオをライブで見ることができます。明らかに、ラップトップは何らかの方法でサーバーで認証する必要がありますが、Webサイトでライブビデオを表示できるユーザーに制限はありません。ありがとう。

31
user88137

現在、FireWire経由で接続された3台のminiDVカメラからオンラインストリーミングを開発しています。これは、ニーズに非常によく似ています。

クイックヒント:vlc + flowplayer/jw player

まず、オンラインストリーミングで使用できるビデオ形式には、FLVとh264の2つがあります。 FLVはトランスコードが簡単で、h264はサイズ/品質比が優れていますが、トランスコーディングはCPUを消費します。どちらもフラッシュプレーヤーでWebページに表示できます。

次に、ストリーミングインフラストラクチャです。ラップトップからの帯域幅は限られているため(カップルMbpsのトップ)、サーバーにストリームを取得し、そこでクライアントに再ストリームする必要があります。したがって、ストリームはサーバーに1回流れ、そこからクライアントにN回流れます。ラップトップのインターネット接続について説明していないため、シナリオは2つのセクションに分かれています。

  1. ラップトップはパブリックIPアドレスで接続されていますORできますNATラップトップへのポート 。サーバーからラップトップに接続できるため、このシナリオははるかに簡単です。簡単で、大きな欠点は、1つの場所(1つのIPアドレス)にバインドされることです。

  2. ラップトップがパブリックIアドレスに接続されていません。これは少しトリッキーですが、サーバーにSSHで接続し、十分なアップロードを行うことができるすべてのネットワークで機能します(1 Mbpsで十分です)。

使用シナリオに関係なく、インフラストラクチャーは次のようになります。

CAMERA - (usb) - LAPTOP - (network, limited upload) - SERVER - (network) - Client 0
                                                                         - Client 1
                                                                         - Client 2
                                                                         - Client N

ラップトップからのストリーミング

  1. ウェブカメラからビデオをキャプチャします。ローカルに接続されたウェブカメラからストリームをキャプチャしたことはありませんが、V4Lを介してそれを行う方法の例はたくさんあります。例: Webcam Setup 。あなたが興味を持つべき唯一の部分は:

    laptop$ vlc v4l:// :v4l-vdev="/dev/video0" :v4l-adev="/dev/audio2"

    これは、ウェブカメラに接続するVLCコマンドの最初の部分です。詳細については、前述のHOWTOに従ってください。特に「ビデオグループ」の部分を見て、/ dev/videoと/ dev/audioへのデバイスパスを修正してください。これらはラップトップで異なる場合があります。

  2. ビデオをFLVにトランスコードします。 CPUの要求が少ないFLVを個人的に使用しています。私が使用するトランスコード文字列はこれです:

    --sout '#transcode{vcodec=FLV1,vb=512,acodec=mpga,ab=64,samplerate=44100}'

    ビデオストリームをMPGAオーディオでFLV形式にトランスコードします(私のUbuntuではMP3は使用できません)。サンプルレートは何らかの形で必須であり、それなしでは機能しません。ただし、22050のように小さい方を選択できます。これにより、ビデオストリームが「そのまま」トランスコードされるため、スケールは1:1になります。幅と高さのパラメータ、またはスケールパラメータを追加できます。 VLCのドキュメントをご覧ください。

  3. ラップトップからストリーミングします。次に、サーバーが接続するローカルストリームを作成する必要があります。

    :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}'

サーバーでの再ストリーミング

  1. サーバーでストリームをキャプチャし、再ストリームします。ここでも、キャプチャとストリーミングに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に静かに接続します。クールですね?:)それで、私たちがしなければならないのは、単純なVLC接続とストリーミングだけです。

    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アドレスまたはNATedポートの場合:

    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リモート転送に使用されています。最初の例のようにトランスコード部分を使用しないのはなぜですか?ビデオはすでに正しい形式になっているので、必要なことは、そのままの状態でストリーミングすることだけです。

  2. テスト。どちらの例でも、VLC経由でストリームを表示して機能をテストできます。ローカルストリームをテストできます。

    laptop$ vlc http://localhost:8081/stream.flv

    また、サーバーのストリームをテストできます。

    laptop$ vlc http://server_ip_address:8082/stream.flv

    どちらの場合も、Webカメラの入力が表示されます。

Webにストリームを表示

ほとんどの場合に機能するWeb上のストリームの表示は、Flash Playerを介して行われます。非営利目的で無料で使用できる2つの製品を試しました: JW Player および Flowplayer 。私はFlowplayerを使い続けましたが、理由を覚えていません。おそらくプラグイン(私は使用しません:)が原因であるか、ドキュメントが優れているためです。

WebページでVLCからのFLVストリームを表示する方法は次のとおりです: asfとFlashを使用してVLCをWebサイトにストリーミングする

トラブルシューティング

発生する多くの問題に注意してください。まず、すべての場合と同様に、readです。 VLCは非常におしゃべりなプログラムなので、問題の場所がわかります。ビデオ/オーディオデバイスへのアクセス許可、コーデックの欠落、スペルミスの--soutパラメーターなどに問題がある可能性があります。iftopを使用して、データが実際にネットワークを介して流れるかどうかを確認するなど。

47
mkudlacek

ここで選択するツールは vlc です。これは、多目的マルチフォーマットビデオプレーヤーだけでなく、さまざまなファイルフォーマットやストリーミングプロトコルでストリーミングすることもできます。おまけとして、WindowsとLinuxのホスト間でクロスプラットフォームで動作します。

2、3年前に、狭帯域幅DSL回線(128 Kアップストリーム)を使用している顧客がネットワーク接続されたWebカメラを幅広い視聴者にストリーミング配信する必要があったのと同じようなものをセットアップしました。 「リフレクター」ホストとしてのVLCインストールは、カム信号のローテーションを行い、ストリーミングクライアントから主な帯域幅の負荷を取り、さまざまなストリーミングプロトコルとフォーマットでストリームを提示しました。

3
the-wabbit

私の専門分野ではありませんが、おそらく私はあなたを潜在的な方向に向けることができます。

商用の実装では、AdobeのFlash Media Serverを使用します。もちろん、これはかなりコストのかかるアプローチになる可能性があります。ただし、 Red5 などのオープンソースの代替手段があります。サーバーをインストールする必要があります(Java依存関係があります)。

サーバーを実行したら、フロントエンドを選択できます(Red5にはいくつかのサンプルが付属していると思いますが、type=cameraJW Player を使用することもできます)。

フロントエンドはメディアサーバーからストリーミングビデオを受信し、ストリームをメディアサーバーにアップロードします。

詳細情報: Red5 Help&Info および Red5リファレンス

1
cyberx86