diff --git a/doc/MCU_MS_APPCONFIG 配置.docx b/doc/MCU_MS_APPCONFIG 配置.docx
new file mode 100644
index 0000000..af353f1
Binary files /dev/null and b/doc/MCU_MS_APPCONFIG 配置.docx differ
diff --git a/doc/MCU_MS_APPCONFIG 配置.txt b/doc/MCU_MS_APPCONFIG 配置.txt
new file mode 100644
index 0000000..bb23ea3
--- /dev/null
+++ b/doc/MCU_MS_APPCONFIG 配置.txt
@@ -0,0 +1,19 @@
+market_webrtc_发布版
+mcu/ms/rs服务器:腾讯云测试
+appConfig:
+eyJhcHBJZCI6IjBmZTQ1YmJlYTU5YjRlZTU4NmM4ZGVkNjlmMmJjOGY3IiwiYXBwQ2VydGlmaWNhdGUiOiIiLCJhcHBSZWNvcmRpbmdLZXkiOiIiLCJyZWNvcmRJbnRlcmZhY2VzIjoibmV0d29ya3NjaG9vbC54dWVkaWFueXVuLmNvbS9zZXJ2ZXIvdXNlcnMvUmVjb3JkaW5nIiwiZ2V0Q2hhbm5lbFRva2VuIjoibmV0d29ya3NjaG9vbC54dWVkaWFueXVuLmNvbS9zZXJ2ZXIvdXNlcnMvZW5jcnlwdGlvblRva2VuIiwiZ2V0UmVjb3JkSW5mb0ludGVyZmFjZXMiOiJuZXR3b3Jrc2Nob29sLnh1ZWRpYW55dW4uY29tL3NlcnZlci9yZWNvcmRJbmZvL2dldFJlY29yZEluZm8iLCJzdG9wUmVjb3JkaW5nSW50ZXJmYWNlcyI6Im5ldHdvcmtzY2hvb2wueHVlZGlhbnl1bi5jb20vc2VydmVyL3JlY29yZEluZm8vc3RvcFJlY29yZGluZyIsImdldFR4UmVjb3JkSW5mb0ludGVyZmFjZXMiOiJuZXR3b3Jrc2Nob29sLnh1ZWRpYW55dW4uY29tL3NlcnZlci9yZWNvcmRJbmZvL3RlbmNlbnRSZWNvcmRJbmZvIn0=
+
+
+market_webrtc_测试版
+mcu/ms/rs服务器:腾讯云测试
+appConfig: eyJhcHBJZCI6ImViMjUzY2M3YjQwYzRhOGI4MmYwYTViNmY5M2MyY2UwIiwiYXBwQ2VydGlmaWNhdGUiOiIiLCJhcHBSZWNvcmRpbmdLZXkiOiIiLCJyZWNvcmRJbnRlcmZhY2VzIjoibmV0d29ya3NjaG9vbC54dWVkaWFueXVuLmNvbS9zZXJ2ZXIvdXNlcnMvUmVjb3JkaW5nIiwiZ2V0Q2hhbm5lbFRva2VuIjoibmV0d29ya3NjaG9vbC54dWVkaWFueXVuLmNvbS9zZXJ2ZXIvdXNlcnMvZW5jcnlwdGlvblRva2VuIiwiZ2V0UmVjb3JkSW5mb0ludGVyZmFjZXMiOiJuZXR3b3Jrc2Nob29sLnh1ZWRpYW55dW4uY29tL3NlcnZlci9yZWNvcmRJbmZvL2dldFJlY29yZEluZm8iLCJzdG9wUmVjb3JkaW5nSW50ZXJmYWNlcyI6Im5ldHdvcmtzY2hvb2wueHVlZGlhbnl1bi5jb20vc2VydmVyL3JlY29yZEluZm8vc3RvcFJlY29yZGluZyIsImdldFR4UmVjb3JkSW5mb0ludGVyZmFjZXMiOiJuZXR3b3Jrc2Nob29sLnh1ZWRpYW55dW4uY29tL3NlcnZlci9yZWNvcmRJbmZvL3RlbmNlbnRSZWNvcmRJbmZvIn0=
+
+
+market_flash_发布版
+mcu/ms/rs服务器:腾讯云测试
+appConfig: eyJhcHBJZCI6IjBmZTQ1YmJlYTU5YjRlZTU4NmM4ZGVkNjlmMmJjOGY3IiwiYXBwQ2VydGlmaWNhdGUiOiIiLCJhcHBSZWNvcmRpbmdLZXkiOiIiLCJyZWNvcmRJbnRlcmZhY2VzIjoibmV0d29ya3NjaG9vbC54dWVkaWFueXVuLmNvbS9zZXJ2ZXIvdXNlcnMvUmVjb3JkaW5nIiwiZ2V0Q2hhbm5lbFRva2VuIjoibmV0d29ya3NjaG9vbC54dWVkaWFueXVuLmNvbS9zZXJ2ZXIvdXNlcnMvZW5jcnlwdGlvblRva2VuIiwiZ2V0UmVjb3JkSW5mb0ludGVyZmFjZXMiOiJuZXR3b3Jrc2Nob29sLnh1ZWRpYW55dW4uY29tL3NlcnZlci9yZWNvcmRJbmZvL2dldFJlY29yZEluZm8iLCJzdG9wUmVjb3JkaW5nSW50ZXJmYWNlcyI6Im5ldHdvcmtzY2hvb2wueHVlZGlhbnl1bi5jb20vc2VydmVyL3JlY29yZEluZm8vc3RvcFJlY29yZGluZyIsImdldFR4UmVjb3JkSW5mb0ludGVyZmFjZXMiOiJuZXR3b3Jrc2Nob29sLnh1ZWRpYW55dW4uY29tL3NlcnZlci9yZWNvcmRJbmZvL3RlbmNlbnRSZWNvcmRJbmZvIn0=
+
+
+market_flash_测试版
+mcu/ms/rs服务器:腾讯云测试
+appConfig: eyJhcHBJZCI6ImViMjUzY2M3YjQwYzRhOGI4MmYwYTViNmY5M2MyY2UwIiwiYXBwQ2VydGlmaWNhdGUiOiIiLCJhcHBSZWNvcmRpbmdLZXkiOiIiLCJyZWNvcmRJbnRlcmZhY2VzIjoibmV0d29ya3NjaG9vbC54dWVkaWFueXVuLmNvbS9zZXJ2ZXIvdXNlcnMvUmVjb3JkaW5nIiwiZ2V0Q2hhbm5lbFRva2VuIjoibmV0d29ya3NjaG9vbC54dWVkaWFueXVuLmNvbS9zZXJ2ZXIvdXNlcnMvZW5jcnlwdGlvblRva2VuIiwiZ2V0UmVjb3JkSW5mb0ludGVyZmFjZXMiOiJuZXR3b3Jrc2Nob29sLnh1ZWRpYW55dW4uY29tL3NlcnZlci9yZWNvcmRJbmZvL2dldFJlY29yZEluZm8iLCJzdG9wUmVjb3JkaW5nSW50ZXJmYWNlcyI6Im5ldHdvcmtzY2hvb2wueHVlZGlhbnl1bi5jb20vc2VydmVyL3JlY29yZEluZm8vc3RvcFJlY29yZGluZyIsImdldFR4UmVjb3JkSW5mb0ludGVyZmFjZXMiOiJuZXR3b3Jrc2Nob29sLnh1ZWRpYW55dW4uY29tL3NlcnZlci9yZWNvcmRJbmZvL3RlbmNlbnRSZWNvcmRJbmZvIn0=
\ No newline at end of file
diff --git a/doc/腾讯云测试JSON.txt b/doc/腾讯云测试JSON.txt
new file mode 100644
index 0000000..215abae
--- /dev/null
+++ b/doc/腾讯云测试JSON.txt
@@ -0,0 +1 @@
+{"RS_PULL":{"default":[{"port":"","ip":"playback.xuedianyun.com","name":"record","hlsSuffix":".m3u8","type":"live","rHlsSuffix":"/total.m3u8","publishSuffix":"9f2d3375619115d0115cc2692ede9947"}]},"HLS_PULL":{"default":[{"port":"","ip":"txlivepull.xuedianyun.com","name":"��Ѷ��","hlsSuffix":".m3u8","type":"live","rHlsSuffix":"/total.m3u8","publishSuffix":"9f2d3375619115d0115cc2692ede9947"}]},"MS":{"default":[{"port":"","ip":"txlivepush.xuedianyun.com","name":"��Ѷ��","hlsSuffix":".m3u8","type":"live","rHlsSuffix":"/total.m3u8","publishSuffix":"9f2d3375619115d0115cc2692ede9947"}]},"RTMP_PULL":{"default":[{"port":"","ip":"txlivepull.xuedianyun.com","name":"��Ѷ��","hlsSuffix":".m3u8","type":"live","rHlsSuffix":"/total.m3u8","publishSuffix":"9f2d3375619115d0115cc2692ede9947"}]},"MCU":{"����":[{"port":"80","ip":"mcuglobal.xuedianyun.com","name":"����"},{"port":"80","ip":"mcu.xuedianyun.com","name":"ȫ��ͨ"}],"default":[{"port":"80","ip":"mcuchina.xuedianyun.com","name":"�й�"}],"�й�":{"default":[{"port":"80","ip":"mcuchina.xuedianyun.com","name":"�й�"},{"port":"80","ip":"mcu.xuedianyun.com","name":"ȫ��ͨ"}]}}}
\ No newline at end of file
diff --git a/src/EngineEntrance.js b/src/EngineEntrance.js
index c713cfa..966b338 100644
--- a/src/EngineEntrance.js
+++ b/src/EngineEntrance.js
@@ -62,7 +62,7 @@ export default class MessageEntrance extends Emiter {
constructor() {
super();
//sdk 信息
- GlobalConfig.sdkVersion = "v2.12.14.20170927";
+ GlobalConfig.sdkVersion = "v2.13.5.20170927";
loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
//设置
@@ -200,6 +200,8 @@ export default class MessageEntrance extends Emiter {
this.controlHandUpStatus = this._controlHandUpStatus.bind(this); //控制别人的举手状态
this.controlSilenceStatus = this._controlSilenceStatus.bind(this); //改变禁言状态
+ this.controlDrawStatus = this._controlDrawStatus.bind(this); //控制别人的是否可以使用画笔状态
+
this.sceneTableChange = this._sceneTableChange.bind(this); //切换模块显示
this.kickOutRosterFormNodeId = this._kickOutRosterFormNodeId.bind(this); //把指定nodeId的人踢出课堂
this.sendThridChannelMessage = this._sendThridChannelMessage.bind(this);//通道第三方消息通道发送消息
@@ -1621,7 +1623,19 @@ export default class MessageEntrance extends Emiter {
_confer_ape.changeHandUpStatus(_param);
}
}
-
+ /*
+ * 控制画笔使用状态
+ * */
+ _controlDrawStatus(_param){
+ //{nodeId:333333,isDisEnableDraw:true}
+ if (!_mcu.connected) {
+ loger.warn(GlobalConfig.getCurrentStatus());
+ return {"code": ApeConsts.RETURN_FAILED, "data": ""};
+ }
+ if (_confer_ape) {
+ _confer_ape.controlDrawStatus(_param);
+ }
+ }
//停止上课
_sendCloseClass(_param) {
if (!_mcu||!_mcu.connected) {
@@ -1683,6 +1697,11 @@ export default class MessageEntrance extends Emiter {
loger.log('获取课堂课堂信息完成.',_data.appConfig);
//包含整个课堂最全的信息,储存数据
if (_data) {
+ //老师默认启用画笔功能,其他身份默认禁用画笔功能
+ if(GlobalConfig.userRole==ApeConsts.host){
+ GlobalConfig.selfDisEnableDrawTime=0;
+ }
+
GlobalConfig.mcuDelay = _data.h5Delay || 0; //mcu消息延迟的时间间隔,单位(秒),结合客户端传的messageDelay的值使用
GlobalConfig.className = _data.meetingName || "";
GlobalConfig.classBeginTime = _data.beginTime || "";
diff --git a/src/GlobalConfig.js b/src/GlobalConfig.js
index 9276ef2..5dc9a63 100644
--- a/src/GlobalConfig.js
+++ b/src/GlobalConfig.js
@@ -494,6 +494,8 @@ GlobalConfig.handUpTime = 0;
GlobalConfig.level = 0;
GlobalConfig.openCamera = 0;
GlobalConfig.openMicrophones = 0;
+GlobalConfig.selfDisEnableDrawTime=1;//记录是否禁用画笔,0为启用画笔,大于0时被禁用的时间戳
+
//视频质量相关设置
GlobalConfig.fps = 15; //帧频
GlobalConfig.gop = 3; //关键帧间隔(秒)
diff --git a/src/RecordPlayBackParse.js b/src/RecordPlayBackParse.js
index b26f93b..a1615a7 100644
--- a/src/RecordPlayBackParse.js
+++ b/src/RecordPlayBackParse.js
@@ -439,7 +439,9 @@ class RecordPlayBackParse extends Emiter {
}
if(itemJson&&itemJson.video_url){
- MediaModule.streams[itemJson.stream_id]=itemJson.video_url;
+ if(itemJson.video_url.indexOf(".m3u8")>0){
+ MediaModule.streams[itemJson.stream_id]=itemJson.video_url;
+ }
}
}
}
diff --git a/src/apes/ApeConsts.js b/src/apes/ApeConsts.js
index 173e517..1f24497 100644
--- a/src/apes/ApeConsts.js
+++ b/src/apes/ApeConsts.js
@@ -26,7 +26,7 @@ ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE = 2; //更改用户的举手状态
ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE = 3; //更改用户的禁言状态
ApeConsts.CLASS_ACTION_KICK_OUT_ROSTER=4; //指定的人踢出课堂
ApeConsts.STOP_ALL_PUBLISH=5; //所有人停止推流
-
+ApeConsts.CLASS_ACTION_DRAW_STATUS_CHANGE = 6; //更改用户的画笔状态
//课堂类型 1:1v1(2路流) 2:直播(1路流) 3:小班课(可以多路流)
ApeConsts.CLASS_TYPE_1 = 1; // 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流)
diff --git a/src/apes/ConferApe.js b/src/apes/ConferApe.js
index 66003e1..8aec0a2 100644
--- a/src/apes/ConferApe.js
+++ b/src/apes/ConferApe.js
@@ -107,6 +107,7 @@ class ConferApe extends Ape {
nodeInfoRecordPdu.userData = GlobalConfig.userData;
nodeInfoRecordPdu.userId = GlobalConfig.userId;
nodeInfoRecordPdu.handUpTime = GlobalConfig.handUpTime;
+ nodeInfoRecordPdu.selfDisEnableDrawTime = GlobalConfig.selfDisEnableDrawTime;
//nodeInfoRecordPdu.deviceType= GlobalConfig.deviceType;
//nodeInfoRecordPdu.mobileDirection= GlobalConfig.mobileDirection;
nodeInfoRecordPdu.microphones = GlobalConfig.microphones;
@@ -407,6 +408,18 @@ class ConferApe extends Ape {
loger.warn('学生没有开启绘制的权限');
}
}
+ //控制指定用户的画笔状态
+ changeUserDrawStatus(_param){
+ loger.log('控制指定用户的画笔状态->', _param);
+ if (_param && _param.isDisEnableDraw == true) {
+ //举手
+ GlobalConfig.selfDisEnableDrawTime=EngineUtils.creatTimestamp();//被禁用画笔的时间
+ } else {
+ GlobalConfig.selfDisEnableDrawTime = 0; //取消禁用画笔
+ }
+ this.updateUserInfo();
+ }
+
//开始上课
startClass(_param) {
if (GlobalConfig.isHost) {
@@ -517,6 +530,25 @@ class ConferApe extends Ape {
console.log(_param);
}
}
+ //控制画笔的使用状态
+ controlDrawStatus(_param) {
+ //控制用户的举手状态
+ if (!_param || !_param.nodeId) {
+ loger.log('控制画笔的使用状态->失败->参数错误', _param);
+ return;
+ }
+ let msgObj = {};
+ msgObj.nodeId = _param.nodeId;
+ msgObj.isDisEnableDraw = false;
+ if (_param && _param.isDisEnableDraw == true) {
+ msgObj.isDisEnableDraw = true;
+ }
+ this.sendConferMsg({
+ "to": _param.nodeId,
+ "message": JSON.stringify(msgObj),
+ "actionType": ApeConsts.CLASS_ACTION_DRAW_STATUS_CHANGE
+ });
+ }
//控制举手状态
controlHandUpStatus(_param) {
@@ -612,7 +644,7 @@ class ConferApe extends Ape {
let adapterPdu = new pdu['RCAdapterPdu'];
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
-
+ loger.log('发送更新课堂信息->');
this.sendUniform(adapterPdu, true);
}
@@ -674,6 +706,8 @@ class ConferApe extends Ape {
GlobalConfig.classTimestamp = GlobalConfig.classTimestamp + 1; //计时
//向应用层更新当前课堂进行的时间长度 (秒)
this._emit(MessageTypes.CLASS_UPDATE_TIMER, {"classTimestamp": GlobalConfig.classTimestamp});
+
+ /* 录制消息已经更新了数据,这个课堂内的就不需要再更新,间隔太短了频率太高
//以一定的时间间隔同步课堂内所有人的累积上课时间
if (GlobalConfig.classTimestamp % GlobalConfig.updateClassInfoDelay == 0) {
//如果是host身份,需要同步时间给其他人,同时把当前的状态上传到服务器
@@ -683,7 +717,7 @@ class ConferApe extends Ape {
//同步消息给其他人
this.sendUpdaterClassStatusInfo({"actionType": ApeConsts.CLASS_STATUS_STARTED, isStopAllPublishMedia: false});
}
- }
+ }*/
//进行MS动态选点,选择最快的MS服务器地址(录制回放不做处理)
if (!GlobalConfig.isRecordPlayBack && GlobalConfig.classTimestamp % GlobalConfig.msDynamicChooseIpDelay == 0) {
@@ -710,7 +744,6 @@ class ConferApe extends Ape {
//MCU同步消息给其他人
this.sendUpdaterClassStatusInfo({"actionType": GlobalConfig.classStatus, isStopAllPublishMedia: false});
}
-
}
/* if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) {
GlobalConfig.classTimestamp = GlobalConfig.classTimestamp + 1; //计时
@@ -875,6 +908,17 @@ class ConferApe extends Ape {
loger.warn('chatMsg->JSON数据解析失败');
}
break;
+ case ApeConsts.CLASS_ACTION_DRAW_STATUS_CHANGE:
+ let drawMsgObj = null;
+ try {
+ drawMsgObj = JSON.parse(chatMsg.message);
+ if (drawMsgObj && drawMsgObj.nodeId == GlobalConfig.nodeId) {
+ this.changeUserDrawStatus(drawMsgObj);
+ }
+ } catch (err) {
+ loger.warn('chatMsg->JSON数据解析失败');
+ }
+ break;
case ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE:
let silenceMsg = null;
try {
diff --git a/src/mcu.js b/src/mcu.js
index 679f19d..e472801 100644
--- a/src/mcu.js
+++ b/src/mcu.js
@@ -218,6 +218,7 @@ class MCU extends Emiter {
nodeInfoRecordPdu.role = ApeConsts.userTypesToId[this.classInfo.userRole] || 1; //NR_NORMAL用户的身份,根据用户登录时的身份设置
nodeInfoRecordPdu.level = 0;
nodeInfoRecordPdu.handUpTime = 0;
+ nodeInfoRecordPdu.selfDisEnableDrawTime = 1;
nodeInfoRecordPdu.openCamera = 0;
nodeInfoRecordPdu.openMicrophones = 0;
nodeInfoRecordPdu.microphones = GlobalConfig.microphones;
diff --git a/src/pdus/pro.js b/src/pdus/pro.js
index d2e1048..34b8a91 100644
--- a/src/pdus/pro.js
+++ b/src/pdus/pro.js
@@ -928,6 +928,7 @@ message RCNodeInfoRecordPdu {
optional string sdkVersion = 36;//SDK版本
optional uint32 micNoise=37;
optional bool autoGain=38;
+ optional uint32 selfDisEnableDrawTime = 39;
}
message RCVotingPollSettingsPdu {