WebRtcApe.js 7.9 KB
//*
// WebRtc
// */
import Emiter from 'Emiter';
import Loger from "Loger";
import $ from "jquery";
import GlobalConfig from 'GlobalConfig';
import ApeConsts from './ApeConsts';
import EngineUtils from 'EngineUtils';
import MessageTypes from 'MessageTypes';
var AgoraRTC = require('../AgoraRTCSDK-1.12.0');
let loger = Loger.getLoger('WebRtcApe');

class WebRtcApe extends Emiter {
  constructor() {
    super();
    this.appId = 'eb253cc7b40c4a8b82f0a5b6f93c2ce0';
    this.appCertificate = "";
    this.appRecordingKey = "";

    this.channelKey=null;
    this.channelId = "";
    this.uid = 0;
    this.info = ""

    this.mode = "interop";
    this.client = null;
    this.localStream = null;
    this.cameras = [];
    this.microphones = [];
    this.curCamera = "";
    this.curMicrophone = "";
    this.videoResolution = "240P";
    this.isOpenVideo = true;

    this.localViewId = "";
    this.localStyle = "";

    this.remoteViewId = "";
    this.remoteStyle = "";

    this.invisibleViewId ="";
    this.invisibleStyle ="";

    this.xdyRemote = "xdy_remote";
    //webRtc sdk
    this.client = AgoraRTC.createClient({mode: this.mode});
    this.getDevices();
  }

  initApp(_params) {
    loger.log("初始化WebRtc");
    if (_params) {
      this.appId = _params.appId;
    }
    if (this.client) {
      this.client.init(this.appId, () => {
        loger.log("初始化WebRtc->成功");
      }, (err)=> {
        loger.error("初始化WebRtc->失败", err);

      });
      this.addEvent();
    }
  }

  addEvent() {
    loger.log("监听webRtc消息");
    if (!this.client) {
      loger.log("addEvent error:client is null");
      return;
    }
    this.channelKey = "";
    this.client.on('error', (err) => {
      loger.log("WebRtc异常:", err.reason);
      if (err.reason === 'DYNAMIC_KEY_TIMEOUT') {
        this.client.renewChannelKey(this.channelKey, ()=> {
          loger.log("Renew channel key successfully");
        }, (err)=> {
          loger.log("Renew channel key failed: ", err);
        });
      }
    });

    this.client.on('stream-added', (evt)=> {
      let stream = evt.stream;
      loger.log("New stream added: " + stream.getId());
      loger.log("Subscribe ", stream);
      this.client.subscribe(stream, (err)=> {
        loger.log("Subscribe stream failed", err);
      });
    });

    this.client.on('stream-subscribed', (evt)=> {
      let stream = evt.stream;
      loger.log("Subscribe remote stream successfully: " + stream.getId());
      if(GlobalConfig.getUserRoleFromeNodeId(stream.getId())==ApeConsts.invisible){
        //显示隐藏用户
        $(this.invisibleViewId).append('<div id="' + this.xdyRemote + stream.getId() + '" style="float:left; width:320px;height:240px;"></div>');
      }else {
        $(this.remoteViewId).append('<div id="' + this.xdyRemote + stream.getId() + '" style="float:left; width:320px;height:240px;"></div>');
      }
      stream.play('' + this.xdyRemote + stream.getId());
    });

    this.client.on('stream-removed', (evt)=> {
      let stream = evt.stream;
      stream.stop();
      $('#' + this.xdyRemote + stream.getId()).remove();
      loger.log("Remote stream is removed " + stream.getId());
    });

    this.client.on('peer-leave', (evt)=> {
      let stream = evt.stream;
      if (stream) {
        stream.stop();
        $('#' + this.xdyRemote + stream.getId()).remove();
        loger.log(evt.uid + " ->离开视频通话频道");
      }
    });
    this.client.on("active-speaker", (evt)=> {
      let uid = evt.uid;
      loger.log("当前正在讲话的uid:" + uid);
    });
  }

  joinChannel(_params) {
    this.channelId = _params.channelId||"";
    this.uid = parseInt(_params.uid)||0;
    this.info =_params.info || "";
    this.channelKey  = _params.channelKey||null;

    loger.log("加入视频通话频道->channelId:"+this.channelId,"uid:"+this.uid);
    this.client.join(this.channelKey , ""+this.channelId, this.uid, (uid)=> {
      this.uid = uid;
      loger.log("加入视频通话频道->成功->channelId:"+this.channelId,"uid:"+this.uid);
      this.openLoaclStream();
    }, (err)=> {
      loger.log("加入视频通话频道->失败->", err);
    });
  }

  openLoaclStream() {
    loger.log("摄像头", this.curCamera);
    loger.log("麦克风", this.curMicrophone);
    this.localStream = AgoraRTC.createStream({
      streamID: this.uid,
      audio: true,
      microphoneId: this.curMicrophone,
      cameraId: this.curCamera,
      video: this.isOpenVideo,
      screen: false
    });

    if (this.isOpenVideo) {
      this.localStream.setVideoProfile(this.videoResolution);
    }
  }

  leaveChannel() {
    loger.log("离开视频通话频道");
    if (!this.client) {
      return;
    }
    this.client.leaveChannel(() => {
      loger.log("Leavel channel successfully");
    }, (err)=> {
      loger.log("Leave channel failed");
    });
  }

  publish() {
    if (!this.client||!this.localStream) {
      return;
    }
    this.localStream.init(()=> {
      loger.log("webRtc->推流: ");
      let viewName = this.localViewId.replace("#", "");
      this.localStream.play(viewName);
      this.client.publish(this.localStream, (err)=> {
        loger.log("webRtc->推流失败: " + err);
        GlobalConfig.openCamera =0;
        GlobalConfig.openMicrophones =0;
      });
      GlobalConfig.openCamera = EngineUtils.creatTimestamp();
      GlobalConfig.openMicrophones = GlobalConfig.openCamera;

      this._emit(MessageTypes.USER_DEVICE_STATUS_CHAANGE, {
        nodeId: GlobalConfig.nodeId,
        userRole: GlobalConfig.userRole,
        userName: GlobalConfig.userName,
        userId: GlobalConfig.userId,
        openCamera: GlobalConfig.openCamera,
        openMicrophones: GlobalConfig.openMicrophones
      });

    }, (err)=> {
      loger.log("webRtc->推流->本地流开启失败", err);
    });
  }

  unpublish() {
    loger.log("webRtc->停止推流 ");
    if (!this.client||!this.localStream) {
      return;
    }
    this.client.unpublish(this.localStream, (err)=> {
      loger.log("webRtc->停止推流->失败" + err);
    });
    this.localStream.close();
    $(this.localViewId).html("");
    GlobalConfig.openCamera =0;
    GlobalConfig.openMicrophones =0;
    this._emit(MessageTypes.USER_DEVICE_STATUS_CHAANGE, {
      nodeId: GlobalConfig.nodeId,
      userRole: GlobalConfig.userRole,
      userName: GlobalConfig.userName,
      userId: GlobalConfig.userId,
      openCamera: GlobalConfig.openCamera,
      openMicrophones: GlobalConfig.openMicrophones
    });
  }

  /*
   * 设置本地回显视图
   * */
  setLoaclView(_params) {
    loger.log("设置本地回显视图");
    this.localViewId = _params.divId||"";;
    this.localStyle = _params.styleStr||"";;
  }

  /*
   * 设置其他人的video视图容器
   * */
  setRemoteView(_params) {
    loger.log("设置其他人的video视图容器");
    this.remoteViewId = _params.divId||"";
    this.remoteStyle = _params.styleStr||"";
  }

  /*
   * 设置隐藏用户的video视图容器
   * */
  setInvisibleMediaView(_params) {
    loger.log("设置隐藏用户的video视图容器");
    this.invisibleViewId = _params.divId||"";
    this.invisibleStyle = _params.styleStr||"";
  }

  getDevices(_params,_callback) {
    AgoraRTC.getDevices((devices)=> {
      console.log("devices", devices)
      for (let i = 0; i < devices.length; i++) {
        let device = devices[i];
        if (device.kind === 'audioinput') {
          this.microphones.push(device);
        } else if (device.kind === 'videoinput') {
          this.cameras.push(device);
        } else {
          loger.warn('未知的设备: ', device);
        }
      }
      if (this.cameras && this.cameras.length > 0) {
        this.curCamera = this.cameras[0].deviceId || "";
      }
      if (this.microphones && this.microphones.length > 0) {
        this.curMicrophone = this.microphones[0].deviceId || "";
      }
      if(_callback){
        _callback({cameras:this.cameras,microphones:this.microphones});
      }
    });
  }
}
export default new WebRtcApe;