[正如我们上周报道的一样](http://updates.html5rocks.com/2012/12/WebRTC-hits-Firefox-Android-and-iOS),最近有很多事情发生在我们熟知的[WebRTC](http://www.html5rocks.com/en/tutorials/webrtc/basics/)上。
其中一个是:基于WebRTC的屏幕共享。
![](https://box.kancloud.cn/2016-08-09_57a9aa56ab209.jpg)
[](https://www.youtube.com/watch?v=tD0QtBUZsF4 ""链接截屏WebRTC的屏幕共享行动。截屏图像显示WebRTC的屏幕共享扩展,杰克阿奇博尔德,彼得Beverloo,保罗·刘易斯和山姆达顿。" ")
这是屏幕录像:[youtube.com/watch?v=tD0QtBUZsF4](https://www.youtube.com/watch?v=tD0QtBUZsF4 "Video on YouTube: screencast of WebRTC screensharing in action")。
这是代码:[github.com/samdutton/rtcshare](https://www.github.com/samdutton/rtcshare "Github code repository for WebRTC screensharing extension")。
从本质上讲,我们使用RTCPeerConnection和[`chrome.tabCapture`](http://developer.chrome.com/dev/extensions/tabCapture.html "chrome.tabCapture API文档")构建了一个实验性的Chrome扩展,以此通过浏览器标签来分享实时视频。如果你想尝试一下,你需要使用[Chrome的Canary](https://tools.google.com/dlpage/chromesxs/)版本 ,并且在about:flags页面开启实验性扩展(Experimental Extension)的API。
我们的原型很大程度上依赖于强大的[apprtc.appspot.com](http://apprtc.appspot.com/)演示,坦率地说,这有点像黑客行为。但是,这是一个概念的证明,并且我们做到了。
下面是我们的实现方法:
1. 当用户点击扩展程序图标(地址栏旁的“录制按钮“),扩展的后台脚本background.js为它自身添加了一个iframe,`src``指向`[rtcshare.appspot.com](https://rtcshare.appspot.com/)。在background.js中它仅用于获取`token`和`room_key``这样的参数`值。
~~~
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.
}
}
~~~
2. 当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!
});
}
~~~
3. 一旦实时数据流可用(换句话说,即当前标签的实时视频*),*background.js便启动点对点连接的进程,信号通过[rtcshare.appspot.com](http://www.rtcshare.appspot.com/)使用XHR及Google的[Channel API](https://developers.google.com/appengine/docs/python/channel/overview)进行传输。所有一切的工作原理就像[apprtc](http://www.apprtc.appspot.com/)的示例一样,除了视频流到远程的传送是通过chrome.tabCapture()而不是getUserMedia()。
~~~
function handleCapture(stream){
localStream = stream; // used by RTCPeerConnection addStream();
initialize(); // start signalling and peer connection process
}
~~~
4. 为了演示考虑,这个扩展会在新标签打开一个[rtcshare.appspot.com](https://rtcshare.appspot.com/)提供的url,其中包含一个房间号的参数。当然,这个URL可以在另一台计算机上或者任何地方打开,这可能是最有价值的事情。me.t
~~~
chrome.tabs.create({url: room_link});abs.create({URL:room_link});
~~~
我们为屏幕共享设想了很多有趣的用例,即使在这个早期的发展阶段,基于插件的标签录制和分享有多快和多稳定也给我们留下了深刻的印象。
如果你想了解更多关于WebRTC的内容,请查阅[HTML5 Rocks的文章](http://www.html5rocks.com/en/tutorials/webrtc/basics/)或我们的[快速入门指南](https://docs.google.com/document/d/1idl_NYQhllFEFqkGQOLv8KBK8M3EVzyvxnKkHl4SuM8/edit) 。
祝大家2013年快乐!
相关文章:《[Chrome引入WebRTC支持视频聊天App](http://blog.csdn.net/hfahe/article/details/8083572)》
《[如何使用HTML5实现拍照上传应用](http://blog.csdn.net/hfahe/article/details/7354912)》
《[对HTML5 Device API相关规范的解惑](http://blog.csdn.net/hfahe/article/details/7338032)》
译自:http://updates.html5rocks.com/2012/12/Screensharing-with-WebRTC
转载请注明:来自蒋宇捷的博客-http://blog.csdn.net/hfahe
- 前言
- AutoPager的简单实现
- 利用CSS3特性巧妙实现漂亮的DIV箭头
- IE9在Win7下任务栏新特性简介
- 浏览器九宫格的简单实现
- Raphael js库简介
- 使用CSS3构建Ajax加载动画
- 用CSS3创建动画价格表
- 用CSS3实现浏览器的缩放功能
- 用纯CSS3实现QQ LOGO
- 用CSS3创建旋转载入器
- 使用Javascript开发移动应用程序
- 用HTML5创建超酷图像灰度渐变效果
- 使用CSS3创建文字颜色渐变(CSS3 Text Gradient)
- 仅用CSS创建立体旋转幻灯片
- 如何创建跨浏览器的HTML5表单
- 用CSS3实现动画进度条
- HTML5 Guitar Tab Player
- 奇妙的HTML5 Canvas动画实例
- 谈HTML5和CSS3的国际化支持
- 实现跨浏览器的HTML5占位符
- 前端开发必备工具:WhatFont Bookmarklet-方便的查询网页上的字体
- 使用HTML5和CSS3来创建幻灯片
- HTML5之美
- 如何使用HTML5创建在线精美简历
- 以小见大、由浅入深-谈如何面试Javascript工程师
- 快速入门:HTML5强大的Details元素
- 用CSS3实现图像风格
- HTML5视频字幕与WebVTT
- 用纯CSS3实现Path华丽动画
- 用3个步骤实现响应式网页设计
- 遇见CSS3滤镜
- 关于CSS3滤镜的碎念
- 用纯CSS3绘制萌系漫画人物动态头像
- CSS3新的鼠标样式介绍
- 用HTML5献上爱的3D玫瑰
- 对HTML5 Device API相关规范的解惑
- 如何使用HTML5实现拍照上传应用
- 2012第一季度国外HTML5移动开发趋势
- HTML5新特性:范围样式
- 百度开发者大会-《用HTML5新特性开发移动App》PPT分享
- Chrome 19对于HTML5最新支持的动态:电池状态API,全屏API,震动API,语音API
- 遇见Javascript类型数组(Typed Array)
- 用HTML5 Audio API开发游戏音乐
- 用HTML5实现人脸识别
- 用Javascript实现人脸美容
- Chrome 20对于HTML5最新支持的动态:颜色输入,网络信息API,CSS着色器
- 用HTML5实现手机摇一摇的功能
- 用HTML5实现iPad应用无限平滑滚动
- 用非响应式设计构建跨端Web App
- 了解SVG
- HTML5图像适配介绍
- HTML5安全:内容安全策略(CSP)简介
- HTML5安全:CORS(跨域资源共享)简介
- 用CSS3 Region和3D变换实现书籍翻页效果
- 谈谈移动App的思维误区
- Chrome新特性:文件夹拖拽支持
- 《关注HTML5安全》
- HTML5安全风险详析之一:CORS攻击
- HTML5安全风险详析之二:Web Storage攻击
- HTML5图像适配最新进展:响应式图片规范草案
- HTML5移动Web App相关标准状态及路线图
- HTML5安全风险详析之三:WebSQL攻击
- Chrome引入WebRTC支持视频聊天App
- HTML5安全风险详析之四:Web Worker攻击
- HTML5安全风险详析之五:劫持攻击
- HTML5安全风险详析之六:API攻击
- HTML5安全攻防详析之七:新标签攻击
- 在iOS Safari中播放离线音频
- 使用WebRTC实现远程屏幕共享
- Firefox、Android、iOS遇见WebRTC
- HTML5光线传感器简介
- HTML5安全攻防详析之八:Web Socket攻击
- HTML5安全攻防详析之完结篇:HTML5对安全的改进
- 激动人心!在网页上通过语音输入文字 - HTML5 Web Speech API介绍
- Web滚动性能优化实战
- 用CSS3设计响应式导航菜单
- 用HTML5构建高性能视差网站
- 漫谈@supports与CSS3条件规则
- HTML5下载属性简介
- 如何开发优秀的HTML5游戏?-迪斯尼《寻找奥兹之路》游戏技术详解(一)
- 如何开发优秀的HTML5游戏?-迪斯尼《寻找奥兹之路》游戏技术详解(二)
- 趋势:Chrome为打包应用提供强大新特性
- 从HTML5移动应用现状谈发展趋势
- 基于HTML5的Web跨设备超声波通信方案