Webrtc 我无法接收远程视频流
我在linux上使用google chrome 21.x,webrtc对等连接已建立,但无法接收任何远程视频流,这是给peerconnection的回调。onaddstream“从未被调用,有人能告诉我需要在哪里查看吗 我正在粘贴我的全部代码,仍然无法接收远程视频流,也没有任何错误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 = "";
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演示:
- 在创建对等点之前,请确保两个对等点都已准备好握手
- 就绪意味着两个对等方都可以访问媒体流(音频和/或视频)
- 第一个对等方应启动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?