Jak informowaliśmy w zeszłym tygodniu, ostatnio dużo się działo w przypadku naszego starego znajomego, WebRTC.
Oto kolejna nowość: udostępnianie ekranu za pomocą WebRTC.
Oto screencast: youtube.com/watch?v=tD0QtBUZsF4
A oto kod: github.com/samdutton/rtcshare
Stworzyliśmy eksperymentalne rozszerzenie do Chrome, które wykorzystuje RTCPeerConnection i chrome.tabCapture do udostępniania na żywo „filmu” z karty przeglądarki. Jeśli chcesz wypróbować tę funkcję, musisz mieć Chrome Canary i włączyć eksperymentalne interfejsy API rozszerzeń na stronie about:flags.
Nasz prototyp w dużej mierze opiera się na potężnej wersji demonstracyjnej appr.tc i – szczerze mówiąc – jest trochę „na skróty”. Ale to model koncepcyjny, który działa.
Oto jak to zrobiliśmy:
- Gdy użytkownik kliknie ikonę rozszerzenia (przycisk nagrywania obok paska adresu), skrypt tła rozszerzenia background.js dołącza do siebie element iframe, którego
srcto rtcshare.appspot.com. W skrypcie background.js jest on używany tylko do pobierania wartości takich jaktokeniroom_key. Mówiliśmy, że to hack :^}! To zmodyfikowana wersja apprtc.appspot.com. Podobnie jak w przypadku przykładu apprtc, rtcshare.appspot.com jest też używany w przypadku klienta zdalnego.
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.
}
}
- Po załadowaniu elementu iframe skrypt background.js pobiera z niego wartości (wygenerowane przez aplikację rtcshare.appspot.com) i wywołuje funkcję
chrome.tabCapture.capture(), aby rozpocząć rejestrowanie transmisji na żywo z bieżącej karty.
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!
});
}
- Gdy transmisja na żywo jest dostępna (czyli „film” na żywo z bieżącej karty), background.js rozpoczyna proces połączenia peer-to-peer, a sygnalizacja odbywa się za pomocą rtcshare.appspot.com przy użyciu XHR i interfejsu Channel API Google. Działa ona podobnie jak wersja demonstracyjna apprtc, z tym że strumień wideo przesyłany do zdalnego urządzenia pochodzi z
chrome.tabCapture, a nie zgetUserMedia().
function handleCapture(stream){
localStream = stream; // used by RTCPeerConnection addStream();
initialize(); // start signalling and peer connection process
}
- Na potrzeby demonstracji to rozszerzenie prototypowe otwiera nową kartę z adresem URL podanym przez rtcshare.appspot.com, do którego dodany jest ciąg zapytania „room number”. Oczywiście ten adres URL można otworzyć na innym komputerze, w innym miejscu, i TO może być początek czegoś przydatnego.
chrome.tabs.create({url: room_link});
Widzimy wiele ciekawych zastosowań udostępniania ekranu. Już na tym wczesnym etapie rozwoju jesteśmy pod wrażeniem tego, jak szybko i stabilnie działa przechwytywanie i udostępnianie kart bez wtyczek.
Jak zawsze zachęcamy do przesyłania komentarzy na temat tego rozszerzenia i interfejsów WebRTC API. Jeśli chcesz dowiedzieć się więcej o WebRTC, przeczytaj artykuł na HTML5 Rocks lub nasz krótki przewodnik.
Życzymy udanych eksperymentów i wszystkiego najlepszego w 2013 roku od całego zespołu HTML5R i WebRTC.