您可能已经注意到,我们在 WebRTC 实现方面取得了很大进展,并且预计在接下来的几个版本中会有更多改进。
我们正在进行的工作旨在改善音频质量问题(是的,我们知道我们仍然有一些问题!)并协助解决 NAT 穿越问题(您可以在 Bug 904622 中跟踪进度)。
现有限制
除了即将进行的改进之外,我还想花点时间来了解您可能已经注意到的几个现有限制,并提供一些有关编写在这些限制内工作的应用程序的建议。
第一个问题,在 Bug 857115 中进行了描述,是 mozRTCPeerConnection 目前不支持对正在进行的会话进行重新协商。一旦会话建立,其参数就会固定。实际上,这意味着您无法例如在该会话的后期启动仅音频呼叫然后向同一对等连接添加视频。我们还有另一个类似的限制,即我们目前不支持单个对等连接上的一个以上的音频和视频流(请参阅 Bug 784517 和 Bug 907339)。
目前的解决方案
我们将尽快解决这些限制,但我们的代码更改需要几个月的时间才能通过 Firefox 发布流程发布。在此之前,我想提供一些解决方法,以便您可以继续使用 Firefox 创建很棒的东西。
静音音频和视频流
媒体重新协商有两个主要用例:在会话过程中静音和取消静音媒体;以及在会话过程中添加/删除视频。对于静音和取消静音,技巧在于明智地使用 MediaStreamTrack 对象上的“enabled”属性:当您要静音时,只需将轨道上的 enabled 设置为“false”。
var pc = new mozRTCPeerConnection;
navigator.mozGetUserMedia({video: true},
function (mediaStream) {
// Create a new self-view video element
var video = document.createElement("video");
video.setAttribute("width", 640);
video.setAttribute("height", 480);
video.setAttribute("style", "transform: scaleX(-1)");
video.src = window.URL.createObjectURL(mediaStream);
document.body.appendChild(video);
video.play();
// Add a button to hold/unhold video stream
var button = document.createElement("button");
button.appendChild(document.createTextNode("Toggle Hold"));
button.onclick = function(){
mediaStream.getVideoTracks()[0].enabled =
!(mediaStream.getVideoTracks()[0].enabled);
}
document.body.appendChild(document.createElement("br"));
document.body.appendChild(button);
// Add the mediaStream to the peer connection
pc.addStream(mediaStream);
// At this point, you're ready to start the call with
// pc.setRemoteDescription() or pc.createOffer()
},
function (err) { alert(err); }
);
请注意,将 MediaStreamTrack 的“enabled”属性设置为“false”不会停止媒体流,但它会更改正在编码为黑色正方形(对于视频)和静音(对于音频)的媒体,这两者都压缩得非常好。根据您的应用程序,使用浏览器到浏览器信令(例如,WebSockets 或数据通道)让另一个浏览器知道它应该隐藏或显示视频窗口(当相应的视频被静音时)也可能是有意义的。
呼叫过程中添加视频
对于呼叫过程中添加视频,最用户友好的解决方法是销毁仅音频的对等连接,并创建一个新的对等连接,同时包含音频和视频。当您执行此操作时,它会提示用户使用摄像头和麦克风;但是,由于 Firefox 在单个对话框中执行此操作,因此用户体验通常非常好。添加视频后,您可以通过反向执行此技巧(从而释放摄像头)将其删除,或者您可以简单地执行上面我描述的“静音视频”技巧(这将使摄像头继续工作 - 这可能会让一些用户感到不适)。
发送多个音频或视频流
要发送多个音频或视频流,您可以在浏览器之间使用多个同时对等连接:每个您希望发送的音频/视频对一个。您还可以使用此技术作为添加和删除会话中视频的替代方法:设置初始仅音频呼叫;如果用户稍后决定添加视频,您可以创建一个新的对等连接并协商单独的仅视频连接。
使用第一种方法添加视频的一个细微缺点是,它在您添加视频时会重新启动音频连接,这可能会导致音频流出现一些明显的故障。但是,一旦我们实现了音频和视频同步,确保音频和视频轨道在同一个 MediaStream 中将确保它们保持同步。对于多个 MediaStream 或多个对等连接,这种同步并不保证。
临时解决方法和实现目标
我们认识到这些解决方法并不理想,我们正在尽快努力实现规范兼容性。在此期间,我们希望这些信息能帮助您构建当今的应用程序。好消息是,即使在我们解决了上面描述的限制之后,这些技术也应该继续有效,因此您可以根据需要迁移到最终解决方案。
最后,我建议任何对重新协商和/或多媒体流感兴趣的人关注我上面提到的错误。一旦我们实现了这些功能,它们应该在 Firefox 的发布版本中出现大约 18 周内。在那之后,您需要切换到“标准”方法来确保最佳的音频和视频质量。
感谢您的耐心等待。出去创造伟大的事物吧!
关于 Adam Roach
Adam Roach 与 Mozilla 的 WebRTC 实现团队合作,将实时技术引入 Firefox 和 FirefoxOS 共享的核心库。自 1997 年以来,他一直在通过协议标准化、架构、设计和实施来构建基于 IP 的实时通信世界。
关于 Robert Nyman [荣誉编辑]
技术布道者和 Mozilla Hacks 编辑。发表关于 HTML5、JavaScript 和开放网络的演讲和博客文章。Robert 是 HTML5 和开放网络的坚定支持者,自 1999 年以来一直从事网络前端开发工作 - 在瑞典和纽约市。他还定期在 http://robertnyman.com 上发表博客文章,并且喜欢旅行和结识新朋友。
9 条评论