李勇

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

此 diff 太大无法显示。
... ... @@ -28,7 +28,7 @@ import MediaModule from 'apes/MediaModule';
import UTF8 from 'utf-8';
let loger = Loger.getLoger('McuClient');
let _sdkInfo = {"version": "v1.23.2.201705018", "author": "www.3mang.com"};
let _sdkInfo = {"version": "v1.23.3.201705018", "author": "www.3mang.com"};
//APE
let _sass;
... ...
... ... @@ -61,6 +61,7 @@ class RecordPlayBackParse extends Emiter {
this._chatApeMssages = {};//聊天数据
this._videoApeMssages = {};//视频数据
this._audioApeMssages = {};//音频数据
this.mediaChannleList={};
this._docApeMssages = {};//文档数据
this._whiteApeMssages = {};//白板数据
}
... ... @@ -119,7 +120,7 @@ class RecordPlayBackParse extends Emiter {
//解析和储存,录制回放EverSocket底层消息处理 data-数据;timestamp-数据对应的时间戳
_parseSaveSocketMsgReceivedHandler(data, timestamp) {
loger.log('解析和储存,录制回放EverSocket底层消息处理 ');
loger.log('解析和储存录制回放数据-> ');
let pduMsg = pdu.decode_pdu(data);
let pduType = pduMsg.get("type");
let pduData = pduMsg.get("data");
... ... @@ -172,11 +173,11 @@ class RecordPlayBackParse extends Emiter {
break;
case ApeConsts.VIDEO_SESSION_ID:
this.saveParseData(data, timestamp, this._videoApeMssages);
this._pduRegAdapterHandler(pduMsg.data,timestamp,data,ApeConsts.VIDEO_SESSION_ID)
this.unPackpduRegAdapterHandler(pduMsg.data,timestamp,data,ApeConsts.VIDEO_SESSION_ID)
break;
case ApeConsts.AUDIO_SESSION_ID:
this.saveParseData(data, timestamp, this._audioApeMssages);
this._pduRegAdapterHandler(pduMsg.data,timestamp,data,ApeConsts.AUDIO_SESSION_ID)
this.unPackpduRegAdapterHandler(pduMsg.data,timestamp,data,ApeConsts.AUDIO_SESSION_ID)
break;
default:
break;
... ... @@ -188,7 +189,7 @@ class RecordPlayBackParse extends Emiter {
}
}
//保存数据
//保存各个模块的MCU原始数据
saveParseData(data, timestamp, apeMessages) {
let messageItem = apeMessages[timestamp];
if (!messageItem) {
... ... @@ -293,9 +294,9 @@ class RecordPlayBackParse extends Emiter {
let byteData = parseBuffer.buffer.slice(position, (position + byteLen));
position += byteLen;
//按时间戳解保存数据
this._parseSaveSocketMsgReceivedHandler(byteData, timestamp);
//记录最后一个数据的时间戳作为整个录制回放的总时间戳
this._recordPlaybackMaxTime = timestamp;
}
... ... @@ -330,19 +331,6 @@ class RecordPlayBackParse extends Emiter {
}
}
}
/*_searchMessageFromTime(_timestamp,_apeMessages){
let msgDataArr=this._messages[_timestamp];
if(!msgDataArr){
//没有数据,需要查找当前时间点属于哪一个时间戳关键帧
}else {
//把时间点对应的数据发送,同一秒内有存在多个数据的情况
for(let i=0;i<msgDataArr.length;i++){
this._everSocketMsgReceivedHandler(msgDataArr[i].byteData);
}
}
}*/
//method------------外部接口-------------------------------------
//开始播放
... ... @@ -397,9 +385,13 @@ class RecordPlayBackParse extends Emiter {
this._searchApeMessageKeyfram(this._conferApeMssages, ApeConsts.CONFERENCE_SESSION_ID);
this._searchApeMessageKeyfram(this._docApeMssages, ApeConsts.DOCSHARING_SESSION_ID);
/*
//旧的音视频查找关键帧数据,多路音视频的时候存在显示问题,已经废弃
//this._searchApeMessageKeyfram(this._videoApeMssages, ApeConsts.VIDEO_SESSION_ID);
//this._searchApeMessageKeyfram(this._audioApeMssages, ApeConsts.AUDIO_SESSION_ID);
*/
//音视频模块的查找规则和其他模块不一样,音视频按频道查找,如果课堂内存在多个频道,都要查
this.searchMediaApeMessageKeyfram(this.mediaChannleList);
//聊天模块、白板标注模块的比较特殊,消息是累计的,默认最多30条
... ... @@ -435,9 +427,9 @@ class RecordPlayBackParse extends Emiter {
loger.log("SEEK->APE", ApeConsts(_apeId), this._recordPlaybackTimestamp, "没有查找到相连的数据");
}
//音视频模块seek的时候,查找当前seek点的关键帧数据
//音视频模块seek的时候,查找当前seek点的关键帧数据,所有频道的数据都需要查一下,否则多路视频的时候会显示不全
searchMediaApeMessageKeyfram(_apeMessages){
loger.log("searchMediaApeMessageKeyfram->SEEK->APE")
loger.log("SEEK->查找音视频模块数据");
if(_apeMessages) {
for (let k in _apeMessages) {
let channelInfos = _apeMessages[k];
... ... @@ -447,7 +439,7 @@ class RecordPlayBackParse extends Emiter {
messageItem = channelInfos[i];
if (messageItem) {
keyFrameSeekTime = (this._recordPlaybackTimestamp - i);
loger.log("searchMediaApeMessageKeyfram->SEEK->APE->messageItem",messageItem,'keyFrameSeekTime->',keyFrameSeekTime)
loger.log("SEEK->查找音视频模块数据->",messageItem,'keyFrameSeekTime->',keyFrameSeekTime)
this._everSocketMsgReceivedHandler(messageItem.byteData, keyFrameSeekTime);
break;
}
... ... @@ -505,9 +497,10 @@ class RecordPlayBackParse extends Emiter {
}
}
}
// 数据同步处理 regBuffer已经解开的数据,timestamp 时间戳,data原始数据 ApeConsts.VIDEO_SESSION_ID
_pduRegAdapterHandler(regBuffer,timestamp,data,sessionId) {
//音视频的数据需要解析,然后按频道储存数据
// 解析pdu RCAdapterPdu的数据: regBuffer(RCAdapterPdu数据),timestamp(时间戳), data(mcu的原始数据) sessionId(类型)
unPackpduRegAdapterHandler(regBuffer, timestamp, data, sessionId) {
let regPdu;
let regItems ;
let regItemSize ;
... ... @@ -521,18 +514,12 @@ class RecordPlayBackParse extends Emiter {
console.warn('RCAdapterPdu->unpack-error->type类型不对')
return;
}
//onsole.log('RCAdapterPdu',regPdu)
//loger.log(this._session_name + '数据同步消息');
//loger.log(this._session_name + '数据同步消息.同步条数', regItemSize,"seekTime->",seekTime);
for (var i = 0; i < regItemSize; ++i) {
let regItem = regItems[i];
let regItemType = regItem.type;
let regItemData = regItem.itemData;
//根据数据包中的type处理数据是否同步
if (pdu.RCPDU_REG_UPDATE_OBJ !== regItemType) {
if (pdu.RCPDU_REG_RESPONSE_OBJ == regItemType) {
let regResponsePdu = pdu['RCRegistryResponseObjPdu'].decode(regItemData);
... ... @@ -552,25 +539,19 @@ class RecordPlayBackParse extends Emiter {
switch (sub_type) {
case pdu.RCPDU_REG_ROSTER_INSERT_PDU:
//let rosterInsertData = pdu['RCRegstryRosterInsertItemPdu'].decode(user_data);
// loger.log('RCPDU_REG_ROSTER_INSERT_PDU---->');
let rosterInsertData = pdu['RCRegistryRosterInsertItemPdu'].decode(user_data);
// console.log('RCRegistryRosterInsertItemPdu',rosterInsertData)
let rosterInsertItems = rosterInsertData.items;
let rosterInsertItemsLen = rosterInsertItems.length;
for (let i = 0; i < rosterInsertItemsLen; ++i) {
let record = rosterInsertItems[i];
let recordId = record.item_id;
let recordData = pdu['RCNodeInfoRecordPdu'].decode(record.item_data);
//this.rosterInsertHandler(recordId, recordData);
//console.log('RCNodeInfoRecordPdu',recordData)
}
break;
case pdu.RCPDU_REG_ROSTER_DELETE_PDU:
let rosterDelData = pdu['RCRegistryRosterDeleteItemPdu'].decode(user_data);
// console.log('RCRegistryRosterDeleteItemPdu',rosterDelData)
// this.rosterDelHandler(rosterDelData.nodeId);
break;
case pdu.RCPDU_REG_ROSTER_UPDATE_PDU:
let rosterUpdateData = pdu['RCRegistryRosterUpdateItemPdu'].decode(user_data);
... ... @@ -582,7 +563,6 @@ class RecordPlayBackParse extends Emiter {
let nodeId = node.nodeId;
let nodeData = pdu['RCNodeInfoRecordPdu'].decode(node.nodeData);
// console.log('RCNodeInfoRecordPdu',nodeData)
//this.rosterUpdateHandler(nodeId, nodeData);
}
break;
case pdu.RCPDU_REG_TABLE_INSERT_PDU:
... ... @@ -595,15 +575,10 @@ class RecordPlayBackParse extends Emiter {
//loger.log("insertItem",insertItem);
//this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
}
//文档数据数组内部自己处理数组
//this.tableInsertApeHandler(tableInsertItems);
break;
case pdu.RCPDU_REG_TABLE_DELETE_PDU:
let tableDeleteData = pdu['RCRegistryTableDeleteItemPdu'].decode(user_data);
//console.log("tableDeleteData",object_id,tableDeleteData);
// console.log('RCRegistryTableDeleteItemPdu',tableDeleteData)
//this.tableDeleteHandler(object_id, tableDeleteData);
break;
case pdu.RCPDU_REG_TABLE_UPDATE_PDU:
let tableUpdateData = pdu['RCRegistryTableUpdateItemPdu'].decode(user_data);
... ... @@ -638,7 +613,6 @@ class RecordPlayBackParse extends Emiter {
loger.log("RCAudioChannelInfoPdu->unPackPdu->error->" + tableItem.itemIdx + " err:" + err.message);
}
}
}
break;
case pdu.RCPDU_REG_QUEUE_UPDATE_PDU:
... ... @@ -646,11 +620,11 @@ class RecordPlayBackParse extends Emiter {
case pdu.RCPDU_REG_QUEUE_INSERT_PDU:
loger.warn('REG QUEUE ARE IGNORED');
break;
default :
break;
}
}
}
}
RecordPlayBackParse.prototype.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = 'class_join_recordPlayback_success';//加入录制回放成功
... ...