MediaModule.js 5.3 KB
// //////////////////////////////////////////////////////////////////////////////
//  VideoApe、AudioApe 共用的方法单独提取处理
// //////////////////////////////////////////////////////////////////////////////

import ApeConsts from './ApeConsts';
import Loger from 'Loger';
import MessageTypes from 'MessageTypes';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';

let loger = Loger.getLoger('MediaModule');

class MediaModule {
    constructor() {
        this.mediaChannels = {};
        this.maxMediaChannel=0;
        this.MEDIA_OBJ_TABLE_ID=0;
    }

    //获取播流地址
    getMediaPlayPath(_param) {
        loger.log('getMediaPlayPath');
        if (_param == null||_param.siteId == null||
            _param.classId == null||_param.userId == null||
            _param.channelId == null|| _param.timestamp==null)
        {
            loger.warn('getMediaPlayPath,参数错误', _param);
            this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
            return {"code": 1, "data": ""};
        }

        let path = "";
        let port="";
        if (_param.type == "m3u8") {
            //M3U8
            //http://123.56.73.119:6001/hls/h5dev_403074980_0_983041_1487663265/index.m3u8
            port = (GlobalConfig.RSServerPort == "" || GlobalConfig.RSServerPort == null) ? "":":" + GlobalConfig.RSServerPort;
            path = "http://" + GlobalConfig.RSServerIP
                + port + "/live/"
                + _param.siteId
                + "_" + _param.classId
                + "_" + _param.userId
                + "_" + _param.channelId
                + "_" + _param.timestamp
                + "/index.m3u8";
        } else {
            port = (GlobalConfig.MSServerPort == "" || GlobalConfig.MSServerPort == null) ? "":":" + GlobalConfig.MSServerPort;
            path = "rtmp://" + GlobalConfig.MSServerIP
                + port + "/live/"
                + _param.siteId
                + "_" + _param.classId
                + "_" + _param.userId
                + "_" + _param.channelId
                + "_" + _param.timestamp;
        }
        return {"code": 0, "data": path};
    }

    //获取推流地址
    getMediaPublishPath(_param) {
        loger.log('getMediaPublishPath');
        //判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启
        let freeChannel = this.getFreeMediaChannel();
        if (freeChannel == 0) {
            return {"code": 1, "data": "不能再打开更多的设备"};
        }

        //默认方式推流
        let pubType="live";
        //flash推流
        if(_param&&_param.type=="flash"){
            pubType ="flash";
        }

        //端口,有端口就显示 ":xxx",没有端口就是""
        let port = (GlobalConfig.MSServerPort == "" || GlobalConfig.MSServerPort == null) ? "":":" + GlobalConfig.MSServerPort;
        //时间戳
        let timestamp = EngineUtils.creatTimestamp();

        //生成推流地址和推流数据(同步数据的时候用)
        let publishUrl = "rtmp://" + GlobalConfig.MSServerIP
            + port + "/"+pubType+"/" +GlobalConfig.siteId+"_"
            + GlobalConfig.classId + "_"+GlobalConfig.userId
            +"_" + freeChannel + "_" + timestamp;
        return {"code": 0,
                "data":
                    {   "siteId":GlobalConfig.siteId,
                        "classId":GlobalConfig.classId,
                        "userId":GlobalConfig.userId,
                        "channelId": freeChannel,
                        "timestamp": timestamp,
                        "publishUrl": publishUrl
                    }
        };
    }

    //获取当前空闲的channel,返回值为0代表没有空闲的,否则返回的就是空闲的channelId
    getFreeMediaChannel() {
        let counter = 0;
        for (let key in this.mediaChannels) {
            let item = this.mediaChannels[key];
            if (item && item.status == ApeConsts.CHANNEL_STATUS_RELEASED) {
                return item.channelId;
            }
            counter++;
        }
        loger.log("getFreeMediaChannel","maxMediaChannel",this.maxMediaChannel,"counter:",counter);
        console.log(this.mediaChannels);
        if (counter < this.maxMediaChannel) {
            return this.MEDIA_OBJ_TABLE_ID + (counter);
        }
        return 0;//没有空闲的
    }

    //获取当前属于nodeId的已经打开的的channel,返回值为0代表没有打开的,否则返回的就是打开的channelId
    getOpeningMediaChannel(_nodeId){
        if(_nodeId==null||_nodeId==0){
            return 0;
        }
        for (let key in this.mediaChannels) {
            let item = this.mediaChannels[key];
            if (item && item.status == ApeConsts.CHANNEL_STATUS_OPENING&&item.fromNodeId==_nodeId) {
                return item.channelId;
            }
        }
        return 0;
    }

    //检查频道是否已经被占用
    checkChannelIsOpening(_channelId){
        if(_channelId==null){
            loger.warn("checkChannelIsOpening error,channel=",_channelId);
            return true;
        }
        let channelInfo=this.mediaChannels[_channelId];
        if(channelInfo==null||channelInfo.status==ApeConsts.CHANNEL_STATUS_RELEASED){
            return false;
        }
        return true;
    }
}

export default MediaModule;