ShareApe.js 6.9 KB
// //////////////////////////////////////////////////////////////////////////////
//视频模块
// //////////////////////////////////////////////////////////////////////////////
import Loger from 'Loger';
import MessageTypes from 'MessageTypes';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
import ShareScreen from 'ss'
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='';//rtmp://123.56.205.116/live/alexwang
        this.isConnect=false;
        //this.shareScreen=new ShareScreen();
        this.shareScreen=ShareScreen;
        this.ip='127.0.0.1';
        this.port=8090;
        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 成功
            console.log('屏幕共享开始开启');
            this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_SUCCESS);
        })
        // 屏幕共享关闭
        this.shareScreen.on(ShareScreen.SS_STOP, () => {
            //调用startShareScreen 失败
            console.log('屏幕共享开启失败');
            this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_FAILE);
        })

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

        })

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

        // 服务开启
        this.shareScreen.on(ShareScreen.OPEN, () => {
            console.log('屏幕共享服务开启-OPEN');
            this.isConnect=true;
            this._emit(MessageTypes.PUBLISH_SCREEN_SHARE_CONNECTED);
            //连接成功
            // 发起屏幕共享[推送地址可选]
            this.sendPublishRequest();
        })
    }
     // 连接本地流媒体服务
    startConnectSocket(){
        clearTimeout(this.reConnectTimer);
        if(!this.isConnect){
            console.log('开始连接本地流媒体服务->');
            this.shareScreen.start(this.ip, this.port);
        }
    }

    //屏幕共享推流,如果没有连接需要先建立连接
    publish(_result){
       /* return {"code": ApeConsts.RETURN_SUCCESS,
            "data":"",
            "mediaId":shareChannel,
            "publishUrl": publishUrl,
            "streamId":streamId
        };*/
        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;