李勇

1.开启录制的时候,增加对当前显示的文档数据记录,解决录制文件中内容缺少的问题

2.录制回放时在seek的时候,增加对SDK中当前文档和白板标注模块数据的清除
此 diff 太大无法显示。
... ... @@ -26,7 +26,7 @@ import ArrayBufferUtil from 'libs/ArrayBufferUtil';
import UTF8 from 'utf-8';
let loger = Loger.getLoger('MessageEntrance');
let _sdkInfo = {"version": "v.1.8.16.20170410", "author": "www.3mang.com"};
let _sdkInfo = {"version": "v.1.8.19.20170411", "author": "www.3mang.com"};
//APE
let _sass;
... ... @@ -38,7 +38,7 @@ let _video_ape;
let _audio_ape;
let _doc_ape;
let _whiteboard_ape;
let _parseBuf;
let _recordPlayback;
//MCUClient 外部实例化主类
export default class MessageEntrance extends Emiter {
... ... @@ -77,9 +77,10 @@ export default class MessageEntrance extends Emiter {
_mcu.on(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this._mcuJoinMCUClassSuccessHandler.bind(this));//加入MCU课堂完成
//录制回放
_parseBuf = RecordPlayBackParse;
_parseBuf.on('*', (type, data) => this._emit(type, data));
_parseBuf.on(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, this._joinRecordPlaybackSuccessHandler.bind(this));//加入录制回放完成
_recordPlayback = RecordPlayBackParse;
_recordPlayback.on('*', (type, data) => this._emit(type, data));
_recordPlayback.on(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, this._joinRecordPlaybackSuccessHandler.bind(this));//加入录制回放完成
_recordPlayback.on(RecordPlayBackParse.RECORD_PLAYBACK_CLEAR_DATA, this._recordPlaybackClearDataHandler.bind(this));//录制回放状态更新
// 注册所有应用Ape
... ... @@ -90,7 +91,7 @@ export default class MessageEntrance extends Emiter {
_confer_ape.on(MessageTypes.CLASS_DELETE_ROSTER, this._onClassDeleteRoster.bind(this));//当前课堂人员离开
_confer_ape.on(MessageTypes.CLASS_NONENTITY_ROSTER, this._onClassNonentityRoster.bind(this));//当前课堂中视频或音频占用channel的nodeId ,在人员列表中不存在
_confer_ape.on(MessageTypes.CLASS_RECORD_START, this._onClassRecordStart.bind(this));//课堂开始录制
_confer_ape.on(MessageTypes.CLASS_RECORD_SUCCESS, this._onClassRecordSuccess.bind(this));//课堂开启录制成功
_chat_ape = new ChatApe();
_chat_ape.on('*', (type, data) => this._emit(type, data));
... ... @@ -245,7 +246,12 @@ export default class MessageEntrance extends Emiter {
_sass.saveClassRecordContrlInfo(_param);
}
}
//开启录制成功
_onClassRecordSuccess(_param){
if(_doc_ape){
_doc_ape.updaterRecordStatus();
}
}
//有人员离开
_onClassDeleteRoster(_data) {
... ... @@ -513,10 +519,10 @@ export default class MessageEntrance extends Emiter {
//录制回放不需要选点
if(GlobalConfig.isRecordPlayBack){
if (_parseBuf) {
if (_recordPlayback) {
//开启录制回放流程
loger.log("开启录制回放流程");
_parseBuf.readyRecordPlay();
_recordPlayback.readyRecordPlay();
}else {
loger.warn("开启录制回放流程失败,还未创建模块");
}
... ... @@ -1082,29 +1088,39 @@ export default class MessageEntrance extends Emiter {
//开始录制回放
_startRecordPlayback(_param) {
if (_parseBuf) {
_parseBuf.startRecordPlayback(_param);
if (_recordPlayback) {
_recordPlayback.startRecordPlayback(_param);
}
}
//停止录制回放
_stopRecordPlayback(_param) {
if (_parseBuf) {
_parseBuf.stopRecordPlayback(_param);
if (_recordPlayback) {
_recordPlayback.stopRecordPlayback(_param);
}
}
//暂停录制回放
_pauseRecordPlayback(_param) {
if (_parseBuf) {
_parseBuf.pauseRecordPlayback(_param);
if (_recordPlayback) {
_recordPlayback.pauseRecordPlayback(_param);
}
}
//seek录制回放
_seekRecordPlayback(_param) {
if (_parseBuf) {
_parseBuf.seekRecordPlayback(_param);
if (_recordPlayback) {
_recordPlayback.seekRecordPlayback(_param);
}
}
//录制回放状态更新
_recordPlaybackClearDataHandler(_param){
loger.log("_recordPlaybackClearDataHandler->")
if(_doc_ape){
_doc_ape.clearData();
}
if(_whiteboard_ape){
_whiteboard_ape.clearData();
}
}
//录制回放加入 课堂成功
_joinRecordPlaybackSuccessHandler(_data) {
loger.log('加入录制回放成功.');
... ...
... ... @@ -27,8 +27,8 @@ MessageTypes.CLASS_STATUS_INFO_CHANGE="class_status_info_change";// 'class.statu
MessageTypes.CLASS_UPDATE_TIMER="class_update_timer";//'class.update.timer';//更新当前上课的时间
MessageTypes.CLASS_RECORD_START="class_record_start";//'class.record.start';//开始录制
MessageTypes.CLASS_RECORD_START="class_record_start";//;//开始录制
MessageTypes.CLASS_RECORD_SUCCESS="class_record_success";////开启录制成功
//聊天模块事件定义
... ...
... ... @@ -357,6 +357,7 @@ class RecordPlayBackParse extends Emiter {
//把记录的文档信息也要清除
GlobalConfig.activeDocId=0;
GlobalConfig.activeDocCurPage=1;
this._emit(RecordPlayBackParse.RECORD_PLAYBACK_CLEAR_DATA);
this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": STOP});
}
... ... @@ -380,7 +381,7 @@ class RecordPlayBackParse extends Emiter {
//把记录的文档信息也要清除
GlobalConfig.activeDocId=0;
GlobalConfig.activeDocCurPage=1;
this._emit(RecordPlayBackParse.RECORD_PLAYBACK_CLEAR_DATA);
//各个ape模块查找关键帧数据
this._searchKeyfram();
}
... ... @@ -479,6 +480,7 @@ class RecordPlayBackParse extends Emiter {
}
RecordPlayBackParse.prototype.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = 'class_join_recordPlayback_success';//加入录制回放成功
RecordPlayBackParse.prototype.RECORD_PLAYBACK_CLEAR_DATA = RecordPlayBackParse.RECORD_PLAYBACK_CLEAR_DATA = 'record_playback_clear_data';//清除录制回放数据
export default new RecordPlayBackParse;
... ...
... ... @@ -194,23 +194,23 @@ export default class Ape extends Emiter {
}
rosterInsertHandler(recordId, recordData) {
loger.warn(this._session_name + ' rosterInsertHandler 应有子类具体覆盖处理.');
// loger.warn(this._session_name + ' rosterInsertHandler 应有子类具体覆盖处理.');
}
rosterUpdateHandler(nodeId, nodeData) {
loger.warn(this._session_name + ' rosterUpdateHandler 应有子类具体覆盖处理.');
//loger.warn(this._session_name + ' rosterUpdateHandler 应有子类具体覆盖处理.');
}
rosterDelHandler(recordData) {
loger.warn(this._session_name + ' rosterDelHandler 应有子类具体覆盖处理.');
//loger.warn(this._session_name + ' rosterDelHandler 应有子类具体覆盖处理.');
}
tableInsertHandler(tableId, record) {
loger.warn(this._session_name + ' tableInsertHandler 应有子类具体覆盖处理.');
//loger.warn(this._session_name + ' tableInsertHandler 应有子类具体覆盖处理.');
}
tableUpdateHandler(ownerId, recordId, recordData,seekTime) {
loger.warn(this._session_name + ' tableUpdateHandler 应有子类具体覆盖处理.');
//loger.warn(this._session_name + ' tableUpdateHandler 应有子类具体覆盖处理.');
}
tableUpdateApeHandler(tableUpdateItems,seekTime){
... ... @@ -219,20 +219,20 @@ export default class Ape extends Emiter {
}
tableDeleteHandler(tableId, record) {
loger.warn(this._session_name + ' tableDelHandler 应有子类具体覆盖处理.');
//loger.warn(this._session_name + ' tableDelHandler 应有子类具体覆盖处理.');
}
onJoinChannelHandlerSuccess() {
loger.warn(this._session_name + ' onJoinChannelHandlerSuccess 应有子类具体覆盖处理.');
//loger.warn(this._session_name + ' onJoinChannelHandlerSuccess 应有子类具体覆盖处理.');
}
onJoinSessionHandlerSuccess() {
loger.warn(this._session_name + ' onJoinSessionHandlerSuccess 应有子类具体覆盖处理.');
//loger.warn(this._session_name + ' onJoinSessionHandlerSuccess 应有子类具体覆盖处理.');
}
// 加入Session处理
_joinSessionHandler(data) {
loger.log(this._session_name, ' -> 加入Session');
//loger.log(this._session_name, ' -> 加入Session');
this.onJoinSessionHandlerSuccess();
}
... ...
... ... @@ -500,10 +500,14 @@ class ConferApe extends Ape {
}
onSendConferRecordRequestHandler(_data) {
loger.log("onSendConferRecordRequestHandler");
try {
let conferRecordSendPdu = pdu['RCConferenceRecordRequestPdu'].decode(_data);
loger.log(conferRecordSendPdu);
// {"initiator":820461225,"record":false,"classTime":3213,"filename":"h5dev/20170410/1437784290_20170410.rec"}
loger.log("onSendConferRecordRequestHandler->",conferRecordSendPdu);
if(conferRecordSendPdu&&conferRecordSendPdu.record==true||conferRecordSendPdu.record=="true"){
//每次开启录制的时候,需要把当前显示的文档数据更新一次,否则无法录制已经显示的文件
this._emit(MessageTypes.CLASS_RECORD_SUCCESS);
}
} catch (err) {
loger.warn("onSendConferRecordRequestHandler err", err.message);
}
... ...
... ... @@ -210,9 +210,19 @@ class DocApe extends Ape {
return path;
}
//更新文档模块的录制信息,每次开启录制的时候需要把当前文档的信息更新一次
updaterRecordStatus(_param){
if(GlobalConfig.isHost&&!GlobalConfig.isRecordPlayBack&&GlobalConfig.activeDocId>0){
loger.log("开启录制成功->更新当前的文档数据->docId:", GlobalConfig.activeDocId, 'page:',GlobalConfig.activeDocCurPage);
this.documentSwitchPage({
"itemIdx": GlobalConfig.activeDocId,
"curPageNo":GlobalConfig.activeDocCurPage
});
}
}
//切换文档
documentSwitchDoc(paramInfo) {
loger.log('切换文档,documentSwitchDoc->', paramInfo);
loger.log('切换文档->', paramInfo);
if (GlobalConfig.isRecordPlayBack) {
loger.warn('录制回放状态不允许切换文档');
... ... @@ -220,7 +230,7 @@ class DocApe extends Ape {
}
if (paramInfo == null || paramInfo.itemIdx == null) {
loger.warn('documentSwitch失败,参数错误', paramInfo);
loger.warn('切换文档失败,参数错误', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
... ... @@ -243,7 +253,7 @@ class DocApe extends Ape {
//获取已经存在的数据
let docDataModel = this.docList[paramInfo.itemIdx];
if (docDataModel == null) {
loger.warn('documentSwitch失败,文档不存在', paramInfo);
loger.warn('切换文档失败,文档不存在', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
... ... @@ -266,15 +276,13 @@ class DocApe extends Ape {
//文档翻页
documentSwitchPage(paramInfo) {
loger.log('文档翻页,documentSwitchPage');
loger.log(paramInfo);
//console.log(this.docList);
loger.log('文档翻页->',paramInfo);
//获取已经存在的数据
let docDataModel = this.docList[paramInfo.itemIdx];
//console.log(docDataModelPdu);
//console.log(docDataModel);
if (docDataModel == null) {
loger.log('documentSwitchPage->,文档不存在', paramInfo);
loger.log('文档翻页->,文档不存在', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
... ... @@ -289,12 +297,12 @@ class DocApe extends Ape {
//文档切换显示模式
documentSwitchShowModel(paramInfo) {
loger.log('documentSwitchShowModel', paramInfo);
loger.log('文档切换显示模式', paramInfo);
//获取已经存在的数据
let docDataModel = this.docList[paramInfo.itemIdx];
if (docDataModel == null) {
loger.log('documentSwitchShowModel->文档不存在', paramInfo);
loger.log('文档切换显示模式->文档不存在', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
... ... @@ -326,7 +334,7 @@ class DocApe extends Ape {
documentDeleteAll(_param) {
for (let key in this.docList) {
//console.log("key:"+key);
loger.log("删除文档数据itemIdx:" + key);
loger.log("删除文档数据->itemIdx:" + key);
this.documentDelete({"itemIdx": key});
}
}
... ... @@ -354,10 +362,18 @@ class DocApe extends Ape {
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
loger.log("文档发送删除数据=============" + tableDeleteItemPdu.itemIdx);
loger.log("文档发送删除数据=============>" + tableDeleteItemPdu.itemIdx);
this.sendUniform(adapterPdu, true);
}
//清除当前文档模块的数据
clearData(){
loger.log("clearData->")
this.docList={};
GlobalConfig.activeDocId=0;
GlobalConfig.activeDocCurPage=1;
}
/////收到消息处理/////////////////////////////////////////////////////////////////////////////////
tableInsertHandler(owner, itemIdx, itemData) {
/* let itemDataInfo = this.unPackPdu(owner, itemIdx, itemData);
... ... @@ -380,11 +396,11 @@ class DocApe extends Ape {
this.documentSwitchDoc(paramInfo);
}*/
}
//添加文档
tableInsertApeHandler(_tableUpdateItems, _seekTime) {
let tableInsertItems =_tableUpdateItems;
let tableInsertItemsLen = tableInsertItems.length;
loger.log('tableInsertApeHandler', "activeDocId->", GlobalConfig.activeDocId, "tableUpdateItemsLen->", tableInsertItemsLen);
loger.log('添加文档->', "activeDocId->", GlobalConfig.activeDocId, "tableUpdateItemsLen->", tableInsertItemsLen);
for (let i = 0; i < tableInsertItemsLen; ++i) {
let insertItem = tableInsertItems[i];
//this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
... ... @@ -394,7 +410,7 @@ class DocApe extends Ape {
if (itemDataInfo.visible == "true" || itemDataInfo.visible == true) {
GlobalConfig.activeDocId = itemDataInfo.itemIdx;//当前激活的文档ID
GlobalConfig.activeDocCurPage = itemDataInfo.curPageNo;//当前激活的文档的当前页
loger.log('tableInsertHandler 设置当前激活的文档id');
loger.log('添加文档->设置当前激活的文档id');
}
this._emit(MessageTypes.DOC_UPDATE, itemDataInfo);//用添加和更新都统一DOC_UPDATE
}
... ... @@ -403,7 +419,7 @@ class DocApe extends Ape {
this._showDefaultDoc();
}
tableDeleteHandler(object_id, tableDeleteData) {
loger.log('tableDeleteHandler', object_id, tableDeleteData);//["tableDeleteHandler",1179649,{"type":231,"itemIdx":[1486301768]}]
loger.log('删除文档数据->', object_id, tableDeleteData);//["tableDeleteHandler",1179649,{"type":231,"itemIdx":[1486301768]}]
if (tableDeleteData && tableDeleteData.itemIdx) {
let len = tableDeleteData.itemIdx.length;
let itemIdxs = tableDeleteData.itemIdx;
... ... @@ -415,7 +431,7 @@ class DocApe extends Ape {
if (itemDataInfo && (itemDataInfo.visible == "true" || itemDataInfo.visible == true)) {
GlobalConfig.activeDocId = 0;//当前激活的文档ID
GlobalConfig.activeDocCurPage = 1;//当前激活的文档的当前页
loger.log('tableDeleteHandler->当前显示的文档');
loger.log('删除文档数据->清除当前显示的文档');
}
this._emit(MessageTypes.DOC_DELETE, {"itemIdx": itemIdxs[i]});
delete this.docList[itemIdxs[i]];
... ... @@ -445,7 +461,7 @@ class DocApe extends Ape {
tableUpdateApeHandler(_tableUpdateItems, _seekTime) {
let tableUpdateItemsLen = _tableUpdateItems.length;
loger.log('tableUpdateApeHandler', "activeDocId->", GlobalConfig.activeDocId, "tableUpdateItemsLen->", tableUpdateItemsLen);
loger.log('更新文档->', "activeDocId->", GlobalConfig.activeDocId, "更新的数量->", tableUpdateItemsLen);
for (let i = 0; i < tableUpdateItemsLen; ++i) {
let tableItem = _tableUpdateItems[i];
let itemDataInfo = this.unPackPdu(tableItem.owner, tableItem.itemIdx, tableItem.itemData);
... ... @@ -454,12 +470,12 @@ class DocApe extends Ape {
if (itemDataInfo && (itemDataInfo.visible == "true" || itemDataInfo.visible == true)) {
GlobalConfig.activeDocId = itemDataInfo.itemIdx;//当前激活的文档ID
GlobalConfig.activeDocCurPage = itemDataInfo.curPageNo;//当前激活的文档的当前页
loger.log('tableUpdateHandler 设置当前激活的文档id->', GlobalConfig.activeDocId, "curPageNum->", GlobalConfig.activeDocCurPage);
loger.log('更新文档->设置当前激活的文档id->', GlobalConfig.activeDocId, "curPageNum->", GlobalConfig.activeDocCurPage);
}
loger.log('doc->', itemDataInfo);
this._emit(MessageTypes.DOC_UPDATE, itemDataInfo);
} else {
loger.log('tableUpdateHandler 数据无效--> itemIdx', itemIdx);
loger.log('更新文档-> 数据无效--> itemIdx', itemIdx);
}
}
this._showDefaultDoc();
... ... @@ -506,25 +522,25 @@ class DocApe extends Ape {
//检查文档是否已经存在,如果存在 返回true,否则返回false
checkDocId(_docId) {
if (_docId == null) {
loger.warn('checkDocId _docId参数为null');
loger.warn('查找文档->失败->参数为null');
return true;
}
//遍历查找
for (let key in this.docList) {
let item = this.docList[key];
loger.log('item.docId==============_docId', item.docId, _docId);
if (item && item.docId == _docId) {
loger.log('查找文档->已经存在->',_docId);
return true;
}
}
loger.log('查找文档->没有查找到文档->',_docId);
//储存的数据中没有查找到
return false;
}
///////数据的封包和解包/////////////////////////////////////////
packPdu(_param, _itemIdx) {
loger.log("文档===packPdu ");
loger.log("文档===>packPdu ");
//验证坐标点集合数组是否合法
if (_param == null || _itemIdx == null) {
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
... ... @@ -579,18 +595,16 @@ class DocApe extends Ape {
}
unPackPdu(owner, itemIdx, itemData) {
loger.log("文档===unPackPdu ");
if (owner == null || itemIdx == null || itemData == null) {
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return null;
}
try {
let docModelPdu = pdu['RCDocSendDataModelPdu'].decode(itemData);
//loger.log(docModelPdu);
loger.log("文档===>unPackPdu");
return docModelPdu;
} catch (err) {
loger.log("文档收到数据 unPackPdu Pdu解析错误,itemIdx=" + itemIdx + " err:" + err.message);
loger.log("文档===>unPackPdu->Pdu解析错误->itemIdx=" + itemIdx + "->err:" + err.message);
}
return null;
}
... ...
... ... @@ -58,6 +58,12 @@ class WhiteBoardApe extends Ape {
this.insertHistory = [];
}
//清除当前模块的数据
clearData(){
loger.log("clearData->")
this.annoInfos = {};//储存所有的标注数据
this.insertHistory = [];//添加的白板记录,用于撤回操作
}
/////////////发送数据操作//////////////////////////////////////////////////////
// 添加标注,发送信息
sendInsetAnnotaion(_param) {
... ...