李勇

解决录制回放时多路音视频显示不完整的问题

此 diff 太大无法显示。
@@ -28,7 +28,7 @@ import MediaModule from 'apes/MediaModule'; @@ -28,7 +28,7 @@ import MediaModule from 'apes/MediaModule';
28 import UTF8 from 'utf-8'; 28 import UTF8 from 'utf-8';
29 29
30 let loger = Loger.getLoger('McuClient'); 30 let loger = Loger.getLoger('McuClient');
31 -let _sdkInfo = {"version": "v1.23.2.201705018", "author": "www.3mang.com"}; 31 +let _sdkInfo = {"version": "v1.23.3.201705018", "author": "www.3mang.com"};
32 32
33 //APE 33 //APE
34 let _sass; 34 let _sass;
@@ -61,6 +61,7 @@ class RecordPlayBackParse extends Emiter { @@ -61,6 +61,7 @@ class RecordPlayBackParse extends Emiter {
61 this._chatApeMssages = {};//聊天数据 61 this._chatApeMssages = {};//聊天数据
62 this._videoApeMssages = {};//视频数据 62 this._videoApeMssages = {};//视频数据
63 this._audioApeMssages = {};//音频数据 63 this._audioApeMssages = {};//音频数据
  64 + this.mediaChannleList={};
64 this._docApeMssages = {};//文档数据 65 this._docApeMssages = {};//文档数据
65 this._whiteApeMssages = {};//白板数据 66 this._whiteApeMssages = {};//白板数据
66 } 67 }
@@ -119,7 +120,7 @@ class RecordPlayBackParse extends Emiter { @@ -119,7 +120,7 @@ class RecordPlayBackParse extends Emiter {
119 120
120 //解析和储存,录制回放EverSocket底层消息处理 data-数据;timestamp-数据对应的时间戳 121 //解析和储存,录制回放EverSocket底层消息处理 data-数据;timestamp-数据对应的时间戳
121 _parseSaveSocketMsgReceivedHandler(data, timestamp) { 122 _parseSaveSocketMsgReceivedHandler(data, timestamp) {
122 - loger.log('解析和储存,录制回放EverSocket底层消息处理 '); 123 + loger.log('解析和储存录制回放数据-> ');
123 let pduMsg = pdu.decode_pdu(data); 124 let pduMsg = pdu.decode_pdu(data);
124 let pduType = pduMsg.get("type"); 125 let pduType = pduMsg.get("type");
125 let pduData = pduMsg.get("data"); 126 let pduData = pduMsg.get("data");
@@ -172,11 +173,11 @@ class RecordPlayBackParse extends Emiter { @@ -172,11 +173,11 @@ class RecordPlayBackParse extends Emiter {
172 break; 173 break;
173 case ApeConsts.VIDEO_SESSION_ID: 174 case ApeConsts.VIDEO_SESSION_ID:
174 this.saveParseData(data, timestamp, this._videoApeMssages); 175 this.saveParseData(data, timestamp, this._videoApeMssages);
175 - this._pduRegAdapterHandler(pduMsg.data,timestamp,data,ApeConsts.VIDEO_SESSION_ID) 176 + this.unPackpduRegAdapterHandler(pduMsg.data,timestamp,data,ApeConsts.VIDEO_SESSION_ID)
176 break; 177 break;
177 case ApeConsts.AUDIO_SESSION_ID: 178 case ApeConsts.AUDIO_SESSION_ID:
178 this.saveParseData(data, timestamp, this._audioApeMssages); 179 this.saveParseData(data, timestamp, this._audioApeMssages);
179 - this._pduRegAdapterHandler(pduMsg.data,timestamp,data,ApeConsts.AUDIO_SESSION_ID) 180 + this.unPackpduRegAdapterHandler(pduMsg.data,timestamp,data,ApeConsts.AUDIO_SESSION_ID)
180 break; 181 break;
181 default: 182 default:
182 break; 183 break;
@@ -188,7 +189,7 @@ class RecordPlayBackParse extends Emiter { @@ -188,7 +189,7 @@ class RecordPlayBackParse extends Emiter {
188 } 189 }
189 } 190 }
190 191
191 - //保存数据 192 + //保存各个模块的MCU原始数据
192 saveParseData(data, timestamp, apeMessages) { 193 saveParseData(data, timestamp, apeMessages) {
193 let messageItem = apeMessages[timestamp]; 194 let messageItem = apeMessages[timestamp];
194 if (!messageItem) { 195 if (!messageItem) {
@@ -293,9 +294,9 @@ class RecordPlayBackParse extends Emiter { @@ -293,9 +294,9 @@ class RecordPlayBackParse extends Emiter {
293 let byteData = parseBuffer.buffer.slice(position, (position + byteLen)); 294 let byteData = parseBuffer.buffer.slice(position, (position + byteLen));
294 position += byteLen; 295 position += byteLen;
295 296
  297 + //按时间戳解保存数据
296 this._parseSaveSocketMsgReceivedHandler(byteData, timestamp); 298 this._parseSaveSocketMsgReceivedHandler(byteData, timestamp);
297 299
298 -  
299 //记录最后一个数据的时间戳作为整个录制回放的总时间戳 300 //记录最后一个数据的时间戳作为整个录制回放的总时间戳
300 this._recordPlaybackMaxTime = timestamp; 301 this._recordPlaybackMaxTime = timestamp;
301 } 302 }
@@ -330,19 +331,6 @@ class RecordPlayBackParse extends Emiter { @@ -330,19 +331,6 @@ class RecordPlayBackParse extends Emiter {
330 } 331 }
331 } 332 }
332 } 333 }
333 -  
334 - /*_searchMessageFromTime(_timestamp,_apeMessages){  
335 - let msgDataArr=this._messages[_timestamp];  
336 - if(!msgDataArr){  
337 - //没有数据,需要查找当前时间点属于哪一个时间戳关键帧  
338 - }else {  
339 - //把时间点对应的数据发送,同一秒内有存在多个数据的情况  
340 - for(let i=0;i<msgDataArr.length;i++){  
341 - this._everSocketMsgReceivedHandler(msgDataArr[i].byteData);  
342 - }  
343 - }  
344 - }*/  
345 -  
346 //method------------外部接口------------------------------------- 334 //method------------外部接口-------------------------------------
347 335
348 //开始播放 336 //开始播放
@@ -397,9 +385,13 @@ class RecordPlayBackParse extends Emiter { @@ -397,9 +385,13 @@ class RecordPlayBackParse extends Emiter {
397 this._searchApeMessageKeyfram(this._conferApeMssages, ApeConsts.CONFERENCE_SESSION_ID); 385 this._searchApeMessageKeyfram(this._conferApeMssages, ApeConsts.CONFERENCE_SESSION_ID);
398 this._searchApeMessageKeyfram(this._docApeMssages, ApeConsts.DOCSHARING_SESSION_ID); 386 this._searchApeMessageKeyfram(this._docApeMssages, ApeConsts.DOCSHARING_SESSION_ID);
399 387
  388 + /*
  389 + //旧的音视频查找关键帧数据,多路音视频的时候存在显示问题,已经废弃
400 //this._searchApeMessageKeyfram(this._videoApeMssages, ApeConsts.VIDEO_SESSION_ID); 390 //this._searchApeMessageKeyfram(this._videoApeMssages, ApeConsts.VIDEO_SESSION_ID);
401 //this._searchApeMessageKeyfram(this._audioApeMssages, ApeConsts.AUDIO_SESSION_ID); 391 //this._searchApeMessageKeyfram(this._audioApeMssages, ApeConsts.AUDIO_SESSION_ID);
  392 + */
402 393
  394 + //音视频模块的查找规则和其他模块不一样,音视频按频道查找,如果课堂内存在多个频道,都要查
403 this.searchMediaApeMessageKeyfram(this.mediaChannleList); 395 this.searchMediaApeMessageKeyfram(this.mediaChannleList);
404 396
405 //聊天模块、白板标注模块的比较特殊,消息是累计的,默认最多30条 397 //聊天模块、白板标注模块的比较特殊,消息是累计的,默认最多30条
@@ -435,9 +427,9 @@ class RecordPlayBackParse extends Emiter { @@ -435,9 +427,9 @@ class RecordPlayBackParse extends Emiter {
435 loger.log("SEEK->APE", ApeConsts(_apeId), this._recordPlaybackTimestamp, "没有查找到相连的数据"); 427 loger.log("SEEK->APE", ApeConsts(_apeId), this._recordPlaybackTimestamp, "没有查找到相连的数据");
436 } 428 }
437 429
438 - //音视频模块seek的时候,查找当前seek点的关键帧数据 430 + //音视频模块seek的时候,查找当前seek点的关键帧数据,所有频道的数据都需要查一下,否则多路视频的时候会显示不全
439 searchMediaApeMessageKeyfram(_apeMessages){ 431 searchMediaApeMessageKeyfram(_apeMessages){
440 - loger.log("searchMediaApeMessageKeyfram->SEEK->APE") 432 + loger.log("SEEK->查找音视频模块数据");
441 if(_apeMessages) { 433 if(_apeMessages) {
442 for (let k in _apeMessages) { 434 for (let k in _apeMessages) {
443 let channelInfos = _apeMessages[k]; 435 let channelInfos = _apeMessages[k];
@@ -447,7 +439,7 @@ class RecordPlayBackParse extends Emiter { @@ -447,7 +439,7 @@ class RecordPlayBackParse extends Emiter {
447 messageItem = channelInfos[i]; 439 messageItem = channelInfos[i];
448 if (messageItem) { 440 if (messageItem) {
449 keyFrameSeekTime = (this._recordPlaybackTimestamp - i); 441 keyFrameSeekTime = (this._recordPlaybackTimestamp - i);
450 - loger.log("searchMediaApeMessageKeyfram->SEEK->APE->messageItem",messageItem,'keyFrameSeekTime->',keyFrameSeekTime) 442 + loger.log("SEEK->查找音视频模块数据->",messageItem,'keyFrameSeekTime->',keyFrameSeekTime)
451 this._everSocketMsgReceivedHandler(messageItem.byteData, keyFrameSeekTime); 443 this._everSocketMsgReceivedHandler(messageItem.byteData, keyFrameSeekTime);
452 break; 444 break;
453 } 445 }
@@ -505,9 +497,10 @@ class RecordPlayBackParse extends Emiter { @@ -505,9 +497,10 @@ class RecordPlayBackParse extends Emiter {
505 } 497 }
506 } 498 }
507 } 499 }
508 - // 数据同步处理 regBuffer已经解开的数据,timestamp 时间戳,data原始数据 ApeConsts.VIDEO_SESSION_ID  
509 - _pduRegAdapterHandler(regBuffer,timestamp,data,sessionId) {  
510 500
  501 + //音视频的数据需要解析,然后按频道储存数据
  502 + // 解析pdu RCAdapterPdu的数据: regBuffer(RCAdapterPdu数据),timestamp(时间戳), data(mcu的原始数据) sessionId(类型)
  503 + unPackpduRegAdapterHandler(regBuffer, timestamp, data, sessionId) {
511 let regPdu; 504 let regPdu;
512 let regItems ; 505 let regItems ;
513 let regItemSize ; 506 let regItemSize ;
@@ -521,18 +514,12 @@ class RecordPlayBackParse extends Emiter { @@ -521,18 +514,12 @@ class RecordPlayBackParse extends Emiter {
521 console.warn('RCAdapterPdu->unpack-error->type类型不对') 514 console.warn('RCAdapterPdu->unpack-error->type类型不对')
522 return; 515 return;
523 } 516 }
524 -  
525 - //onsole.log('RCAdapterPdu',regPdu)  
526 -  
527 - //loger.log(this._session_name + '数据同步消息');  
528 - //loger.log(this._session_name + '数据同步消息.同步条数', regItemSize,"seekTime->",seekTime);  
529 for (var i = 0; i < regItemSize; ++i) { 517 for (var i = 0; i < regItemSize; ++i) {
530 let regItem = regItems[i]; 518 let regItem = regItems[i];
531 let regItemType = regItem.type; 519 let regItemType = regItem.type;
532 let regItemData = regItem.itemData; 520 let regItemData = regItem.itemData;
533 521
534 //根据数据包中的type处理数据是否同步 522 //根据数据包中的type处理数据是否同步
535 -  
536 if (pdu.RCPDU_REG_UPDATE_OBJ !== regItemType) { 523 if (pdu.RCPDU_REG_UPDATE_OBJ !== regItemType) {
537 if (pdu.RCPDU_REG_RESPONSE_OBJ == regItemType) { 524 if (pdu.RCPDU_REG_RESPONSE_OBJ == regItemType) {
538 let regResponsePdu = pdu['RCRegistryResponseObjPdu'].decode(regItemData); 525 let regResponsePdu = pdu['RCRegistryResponseObjPdu'].decode(regItemData);
@@ -552,25 +539,19 @@ class RecordPlayBackParse extends Emiter { @@ -552,25 +539,19 @@ class RecordPlayBackParse extends Emiter {
552 539
553 switch (sub_type) { 540 switch (sub_type) {
554 case pdu.RCPDU_REG_ROSTER_INSERT_PDU: 541 case pdu.RCPDU_REG_ROSTER_INSERT_PDU:
555 - //let rosterInsertData = pdu['RCRegstryRosterInsertItemPdu'].decode(user_data);  
556 - // loger.log('RCPDU_REG_ROSTER_INSERT_PDU---->');  
557 -  
558 let rosterInsertData = pdu['RCRegistryRosterInsertItemPdu'].decode(user_data); 542 let rosterInsertData = pdu['RCRegistryRosterInsertItemPdu'].decode(user_data);
559 - // console.log('RCRegistryRosterInsertItemPdu',rosterInsertData) 543 +
560 let rosterInsertItems = rosterInsertData.items; 544 let rosterInsertItems = rosterInsertData.items;
561 let rosterInsertItemsLen = rosterInsertItems.length; 545 let rosterInsertItemsLen = rosterInsertItems.length;
562 for (let i = 0; i < rosterInsertItemsLen; ++i) { 546 for (let i = 0; i < rosterInsertItemsLen; ++i) {
563 let record = rosterInsertItems[i]; 547 let record = rosterInsertItems[i];
564 let recordId = record.item_id; 548 let recordId = record.item_id;
565 let recordData = pdu['RCNodeInfoRecordPdu'].decode(record.item_data); 549 let recordData = pdu['RCNodeInfoRecordPdu'].decode(record.item_data);
566 - //this.rosterInsertHandler(recordId, recordData);  
567 - //console.log('RCNodeInfoRecordPdu',recordData)  
568 } 550 }
569 break; 551 break;
570 case pdu.RCPDU_REG_ROSTER_DELETE_PDU: 552 case pdu.RCPDU_REG_ROSTER_DELETE_PDU:
571 let rosterDelData = pdu['RCRegistryRosterDeleteItemPdu'].decode(user_data); 553 let rosterDelData = pdu['RCRegistryRosterDeleteItemPdu'].decode(user_data);
572 // console.log('RCRegistryRosterDeleteItemPdu',rosterDelData) 554 // console.log('RCRegistryRosterDeleteItemPdu',rosterDelData)
573 - // this.rosterDelHandler(rosterDelData.nodeId);  
574 break; 555 break;
575 case pdu.RCPDU_REG_ROSTER_UPDATE_PDU: 556 case pdu.RCPDU_REG_ROSTER_UPDATE_PDU:
576 let rosterUpdateData = pdu['RCRegistryRosterUpdateItemPdu'].decode(user_data); 557 let rosterUpdateData = pdu['RCRegistryRosterUpdateItemPdu'].decode(user_data);
@@ -582,7 +563,6 @@ class RecordPlayBackParse extends Emiter { @@ -582,7 +563,6 @@ class RecordPlayBackParse extends Emiter {
582 let nodeId = node.nodeId; 563 let nodeId = node.nodeId;
583 let nodeData = pdu['RCNodeInfoRecordPdu'].decode(node.nodeData); 564 let nodeData = pdu['RCNodeInfoRecordPdu'].decode(node.nodeData);
584 // console.log('RCNodeInfoRecordPdu',nodeData) 565 // console.log('RCNodeInfoRecordPdu',nodeData)
585 - //this.rosterUpdateHandler(nodeId, nodeData);  
586 } 566 }
587 break; 567 break;
588 case pdu.RCPDU_REG_TABLE_INSERT_PDU: 568 case pdu.RCPDU_REG_TABLE_INSERT_PDU:
@@ -595,15 +575,10 @@ class RecordPlayBackParse extends Emiter { @@ -595,15 +575,10 @@ class RecordPlayBackParse extends Emiter {
595 //loger.log("insertItem",insertItem); 575 //loger.log("insertItem",insertItem);
596 //this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData); 576 //this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
597 } 577 }
598 -  
599 - //文档数据数组内部自己处理数组  
600 - //this.tableInsertApeHandler(tableInsertItems);  
601 break; 578 break;
602 case pdu.RCPDU_REG_TABLE_DELETE_PDU: 579 case pdu.RCPDU_REG_TABLE_DELETE_PDU:
603 let tableDeleteData = pdu['RCRegistryTableDeleteItemPdu'].decode(user_data); 580 let tableDeleteData = pdu['RCRegistryTableDeleteItemPdu'].decode(user_data);
604 //console.log("tableDeleteData",object_id,tableDeleteData); 581 //console.log("tableDeleteData",object_id,tableDeleteData);
605 - // console.log('RCRegistryTableDeleteItemPdu',tableDeleteData)  
606 - //this.tableDeleteHandler(object_id, tableDeleteData);  
607 break; 582 break;
608 case pdu.RCPDU_REG_TABLE_UPDATE_PDU: 583 case pdu.RCPDU_REG_TABLE_UPDATE_PDU:
609 let tableUpdateData = pdu['RCRegistryTableUpdateItemPdu'].decode(user_data); 584 let tableUpdateData = pdu['RCRegistryTableUpdateItemPdu'].decode(user_data);
@@ -638,7 +613,6 @@ class RecordPlayBackParse extends Emiter { @@ -638,7 +613,6 @@ class RecordPlayBackParse extends Emiter {
638 loger.log("RCAudioChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message); 613 loger.log("RCAudioChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message);
639 } 614 }
640 } 615 }
641 -  
642 } 616 }
643 break; 617 break;
644 case pdu.RCPDU_REG_QUEUE_UPDATE_PDU: 618 case pdu.RCPDU_REG_QUEUE_UPDATE_PDU:
@@ -646,11 +620,11 @@ class RecordPlayBackParse extends Emiter { @@ -646,11 +620,11 @@ class RecordPlayBackParse extends Emiter {
646 case pdu.RCPDU_REG_QUEUE_INSERT_PDU: 620 case pdu.RCPDU_REG_QUEUE_INSERT_PDU:
647 loger.warn('REG QUEUE ARE IGNORED'); 621 loger.warn('REG QUEUE ARE IGNORED');
648 break; 622 break;
649 - 623 + default :
  624 + break;
650 } 625 }
651 } 626 }
652 } 627 }
653 -  
654 } 628 }
655 629
656 RecordPlayBackParse.prototype.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = 'class_join_recordPlayback_success';//加入录制回放成功 630 RecordPlayBackParse.prototype.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = 'class_join_recordPlayback_success';//加入录制回放成功