我知道adapter.js,它试图:
使应用程序不受规范变化和前缀差异的影响。
但是adapter .js只覆盖了非常基本的WebRTC API。我只以setRemoteDescription
为例。
在2013年,它被称为:
pc.setRemoteDescription(offer);
根据https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection,目前的API是?
pc.setRemoteDescription(new RTCSessionDescription(offer), function() {
pc.createAnswer(function(answer) {
pc.setLocalDescription(new RTCSessionDescription(answer), function() {
// send the answer to a server to be forwarded back to the caller (you)
}, error);
}, error);
}, error);
我目前正在阅读2015年的一篇文章,其中似乎是:
pc2.setRemoteDescription(pc1_offer).then(step3, failed);
- 我在哪里可以找到最新的和"官方"的文档为WebRTC API的?
- 你如何跟上这些频繁的变化?
编辑
http://www.w3.org/TR/webrtc/并不遥远,但我更愿意寻找一些东西,Firefox和Chrome的API的当前实现状态可以遵循(是超过将是,如果有意义的话)。
WebRTC仍在开发中,所以现在没有比规范更好的资源了,保持最新变化的最好地方是:http://w3c.github.io/webrtc-pc
当涉及到单个浏览器和实现时,它变得更加困难。看看:http://iswebrtcreadyyet.com
你在问题中观察到的主要API差异是2014年对承诺的支持。所有异步方法现在都返回一个Promise,而不是接受一对成功和失败回调。Chrome还没有实现这个功能,但是Firefox实现了。
下面是一个完整的在Firefox中工作的WebRTC调用(注意:使用箭头函数):
var pc1 = new mozRTCPeerConnection(), pc2 = new mozRTCPeerConnection();
pc1.onicecandidate = e => !e.candidate ||
pc2.addIceCandidate(e.candidate).catch(failed);
pc2.onicecandidate = e => !e.candidate ||
pc1.addIceCandidate(e.candidate).catch(failed);
pc2.onaddstream = e => v2.mozSrcObject = e.stream;
function start() {
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
.then(stream => pc1.addStream(v1.mozSrcObject = stream))
.then(() => pc1.createOffer())
.then(offer => pc1.setLocalDescription(offer))
.then(() => pc2.setRemoteDescription(pc1.localDescription))
.then(() => pc2.createAnswer())
.then(answer => pc2.setLocalDescription(answer))
.then(() => pc1.setRemoteDescription(pc2.localDescription))
.then(() => log("Connected!"))
.catch(failed);
}
var log = msg => div.innerHTML += "<p>" + msg + "</p>";
var failed = e => log(e.name +": "+ e.message +" line "+ e.lineNumber);
<video id="v1" height="120" width="160" autoplay></video>
<video id="v2" height="120" width="160" autoplay></video><br>
<button onclick="start()">Start!</button><div id="div"></div>
这是20行代码,比你可能见过的其他版本要小得多。
如果它看起来很神秘,不要绝望,因为承诺和箭头函数是需要一点时间来习惯的新概念,特别是在像这样组合使用的时候。我建议使用上面的链接分别阅读它们。
所有RTCPeerConnection方法仍然可以使用旧的回调版本,所以promise的使用是可选的。Chrome支持浏览器中的承诺(只是不支持WebRTC),但还不支持箭头功能,所以上述功能可能还需要一段时间才能普及。
撇开这个差异不谈,Chrome和Firefox在高级调用设置甚至重新协商时都相当稳定。规范中仍在变化的部分与新的低层控制面有关,比如RTCRtpSender,以及从指定流到指定轨道的重新聚焦(用addTrack
代替addStream
等)。
我知道的几个不同之处:
- getUserMedia constraints - Chrome在这里实现了大约2013年的规范,而Firefox实现了规范(但仅限于宽度/高度/帧速率和facingMode)。
- getStats - Chrome的实现,虽然更成熟,是非标准的,而Firefox实现规范(但仅限于rtp/rtcp, ice候选和其他一些东西)。
- RTCOfferOptions - Chrome阻塞在这些,所以,而不是例如
{ offerOptions: true }
使用旧的{ mandatory: OfferOptions: true }
(注意大小写差异'o' vs。'O'),因为这在两个浏览器中都有效。 - addTrack/removeTrack现在坚持
addStream(stream)
(虽然Firefox没有实现removeStream
,所以使用removeTrack
)。
由于前缀和其他差异,您仍然需要adapter.js,但还有更多的adapter.js可以和应该做的。希望它的新版本能够通过为上面的一些差异提供一个polyfill来进一步缩小这个差距。
我对Firefox的了解比Chrome好,所以如果我错过了什么,我很抱歉。