Javascript WebRTC远程视频流不工作

Javascript WebRTC远程视频流不工作,javascript,webrtc,Javascript,Webrtc,我已经添加了一个简单的webRTC应用程序,它将连接一个浏览器窗口,从我的相机流式传输视频数据。最终目标是在页面上获得两个视频流,一个直接来自摄像头,另一个来自浏览器在本地建立的WebRTC连接 不幸的是,远程视频流没有显示。知道为什么吗 <video id="yours" autoplay></video> <video id="theirs" autoplay></video> 我关注Dan Ristic关于WebRTC的书,理解了他在编码方

我已经添加了一个简单的webRTC应用程序,它将连接一个浏览器窗口,从我的相机流式传输视频数据。最终目标是在页面上获得两个视频流,一个直接来自摄像头,另一个来自浏览器在本地建立的WebRTC连接

不幸的是,远程视频流没有显示。知道为什么吗

<video id="yours" autoplay></video>
<video id="theirs" autoplay></video>
我关注Dan Ristic关于WebRTC的书,理解了他在编码方面所做的工作。不幸的是,远程视频没有显示。

添加故障回调以使其正常工作。否则,您不仅看不到错误,而且这样做实际上会使它工作,原因非常奇怪:

你是WebIDL重载的受害者。 现在的情况是WebRTC API有两个版本,您正在混合它们

有一个,例如:

和a,例如:

换句话说,有两个
createOffer
函数采用不同数量的参数

不幸的是,您遇到了第一个
createOffer
,因为您只传递了一个参数!第一个
createOffer
需要一个对象,不幸的是,在WebIDL中,该对象与函数无法区分。因此,它被视为有效参数(空选项对象)。即使这导致了
类型错误
,也不会导致异常,因为承诺API拒绝返回的承诺,而不是抛出异常:

pc.createOffer(3).catch(e => console.log("Here: "+ e.name)); // Here: TypeError
您也没有检查返回的承诺,因此错误将丢失

以下是一个工作版本(适用于Chrome):

navigator.getUserMedia=navigator.getUserMedia||
navigator.webkitGetUserMedia||
navigator.mozGetUserMedia;
window.rtpeerconnection=window.rtpeerconnection||
window.webkirtpeerconnection;
你的连接,他们的连接;
getUserMedia({video:true,audio:false},函数(流){
yourVideo.src=window.URL.createObjectURL(流);
var config={“iceServers”:[{“URL”:“stun:stun.1.google.com:19302”}]};
yourConnection=新的RTPeerConnection(配置);
theirConnection=新的RTPeerConnection(配置);
yourConnection.addStream(stream);
theirConnection.onaddstream=函数(事件){
theirVideo.src=window.URL.createObjectURL(event.stream);
};
yourConnection.onicecandidate=函数(e){
如果(如候选人){
他们的联系。添加日期(新的RTICE候选人(e.候选人),
成功、失败);
}
};
theirConnection.onicecandidate=函数(e){
如果(如候选人){
yourConnection.addIceCandidate(新的RTICE候选者(e.候选者),
成功、失败);
}
};
yourConnection.createOffer(函数(offer){
yourConnection.setLocalDescription(提供、成功、失败);
他们的Connection.setRemoteDescription(提供、成功、失败);
theirConnection.createAnswer(函数(提供){
theirConnection.setLocalDescription(提供、成功、失败);
yourConnection.setRemoteDescription(提供、成功、失败);
}(失败);
}(失败);
}(失败);
函数success(){};
函数失败(e){console.log(e);}


woww。这个答案让我很高兴。我是WebRTC的新手,将来我会非常打扰你!我不明白。我了解很多,但还是不明白。此示例应与对等方建立连接。所以在第二个
视频中
我应该看到其他人,而不是我,对吗?@DamianHetman你想看到谁?:)这只是一个本地循环演示。对于真正的呼叫,您需要知道首先呼叫谁,以及一些信号通道来交换提供/应答以设置呼叫。@jib那么如何与其他呼叫方进行此操作?我在网上搜索了一些例子,几乎每个例子都是本地循环。我找到了一个允许打电话给其他人,但代码太旧了,无法工作。我试图进行一对一视频通话,但我不知道我做错了什么…@DamianHetman,这是因为做更多的事情需要(websocket)服务器来发送信号。请参阅和上的其他答案。第二个,您可以使用它连接到任何地方的任何机器(前提是手动获取报价并来回应答)。
pc.createOffer(options).then(successCallback, failureCallback);
pc.createOffer(successCallback, failureCallback, options);
pc.createOffer(3).catch(e => console.log("Here: "+ e.name)); // Here: TypeError