李勇
ab6cd16f 1 parent 1fa8bde7 webRtc-dev ... 20170922-1 20171019-1 20171120-1w dev ly20170731-1 ly20170731-2 ly20170801-2 ly20170802-1 ly20170818-1 ly20170818-2 ly20170820-1 ly20170821-1 ly20170824-1 ly20170829-1 ly20170925-1 ly20170926-1 ly20170927-1 ly20170929-1 ly20171011-1 ly20171013-1 ly20171013-2 ly20171016-1 ly20171021-1 ly20171023-1 ly20171024-1w ly20171025-1w ly20171026-1w ly20171027-1w ly20171030-1 ly20171030-2w ly20171107-1 ly20171110-1w ly20171113-1w ly20171204-1w ly20171208-1w ly20171211-1w ly20171211-2w ly20171214-1w v2.38.13.20171216 v2.38.11.20171214 v2.38.3.201712011 v2.38.1.201712011 v2.36.11.20171204 v2.36.8.20171206 v2.36.4.20171201 v2.35.11.20171130 v2.34.16.20171128 v2.34.5.20171127 v2.33.6.20171123 v2.32.1.20171123 v2.31.12.20171122 v2.31.10.20171122 v2.30.5.20171117 v2.30.2.20171117 v2.29.5.20171114 v2.28.1.20171110 v2.27.11.20171109 v2.26.9.20171107 v2.26.6.20171103 v2.26.2.20171102 v2.25.7.20171031 v2.25.6.20171031 v2.25.0.20171030 v2.24.2.20171030 v2.23.0.20171030 v2.22.7.20171026 v2.20.5.20171023 v2.20.0.20171021 v2.19.8.20171020 v2.18.14.20171020 v2.18.10.20171019 v2.17.11.20171014 v2.16.8.20171012 v2.16.5.20171012 v2.15.5.20171001 v2.15.3.20170929 v2.14.5.20170927 v2.13.5.20170927 v2.12.14.20170927 v2.12.8.20170926 v2.12.6.20170925 v2.11.13.20170925 v2.10.7.20170921 v2.10.6.20170921 v2.10.5.20170920 v2.10.4.20170920 v2.9.3.20170919 v2.8.17.20170918 v2.8.8.20170917 v2.8.2.20170916 v2.6.2.20170915 v2.5.12.20170915 v2.5.6.20170914 v2.5.5.20170914 v2.4.4.20170908 v2.4.2.20170908 v2.4.0.20170907 v2.3.6.20170907 v2.2.16.20170905 v2.1.22.20170904 v1.84.0.20170912 v1.83.2.20170831 v1.82.11.20170829 v1.81.19.20170828 v1.80.2.20170824 v1.79.6.20170822 v1.79.5.20170821 v1.79.4.20170821 v1.79.3.20170821 v1.78.4.20170820 v1.77.4.20170819 v1.76.2.20170818 v1.75.0.20170815 v1.74.0.20170814 v1.73.2.20170814 v1.73.1.20170814 v1.71.0.20170813 v1.70.5.20170812 v1.68.2.20170812 v1.66.1.20170809 v1.65.25.20170808 v1.65.24.20170806 v1.63.1.20170731 v1.62.3.20170731 v1.61.0.20170729 v1.60.0.20170729

增加MS地址无效时的判断

... ... @@ -35,7 +35,7 @@ import QuestionApe from 'apes/QuestionApe';
import UTF8 from 'utf-8';
let loger = Loger.getLoger('McuClient');
let _sdkInfo = {"version": "v1.59.0.20170729", "author": "www.3mang.com"};
let _sdkInfo = {"version": "v1.60.0.20170729", "author": "www.3mang.com"};
//APE
let _sass;
... ... @@ -907,6 +907,21 @@ export default class MessageEntrance extends Emiter {
loger.warn('HLS拉流地址->HLS->', GlobalConfig.MS_PLAY_HLS_IP, GlobalConfig.MS_PLAY_HLS_PORT);
loger.warn('HLS录制回放拉流地址->HLS->', GlobalConfig.RS_RECORD_PLAY_IP, GlobalConfig.RS_RECORD_PLAY_PORT);
if(!GlobalConfig.MS_PUBLISH_IP){
loger.error("推流MS地址地址无效");
}
if(!GlobalConfig.MS_PLAY_RTMP_IP){
loger.warn("RTMP拉流地址无效->使用推流地址作为RTMP拉流地址");
GlobalConfig.MS_PLAY_RTMP_IP=GlobalConfig.MS_PUBLISH_IP;
GlobalConfig.MS_PLAY_RTMP_PORT=GlobalConfig.MS_PUBLISH_PORT
}
if(!GlobalConfig.MS_PLAY_HLS_IP){
loger.warn("HLS拉流地址无效->使用HLS回放地址作为HLS拉流地址");
GlobalConfig.MS_PLAY_HLS_IP=GlobalConfig.MS_PLAY_HLS_PORT;
GlobalConfig.RS_RECORD_PLAY_IP=GlobalConfig.RS_RECORD_PLAY_PORT
}
if (_mcu) {
_mcu.joinMCU(GlobalConfig.getClassInfo());
}
... ...
... ... @@ -11,299 +11,308 @@ import EngineUtils from 'EngineUtils';
let loger = Loger.getLoger('MediaModule');
class MediaModule {
constructor() {
this.needPublishMediaChannel={};//记录准备推流的频道信息
this.mediaChannels = {};
this.maxMediaChannel=0;
this.mediaType=ApeConsts.MEDIA_TYPE_DEFAULT;
this.MEDIA_OBJ_TABLE_ID=0;
this.SCREENSHARING_OBJ_TABLE_ID=ApeConsts.SCREENSHARING_OBJ_TABLE_ID;
constructor() {
this.needPublishMediaChannel = {};//记录准备推流的频道信息
this.mediaChannels = {};
this.maxMediaChannel = 0;
this.mediaType = ApeConsts.MEDIA_TYPE_DEFAULT;
this.MEDIA_OBJ_TABLE_ID = 0;
this.SCREENSHARING_OBJ_TABLE_ID = ApeConsts.SCREENSHARING_OBJ_TABLE_ID;
}
//获取播流地址
getMediaPlayPath(_param) {
loger.log('获取播放地址->');
if (_param == null || _param.streamId == null) {
loger.warn('获取播放地址->参数错误', _param);
//this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return {"code": ApeConsts.RETURN_FAILED, "data": ""};
}
//获取播流地址
getMediaPlayPath(_param) {
loger.log('获取播放地址->');
if (_param == null||_param.streamId == null)
{
loger.warn('获取播放地址->参数错误', _param);
//this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return {"code": ApeConsts.RETURN_FAILED, "data": ""};
}
let path = "";
let port="";
let fileName='';
if (_param.type == "m3u8") {
//M3U8
//http://123.56.73.119:6001/live/h5dev_2106728010_8ab3b0ed5a3a9220015a3a958f0d0003_983041_1489113860/index.m3u8
if(GlobalConfig.siteId==GlobalConfig.siteId_letv){
//乐视的hls地址规则
fileName='desc.m3u8';
}else {
//fileName='index.m3u8';
fileName='playlist.m3u8';
}
port = (GlobalConfig.MS_PLAY_HLS_PORT == "" || GlobalConfig.MS_PLAY_HLS_PORT == null) ? "":":" + GlobalConfig.MS_PLAY_HLS_PORT;
path = "http://" + GlobalConfig.MS_PLAY_HLS_IP
+ port + "/live/"
+ _param.streamId
+ ".m3u8";//
//+ "/"+fileName;//
} else {
//RTMP
port = (GlobalConfig.MS_PLAY_RTMP_PORT == "" || GlobalConfig.MS_PLAY_RTMP_PORT == null) ? "":":" + GlobalConfig.MS_PLAY_RTMP_PORT;
path = "rtmp://" + GlobalConfig.MS_PLAY_RTMP_IP
+ port + "/live/"
+ _param.streamId;
}
path=path.replace("::",":");//如果ip和port之间有多的:需要去掉
return {"code": ApeConsts.RETURN_SUCCESS, "data": "","playUrl": path};
let path = "";
let port = "";
let fileName = '';
if (_param.type == "m3u8") {
//M3U8
if (!GlobalConfig.MS_PLAY_HLS_IP) {
loger.error("HLS拉流地址地址无效");
}
//http://123.56.73.119:6001/live/h5dev_2106728010_8ab3b0ed5a3a9220015a3a958f0d0003_983041_1489113860/index.m3u8
if (GlobalConfig.siteId == GlobalConfig.siteId_letv) {
//乐视的hls地址规则
fileName = 'desc.m3u8';
} else {
//fileName='index.m3u8';
fileName = 'playlist.m3u8';
}
port = (GlobalConfig.MS_PLAY_HLS_PORT == "" || GlobalConfig.MS_PLAY_HLS_PORT == null) ? "" : ":" + GlobalConfig.MS_PLAY_HLS_PORT;
path = "http://" + GlobalConfig.MS_PLAY_HLS_IP
+ port + "/live/"
+ _param.streamId
+ ".m3u8";//
//+ "/"+fileName;//
} else {
//RTMP
if (!GlobalConfig.MS_PLAY_RTMP_IP) {
loger.error("RTMP拉流地址地址无效");
}
port = (GlobalConfig.MS_PLAY_RTMP_PORT == "" || GlobalConfig.MS_PLAY_RTMP_PORT == null) ? "" : ":" + GlobalConfig.MS_PLAY_RTMP_PORT;
path = "rtmp://" + GlobalConfig.MS_PLAY_RTMP_IP
+ port + "/live/"
+ _param.streamId;
}
//获取录制回放时点播的地址,只有m3u8
getMediaRecordPlaybackPath(_param) {
loger.log('获取录制回放时点播的地址->m3u8');
if (_param == null||_param.streamId == null)
{
loger.warn('获取录制回放时点播的地址->参数错误', _param);
return {"code": ApeConsts.RETURN_FAILED, "data": ""};
}
//M3U8 http://123.56.73.119:6001/live/h5dev_2106728010_8ab3b0ed5a3a9220015a3a958f0d0003_983041_1489113860/total.m3u8
let port = (GlobalConfig.RS_RECORD_PLAY_PORT == "" || GlobalConfig.RS_RECORD_PLAY_PORT == null) ? "":":" + GlobalConfig.RS_RECORD_PLAY_PORT;
let path = "http://" + GlobalConfig.RS_RECORD_PLAY_IP
+ port + "/live/"
+ _param.streamId
+ "/total.m3u8";
path=path.replace("::",":");//如果ip和port之间有多的:需要去掉
return {"code": ApeConsts.RETURN_SUCCESS, "data": "","playUrl": path};
}
path = path.replace("::", ":");//如果ip和port之间有多的:需要去掉
return {"code": ApeConsts.RETURN_SUCCESS, "data": "", "playUrl": path};
}
//获取推流地址
getMediaPublishPath(_param) {
loger.log('获取推流地址->');
//判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启
let freeChannel = this.getFreeMediaChannel();
if (freeChannel == 0) {
return {"code":ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备","mediaChannels":this.mediaChannels};
}
//默认方式推流
let pubType="live";
////flash推流
//if(_param&&_param.type=="flash"){
// pubType ="flash";
//}
//端口,有端口就显示 ":xxx",没有端口就是""
let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "":":" + GlobalConfig.MS_PUBLISH_PORT;
//时间戳
let timestamp = EngineUtils.creatTimestamp();
let streamId=GlobalConfig.siteId+"_"
+ GlobalConfig.classId + "_"+GlobalConfig.userId
+"_" + freeChannel + "_" + timestamp;
//生成推流地址和推流数据(同步数据的时候用)
let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP
+ port + "/"+pubType+"/" +streamId;
publishUrl=publishUrl.replace("::",":");//如果ip和port之间有多的:需要去掉
this.needPublishMediaChannel[publishUrl]={
"channelId":freeChannel,
"publishUrl":publishUrl,
"streamId":streamId,
"timestamp":timestamp,
"nodeId":GlobalConfig.nodeId
};
return {"code": ApeConsts.RETURN_SUCCESS,
"data":"",
"mediaId":freeChannel,
"userId":GlobalConfig.userId,
"userName":GlobalConfig.userName,
"userRole":GlobalConfig.userRole,
"publishUrl": publishUrl
};
//获取录制回放时点播的地址,只有m3u8
getMediaRecordPlaybackPath(_param) {
loger.log('获取录制回放时点播的地址->m3u8');
if (_param == null || _param.streamId == null) {
loger.warn('获取录制回放时点播的地址->参数错误', _param);
return {"code": ApeConsts.RETURN_FAILED, "data": ""};
}
//监课获取推流地址
getMediaPublishPathForInVisible(_param) {
let mediaLen=Object.keys(MediaModule.allMediaChannelsList).length;
let freeChannel=(this.MEDIA_OBJ_TABLE_ID-20-mediaLen)||GlobalConfig.nodeId;
loger.log('监课获取推流地址->'+freeChannel+" mediaLen:"+mediaLen);
//默认方式推流
let pubType="live";
////flash推流
//if(_param&&_param.type=="flash"){
// pubType ="flash";
//}
//端口,有端口就显示 ":xxx",没有端口就是""
let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "":":" + GlobalConfig.MS_PUBLISH_PORT;
//时间戳
let timestamp = EngineUtils.creatTimestamp();
let streamId=GlobalConfig.siteId+"_"
+ GlobalConfig.classId + "_"+GlobalConfig.userId
+"_" + freeChannel + "_" + timestamp;
//生成推流地址和推流数据(同步数据的时候用)
let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP
+ port + "/"+pubType+"/" +streamId;
publishUrl=publishUrl.replace("::",":");//如果ip和port之间有多的:需要去掉
this.needPublishMediaChannel[publishUrl]={
"channelId":freeChannel,
"publishUrl":publishUrl,
"streamId":streamId,
"timestamp":timestamp,
"nodeId":GlobalConfig.nodeId
};
return {"code": ApeConsts.RETURN_SUCCESS,
"data":"",
"userId":GlobalConfig.userId,
"userName":GlobalConfig.userName,
"userRole":GlobalConfig.userRole,
"mediaId":freeChannel,
"publishUrl": publishUrl
};
//M3U8 http://123.56.73.119:6001/live/h5dev_2106728010_8ab3b0ed5a3a9220015a3a958f0d0003_983041_1489113860/total.m3u8
let port = (GlobalConfig.RS_RECORD_PLAY_PORT == "" || GlobalConfig.RS_RECORD_PLAY_PORT == null) ? "" : ":" + GlobalConfig.RS_RECORD_PLAY_PORT;
let path = "http://" + GlobalConfig.RS_RECORD_PLAY_IP
+ port + "/live/"
+ _param.streamId
+ "/total.m3u8";
path = path.replace("::", ":");//如果ip和port之间有多的:需要去掉
return {"code": ApeConsts.RETURN_SUCCESS, "data": "", "playUrl": path};
}
//获取推流地址
getMediaPublishPath(_param) {
loger.log('获取推流地址->');
//判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启
let freeChannel = this.getFreeMediaChannel();
if (freeChannel == 0) {
return {"code": ApeConsts.RETURN_FAILED, "data": "不能再打开更多的设备", "mediaChannels": this.mediaChannels};
}
//桌面共享获取推流地址,频道号由外部传入
getMediaPublishPathForScreenShare(_shareChannel,_publishType) {
let shareChannel=_shareChannel||this.SCREENSHARING_OBJ_TABLE_ID;
loger.log('桌面共享获取推流地址->'+shareChannel);
//默认方式推流
let pubType="live";//统一使用live 20170615
/*//flash推流
if(_publishType=="live"){
pubType ="live";
}*/
//端口,有端口就显示 ":xxx",没有端口就是""
let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "":":" + GlobalConfig.MS_PUBLISH_PORT;
//时间戳
let timestamp = EngineUtils.creatTimestamp();
let streamId=GlobalConfig.siteId+"_"
+ GlobalConfig.classId + "_"+GlobalConfig.userId
+"_" + shareChannel + "_" + timestamp;
//生成推流地址和推流数据(同步数据的时候用)
let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP
+ port + "/"+pubType+"/" +streamId;
publishUrl=publishUrl.replace("::",":");//如果ip和port之间有多的:需要去掉
/* this.needPublishMediaChannel[publishUrl]={
"channelId":shareChannel,
"publishUrl":publishUrl,
"streamId":streamId,
"timestamp":timestamp,
"nodeId":GlobalConfig.nodeId
};*/
return {"code": ApeConsts.RETURN_SUCCESS,
"data":"",
"mediaId":shareChannel,
"userId":GlobalConfig.userId,
"userName":GlobalConfig.userName,
"userRole":GlobalConfig.userRole,
"publishUrl": publishUrl,
"streamId":streamId
};
}
//默认方式推流
let pubType = "live";
//获取当前空闲的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) {
loger.log("已获取空闲的通道->channelId:"+item.channelId);
return item.channelId;
}
counter++;
}
loger.log("获取空闲的通道","mediaChannels",this.mediaChannels,"counter:",counter);
//loger.log(this.mediaChannels);
if (counter < this.maxMediaChannel) {
return this.MEDIA_OBJ_TABLE_ID + (counter);
}
return 0;//没有空闲的
if (!GlobalConfig.MS_PUBLISH_IP) {
loger.error("MS推流地址地址无效");
}
//获取准备推流的频道信息
getNeedPublishMediaChannel(_publishUrl){
return this.needPublishMediaChannel[_publishUrl];
//端口,有端口就显示 ":xxx",没有端口就是""
let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "" : ":" + GlobalConfig.MS_PUBLISH_PORT;
//时间戳
let timestamp = EngineUtils.creatTimestamp();
let streamId = GlobalConfig.siteId + "_"
+ GlobalConfig.classId + "_" + GlobalConfig.userId
+ "_" + freeChannel + "_" + timestamp;
//生成推流地址和推流数据(同步数据的时候用)
let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP
+ port + "/" + pubType + "/" + streamId;
publishUrl = publishUrl.replace("::", ":");//如果ip和port之间有多的:需要去掉
this.needPublishMediaChannel[publishUrl] = {
"channelId": freeChannel,
"publishUrl": publishUrl,
"streamId": streamId,
"timestamp": timestamp,
"nodeId": GlobalConfig.nodeId
};
return {
"code": ApeConsts.RETURN_SUCCESS,
"data": "",
"mediaId": freeChannel,
"userId": GlobalConfig.userId,
"userName": GlobalConfig.userName,
"userRole": GlobalConfig.userRole,
"publishUrl": publishUrl
};
}
//监课获取推流地址
getMediaPublishPathForInVisible(_param) {
let mediaLen = Object.keys(MediaModule.allMediaChannelsList).length;
let freeChannel = (this.MEDIA_OBJ_TABLE_ID - 20 - mediaLen) || GlobalConfig.nodeId;
loger.log('监课获取推流地址->' + freeChannel + " mediaLen:" + mediaLen);
//默认方式推流
let pubType = "live";
////flash推流
//if(_param&&_param.type=="flash"){
// pubType ="flash";
//}
//端口,有端口就显示 ":xxx",没有端口就是""
let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "" : ":" + GlobalConfig.MS_PUBLISH_PORT;
//时间戳
let timestamp = EngineUtils.creatTimestamp();
let streamId = GlobalConfig.siteId + "_"
+ GlobalConfig.classId + "_" + GlobalConfig.userId
+ "_" + freeChannel + "_" + timestamp;
//生成推流地址和推流数据(同步数据的时候用)
let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP
+ port + "/" + pubType + "/" + streamId;
publishUrl = publishUrl.replace("::", ":");//如果ip和port之间有多的:需要去掉
this.needPublishMediaChannel[publishUrl] = {
"channelId": freeChannel,
"publishUrl": publishUrl,
"streamId": streamId,
"timestamp": timestamp,
"nodeId": GlobalConfig.nodeId
};
return {
"code": ApeConsts.RETURN_SUCCESS,
"data": "",
"userId": GlobalConfig.userId,
"userName": GlobalConfig.userName,
"userRole": GlobalConfig.userRole,
"mediaId": freeChannel,
"publishUrl": publishUrl
};
}
//桌面共享获取推流地址,频道号由外部传入
getMediaPublishPathForScreenShare(_shareChannel, _publishType) {
let shareChannel = _shareChannel || this.SCREENSHARING_OBJ_TABLE_ID;
loger.log('桌面共享获取推流地址->' + shareChannel);
//默认方式推流
let pubType = "live";//统一使用live 20170615
/*//flash推流
if(_publishType=="live"){
pubType ="live";
}*/
//端口,有端口就显示 ":xxx",没有端口就是""
let port = (GlobalConfig.MS_PUBLISH_PORT == "" || GlobalConfig.MS_PUBLISH_PORT == null) ? "" : ":" + GlobalConfig.MS_PUBLISH_PORT;
//时间戳
let timestamp = EngineUtils.creatTimestamp();
let streamId = GlobalConfig.siteId + "_"
+ GlobalConfig.classId + "_" + GlobalConfig.userId
+ "_" + shareChannel + "_" + timestamp;
//生成推流地址和推流数据(同步数据的时候用)
let publishUrl = "rtmp://" + GlobalConfig.MS_PUBLISH_IP
+ port + "/" + pubType + "/" + streamId;
publishUrl = publishUrl.replace("::", ":");//如果ip和port之间有多的:需要去掉
/* this.needPublishMediaChannel[publishUrl]={
"channelId":shareChannel,
"publishUrl":publishUrl,
"streamId":streamId,
"timestamp":timestamp,
"nodeId":GlobalConfig.nodeId
};*/
return {
"code": ApeConsts.RETURN_SUCCESS,
"data": "",
"mediaId": shareChannel,
"userId": GlobalConfig.userId,
"userName": GlobalConfig.userName,
"userRole": GlobalConfig.userRole,
"publishUrl": publishUrl,
"streamId": streamId
};
}
//获取当前空闲的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) {
loger.log("已获取空闲的通道->channelId:" + item.channelId);
return item.channelId;
}
counter++;
}
//获取当前属于nodeId的已经打开的的channel,返回值为0代表没有打开的,否则返回的就是打开的channelId
getOpeningMediaChannelForNodeId(_nodeId){
loger.log("getOpeningMediaChannel","nodeId",_nodeId,"mediaChannels:",this.mediaChannels);
let channelInfo={};
channelInfo.channelId=0;
if(_nodeId==null||_nodeId==0){
return channelInfo;
}
for (let key in this.mediaChannels) {
let item = this.mediaChannels[key];
if (item && item.status == ApeConsts.CHANNEL_STATUS_OPENING&&item.fromNodeId==_nodeId) {
return item;
}
}
return channelInfo;
loger.log("获取空闲的通道", "mediaChannels", this.mediaChannels, "counter:", counter);
//loger.log(this.mediaChannels);
if (counter < this.maxMediaChannel) {
return this.MEDIA_OBJ_TABLE_ID + (counter);
}
//检查频道是否已经被占用
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;
return 0;//没有空闲的
}
//获取准备推流的频道信息
getNeedPublishMediaChannel(_publishUrl) {
return this.needPublishMediaChannel[_publishUrl];
}
//获取当前属于nodeId的已经打开的的channel,返回值为0代表没有打开的,否则返回的就是打开的channelId
getOpeningMediaChannelForNodeId(_nodeId) {
loger.log("getOpeningMediaChannel", "nodeId", _nodeId, "mediaChannels:", this.mediaChannels);
let channelInfo = {};
channelInfo.channelId = 0;
if (_nodeId == null || _nodeId == 0) {
return channelInfo;
}
//获取当前所有频道的信息
getAllMediaChannelInfo(){
let channels=[];
for (let key in this.mediaChannels){
let channel=this.mediaChannels[key];
if(channel){
channels.push({"mediaId":channel.channelId,"status":channel.status,"fromNodeId":channel.fromNodeId});
}
}
if(channels.length<this.maxMediaChannel){
for (let i=channels.length;i<this.maxMediaChannel;i++){
let channelId=this.MEDIA_OBJ_TABLE_ID + (i);
channels.push({"mediaId":channelId,"status":ApeConsts.CHANNEL_STATUS_RELEASED,"fromNodeId":0});
}
}
return channels;
for (let key in this.mediaChannels) {
let item = this.mediaChannels[key];
if (item && item.status == ApeConsts.CHANNEL_STATUS_OPENING && item.fromNodeId == _nodeId) {
return item;
}
}
return channelInfo;
}
//检查频道是否已经被占用
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;
}
//获取当前所有频道的信息
getAllMediaChannelInfo() {
let channels = [];
for (let key in this.mediaChannels) {
let channel = this.mediaChannels[key];
if (channel) {
channels.push({"mediaId": channel.channelId, "status": channel.status, "fromNodeId": channel.fromNodeId});
}
}
//获取默认的频道信息
getDefaultChannelInfo(){
let channelInfo={};
channelInfo.owner=0;//这个很重要,释放的时候必须设置为0,占用的时候设置为自己的nodeId
channelInfo.status=ApeConsts.CHANNEL_STATUS_RELEASED;
channelInfo.fromNodeId=GlobalConfig.nodeId;
channelInfo.channelId=0;//channelId不能为0
channelInfo.streamId="";
channelInfo.classId=GlobalConfig.classId;
channelInfo.siteId=GlobalConfig.siteId;
channelInfo.toNodeId=0;
channelInfo.userId=GlobalConfig.userId;
channelInfo.mediaType=this.mediaType||ApeConsts.MEDIA_TYPE_DEFAULT;
return channelInfo;
if (channels.length < this.maxMediaChannel) {
for (let i = channels.length; i < this.maxMediaChannel; i++) {
let channelId = this.MEDIA_OBJ_TABLE_ID + (i);
channels.push({"mediaId": channelId, "status": ApeConsts.CHANNEL_STATUS_RELEASED, "fromNodeId": 0});
}
}
return channels;
}
//获取默认的频道信息
getDefaultChannelInfo() {
let channelInfo = {};
channelInfo.owner = 0;//这个很重要,释放的时候必须设置为0,占用的时候设置为自己的nodeId
channelInfo.status = ApeConsts.CHANNEL_STATUS_RELEASED;
channelInfo.fromNodeId = GlobalConfig.nodeId;
channelInfo.channelId = 0;//channelId不能为0
channelInfo.streamId = "";
channelInfo.classId = GlobalConfig.classId;
channelInfo.siteId = GlobalConfig.siteId;
channelInfo.toNodeId = 0;
channelInfo.userId = GlobalConfig.userId;
channelInfo.mediaType = this.mediaType || ApeConsts.MEDIA_TYPE_DEFAULT;
return channelInfo;
}
}
MediaModule.allMediaChannelsList={};//当前已经创建的所有音视频通道(包含释放或未未释放的)
MediaModule.allMediaChannelsList = {};//当前已经创建的所有音视频通道(包含释放或未未释放的)
export default MediaModule;
... ...