web-dev-qa-db-ja.com

getUserMediaによってキャプチャされた後、WebRTCでホストサーバーにMediaStreamを送信する

getUserMedia()を使用してオーディオデータをキャプチャしており、MySQLフィールドにBlobとして保存できるようにサーバーに送信したい。

これが私がやろうとしていることのすべてです。 WebRTCを使用してこれを行うためにいくつかの試みをしましたが、現時点ではこれが正しいのか、それを行うための最良の方法であるのかさえわかりません。

anybody助けてもらえますか?

マイクから音声をキャプチャするために使用しているコードは次のとおりです。

navigator.getUserMedia({
    video:false,
    audio:true,
},function(mediaStream){

    // output mediaStream to speakers:
    var mediaStreamSource=audioContext.createMediaStreamSource(mediaStream);
    mediaStreamSource.connect(audioContext.destintion);

    // send mediaStream to server:

    // WebRTC code? not sure about this...
    var RTCconfig={};
    var conn=new RTCPeerConnection(RTCconfig);

    // ???

},function(error){
    console.log('getUserMedia() fail.');
    console.log(error);
});

このmediaStreamをサーバーに送信するにはどうすればよいですか?

周りをグーグルで調べた後、WebRTCを調べてきましたが、これは単にピアツーピア通信用のようです-実際、今私はこれをもっと調べています。これが道だと思います。クライアントのブラウザからホストWebサーバーまで通信する方法のように思えますが、私が試みることはほとんど機能しません。

私は W3Cのドキュメント (これは抽象的すぎると感じています)を通り抜けてきました HTML5 Rocksのこの記事 (これは育ちつつあります)回答よりも多くの質問)。どうやらシグナリング方式が必要なようですが、mediaStreams、XHR、XMPP、SIP、Socket.ioなどを送信するのに最適なシグナリング方式は誰でもアドバイスできますか?

WebRTCの受信をサポートするためにサーバーで必要なものは何ですか?私のWebサーバーは基本的なLAMPスタックを実行しています。

また、mediaStreamの記録が完了するまで待ってからサーバーに送信するのがベストでしょうか、それとも記録されているmediaStreamを送信する方が良いでしょうか?これを正しい方法で行おうとしているかどうかを知りたい。 javascriptとHTML5でファイルアップローダーを作成しましたが、これらのmediaStreamsのいずれかをアップロードすることは地獄のように複雑に思え、適切に近づいているかどうかわかりません。

これに関する助けは大歓迎です。

39
Jimmery

ライブストリーム自体の実行中はアップロードできません。これは、ライブストリームであるためです。

そのため、これにはいくつかのオプションがあります。

  1. そこにある多くのレコーダーのいずれかを使用してオーディオストリームを録音します RecordRTC はかなりうまく機能します。ストリームが完了するまで待ってから、ファイルをアップロードします。
  2. 録音されたオーディオの小さなチャンクをタイマーで送信し、それらをサーバー側に再度マージします。 これはこの例です
  3. Websocketを介して発生したオーディオパケットをサーバーに送信し、サーバーで操作およびマージできるようにします。 RecordRTCの私のバージョンはこれを行います
  4. サーバーとの実際のピア接続を作成して、未加工のrtpストリームを取得し、低レベルのコードを使用してストリームを記録できるようにします。これは Janus-Gateway で簡単に行えます。

ストリームの送信を待機するか、チャンクで送信するかについては、記録している時間に依存します。長時間の場合は、クライアント側から大きなオーディオファイルをアップロードして保存するのはクライアントにとって困難になる可能性があるため、録音をチャンクで送信するか、Websocket経由でアクティブにオーディオパケットを送信する方が優れたソリューションです。

Firefoxには実際には 独自の記録ソリューション がありますが、chromeではサポートされていないため、状況によっては動作しない可能性があります。

余談ですが、前述のシグナリング方法はセッションの構築/破棄用であり、実際にはメディア自体とは関係ありません。おそらく上記のソリューション番号4を使用している場合にのみ、これについて本当に心配するでしょう。

45
Benjamin Trent

適切なAPIは MediaRecorder API ですが、Web Audio APIほどサポートされていないため、ScriptNodeを使用するか、 Recorder.js (またはbase独自のスクリプトノードを構築するために)。

3
Luizgrs