基于Licode demo的屏幕共享功能的实现

                                                                                                                           基于Licode demo的屏幕共享功能的实现本文在licode的basicExample基础上添加screensharing功能。主要麻烦的是屏幕共享必须在https协议下传输,需要修改erizo controller的代码,而且https协议的证书问题也比较麻烦,目前的办法是手动添加证书到chrome中。chrome新版本需要使用插件screen capture,licode官方发布的插件不能直接在本地server上使用,需要修改后使用,下文将具体说。
1.index.html 修改,添加两个按钮,分别对应本地视频音频流和屏幕流
<button id="screenSharing" onclick="screenSharing()">Screen Sharing</button>
    <button id="localVideo" onclick="localVideo()">localVidoe</button>

 2.script.js 分别为screenSharing和localVidoe加载不同的localStream流。

function localVideo(){
  var config = {audio: true, video: true, data: true,  videoSize: [640, 480, 640, 480]};
  localStream = Erizo.Stream(config);
  initialize();
  console.info("localVidoe button has been clicked...");
}

function screenSharing(){
  var config = {screen: true, data: true, attributes: {name:‘myStream‘}};
  config.extensionId = "gieahgoflbnmfamkbfjafjkdgnkjmhch";
  localStream = Erizo.Stream(config);
  initialize();
  console.info("screenSharing button has been clicked...");

}

var serverUrl = "/";
var localStream, room, recording, recordingId;

function getParameterByName(name) {
  name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
  var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
      results = regex.exec(location.search);
  return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

function testConnection () {
  window.location = "/connection_test.html";
}

function startRecording () {
  if (room !== undefined){
    if (!recording){
      room.startRecording(localStream, function(id) {
        recording = true;
        recordingId = id;
      });

    } else {
      room.stopRecording(recordingId);
      recording = false;
    }
  }
}

function localVideo(){
  var config = {audio: true, video: true, data: true,  videoSize: [640, 480, 640, 480]};
  localStream = Erizo.Stream(config);
  initialize();
  console.info("localVidoe button has been clicked...");
}

function screenSharing(){
  var config = {screen: true, data: true, attributes: {name:‘myStream‘}};
  config.extensionId = "gieahgoflbnmfamkbfjafjkdgnkjmhch";
  localStream = Erizo.Stream(config);
  initialize();
  console.info("screenSharing button has been clicked...");

}

window.onload=function(){
}
function initialize () {
  recording = false;
  var createToken = function(userName, role, callback) {

    var req = new XMLHttpRequest();
    var url = serverUrl + ‘createToken/‘;
    var body = {username: userName, role: role};

    req.onreadystatechange = function () {
      if (req.readyState === 4) {
        callback(req.responseText);
      }
    };

    req.open(‘POST‘, url, true);
    req.setRequestHeader(‘Content-Type‘, ‘application/json‘);
    req.send(JSON.stringify(body));
  };

  createToken("user", "presenter", function (response) {
    var token = response;
    console.log(token);
    room = Erizo.Room({token: token});

    localStream.addEventListener("access-accepted", function () {
      console.info(‘acess-accepted a client...‘);
      var subscribeToStreams = function (streams) {
        for (var index in streams) {
          var stream = streams[index];
          if (localStream.getID() !== stream.getID()) {
            room.subscribe(stream);
          }
        }
      };

      room.addEventListener("room-connected", function (roomEvent) {
    console.info(‘a client room connected...‘);
        room.publish(localStream, {maxVideoBW: 300});
        subscribeToStreams(roomEvent.streams);
      });

      room.addEventListener("stream-subscribed", function(streamEvent) {
        var stream = streamEvent.stream;
        var div = document.createElement(‘div‘);
        div.setAttribute("style", " width: 320px; height: 240px;");
        div.setAttribute("id", "test" + stream.getID());

        document.body.appendChild(div);
        stream.show("test" + stream.getID());

      });

      room.addEventListener("stream-added", function (streamEvent) {
        var streams = [];
        streams.push(streamEvent.stream);
        subscribeToStreams(streams);
        document.getElementById("recordButton").disabled = false;
      });

      room.addEventListener("stream-removed", function (streamEvent) {
        // Remove stream from DOM
        var stream = streamEvent.stream;
        if (stream.elementID !== undefined) {
          var element = document.getElementById(stream.elementID);
          document.body.removeChild(element);
        }
      });

      room.addEventListener("stream-failed", function (streamEvent){
          console.log("STREAM FAILED, DISCONNECTION");
          room.disconnect();

      });

      room.connect();

      localStream.show("myVideo");

    });
    localStream.init();
  });
};
3.修改licode_config.js ,将erizo controller改成https传输,因为屏幕共享必须在https协议下传输。host.key host.cert是openssl生成的。ip具体具体情况设置
config.erizoController.publicIP = ‘192.168.0.2‘; //default value: ‘‘
// Use ‘‘ to use the public IP address instead of a hostname
config.erizoController.hostname = ‘‘; //default value: ‘‘
config.erizoController.port = 8080; //default value: 8080
// Use true if clients communicate with erizoController over SSL
config.erizoController.ssl = true; //default value: false

config.erizoController.sslKey=‘/home/xxx/licode/myCert_chen/host.key‘;
config.erizoController.sslCert=‘/home/xxx/licode/myCert_chen/host.cert‘;

  

4.修改erizoCtroller.js使其支持https
var fs=require(‘fs‘);

var http = require(‘http‘);
var https=require(‘https‘);
var config = require(‘./../../licode_config‘);

GLOBAL.config = config || {};

if(GLOBAL.config.erizoController.ssl){
    var options = {
        key: fs.readFileSync(GLOBAL.config.erizoController.sslKey).toString(),
        cert: fs.readFileSync(GLOBAL.config.erizoController.sslCert).toString()
    };
    var server = https.createServer(options);
}
else
    var server = http.createServer();
5.修改chrome插件licode/erizo_controller/erizoClient/extras/chrome-extension/manifest.json,并安装到chrome中。
"externally_connectable":
{
"matches":
["*://192.168.0.2/*"]
   },
6.修改extensinID,script.js和erizo.js中。externId可以在chrome插件设置dev模式查看。
7.打开https://192.168.0.2:3004链接,添加信任。然后打开https://192.168.0.2:8080/socket.io,添加到chrome信任列表中。特别是socket.io需要注意,如果不添加信任,则无法使用screen sharing功能,返回不安全的应答错误insecure response




 
 

 
时间: 2024-10-05 07:20:29

基于Licode demo的屏幕共享功能的实现的相关文章

移动端的拖拽这个demo实现的功能

SQL数据库适合那些需求确定和对数据完整性要去严格的项目.NoSQL数据库适用于那些对速度和可扩展性比较看重的那些不相关的,不确定和不断发展的需求. 总所周知,网页的加载速度跟图片是有很大的关系的,因为在不影响图片质量的情况下,减小图片的大小显得尤为重要. 这个demo实现的功能是:可以拖拽的元素(在这里是图片)位于列表中,这些元素可以被拖到指定区域,到达指定区域(控制台)后,元素被插入控制台后,原来的拖动元素返回原位置,新的元素依然可以在控制台中拖动,也能拖出控制台. 由于网页支付基于JS-S

基于bootstrup的jQuery多功能模态对话框

这是一款非常实用的基于bootstrup的jQuery多功能模态对话框插件.该jQuery模态对话框集警告框.确认框和对话框于一体.是一款不可多得的多功能.多用途的模态对话框插件. 它的主要特点有: 可以通过AJAX直接将调用内容到对话框中. 可以在指定的时间后自动关闭对话框. 可以设置为点击模态背景不关闭对话框. 拥有丰富的回调函数. 在线演示:http://www.htmleaf.com/Demo/201502141378.html 下载地址:http://www.htmleaf.com/j

mysql基于init-connect+binlog完成审计功能

mysql基于init-connect+binlog完成审计功能 目前社区版本的mysql的审计功能还是比较弱的,基于插件的审计目前存在于Mysql的企业版.Percona和MariaDB上,但是mysql社区版本有提供init-connect选项,基于此我们可以用它来完成审计功能. init-connect参数说明: http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_init_connect s

基于PHP实现用户注册登录功能

本文介绍的是基于PHP实现用户注册登录功能,本项目分为四部分内容:1前端页面制作,2验证码制作,3实现注册登陆,4功能完善.具体情况可以往下看. 验证码制作 一.实验简介 本次实验将会带领大家使用面向对象的思想封装一个验证码类.并在注册和登陆界面展示使用.通过本次实验的学习,你将会领悟到 PHP 的 OOP 思想,以及 GD 库的使用,验证码生成. 1.1 涉及到的知识点 PHP GD库 OOP编程 1.2 开发工具 sublime,一个方便快速的文本编辑器.点击桌面左下角: 应用程序菜单/开发

基于90nm CMOS技术的功能齐全的64Mb DDR3 STT-MRAM

自旋转矩磁阻随机存取存储器(ST-MRAM)有望成为一种快速,高密度的非易失性存储器,可以增强各种应用程序的性能,特别是在用作数据存储中的非易失性缓冲器时设备和系统.为此,everspin开发了基于90nmCMOS技术的全功能64Mb DDR3 STT-MRAM.存储器以8个存储区的配置进行组织,可支持1.6Giga Transfers/s(DDR3-1600).已经在800MHz的全64Mb上运行了标准的内存测试,例如March6N模式,其中0失败超过105个周期.还验证了从0°C到70°C的

微信开发(一)基于Wx-java的微信分享功能

最近在做微信服务号开发,简单总结一下,便于自己学习积累和分享给大家: 环境介绍: Spring+ Spring MVC +Mybatis 开发语言: JAVA 微信公众平台的开发中,微信只公布了一个基于Http协议的接口和加解密的算法sdk,在开发的过程中可以自己根据需求来配置数据,调用相关接口,也可以引用比较成熟的基于java语言的微信公众号sdk.笔者引用的是目前比较流行的 weixin-java-tools 可以参考:点击打开链接 项目中引入了weixin-java-mp 就可直接调用相关

Autofac 之 基于 Castle DynamicProxy2 的 Interceptor 功能

Autofac 结合 Castle DynamicProxy2 功能 Autofac 不仅作为轻量级高效的 IoC 容器,而且还能很好的与 Castle.DynamicProxy2 结合起来,实现 AOP 功能. 首先,我们需要定义拦截器,简单的定义可实现 Castle.DynamicProxy.IInterceptor 接口即可. 添加拦截器   定义好了拦截器后,如何应用到相关对象呢?有两种方式: 1)使用 Autofac.Extras.DynamicProxy2.InterceptAttr

放大招了,基于友推快速分享功能到微信

一直想做一个基于友推的系列专题(包括appKey申请和开发过程中常遇到的一些问题),帮助大家更好地去实现分享功能,总结一个下午,总算弄出一些皮毛来,以后会持续更新,包括一些安卓开发中常遇到的一些问题以及经验奉献给大家一:已实现功能 1.支持微信,QQ,新浪微博,QQ空间,短信,邮件等多家大型社交媒体平台一键分享 2.支持积分抽奖活动在线活动创建,通过分享应用邀请好友拿积分 3.支持截屏涂鸦个性分享 4.集成简单,几行代码轻松搞定,一键集成,永久更新 5.可轻松实现APP第三方登录,免去繁琐的注册

API测试自动化——基于CDIF的SOA基本功能(实例篇)

今天我们通过一些实例来体验一下API的自动化测试,感受一下基于CDIF的SOA的一些基本功能. 传统的测试工具在测试一个API的时候,必须手动填写这个API所需要接收的所有信息,比如一个查询航班动态的API,他接收两个输入字段,一个叫flight, 一个叫date,那么测试这个API的用户,需要手动填写所有这些信息:flight=MU3532 & date=2017-03-02.而的测试工具基于CDIF的测试中就不需要写flight和date这两个字段,直接在API测试网页上填MU3532和20