正如我们上周报道的那样,我们的老朋友 WebRTC 最近发生了很多事情。
不过,我们又迎来了一个“首次”:WebRTC 屏幕共享。
请观看以下屏幕录制视频:youtube.com/watch?v=tD0QtBUZsF4
代码如下:github.com/samdutton/rtcshare
从本质上讲,我们构建了一个实验性 Chrome 扩展程序,该程序使用 RTCPeerConnection 和 chrome.tabCapture 来分享浏览器标签页的实时“视频”。如果您想试用此功能,需要使用 Chrome Canary 版,并需要在 about:flags 页面上启用实验性扩展程序 API。
我们的原型严重依赖于强大的 appr.tc 演示,坦白地说,它有点像黑客行为!但…它只是一个概念验证,而且可以正常运行。
以下是我们所采取的方法:
- 当用户点击扩展程序图标(地址栏旁边的“录制按钮”)时,扩展程序的后台脚本 background.js 会将一个 iframe 附加到自身,该 iframe 的
src为 rtcshare.appspot.com。在 background.js 中,该 iframe 仅用于获取token和room_key等值。我们说过这是一个黑客攻击!这是 apprtc.appspot.com 的精简版本。与 apprtc 示例一样,rtcshare.appspot.com 也用于远程客户端。
chrome.browserAction.onClicked.addListener(function(tab) {
var currentMode = localStorage["capturing"];
var newMode = currentMode === "on" ? "off" : "on";
if (newMode === "on"){ // start capture
appendIframe();
} else { // stop capture
chrome.tabs.getSelected(null, function(tab){
localStream.stop();
onRemoteHangup();
});
// set icon, localStorage, etc.
}
}
- 当 iframe 加载完毕后,background.js 会从中获取值(由 rtcshare.appspot.com 应用生成),并调用
chrome.tabCapture.capture()以开始捕获当前标签页的直播。
function appendIframe(){
iframe = document.createElement("iframe");
iframe.src="https://rtcshare.appspot.com";
document.body.appendChild(iframe);
iframe.onload = function(){
iframe.contentWindow.postMessage("sendConfig", "*");
};
}
// serialised config object messaged by iframe when it loads
window.addEventListener("message", function(event) {
if (event.origin !== "https://rtcshare.appspot.com"){
return;
}
var config = JSON.parse(event.data);
room_link = config.room_link; // the remote peer URL
token = config.token; // for messaging via Channel API
// more parameter set from config
);
function startCapture(){
chrome.tabs.getSelected(null, function(tab) {
var selectedTabId = tab.id;
chrome.tabCapture.capture({audio:true, video:true}, handleCapture); // bingo!
});
}
- 直播可用后(即当前标签页的实时“视频”),background.js 会启动对等连接流程,并通过 rtcshare.appspot.com 使用 XHR 和 Google 的 Channel API 完成信令。总而言之,它的工作方式与 apprtc 演示类似,只不过发送给远程对等方的视频流来自
chrome.tabCapture而不是getUserMedia()。
function handleCapture(stream){
localStream = stream; // used by RTCPeerConnection addStream();
initialize(); // start signalling and peer connection process
}
- 出于演示目的,此原型扩展程序会打开一个新标签页,其中包含 rtcshare.appspot.com 提供的网址,该网址已添加“会议室编号”查询字符串。当然,您可以在其他计算机上的其他位置打开此网址,而这可能就是有用信息的开始!
chrome.tabs.create({url: room_link});
我们设想了许多有趣的屏幕共享用例,即使在开发初期,我们也很惊讶于无需插件的标签页捕获和共享功能可以如此快速稳定。
与往常一样,我们欢迎您就此扩展程序和 WebRTC API 提供任何意见。如果您想详细了解 WebRTC,请参阅 HTML5 Rocks 文章或我们的快速入门指南。
祝大家开发愉快!HTML5R 和 WebRTC 的全体成员祝您 2013 年万事如意!