好消息!我們又推出一項首創功能:WebRTC 螢幕分享。
螢幕側錄:youtube.com/watch?v=tD0QtBUZsF4
程式碼位於:github.com/samdutton/rtcshare
我們打造了實驗性 Chrome 擴充功能,可使用 RTCPeerConnection 和 chrome.tabCapture 分享瀏覽器分頁的「影片」直播。如要試用這項功能,請使用 Chrome Canary,並在 about:flags 頁面啟用實驗性擴充功能 API。
我們的原型大量採用強大的 appr.tc 示範,坦白說,這有點像是駭客行為!但...這是概念驗證,而且運作正常。
我們採用的做法如下:
- 使用者點按擴充功能圖示 (網址列旁的「錄製按鈕」) 時,擴充功能的背景指令碼 background.js 會將 iframe 附加至自身,而
src為 rtcshare.appspot.com。在 background.js 中,這只用於取得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 年一切順利!