李勇

修改拉流地址的规则->直播课堂和移动设备的时候需要选择Sass配置的videoCDNAddr中的地址

此 diff 太大无法显示。
@@ -30,11 +30,11 @@ import MediaModule from 'apes/MediaModule'; @@ -30,11 +30,11 @@ import MediaModule from 'apes/MediaModule';
30 import MediaSharedApe from 'apes/MediaSharedApe'; 30 import MediaSharedApe from 'apes/MediaSharedApe';
31 import MusicSharedApe from 'apes/MusicSharedApe'; 31 import MusicSharedApe from 'apes/MusicSharedApe';
32 import QuestionApe from 'apes/QuestionApe'; 32 import QuestionApe from 'apes/QuestionApe';
33 - 33 +import mdetect from "mdetect";
34 import UTF8 from 'utf-8'; 34 import UTF8 from 'utf-8';
35 35
36 let loger = Loger.getLoger('McuClient'); 36 let loger = Loger.getLoger('McuClient');
37 -let _sdkInfo = { "version": "v1.37.3.20170627", "author": "www.3mang.com" }; 37 +let _sdkInfo = { "version": "v1.38.4.20170629", "author": "www.3mang.com" };
38 38
39 //APE 39 //APE
40 let _sass; 40 let _sass;
@@ -58,7 +58,14 @@ export default class MessageEntrance extends Emiter { @@ -58,7 +58,14 @@ export default class MessageEntrance extends Emiter {
58 super(); 58 super();
59 //sdk 信息 59 //sdk 信息
60 this.sdkInfo = _sdkInfo; 60 this.sdkInfo = _sdkInfo;
61 - loger.log(this.sdkInfo); 61 + loger.warn(this.sdkInfo);
  62 + //检查是否是移动端
  63 + GlobalConfig.isMobile=mdetect.isMobileUA();
  64 + if( GlobalConfig.isMobile){
  65 + loger.warn("当前设备是移动设备");
  66 + }else {
  67 + loger.warn("当前设备是PC");
  68 + }
62 69
63 //初始化状态 70 //初始化状态
64 this.isGetUserIpCallback = false; //是否获取IP信息返回 71 this.isGetUserIpCallback = false; //是否获取IP信息返回
@@ -531,172 +538,6 @@ export default class MessageEntrance extends Emiter { @@ -531,172 +538,6 @@ export default class MessageEntrance extends Emiter {
531 } 538 }
532 } 539 }
533 540
534 - //获取课堂所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do  
535 - _sassGetClassParamSuccessHandler(_data) {  
536 - loger.log('获取课堂课堂信息完成.');  
537 - //包含整个课堂最全的信息,储存数据  
538 - if (_data) {  
539 - GlobalConfig.mcuDelay = _data.h5Delay || 0; //mcu消息延迟的时间间隔,单位(秒),结合客户端传的messageDelay的值使用  
540 - GlobalConfig.className = _data.meetingName || "";  
541 - GlobalConfig.classBeginTime = _data.beginTime || "";  
542 - GlobalConfig.classEndTime = _data.endTime || "";  
543 - GlobalConfig.userIp = _data.userIp || "";  
544 -  
545 - GlobalConfig.maxVideoChannels = _data.maxVideoChannels;  
546 - GlobalConfig.maxAudioChannels = _data.maxAudioChannels;  
547 - GlobalConfig.maxMediaChannels = Math.max(GlobalConfig.maxVideoChannels, GlobalConfig.maxAudioChannels);  
548 -  
549 - GlobalConfig.ssTunnelAppURL = _data.ssTunnelAppURL || ''; //屏幕共享插件的地址  
550 -  
551 - //视频质量相关设置,每次加入课堂都按最新的获取设置  
552 - GlobalConfig.fps = _data.fps || 15;  
553 - GlobalConfig.gop = _data.gop || 3;  
554 - GlobalConfig.videoQuality = parseInt(_data.videoQuality);  
555 - GlobalConfig.curVideoQuality = GlobalConfig.videoQuality;  
556 -  
557 - //是否自动开始(身份是host的时候才用到的)  
558 - GlobalConfig.isAutoStartClass = _data.autoRecord || 0;  
559 -  
560 - GlobalConfig.setDocListPrepare(_data.docListPrepare); //提前上传的文档列表  
561 - GlobalConfig.setRecordList(_data.recordList); //录制回放地址  
562 - GlobalConfig.setDocList(_data.docList); //文档地址  
563 - GlobalConfig.setMsList(_data.msList); //推流播流服务器地址(需要对列表中的地址进行分类,里面包含了推流和拉流的地址,目前主要是乐视的需要区分开)  
564 - GlobalConfig.setRsList(_data.rsList); //播放m3u8格式的地址(录制回放时使用)  
565 - GlobalConfig.setMcuList(_data.mcuList); //mcu  
566 - GlobalConfig.setMusicList(_data.musicList); //  
567 - GlobalConfig.setMusicListPrepare(_data.musicListPrepare); //提前上传的声音文件列表  
568 - GlobalConfig.setVideoCDNAddr(_data.videoCDNAddr); //cdn加速的拉流地址,直播的时候才使用  
569 - GlobalConfig.setMediaShareList(_data.sharedMediaList); //提前上传的媒体共享文件列表  
570 -  
571 - //MCU地址  
572 - if (_data.mcuList && _data.mcuList.length > 0) {  
573 - //随机选择一个  
574 - let index = parseInt(Math.random() * _data.mcuList.length);  
575 - GlobalConfig.MCUServerIP = _data.mcuList[index].ip || "";  
576 - GlobalConfig.MCUServerPort = _data.mcuList[index].port || "";  
577 - loger.log('初始->MCU->.', GlobalConfig.MCUServerIP, GlobalConfig.MCUServerPort);  
578 - }  
579 -  
580 - //录制回放时m3u8播流地址  
581 - if (_data.rsList && _data.rsList.length > 0) {  
582 - let index = parseInt(Math.random() * _data.rsList.length);  
583 - GlobalConfig.RS_RECORD_PLAY_IP = _data.rsList[index].ip || "";  
584 - GlobalConfig.RS_RECORD_PLAY_PORT = _data.rsList[index].port || "";  
585 - loger.log('初始->RS->.', GlobalConfig.RS_RECORD_PLAY_IP, GlobalConfig.RS_RECORD_PLAY_PORT);  
586 - }  
587 -  
588 - //上课中音视频推流地址  
589 - if (GlobalConfig.msList && GlobalConfig.msList.length > 0) {  
590 - let index = parseInt(Math.random() * GlobalConfig.msList.length);  
591 - GlobalConfig.MS_PUBLISH_IP = GlobalConfig.msList[index].ip || "";  
592 - GlobalConfig.MS_PUBLISH_PORT = GlobalConfig.msList[index].port || "";  
593 - }  
594 - loger.log('初始->MS->.', GlobalConfig.MS_PUBLISH_IP, GlobalConfig.MS_PUBLISH_PORT);  
595 -  
596 - //播流的地址和推流地址需要分开的时候,单独设置拉流的地址 rtmp(目前乐视使用)  
597 - if (GlobalConfig.pullRtmpList && GlobalConfig.pullRtmpList.length > 0) {  
598 - //有单独的rtmp拉流地址  
599 - let index = parseInt(Math.random() * GlobalConfig.pullRtmpList.length);  
600 - GlobalConfig.MS_PLAY_RTMP_IP = GlobalConfig.pullRtmpList[index].ip || "";  
601 - GlobalConfig.MS_PLAY_RTMP_PORT = GlobalConfig.pullRtmpList[index].port || "";  
602 - } else {  
603 - //如果没有单独的rtmp拉流地址,和推流地址一样即可  
604 - GlobalConfig.MS_PLAY_RTMP_IP = GlobalConfig.MS_PUBLISH_IP;  
605 - GlobalConfig.MS_PLAY_RTMP_PORT = GlobalConfig.MS_PUBLISH_PORT;  
606 - }  
607 -  
608 - loger.log('初始->MSPull->.', GlobalConfig.MS_PLAY_RTMP_IP, GlobalConfig.MS_PLAY_RTMP_PORT);  
609 -  
610 - //播流的地址和推流地址需要分开的时候,单独设置拉流的地址 hls(目前乐视使用)  
611 - if (GlobalConfig.hlsList && GlobalConfig.hlsList.length > 0) {  
612 - //有单独的hls拉流地址  
613 - let index = parseInt(Math.random() * GlobalConfig.hlsList.length);  
614 - GlobalConfig.MS_PLAY_HLS_IP = GlobalConfig.hlsList[index].ip || "";  
615 - GlobalConfig.MS_PLAY_HLS_PORT = GlobalConfig.hlsList[index].port || "";  
616 - } else {  
617 - //没有单独的hls拉流地址,和录制回放地址一样即可  
618 - GlobalConfig.MS_PLAY_HLS_IP = GlobalConfig.RS_RECORD_PLAY_IP;  
619 - GlobalConfig.MS_PLAY_HLS_PORT = GlobalConfig.RS_RECORD_PLAY_PORT;  
620 - }  
621 - loger.log('初始->MSHls->.', GlobalConfig.MS_PLAY_HLS_IP, GlobalConfig.MS_PLAY_HLS_PORT);  
622 -  
623 - //直播的时候,拉流(rtmp和hls)需要从 videoCDNAddr中获取  
624 - //20170531-新规则,所有课堂类型都支持加速  
625 - // if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_2&&GlobalConfig.videoCDNAddrList.length>0){  
626 - if (GlobalConfig.videoCDNAddrList.length > 0) {  
627 - //videoCDNAddrList中rtmppush和hls是混在一起的,需要分离开;  
628 - let listLen = GlobalConfig.videoCDNAddrList.length;  
629 - for (let i = 0; i < listLen; i++) {  
630 - let ipItem = GlobalConfig.videoCDNAddrList[i];  
631 - if (ipItem) {  
632 - if (ipItem.indexOf('hls') >= 0) {  
633 - //直播的时候m3u8拉流地址  
634 - GlobalConfig.MS_PLAY_HLS_IP = ipItem; //ip包含了端口  
635 - GlobalConfig.MS_PLAY_HLS_PORT = "";  
636 - loger.log('videoCDNAddr>初始->MSHls', GlobalConfig.MS_PLAY_HLS_IP);  
637 - } else if (ipItem.indexOf('rtmppull') >= 0) {  
638 - //直播的时候rtmp拉流地址  
639 - GlobalConfig.MS_PLAY_RTMP_IP = ipItem; //ip包含了端口  
640 - GlobalConfig.MS_PLAY_RTMP_PORT = '';  
641 - loger.log('videoCDNAddr->初始->MSPull', GlobalConfig.MS_PLAY_RTMP_IP);  
642 - }  
643 - }  
644 - }  
645 -  
646 - } else {  
647 - loger.log('不需要videoCDNAddr->');  
648 - }  
649 -  
650 - //文档地址  
651 - if (_data.docList && _data.docList.length > 0) {  
652 - //doc上传地址,随机获取一个  
653 - let index = parseInt(Math.random() * _data.docList.length);  
654 - loger.log("docServer->", _data.docList[index]);  
655 - GlobalConfig.DOCServerIP = _data.docList[index].ip || "";  
656 - GlobalConfig.DOCServerPort = _data.docList[index].port || "";  
657 - loger.log('初始->DOC->.', GlobalConfig.DOCServerIP, GlobalConfig.DOCServerPort);  
658 - }  
659 -  
660 - //record  
661 - if (_data.recordList && _data.recordList.length > 0) {  
662 - let index = parseInt(Math.random() * _data.recordList.length);  
663 - GlobalConfig.RecordServerIP = _data.recordList[index].ip || "";  
664 - GlobalConfig.RecordServerPort = _data.recordList[index].port || "";  
665 - loger.log('初始->RECORD->.', GlobalConfig.RecordServerIP, GlobalConfig.RecordServerPort);  
666 - }  
667 -  
668 - }  
669 - //这里需要考虑是否加延迟处理,课堂信息刚获取完成,客户端需要根据数据创建界面UI,等创建完成后再加入课堂是最合适的(目前没有加延迟)  
670 - this._emit(MessageTypes.CLASS_GET_INFO_SUCCESS, GlobalConfig.getClassInfo());  
671 -  
672 - if (_data.currentInfo) {  
673 - //根据从Sass获取的数据信息,同步最后一次保存的课堂状态信息  
674 - loger.log("本地同步最后一次保存过的课堂状态信息");  
675 - try {  
676 - GlobalConfig.setClassStatusInfo(JSON.parse(_data.currentInfo));  
677 - } catch (err) {  
678 - GlobalConfig.setClassStatusInfo(_data.currentInfo);  
679 - }  
680 - loger.log(GlobalConfig.classStatusInfo);  
681 - } else {  
682 - loger.log("还没有保存过课堂状信息");  
683 - }  
684 -  
685 - //录制回放不需要获取ip信息和选点  
686 - if (GlobalConfig.isRecordPlayBack) {  
687 - if (_recordPlayback) {  
688 - //开启录制回放流程  
689 - loger.log("开启录制回放流程");  
690 - _recordPlayback.readyRecordPlay();  
691 - } else {  
692 - loger.warn("开启录制回放流程失败->还未创建模块");  
693 - }  
694 - } else {  
695 - //根据用户的userIp获取信息,选点  
696 - this.getUserIpInfo();  
697 - }  
698 - }  
699 -  
700 //根据UserIp获取ip信息,选点 541 //根据UserIp获取ip信息,选点
701 getUserIpInfo() { 542 getUserIpInfo() {
702 let _this = this; 543 let _this = this;
@@ -877,6 +718,13 @@ export default class MessageEntrance extends Emiter { @@ -877,6 +718,13 @@ export default class MessageEntrance extends Emiter {
877 //Sass校验流程结束之后,开始加入MCU 718 //Sass校验流程结束之后,开始加入MCU
878 _joinMCU() { 719 _joinMCU() {
879 loger.log('加入课堂->.'); 720 loger.log('加入课堂->.');
  721 + loger.warn("课堂服务信息->");
  722 +
  723 + loger.warn('MCU服务器地址->mcu->',GlobalConfig.MCUServerIP, GlobalConfig.MCUServerPort);
  724 + loger.warn('推流地址->MS->', GlobalConfig.MS_PUBLISH_IP, GlobalConfig.MS_PUBLISH_PORT);
  725 + loger.warn('RTMP播流地址->RTMP->',GlobalConfig.MS_PLAY_RTMP_IP, GlobalConfig.MS_PLAY_RTMP_PORT);
  726 + loger.warn('HLS播流地址->HLS->',GlobalConfig.MS_PLAY_HLS_IP, GlobalConfig.MS_PLAY_HLS_PORT);
  727 +
880 if (_mcu) { 728 if (_mcu) {
881 _mcu.joinMCU(GlobalConfig.getClassInfo()); 729 _mcu.joinMCU(GlobalConfig.getClassInfo());
882 } 730 }
@@ -1339,28 +1187,33 @@ export default class MessageEntrance extends Emiter { @@ -1339,28 +1187,33 @@ export default class MessageEntrance extends Emiter {
1339 //直播的时候,拉流(rtmp和hls)需要从 videoCDNAddr中获取 1187 //直播的时候,拉流(rtmp和hls)需要从 videoCDNAddr中获取
1340 //20170531-新规则,所有课堂类型都支持加速 1188 //20170531-新规则,所有课堂类型都支持加速
1341 // if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_2&&GlobalConfig.videoCDNAddrList.length>0){ 1189 // if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_2&&GlobalConfig.videoCDNAddrList.length>0){
1342 - if (GlobalConfig.videoCDNAddrList.length > 0) {  
1343 - //videoCDNAddrList中rtmppush和hls是混在一起的,需要分离开;  
1344 - let listLen = GlobalConfig.videoCDNAddrList.length;  
1345 - for (let i = 0; i < listLen; i++) {  
1346 - let ipItem = GlobalConfig.videoCDNAddrList[i];  
1347 - if (ipItem) {  
1348 - if (ipItem.indexOf('hls') >= 0) {  
1349 - //直播的时候m3u8拉流地址  
1350 - GlobalConfig.MS_PLAY_HLS_IP = ipItem; //ip包含了端口  
1351 - GlobalConfig.MS_PLAY_HLS_PORT = "";  
1352 - loger.log('videoCDNAddr>初始->MSHls', GlobalConfig.MS_PLAY_HLS_IP);  
1353 - } else if (ipItem.indexOf('rtmppull') >= 0) {  
1354 - //直播的时候rtmp拉流地址  
1355 - GlobalConfig.MS_PLAY_RTMP_IP = ipItem; //ip包含了端口  
1356 - GlobalConfig.MS_PLAY_RTMP_PORT = '';  
1357 - loger.log('videoCDNAddr->初始->MSPull', GlobalConfig.MS_PLAY_RTMP_IP); 1190 +
  1191 + //20170629-直播课堂和移动端设备的时候支持
  1192 + if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_2||GlobalConfig.isMobile){
  1193 + if (GlobalConfig.videoCDNAddrList.length > 0) {
  1194 + //videoCDNAddrList中rtmppush和hls是混在一起的,需要分离开;
  1195 + let listLen = GlobalConfig.videoCDNAddrList.length;
  1196 + for (let i = 0; i < listLen; i++) {
  1197 + let ipItem = GlobalConfig.videoCDNAddrList[i];
  1198 + if (ipItem) {
  1199 + if (ipItem.indexOf('hls') >= 0) {
  1200 + //直播的时候m3u8拉流地址
  1201 + GlobalConfig.MS_PLAY_HLS_IP = ipItem; //ip包含了端口
  1202 + GlobalConfig.MS_PLAY_HLS_PORT = "";
  1203 + loger.log('videoCDNAddr>初始->MSHls', GlobalConfig.MS_PLAY_HLS_IP);
  1204 + } else if (ipItem.indexOf('rtmppull') >= 0) {
  1205 + //直播的时候rtmp拉流地址
  1206 + GlobalConfig.MS_PLAY_RTMP_IP = ipItem; //ip包含了端口
  1207 + GlobalConfig.MS_PLAY_RTMP_PORT = '';
  1208 + loger.log('videoCDNAddr->初始->MSPull', GlobalConfig.MS_PLAY_RTMP_IP);
  1209 + }
1358 } 1210 }
1359 } 1211 }
  1212 + } else {
  1213 + loger.error('videoCDNAddr数据无效->',GlobalConfig.videoCDNAddr);
1360 } 1214 }
1361 -  
1362 - } else {  
1363 - loger.log('不需要videoCDNAddr->'); 1215 + }else {
  1216 + loger.warn('非直播课堂或不是移动端->不需要videoCDN加速');
1364 } 1217 }
1365 1218
1366 //文档地址 1219 //文档地址
@@ -1412,6 +1265,7 @@ export default class MessageEntrance extends Emiter { @@ -1412,6 +1265,7 @@ export default class MessageEntrance extends Emiter {
1412 this.getUserIpInfo(); 1265 this.getUserIpInfo();
1413 } 1266 }
1414 } 1267 }
  1268 +
1415 //ChatApe 1269 //ChatApe
1416 // 发送聊天消息 1270 // 发送聊天消息
1417 _sendChatMsg(_messageInfo) { 1271 _sendChatMsg(_messageInfo) {
@@ -472,5 +472,7 @@ GlobalConfig.siteId_letv = 'shchuanbao'; //乐视,MS不需要动态选点的 @@ -472,5 +472,7 @@ GlobalConfig.siteId_letv = 'shchuanbao'; //乐视,MS不需要动态选点的
472 GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址 472 GlobalConfig.ssTunnelAppURL = ''; //屏幕共享插件的地址
473 GlobalConfig.serverTime = 0; //服务器当前时间戳 473 GlobalConfig.serverTime = 0; //服务器当前时间戳
474 GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值; 474 GlobalConfig.serverAndLoacTimeDistanc = 0; //本地时间和服务器时间错的差值;
  475 +
  476 +GlobalConfig.isMobile=false;//是否是移动端
475 export default GlobalConfig; 477 export default GlobalConfig;
476 478
@@ -28,7 +28,7 @@ ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE = 3; //更改用户的禁言状态 @@ -28,7 +28,7 @@ ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE = 3; //更改用户的禁言状态
28 //课堂类型 1:1v1(2路流) 2:直播(1路流) 3:小班课(可以多路流) 28 //课堂类型 1:1v1(2路流) 2:直播(1路流) 3:小班课(可以多路流)
29 ApeConsts.CLASS_TYPE_1 = 1; // 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流) 29 ApeConsts.CLASS_TYPE_1 = 1; // 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流)
30 ApeConsts.CLASS_TYPE_2 = 2; // 直播课堂,通过CDN转发音视频,不能进行音视频互动 :直播(1路流) 30 ApeConsts.CLASS_TYPE_2 = 2; // 直播课堂,通过CDN转发音视频,不能进行音视频互动 :直播(1路流)
31 -ApeConsts.CLASS_TYPE_3 = 2; // 直播课堂,通过CDN转发音视频,不能进行音视频互动 ::小班课(可以多路流) 31 +ApeConsts.CLASS_TYPE_3 = 3; // 小班课,通过CDN转发音视频,不能进行音视频互动 ::小班课(可以多路流)
32 32
33 //角色身份 33 //角色身份
34 //ApeConsts.NR_GUEST = 0; // 客人 34 //ApeConsts.NR_GUEST = 0; // 客人