ShareApe.js 7.6 KB
// //////////////////////////////////////////////////////////////////////////////
//视频模块
// //////////////////////////////////////////////////////////////////////////////
import Loger from 'Loger';
import MessageTypes from 'MessageTypes';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
import ShareScreen from 'screenShare'
import Emiter from 'Emiter';
import ApeConsts from './ApeConsts';
let loger = Loger.getLoger('ShareApe');

class ShareApe extends Emiter {
  constructor() {
    super();
    this.channelId = ApeConsts.SCREENSHARING_OBJ_TABLE_ID;
    this.streamId = '';
    this.publishUrl = '';
    this.isConnect = false;
    this.isStopPublish = false;
    //this.shareScreen=new ShareScreen();
    this.shareScreen = ShareScreen;
    this.defaultWsPort = '605';//ws的默认端口
    this.defaultWssPort = '606';//wss的默认端口
    this.defaultIp = 'localhost.xuedianyun.com';//127.0.0.1
    this.ip = this.defaultIp;
    this.port = this.defaultWsPort;
    this.fullIpPort = '';
    this.init();
  }

  init() {
    // 版本信息
    this.shareScreen.on(ShareScreen.VERSION_INFO_CHANGE, (d) => {
      console.log('VERSION_INFO_CHANGE->', d);
    })

    // 本地摄像头设备
    this.shareScreen.on(ShareScreen.CAMERA_INFO_CHANGE, (d) => {
      console.log('CAMERA_INFO_CHANGE->', d);
    })

    // 本地麦克风设备
    this.shareScreen.on(ShareScreen.MIC_INFO_CHANGE, (d) => {
      console.log('MIC_INFO_CHANGE->', d);
    })

    // 本地RTMP服务端口
    this.shareScreen.on(ShareScreen.RTMP_PORT_CHANGE, (d) => {
      console.log('RTMP_PORT_CHANGE->', d);
    })

    // 麦克风音量
    this.shareScreen.on(ShareScreen.MIC_VOL_CHANGE, (d) => {
      console.log('MIC_VOL_CHANGE->', d);
    })

    // 媒体信息
    this.shareScreen.on(ShareScreen.MOVIE_INFO_CHANGE, (d) => {
      console.log('MOVIE_INFO_CHANGE->', d);
      this._emit(MessageTypes.PUBLISH_SCREEN_MOVIE_INFO_CHANGE, d);
    })

    // 视频信息
    this.shareScreen.on(ShareScreen.VIDEO_INFO_CHANGE, (d) => {
      console.log('VIDEO_INFO_CHANGE->', d);
      this._emit(MessageTypes.PUBLISH_SCREEN_VIDEO_INFO_CHANGE, d);
    })

    // 屏幕共享开始
    this.shareScreen.on(ShareScreen.SS_START, () => {
      //调用startShareScreen 成功
      loger.log('屏幕共享开始开启');
      this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_SUCCESS);
    })
    // 屏幕共享关闭
    this.shareScreen.on(ShareScreen.SS_STOP, () => {
      //调用startShareScreen 失败
      loger.log('屏幕共享开启失败');
      this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_FAILE);
    })

    // 发生错误 -- 无法连接本地服务
    this.shareScreen.on(ShareScreen.ERROR, () => {
      loger.log('无法连接本地服务-ERROR');
      /* this.isConnect=false;
       this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_DISCONNECT);
       this.reConnectTimer=setTimeout(()=>{
       this.startConnectSocket();
       },1400);*/
    })

    // 服务关闭 这个监听暂时不需要,使用ERROR监听即可
    this.shareScreen.on(ShareScreen.CLOSE, () => {
      loger.log('屏幕共享服务-CLOSE->重连');
      //1秒后继续重连
      this.isConnect = false;
      this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_DISCONNECT);
      this.reConnectTimer = setTimeout(()=> {
        this.startConnectSocket();
      }, 1400);
    })

    // 服务开启
    this.shareScreen.on(ShareScreen.OPEN, () => {
      loger.log('屏幕共享服务开启-OPEN');
      this.isConnect = true;
      this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_CONNECTED);
      //连接成功
      // 发起屏幕共享[推送地址可选]
      this.sendPublishRequest();
    })
  }

  // 连接本地流媒体服务
  startConnectSocket() {
    clearTimeout(this.reConnectTimer);
    if (!this.isConnect) {

      //this.shareScreen.start(this.ip, this.port);
      if (GlobalConfig.isHttps==true) {
        this.port = this.defaultWssPort;
      } else {
        this.port = this.defaultWsPort;
      }

      if (this.port) {
        this.fullIpPort = GlobalConfig.websocketProtocol + this.ip + ':' + this.port;
      } else {
        this.fullIpPort = GlobalConfig.websocketProtocol + this.ip;
      }
      loger.log("屏幕共享连接:",GlobalConfig.isHttps,this.port,GlobalConfig.websocketProtocol,this.fullIpPort);
      if (GlobalConfig.isHttps == true) {
        //https的时候替换所有80端口
        this.fullIpPort = GlobalConfig.replacePort(this.fullIpPort, ":80", "");
      }
      loger.log('开始连接本地流媒体服务->', this.fullIpPort);
      this.shareScreen.startConnect(this.fullIpPort);
    }
  }
  /*
  * 推送外部流地址
  * */
  publishExternalLink(_result) {
    /* return {"code": ApeConsts.RETURN_SUCCESS,
     "data":"",
     "mediaId":shareChannel,
     "publishUrl": publishUrl,
     "streamId":streamId,
     "port":""
     };*/
    clearTimeout(this.reConnectTimer);
    //if (_result) {
    //  this.publishUrl = _result.publishUrl || '';
    //  this.streamId = _result.streamId || '';
    //}
    this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_SUCCESS,_result);
  }

  //屏幕共享推流,如果没有连接需要先建立连接
  publish(_result) {
    /* return {"code": ApeConsts.RETURN_SUCCESS,
     "data":"",
     "mediaId":shareChannel,
     "publishUrl": publishUrl,
     "streamId":streamId,
     "port":""
     };*/
    if (_result) {
      this.publishUrl = _result.publishUrl || '';
      this.streamId = _result.streamId || '';
    }
    clearTimeout(this.reConnectTimer);

    if (!this.isConnect) {
      //还没有连接,需要先连接
      this.startConnectSocket()
    } else {
      this.sendPublishRequest();
    }
  }

  //发布推流
  sendPublishRequest() {
    if (this.publishUrl && this.shareScreen) {
      // 发起屏幕共享[推送地址可选]
      this.shareScreen.startShareScreen(this.publishUrl);
    }
  }

  stopPublish() {
    clearTimeout(this.reConnectTimer);
    if (this.shareScreen) {
      // // 关闭屏幕共享
      try {
        this.shareScreen.stopShareScreen();
      } catch (err) {
        console.log('关闭屏幕共享->失败', err.message);
      }
    }
    this.publishUrl = ''
  }

  //屏幕共享推流地址
  getPublishChannelInfo() {
    let channelInfo = {};
    channelInfo.owner = GlobalConfig.nodeId;//这个很重要,释放的时候必须设置为0,占用的时候设置为自己的nodeId
    channelInfo.status = ApeConsts.CHANNEL_STATUS_OPENING;
    channelInfo.fromNodeId = GlobalConfig.nodeId;
    channelInfo.channelId = this.channelId;
    channelInfo.streamId = this.streamId;
    channelInfo.classId = GlobalConfig.classId;
    channelInfo.siteId = GlobalConfig.siteId;
    channelInfo.toNodeId = 0;
    channelInfo.userId = GlobalConfig.userId;
    channelInfo.mediaType = ApeConsts.MEDIA_TYPE_SHARE;
    channelInfo.screenWidth = GlobalConfig.screenWidth;
    channelInfo.screenHeight = GlobalConfig.screenHeight;
    return channelInfo;
  }

  //默认的信息
  getDefaultChannelInfo() {
    let channelInfo = {};
    channelInfo.owner = 0;//这个很重要,释放的时候必须设置为0,占用的时候设置为自己的nodeId
    channelInfo.status = ApeConsts.CHANNEL_STATUS_RELEASED;
    channelInfo.fromNodeId = GlobalConfig.nodeId;
    channelInfo.channelId = this.channelId;
    channelInfo.streamId = ""
    channelInfo.classId = GlobalConfig.classId;
    channelInfo.siteId = GlobalConfig.siteId;
    channelInfo.toNodeId = 0;
    channelInfo.userId = GlobalConfig.userId;
    channelInfo.mediaType = ApeConsts.MEDIA_TYPE_SHARE;
    channelInfo.screenWidth = GlobalConfig.screenWidth;
    channelInfo.screenHeight = GlobalConfig.screenHeight;
    return channelInfo;
  }
}

export default ShareApe;