Webrtc 我无法接收远程视频流

Webrtc 我无法接收远程视频流,webrtc,Webrtc,我在linux上使用google chrome 21.x,webrtc对等连接已建立,但无法接收任何远程视频流,这是给peerconnection的回调。onaddstream“从未被调用,有人能告诉我需要在哪里查看吗 我正在粘贴我的全部代码,仍然无法接收远程视频流,也没有任何错误 var peerConnCreated = false; var peerConn = null; var cameraOn = false; var clientId = 0; var svcName = "";

我在linux上使用google chrome 21.x,webrtc对等连接已建立,但无法接收任何远程视频流,这是给peerconnection的回调。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; };
许多WebRTC演示:

例如,一对一WebRTC音频/视频/屏幕通话:

注: 这个问题太老了。这就是为什么我不认为我应该在这里添加一个工作代码段。以上链接回答了所有问题

但是,如果您是WebRTC的新用户,并且面临类似的问题,那么以下是一些提示:

  • 在创建对等点之前,请确保两个对等点都已准备好握手
  • 就绪意味着两个对等方都可以访问媒体流(音频和/或视频)
  • 第一个对等方应启动RTPeerConnection对象,调用“addStream”并创建报价描述
  • 第二个对等方应从第一个对等方接收OFFER-SDP
  • 第二个对等方应在创建应答描述之前,启动RTPeerConnection对象,调用“addStream”和setRemoteDescription
  • 第二个对等方应创建应答SDP
  • 第一个对等方应获得应答SDP并设置远程描述
  • ICE候选对应与上述过程并行交换
您可以在此处找到一些教程:

记得
此答案针对WebRTC-1.0。它没有应答WebRTC-1.1(ORTC)或更新版本。

上面粘贴的代码包含一个小错误,在生成应答或报价之前,应将流添加到对等连接,即在任何setlocalDescription或setRemoteDescription调用之前应调用“addStream”

在收到至少包含一个流的应答时,应调用onaddstream。如果您没有收到回调,请确保调用了setLocal和setRemoteDescription并成功。

我发现,在我的情况下,如果没有使用其他视频应答,我将无法接收视频

我用假视频流解决了这个问题:

            let w = 640;
            let h = 480;
            let canvas: any = Object.assign(document.createElement("canvas"), { w, h });
            canvas.getContext('2d').fillRect(0, 0, w, h);
            let blackStream = canvas.captureStream();
            outgoingStream.addTrack(blackStream.getVideoTracks()[0]);

我在javascript方面没有看到任何错误,我正在使用我自己的websocket服务器进行jsep信令部分。嗨,Mauz,谢谢你的代码,我只是想知道如何调试我的代码。我的代码看起来很像你的,但它不工作。嗨@RavikumarTulugu,出于测试目的,你的代码是在线托管的吗请给一个链接。你知道,当我们有一个实例而不是文本代码时,调试代码是很容易的!嗨,Mauz,代码还没有准备好部署,它没有在线托管,我已经在帖子中粘贴了整个客户端代码。你在客户端代码中看到任何可疑的东西了吗?嗨,贾斯汀,谢谢你的回复,我只是想知道如果在发送答案后添加了流会怎么样,在这种情况下,我的期望是仍然应该调用“onaddstream”回调,但它不是那样工作的,是一个bug吗?你说的是本地流吗?,在创建答案后将调用onaddstream?