ตามที่เราได้รายงานไปเมื่อสัปดาห์ที่แล้ว ในช่วงนี้เกิดเหตุการณ์มากมายกับ WebRTC เพื่อนเก่าของเรา
มาดูฟีเจอร์ใหม่อีกอย่างกัน นั่นคือการแชร์หน้าจอผ่าน WebRTC
ดูสกรีนแคสต์ได้ที่ youtube.com/watch?v=tD0QtBUZsF4
โค้ดคือ github.com/samdutton/rtcshare
โดยสรุปแล้ว เราได้สร้างส่วนขยาย Chrome เวอร์ชันทดลองที่ใช้ RTCPeerConnection
และ chrome.tabCapture
เพื่อแชร์ "วิดีโอ" สดของแท็บเบราว์เซอร์ หากต้องการลองใช้ คุณจะต้องมี Chrome Canary และจะต้องเปิดใช้ Extension API เวอร์ชันทดลองในหน้า about:flags
โปรโตไทป์ของเราอาศัยการสาธิต appr.tc อย่างหนัก และพูดตามตรงคือเป็นวิธีแก้ปัญหาแบบหยาบๆ แต่... นี่เป็นเวอร์ชันการพิสูจน์แนวคิดและใช้งานได้
วิธีการมีดังนี้
- เมื่อผู้ใช้คลิกไอคอนส่วนขยาย ("ปุ่มบันทึก" ข้างแถบที่อยู่) สคริปต์เบื้องหลังของส่วนขยาย background.js จะต่อท้าย iframe กับตัวเอง โดย
src
ของ iframe นี้คือ 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 จะได้รับค่าจาก iframe (ซึ่งสร้างโดยแอป 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 จะเริ่มกระบวนการเชื่อมต่อแบบ Peer และส่งสัญญาณผ่าน rtcshare.appspot.com โดยใช้ XHR และ Channel API ของ Google โดยรวมแล้ว การทำงานจะเหมือนกับการสาธิต apprtc ยกเว้นสตรีมวิดีโอที่สื่อสารกับคู่สนทนาระยะไกลมาจาก
chrome.tabCapture
ไม่ใช่getUserMedia()
function handleCapture(stream){
localStream = stream; // used by RTCPeerConnection addStream();
initialize(); // start signalling and peer connection process
}
- เพื่อการสาธิต ส่วนขยายโปรโตไทป์นี้จะเปิดแท็บใหม่ที่มี URL ที่ได้จาก rtcshare.appspot.com ซึ่งเพิ่มสตริงการค้นหา "หมายเลขห้อง" แน่นอนว่า URL นี้อาจเปิดในคอมพิวเตอร์เครื่องอื่นหรือที่อื่น และนั่นอาจเป็นจุดเริ่มต้นของสิ่งที่มีประโยชน์
chrome.tabs.create({url: room_link});
เราคาดการณ์ว่าฟีเจอร์นี้จะมี Use Case ที่น่าสนใจมากมาย และแม้ว่าจะยังอยู่ในช่วงเริ่มต้นของการพัฒนา แต่เราก็ประทับใจกับการจับภาพและการแชร์แท็บที่ตอบสนองได้อย่างรวดเร็วและเสถียรโดยไม่ต้องใช้ปลั๊กอิน
และเช่นเคย เรายินดีรับฟังความคิดเห็นของคุณเกี่ยวกับส่วนขยายนี้และเกี่ยวกับ WebRTC API โดยทั่วไป หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับ WebRTC โปรดอ่านบทความ HTML5 Rocks หรือคู่มือเริ่มต้นใช้งานฉบับย่อ
ยินดีที่ได้พบคุณ และขอส่งความปรารถนาดีสำหรับปี 2013 จากทุกคนที่ HTML5R และ WebRTC