6

LinuxでGoogle Chrome 21.xを使用しています.webrtcピア接続は確立されますが、リモートビデオストリームを受信できません.ピア接続「.onaddstream」に与えられたコールバックは呼び出されません. ?

コード全体を貼り付けていますが、まだリモート ビデオ ストリームを受信できず、エラーもありません。

var peerConnCreated = false;
var peerConn = null;
var cameraOn = false;
var clientId = 0;
var svcName = "";
var clientIdRecvd = false;
var myname = "";
var hisname = "";
var myJsep;
var hisJsep;
var mySdp;
var hisSdp;

function login()
{
    var loginid = document.getElementById("login").value;
    var jsonText = {"clientid":clientId, "service":"rtc", "mtype": "online", "username": loginid};
    myname = loginid;
    socket.send(JSON.stringify(jsonText));
}

function iceCallback(canditate, moreToFollow)
{
    if(canditate) {
        console.log("ice canditate");
        var jsonText = {"clientid":clientId, "service":"rtc", "mtype": "canditate", "sndr": myname, "rcpt": hisname, 
            "label": canditate.label, "cand": canditate.toSdp()};
        socket.send(JSON.stringify(jsonText));
    }
}

function onSessionConnecting(message)
{
    console.log("session connecting ...");
}

function onRemoteStreamRemoved(event)
{
    console.log("remote stream removed");
    remotevid.src = "";
}

function onSessionOpened(message)
{
    console.log("session opened");
}

function onRemoteStreamAdded(event)
{
    console.log("remote stream added");
    remotevid.src = window.webkitURL.createObjectURL(event.stream);
    remotevid.style.opacity = 1;
}

function createPeerConnection()
{
    if (peerConnCreated) return;
    peerConn = new webkitPeerConnection00("STUN stun.l.google.com:19302", iceCallback); 
    peerConn.onconnecting = onSessionConnecting;
    peerConn.onopen = onSessionOpened;
    peerConn.onaddstream = onRemoteStreamAdded;
    peerConn.onremovestream = onRemoteStreamRemoved;
    console.log("peer connection created");
    peerConnCreated = true;
}

function turnOnCameraAndMic()
{
    navigator.webkitGetUserMedia({video:true, audio:true}, successCallback, errorCallback);
    function successCallback(stream) {
        sourcevid.style.opacity = 1;
        sourcevid.src = window.webkitURL.createObjectURL(stream);
        peerConn.addStream(stream);
        console.log("local stream added");
    }
    function errorCallback(error) {
        console.error('An error occurred: [CODE ' + error.code + ']');
    }
    cameraOn = true;
}

function dialUser(user)
{
    if (!peerConnCreated) createPeerConnection();
    hisname = user;
    var localOffer = peerConn.createOffer({has_audio:true, has_video:true});
    peerConn.setLocalDescription(peerConn.SDP_OFFER, localOffer);
    mySdp =  peerConn.localDescription;
    myJsep = mySdp.toSdp();
    var call = {"clientid":clientId, "service":"rtc", "mtype": "call", "sndr": myname, "rcpt": hisname, "jsepdata": myJsep};
    socket.send(JSON.stringify(call));
    console.log("sent offer");
    //console.log(myJsep);
    peerConn.startIce();
    console.log("ice started ");
}

//handle the message from the sip server
//There is a new connection from our peer so turn on the camera 
//and relay the stream to peer.
function handleRtcMessage(request)
{
    var sessionRequest = eval('(' + request + ')');
    switch(sessionRequest.mtype) 
    {
        case 'online':
            console.log("new user online");
            var newuser = sessionRequest.username;
            var li = document.createElement("li");
            var name = document.createTextNode(newuser);
            li.appendChild(name);
            li.onclick = function() { dialUser(newuser); };
            document.getElementById("Contact List").appendChild(li);
            break;

        case 'call':
            console.log("recvng call");
            alert("Incoming call ...");
            if (!peerConnCreated) createPeerConnection();
            peerConn.setRemoteDescription(peerConn.SDP_OFFER, new SessionDescription(sessionRequest.jsepdata));
            hisname = sessionRequest.sndr;
            var remoteOffer = peerConn.remoteDescription;
            //console.log("remoteOffer" + remoteOffer.toSdp());
            var localAnswer = peerConn.createAnswer(remoteOffer.toSdp(), {has_audio:true, has_video:true}); 
            peerConn.setLocalDescription(peerConn.SDP_ANSWER, localAnswer);
            var jsonText = {"clientid":clientId,"service":"rtc", "mtype": "pickup", "sndr" :myname, "rcpt": hisname, "jsepdata": localAnswer.toSdp()};
            socket.send(JSON.stringify(jsonText));
            console.log("sent answer");
            //console.log(localAnswer.toSdp());
            peerConn.startIce();
            if (!cameraOn) turnOnCameraAndMic();
            break;

        case 'pickup':
            console.log("recvd pickup");
            peerConn.setRemoteDescription(peerConn.SDP_ANSWER, new SessionDescription(sessionRequest.jsepdata));
            hisname = sessionRequest.sndr;
            if (!cameraOn) turnOnCameraAndMic();
            break;

        case 'canditate':
            console.log("recvd canditate");
            var canditate = new IceCandidate(sessionRequest.label, sessionRequest.cand);
            peerConn.processIceMessage(canditate);
            break;

        case 'bye':
            console.log("recvd bye");
            break;
    }
}

//open the websocket  to the antkorp webserver
var socket = new WebSocket('ws://bldsvrub:9981');
var sourcevid = null;
var remotevid = null;

socket.onopen = function () {
    console.log("websocket opened");
    sourcevid = document.getElementById("sourcevid");
    remotevid = document.getElementById("remotevid");
};

socket.onmessage = function (event) { 
    if (!clientIdRecvd) {
        var reqObj = eval('(' + event.data + ')');
        clientId = reqObj.clientid;
        svcName  = reqObj.service;
        clientIdRecvd = true;
    } else {
        //hookup the new handler to process session requests
        handleRtcMessage(event.data);
    }
};

socket.onclose = function (event) { socket = null; };
4

4 に答える 4

13

貼り付けた上記のコードには小さなバグが含まれています。応答またはオファーを生成する前にストリームをピア接続に追加する必要があります。つまり、setlocalDescription または setRemoteDescription 呼び出しの前に「addStream」を呼び出す必要があります。

于 2012-08-08T10:44:50.603 に答える
5

多くの WebRTC デモ:

例: 1 対 1 の WebRTC オーディオ/ビデオ/スクリーン コール:

ノート:

この質問は古すぎます。そのため、ここに動作するスニペット コード スニペットを追加する必要はないと思います。上記のリンクはすべての質問に答えます。

ただし、NEW-WebRTC ユーザーで、同様の問題に直面している場合は、次のヒントを参考にしてください。

  • ピアを作成する前に、両方のピアでハンドシェイクの準備が整っていることを確認してください。
  • Ready とは、両方のピアがメディア ストリーム (オーディオおよび/またはビデオ) にアクセスできることを意味します。
  • 最初のピアは RTCPeerConnection オブジェクトを開始し、「addStream」を呼び出してオファーの説明を作成する必要があります。
  • 2 番目のピアは、最初のピアから OFFER-SDP を受信する必要があります。
  • 2 番目のピアは RTCPeerConnection オブジェクトを開始し、ANSWER-description を作成する前に「addStream」と setRemoteDescription を呼び出す必要があります。
  • 2 番目のピアは ANSWER-SDP を作成する必要があります。
  • 最初のピアは ANSWER-SDP と set-Remote-Descriptions を取得する必要があります。
  • ICE-candidate-pairs は、上記のプロセスと並行して交換する必要があります。

ここでいくつかのチュートリアルを見つけることができます:

覚えて

この回答は WebRTC-1.0 を対象としています。WebRTC-1.1 (ORTC) 以降のバージョンには応答していません。

于 2012-08-03T12:36:12.730 に答える
3

onaddstreamは、少なくとも1つのストリームを含む回答を受け取ったときに呼び出す必要があります。コールバックを受け取っていない場合は、setLocalとsetRemoteDescriptionの両方が呼び出されて成功していることを確認してください。

于 2012-08-18T04:06:17.160 に答える