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


30

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


そのようなソリューションを実装する方法を尋ねますか、すぐに使用できるサードパーティのソリューションを探しますか?前者の場合、SOはこの質問の間違った場所です。それがダウン投票の理由だと思います

回答:


46

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

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

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

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

  1. ラップトップがパブリックIPアドレスで接続されているか、ラップトップにポートを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"

    Webカメラに接続する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にサイレント接続します。クールだよね?

    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リモートフォワードによって取得されています。最初の例のようにトランスコード部分を使用しないのはなぜですか?ビデオはすでに適切な形式になっているため、私たちがしなければならないことは、そのままストリーミングするだけです。

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

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

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

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

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

Webでストリームを表示する

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

WebページでVLCからFLVストリームを表示する方法については、VLCをWeb サイトにasfとFlashでストリーミングする方法について説明します。

トラブルシューティング

発生する多くの問題に注意してください。すべてのものと同様に、最初に読んでください。VLCは非常におしゃべりなプログラムなので、問題の場所がわかります。...使用することを学ぶ、パラメータ--soutスペルミスのコーデックを、行方不明、ビデオ/オーディオデバイスにアクセスするためのアクセス権に問題がある可能性がありiftopなど、データが実際にネットワークを通して流れかどうかを確認するために


1
どうもありがとう!これは予想以上の情報でした。VLCをチェックアウトし、情報をガイドとして使用します。

3

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

数年前に同様の設定を行い、狭帯域のDSL回線(128Kアップストリーム)を使用する顧客は、ネットワーク接続されたウェブカメラを幅広い視聴者にストリーミングする必要がありました。「リフレクター」ホストとしてのVLCインストールは、カム信号の回転を行い、ストリーミングクライアントから主な帯域幅の負荷を取り、異なるストリーミングプロトコルと形式でストリームを提示しました。


1

私の専門分野ではありませんが、可能性のある方向性を示すことができます。

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

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

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

詳細:Red5ヘルプと情報およびRed5リファレンス


jwplayerは個人的な使用のための素晴らしいものです
ケンドリック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.