web-dev-qa-db-ja.com

getUserMediaをサーバーにストリーミング

バイナリデータとgetUserMediaを初めて使用する場合、getUserMedia(ビデオ/オーディオ)をサーバーにストリーミングしてから、他の接続用にストリーム(ビデオ/オーディオ)を準備するための推奨される方法は何ですか?

私の最初の考えは、WebSocketを介してデータを送信してから、次のようにデータをファイル(mp4)に書き込むことでした。

getUserMedia -->(websockets)--> server -->(file.mp4)--> video.src

私は MediaStreamRecorder を見てきました、そして私はそのようにバッファを送ることができます:

multiStreamRecorder.ondataavailable = function (blobs) {
    socket.emit('blobs', blobs)
};

私が得るサーバー上で

{ audio: <Buffer 52 49 46 46 2c 10 04 00 57 41 56 45 66 6d 74 20 10 00 00 00 01 00 01 00 44 ac 00 00 10 b1 02 00 02 00 10 00 64 61 74 61 00 10 04 00 f8 ff 04 00 0d 00 ... >,
  video: <Buffer 1a 45 df a3 40 20 42 86 81 01 42 f7 81 01 42 f2 81 04 42 f3 81 08 42 82 40 04 77 65 62 6d 42 87 81 02 42 85 81 02 18 53 80 67 10 0a 41 54 15 49 a9 66 ... >,
  onDataAvailableEventFired: true }

これをファイルに書き込み、そのファイルを提供してから、video要素のソースからそのファイルを要求する必要があると思います。それがすべて正しい場合、ファイルをファイルシステムに書き込むにはどうすればよいですか?または私は何か間違ったことをしていますか?

WebRTCにはp2p機能があることを理解しています。ビデオストリームを最大50以上のクライアントに提供するため、オプションではありません。

WebSocketソリューションで更新:

私は今、次のようにWebSocketを介してデータを出力しています。

socket.on('blobs', function(data){
    socket.emit('blobs', data)
})

クライアント側では、それをmediaSourceにプッシュし、次にvideo要素にtimestampOffsetを押し込んで、スムーズに保ちます。

var mediaSource = new MediaSource(),
    mediaBuffer,
    // init duration of 0 seems fine
    duration = 0;

var video = $('video').get(0);
video.src = window.URL.createObjectURL(mediaSource);

mediaSource.addEventListener('sourceopen', function(e) {
    mediaBuffer = mediaSource.addSourceBuffer('video/webm; codecs="vp8"')
    mediaBuffer.addEventListener('update', function() {
        // wait for mediaBuffer update to fire before setting the new duration
        duration = video.duration
    });
}, false);

socket.on('blobs', function (data) {
    mediaBuffer.timestampOffset = duration;
    mediaBuffer.appendBuffer(new Uint8Array(data.video));
});
14
8eecf0d2

これを正しく機能させるには、サーバーがWebRTCを「話す」必要もあります。 WebSocketを使用しても、望ましい結果が得られず、WebRTCほど応答性が低くなります。リアルタイムではありません。

サーバー上でWebRTCを実行するには、 webrtc.org または OpenWebRTC のWebRTCスタックを開始点として使用するか、 GStreamer を使用するか、もう少し完全な何かのために。 WebRTCが開始するメディアサーバーフレームワークの優れたプロジェクトは、 KurentoJitsi 、および Janus です。

あなたの質問の性質上、私の提案は、上記のより完全なメディアサーバーフレームワークの1つから始めることです。

8