2

最新バージョンの Chrome 23.0.1246.0 canary を使用しています。PeerConnection 経由でクライアントから受信した MediaStream を、PeerConnection 経由で別のクライアントに送信したいと考えています。つまり、ClientA は私たちの間の PeerConnection を介してローカル メディア ストリームを私に送信し、次に、このメディア ストリームを ClientB と私の間の PeerConnection を介して ClientB に送信します。

これは私のコードですが、機能しません。AddVideo ボタンを 2 回目にクリックすると、「gotRemoteStream」関数が呼び出されません。理由はわかりません。

誰でも私を助けることができますか?

<!DOCTYPE html>
<html>
<head>
<title>Video Link</title>
<style type="text/css">
    video { width: 200px;}
</style>
</head>
<body>
<input id="btnAddVideo" type="button" value="Add Video" onclick="AddVideo();" />
<div id="videos"></div>
<script type="text/ecmascript">
    var pcs = new Array();
    var pcr = new Array();
    var mediaStream = new Array();
    var msIndex = 0;
    navigator.webkitGetUserMedia({ audio: true, video: true }, gotStream, function () { alert('get MediaStream Error'); });
    function gotStream(stream) {
        mediaStream[0] = stream;
    }

    var pc1;
    var pc2;
    function AddVideo() {
        if (mediaStream[msIndex] == null) return;
        pc1 = new webkitPeerConnection00(null, iceCallback1);
        pc1.addStream(mediaStream[msIndex]);
        var offer = pc1.createOffer(null);
        pc1.setLocalDescription(256, offer);

        pc2 = new webkitPeerConnection00(null, iceCallback2);
        pc2.onaddstream = gotRemoteStream;
        pc2.setRemoteDescription(256, new SessionDescription(offer.toSdp()));
        var answer = pc2.createAnswer(offer.toSdp(), { has_audio: true, has_video: true });
        pc2.setLocalDescription(768, answer);

        pc1.setRemoteDescription(768, new SessionDescription(answer.toSdp()));
        pc2.startIce();
        pc1.startIce();

        pcs.push(pc1);
        pcr.push(pc2);
    }
    function iceCallback1(candidate, bMore) {
        pc2.processIceMessage(new IceCandidate(candidate.label, candidate.toSdp()));
    }
    function iceCallback2(candidate, bMore) {
        pc1.processIceMessage(new IceCandidate(candidate.label, candidate.toSdp()));
    }
    function gotRemoteStream(e) {
        var v = document.createElement('video');
        v.autoplay = 'autoplay';
        v.src = webkitURL.createObjectURL(e.stream);
        document.getElementById('videos').appendChild(v);
        mediaStream.push(e.stream);
        msIndex++;
    }
</script>
</body>
</html>
4

1 に答える 1

0

はい、できます。PeerConnectionの関数addStreamを使用すると、任意のMediaStreamを追加できます。実際、ストリームを PeerConnection に追加した後、クライアント間で SDP (ローカルおよびリモートの説明) をもう一度交換する必要があります。

質問を投稿して以来、API が大幅に改善されたため、コードは最新ではありません。現在の標準を使用して更新する場合は、お手伝いできます。:)

于 2013-08-26T12:01:05.070 に答える