李勇

1.增加画笔单人控制开启和禁用的功能;2.录制回放模块增加腾讯视频数据过滤,只播放m3u8l类型;3.个人信息中增加是否禁用画笔的字段selfDisEnableDrawTime

不能预览此文件类型
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
... ...
{"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
... ...
... ... @@ -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 || "";
... ...
... ... @@ -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; //关键帧间隔(秒)
... ...
... ... @@ -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;
}
}
}
}
... ...
... ... @@ -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路流)
... ...
... ... @@ -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 {
... ...
... ... @@ -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;
... ...
... ... @@ -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 {
... ...