2

私は実際に NodeJS、ws、WebRTC.io、および socket.io に基づくアプリケーションに取り組んでいます。このアプリケーションの目的は、ホストのビデオを複数の出席者にブロードキャストすることです。

主催者とすべての出席者が Web アプリケーションをロードし、主催者がビデオを起動してすべての出席者にストリーミングします。この場合、問題はありませんが、主催者がビデオを起動し、出席者が部屋に参加した場合、この出席者はストリームを取得できず、このストリームを取得する方法がわかりません.

私は多くの解決策を試しました。

最初の解決策

出席者が部屋に到着すると、彼は socket.io を介してホストにメッセージを送信し、ホストは彼のストリームを送り返します。問題は、ストリームが MediaStream ではなくオブジェクトとして出席者に届くため、使用できないことです。

2番目のソリューション

出席者が部屋に到着すると、socket.io を介してホストにメッセージを送信し、ホストは で作成された BLOB を返信しwindow.webkitURL.createObjectURL(rtc.streams[0])ます。この BLOB を出席者のビデオ ソースとして使用しますが、404 エラーが発生します。

両方のソリューションのコードは次のとおりです。

var isStreamCreated = false;

function startVideoLive() {
    var video = document.getElementById('video');
    //Test if peer connection is available for the browser
    if (PeerConnection) {
        if (getRole() == 1) {
            rtc.createStream({
                "video": true,
                "audio": true
            }, function (stream) {
                video.src = URL.createObjectURL(stream);
                video.play();
                isStreamCreated = true
            });

        }
    }
    if (isConnected != true) {
        var room = '1234';
        rtc.connect('ws://' + server + ':8443', room);
        isConnected = true;
    }
}

function setAttendeeWebRTC() {
    if (getRole() == 0) {
        var message = {
            type: "getStreamInfos",
            URL: null,
            stream: null
        }

        socket.emit('message', message);

        rtc.on('add remote stream', function (stream, socketId) {
            rtc.attachStream(stream, 'video');
            isStreamCreated = true;
        });
    }
}

startVideoLive();
setAttendeeWebRTC();

function onGetStreamInfos(message) {
    if (getRole() == 1 && isStreamCreated == true) {

        message.URL = window.webkitURL.createObjectURL(rtc.streams[0]);
        message.stream = rtc.streams[0];

        socket.emit('message', message);
    } else if (getRole() == 0 && isStreamCreated == false && message.URL != null && message.stream != null) {

        document.getElementById('video').src = message.URL;
        // OR
        rtc.attachStream(message.stream, 'video')
        isStreamCreated = true;

    }
}

getRole() は、接続しているユーザーが出席者 (0) か主催者 (1) かを知るために使用されます。

サーバー側では、websocket メッセージをブロードキャストし、webrtc.io を追加します (その他にも多くの機能がありますが、この場合は役に立ちません)。

2 ケースのエラーは次のとおりです。

  • ブロブの場合: GET blob:http%3A//128.1.222.159%3A8081/881928b6-70d3-4054-b15e-88d635a2125f 404 (見つかりません)

  • ストリームの場合: Uncaught TypeError: Type error
    rtc.attachStream
    onGetStreamInfos
    (匿名関数)
    EventEmitter.emit socket.io.js? =1375350434038:633
    SocketNamespace.onPacket socket.io.js?
    =1375350434038:2248
    Socket.onPacket socket.io.js? =1375350434038:1930
    Transport.onPacket socket.io.js?
    =1375350434038:1332
    Transport.onData socket.io.js?_=1375350434038:1303
    WS.open.websocket.onmessage

誰かが私の問題に対処する方法についてアイデアを持っている場合は、事前に感謝します.

編集1:

問題を解決する方法を見つけましたが、新しい問題があります。ここに私の部分的な解決策があります:

function onGetStreamInfos(message) {
    if (getRole() == 1 && isStreamCreated == true) {

        rtc.createPeerConnections();
        rtc.addStreams();
        rtc.addDataChannels();
        rtc.sendOffers()

    } else if (getRole() == 0 && isStreamCreated == false) {

        isStreamCreated = true;

    }
}

しかし今、出席者が部屋に参加すると、他の出席者はビデオを失いました。通常、新しい参加者と古い参加者の間にピア接続を作成するべきではないためだと思います。

非常に明確かどうかはわかりませんが、さらに情報が必要な場合はお気軽にお問い合わせください。最終的に問題を解決する方法が見つかった場合は、ここで解決策を提供します.

編集2:

削除するrtc.createPeerConnections();rtc.addDataChannels();、ほとんどの場合に機能するようです(あまりテストしていません)。

4

3 に答える 3

0

独自のシグナリング サーバーをセットアップする手間をかけたくない場合は、Pubnub またはPusherを使用してそれを処理できます。それらはリアルタイム データ プラットフォームですが、webRTC シグナリングにも使用できます。

試してみたい場合は、Pusher を使用したwebRTC シグナリングのチュートリアルをご覧ください。

http://pusher.com/tutorials/webrtc_chat

免責事項: 私はプッシャーで働いています。

于 2014-07-28T16:39:42.837 に答える
0

なぜあなたは rtc.addDataChannels(); をしているのですか? datachannels は、データ (メディアではなく) を送信するために作成されます。メディアの場合は、RTCPeerConnection を使用するだけでよく、sdp と ice の候補を送信して、シグナリング チャネルを介してピアリングします。すべてがうまくいけば、メディア ストリームが作成されます。

データチャネルは、メディア ストリームの送信には何の役割も持たず、むしろピア ツー ピア データ (ゲーム、ファイルなど) に使用されます。

于 2013-08-03T05:41:30.950 に答える