37

WebRTC ビデオ チャット アプリケーションを開発しているときに、ビデオ ストリームをリモートで受信することに遭遇しました。ビデオ ストリーム ブロブは受信されますが、ビデオは真っ黒です。

私はこれらの答えを調べて、それを機能させるためにできることはほとんどすべて試しました https://stackoverflow.com/a/17424224/923109

......
Globalvars.socket.on('call', function (signal) {
    if(!Globalvars.pc){
        Methods.startCall(false, signal);
    }

    if(signal.sdp){
        temp = new RTCSessionDescription({"sdp" : decodeURIComponent(signal.sdp), "type" : signal.type});
        Globalvars.pc.setRemoteDescription(temp);
        for(i = 0; i < Globalvars.iceCandidateArray.length; i++){
            Globalvars.pc.addIceCandidate(new RTCIceCandidate({
                sdpMLineIndex: decodeURIComponent(signal.sdpMLineIndex),
                candidate: decodeURIComponent(signal.candidate)
            }));
        }

        Globalvars.iceCandidateArray = [];
    }
    else{
        if(Globalvars.pc.remoteDescription){
            Globalvars.pc.addIceCandidate(new RTCIceCandidate({
                sdpMLineIndex: decodeURIComponent(signal.sdpMLineIndex),
                candidate: decodeURIComponent(signal.candidate)
            }));
            console.log("remot");
        }
        else{
            Globalvars.iceCandidateArray.push(new RTCIceCandidate({
                sdpMLineIndex: decodeURIComponent(signal.sdpMLineIndex),
                candidate: decodeURIComponent(signal.candidate)
            }));
            console.log("ice candidate to temp array");
        }
    }
});


$("#roster-wrap").on("click", ".roster-list-item", function(e){
    //Globalvars.socket.emit('call', {"receiver_id" : $(this).attr("data-id"), "caller_id" : Globalvars.me.id});
    params = {"receiver_id" : $(this).attr("data-id"), "caller_id" : Globalvars.me.id};
    Methods.startCall(true, params);
    e.preventDefault();
});
.....


.....
// run start(true) to initiate a call
"startCall" : function (isCaller, params) {
    var configuration = {"iceServers": [{"url": "stun:stun.l.google.com:19302"}]};
    Globalvars.pc = new RTCPeerConnection(configuration);

    // send any ice candidates to the other peer
    Globalvars.pc.onicecandidate = function (evt) {
        //alert("ice candidate");
        if (!Globalvars.pc || !evt || !evt.candidate) return;
        var candidate = evt.candidate;
        Globalvars.socket.emit("call",{ "candidate": encodeURIComponent(candidate.candidate), "sdpMLineIndex" : encodeURIComponent(candidate.sdpMLineIndex), "receiver_id" :  params.receiver_id, "caller_id" : params.caller_id});
    };

    // once remote stream arrives, show it in the remote video element
    Globalvars.pc.onaddstream = function (evt) {
        console.log("add stream");
        if (!event) return;
        $("#remote-video").attr("src",URL.createObjectURL(evt.stream));
        Methods.waitUntilRemoteStreamStartsFlowing();
    };

    // get the local stream, show it in the local video element and send it
    navigator.getUserMedia({ "audio": false, "video": true }, function (stream) {
        $("#my-video").attr("src", URL.createObjectURL(stream));
        Globalvars.pc.addStream(stream);

        if (isCaller){
            Globalvars.pc.createOffer(getDescription, null, { 'mandatory': { 'OfferToReceiveAudio': true, 'OfferToReceiveVideo': true } });
        }
        else{
            console.log("Got Remote Description");
            console.log(Globalvars.pc.remoteDescription);               
            //Globalvars.pc.createAnswer(Globalvars.pc.remoteDescription, getDescription);
            Globalvars.pc.createAnswer(getDescription, null, { 'mandatory': { 'OfferToReceiveAudio': true, 'OfferToReceiveVideo': true } });
        }

        function getDescription(desc) {
            Globalvars.pc.setLocalDescription(desc);
            console.log("my desc");
            console.log(desc);
            Globalvars.socket.emit("call", {"sdp": encodeURIComponent(desc.sdp), "type": desc.type, "receiver_id" :  params.receiver_id, "caller_id" : params.caller_id});
            //signalingChannel.send(JSON.stringify({ "sdp": desc }));
        }
    });
},
......

完全なコードは、 https://bitbucket.org/ajaybc/meetchat-c​​lientおよびhttps://bitbucket.org/ajaybc/meetchat-serverで入手できます。

4

4 に答える 4

1

私はあなたと同じ問題を抱えていましたが、一部のクライアントだけで、あなたと同じ道を模索しました. 最後に (そしておそらく私の問題の最終的な原因) は、少なくとも 1 つのクライアントの背後にある NAT の状況に関連していました。いずれかのクライアントが NAT に穴を開けることができない状況が常に発生する可能性があるため、STUN サーバーは機能しません。このような場合、ビデオをそのクライアントに中継するには TURN サーバーが必要です。

の iceServer にはどのような構成がありますpeerConnectionか? 動作することがわかっているTURNサーバーが含まれていますか?

このサイトhttp://xirsys.com/simplewebrtc/で無料のアカウントを作成し、ホスティングで TURN サーバーの資格情報を取得するための簡単な手順に従ってください。これを使用して、これが問題かどうかをテストできます。

于 2016-01-26T20:54:12.893 に答える
1

追加する必要があるかもしれません

<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />

あなたの AndroidManifest.xml に

Nexus 5 のhttps://download.01.org/crosswalk/releases/crosswalk/android/beta/7.36.154.12/およびhttps://apprtc.appspot.com/でWebRTC が動作することを確認しました。

それがうまくいくことを願っています。

于 2015-04-01T10:45:44.883 に答える
-1

最初に Peer 接続を作成し、次に MediaStream を追加します。メディア ストリームをピア接続に追加した後でのみ、オファー、アンサー、候補の交換を行う必要があります。

于 2015-08-13T05:51:55.710 に答える