web-dev-qa-db-ja.com

ASP.NET MVCを使用してWebRTCまたは任意のブラウザーベースのキャプチャメカニズムからサーバーへのライブビデオWebカメラストリームを処理/受信する

WebRTCからライブビデオストリームをキャプチャする必要があります(または、すべてのブラウザではサポートされていなくても、PoCとしてクライアントWebカメラから他のキャプチャメカニズムを使用する必要があります)。

このライブビデオはサーバーコンポーネント(ASP.Net MVC/Web API)で処理する必要があります。サーバーのコードは次のようになると思います。

[HttpPost]
public ActionResult HandleVideoStream(Stream videoStream)
{
      //Handle the live stream
}

キーワードまたは役立つリンクを探しています。

Base64 jpgを使用して個々のフレームを送信する方法をすでに実装しましたが、base64エンコーディングには大きなオーバーヘッドがあり、ビデオエンコーディングを使用してビデオをより効率的に送信できるため(違いを送信できるため)、これはまったく役に立ちません。 VPx -vp8-などを使用してフレーム間で)、必要なソリューションは、クライアントのWebカメラからビデオをキャプチャし、それをストリーム(またはデータのチャンク)としてサーバー(asp.net)にライブで(記録されずに)送信する必要があります。新しいビデオデータを表す。

20
Sawan

あなたの質問は広すぎるので、オフサイトのリソースを求めることは、stackoverflowのトピックから外れていると見なされます。意見が出やすい発言を避けるために、私は一般的な概念への回答を制限します。

Flash/RTMP

WebRTCはまだすべてのブラウザーで使用できるわけではないため、現在使用中のブラウザーからのWebカメラ入力をキャプチャするために最も広く使用されている方法は、プラグインを使用する方法です。最も一般的な解決策は、人々がそれを好むかどうかにかかわらず、 Adobe Flash Player を使用します。これは、最近のバージョンでの_H.264_エンコーディングのサポート、およびオーディオのAAC、_MP3_などによるものです。

ストリーミングは、最初にフラッシュ通信用に設計された [〜#〜] rtmp [〜#〜] プロトコルを使用して行われます。プロトコルはTCPで機能し、RTMPS(_TLS/SSL_を暗号化する場合は_RTMPを暗号化する)、RTMPTRTMPはファイアウォールトラバーサルをHTTPにカプセル化する)などの複数のフレーバーを備えています。

ストリームは通常 [〜#〜] flv [〜#〜] コンテナ形式を使用します。

Flashを使用してウェブカメラ入力をキャプチャし、RTMPサーバーにストリーミングするオープンソースプロジェクトを簡単に見つけることができます。

サーバー側では、2つのオプションがあります。

  • 基本的なRTMPサーバーを実装して、送信ライブラリと直接通信し、ストリームを読み取る
  • オープンソースのRTMPサーバーの1つを使用し、ASPにクライアントのみを実装します(アプリで何をしようとしているかに応じて、着信ストリームをその場でトランスコードすることもできます)。

WebRTC

WebRTCを使用すると、次のいずれかを実行できます。

  • 小さなメディアチャンクをタイマーで記録し、ストリームが再構築されるサーバーにアップロードします(不連続を避けるためにチャンクを連結して再スタンプする必要があります)。 リンクについてはこの回答を参照してください
  • WebRTCのピアツーピア通信機能を使用して、サーバーをピアの1つにします。

私がまだ個人的にテストしていない2番目のシナリオの可能な解決策は、Adam Roachによって提供されています。

  1. ブラウザは、JavaScriptを含むWebページを取得します。
  2. ブラウザは次のようなJavaScriptを実行します。
    1. getUserMediaを使用してカメラへのハンドルを取得します。
    2. RTCPeerConnectionを作成します
    3. createOffersetLocalDescriptionRTCPeerConnectionを呼び出す
    4. オファーを含むサーバーにリクエストを送信します(SDP形式)
  3. サーバーは、オファーSDPを処理し、独自の回答SDPを生成します。これは、応答としてブラウザーに返されます。
  4. JavaScriptは、setRemoteDescriptionRTCPeerConnectionを呼び出して、メディアのフローを開始します。
  5. サーバーはブラウザから_DTLS/SRTP_パケットの受信を開始し、ローカルのハードドライブに簡単に読み取り可能な形式で保存することを含め、必要な処理を行います。

ソース

これはVorbisよりもWebM内で_VP8_およびSRTPを使用します(UDPTCPも使用できます)。

ラッパーを使用してRTCPeerConnectionASPを直接実装できない限り、ストリームをサーバーアプリに転送する方法が必要になります。

_PeerConnection API_はWebRTCの強力な機能です。現在、GoogleハングアウトのWebRTCバージョンで使用されています。あなたは読むことができます ハングアウトはWebRTCをどのように使用しますか

12
aergistal

これは主題外の質問であることに同意しましたが、最近同じ問題/要件にぶつかりました。私の解決策は、WebRTCExperimentsの MultiStreamRecorder を使用することでした。これは基本的に、X秒ごとにオーディオ/ビデオストリームの「ブロブ」を提供し、これをASP.NET MVCまたはWebAPIコントローラーにアップロードできます ここ 。サーバー上のBLOBを部分的にライブ処理するか、ファイルに連結してから、ストリームが停止したら処理できます。このライブラリで使用されるAPIは、すべてのブラウザで完全にサポートされているわけではないことに注意してください。たとえば、現時点ではiOSはサポートされていません。

私のサーバー側の分析では、ユーザーが完全な文章を話す必要があったため、さらにPitchDetect.jsを使用して、部分的なBLOBをサーバーに送信する前にオーディオストリームの無音を検出しました。このタイプの設定を使用すると、X秒ごとではなく、話し終わった後に部分的なBLOBをサーバーに送信するようにクライアントを構成できます。

1〜2秒の遅延の達成については、HTTPではなくWebSocketで配信を確認することをお勧めしますPOST-ただし、これらのオプションを試して、要件に最適なチャネルを選択する必要があります。

5
Bora B.

最近のほとんどのIPカメラは、H264エンコーディングまたはMJPEGを使用します。どのような種類のカメラが使用されているのかがわかりません。

本当の問題は、ビデオをオーサリング/編集するためのコンポーネントと、それが必要とするビデオ形式です。どの形式にする必要があるかがわかったら、サーバー側で処理できるように、必要に応じてビデオをトランスコード/トランスフォームできます。

変換/トランスコードするメディアサーバーはいくつでもあり、 [〜#〜] ffmpeg [〜#〜] または nreal Media Server のようなものは変換、デコードなどができますサーバー側で使用できる形式に変換します。私が見たほとんどのIPカメラは、H264 Webベースのブラウザープレーヤーを使用しています。

編集:あなたの最大の敵はあなたの遅延になるでしょう。 1〜2秒の遅延を実現するのは困難です。

0
Calvinthesneak