李勇

1.增加自动登录判断

2.录制回放模块对数据分模块保存
@@ -7,6 +7,7 @@ import Emiter from './Emiter'; @@ -7,6 +7,7 @@ import Emiter from './Emiter';
7 import Sass from 'Sass'; 7 import Sass from 'Sass';
8 import ServerCheck from 'ServerCheck'; 8 import ServerCheck from 'ServerCheck';
9 import RecordPlayBackParse from 'RecordPlayBackParse'; 9 import RecordPlayBackParse from 'RecordPlayBackParse';
  10 +import MD5 from "md5";
10 import Mcu from 'mcu'; 11 import Mcu from 'mcu';
11 import MessageTypes from 'MessageTypes'; 12 import MessageTypes from 'MessageTypes';
12 import Loger from 'Loger'; 13 import Loger from 'Loger';
@@ -329,14 +330,24 @@ export default class MessageEntrance extends Emiter { @@ -329,14 +330,24 @@ export default class MessageEntrance extends Emiter {
329 if (GlobalConfig.userName == null || GlobalConfig.userName == "") { 330 if (GlobalConfig.userName == null || GlobalConfig.userName == "") {
330 GlobalConfig.userName = _param.userName; 331 GlobalConfig.userName = _param.userName;
331 } 332 }
  333 + GlobalConfig.autoLogin=_param.autoLogin||"";
332 GlobalConfig.password = _param.password || ""; 334 GlobalConfig.password = _param.password || "";
333 GlobalConfig.hasCamera = (typeof _param.hasCamera == "boolean") ? _param.hasCamera : false; 335 GlobalConfig.hasCamera = (typeof _param.hasCamera == "boolean") ? _param.hasCamera : false;
334 GlobalConfig.hasMicrophone = (typeof _param.hasMicrophone == "boolean") ? _param.hasMicrophone : false; 336 GlobalConfig.hasMicrophone = (typeof _param.hasMicrophone == "boolean") ? _param.hasMicrophone : false;
335 337
336 - //debugger;  
337 - //开始校验  
338 - if (_sass) {  
339 - _sass.passwordAndMd5Checking(GlobalConfig.getClassInfo()); 338 + loger.log("autoLoginMd5",GlobalConfig.classId,GlobalConfig.userId,GlobalConfig.userRole);
  339 + let autoLoginMd5=MD5(""+GlobalConfig.classId+GlobalConfig.userId+GlobalConfig.userRole);
  340 + loger.log("joinClass-GlobalConfig.autoLogin",GlobalConfig.autoLogin,"autoLoginMd5-",autoLoginMd5);
  341 + if(GlobalConfig.autoLogin&&autoLoginMd5==GlobalConfig.autoLogin){
  342 + // MD5(classId+userId+userRole)==m
  343 + //自动登录,跳过验证流程
  344 + loger.log("自动登录");
  345 + this._sassJoinSuccessHandler();
  346 + }else {
  347 + //不能自动登录,开始校验
  348 + if (_sass) {
  349 + _sass.passwordAndMd5Checking(GlobalConfig.getClassInfo());
  350 + }
340 } 351 }
341 } 352 }
342 353
@@ -70,6 +70,7 @@ class GlobalConfig { @@ -70,6 +70,7 @@ class GlobalConfig {
70 classStatusInfo.classStartTime=this.classStartTime;//课堂点击开始时间 70 classStatusInfo.classStartTime=this.classStartTime;//课堂点击开始时间
71 classStatusInfo.classStopTime=this.classStopTime;//最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳 71 classStatusInfo.classStopTime=this.classStopTime;//最后一次停止的时间(点暂停或结束),每次发送数据都获取当前时间戳
72 classStatusInfo.classTimestamp=this.classTimestamp;//相对于点开始课堂的时间戳 72 classStatusInfo.classTimestamp=this.classTimestamp;//相对于点开始课堂的时间戳
  73 + classStatusInfo.recordPlaybackMaxTime=this.recordPlaybackMaxTime;//相对于点开始课堂的时间戳
73 74
74 classStatusInfo.classBeginTime=this.classBeginTime;//课堂创建的时间,这个是Sass返回的 75 classStatusInfo.classBeginTime=this.classBeginTime;//课堂创建的时间,这个是Sass返回的
75 classStatusInfo.classEndTime=this.classEndTime;//课堂结束的时间,这个是Sass返回的 76 classStatusInfo.classEndTime=this.classEndTime;//课堂结束的时间,这个是Sass返回的
@@ -297,6 +298,7 @@ GlobalConfig.classBeginTime="";//课堂创建的时间,这个是Sass返回的 @@ -297,6 +298,7 @@ GlobalConfig.classBeginTime="";//课堂创建的时间,这个是Sass返回的
297 GlobalConfig.classEndTime="";//课堂结束的时间,这个是Sass返回的 298 GlobalConfig.classEndTime="";//课堂结束的时间,这个是Sass返回的
298 GlobalConfig.classTimestamp=0;//从课堂开始到现在的时 299 GlobalConfig.classTimestamp=0;//从课堂开始到现在的时
299 300
  301 +GlobalConfig.recordPlaybackMaxTime=0;//录制回放的总时间
300 GlobalConfig.recordStatus=false;//当前录制状态 302 GlobalConfig.recordStatus=false;//当前录制状态
301 GlobalConfig.recordTimestamp=0;//相对于首次开始录制的进行时间 303 GlobalConfig.recordTimestamp=0;//相对于首次开始录制的进行时间
302 GlobalConfig.recordFileName="";//录制的文件名,如 果为空就创建一个 304 GlobalConfig.recordFileName="";//录制的文件名,如 果为空就创建一个
@@ -17,11 +17,11 @@ import TimerCounter from "TimerCounter"; @@ -17,11 +17,11 @@ import TimerCounter from "TimerCounter";
17 let parseBuffer; 17 let parseBuffer;
18 // 日志对象 18 // 日志对象
19 const loger = Loger.getLoger('RecordPlayBackParse'); 19 const loger = Loger.getLoger('RecordPlayBackParse');
20 -const Default=0;//未开始  
21 -const PLAY=1;//播放中  
22 -const PAUSE=2;//暂停  
23 -const SEEK=3;//seek  
24 -const STOP=4;//停止 20 +const Default = 0;//未开始
  21 +const PLAY = 1;//播放中
  22 +const PAUSE = 2;//暂停
  23 +const SEEK = 3;//seek
  24 +const STOP = 4;//停止
25 25
26 class RecordPlayBackParse extends Emiter { 26 class RecordPlayBackParse extends Emiter {
27 constructor() { 27 constructor() {
@@ -32,9 +32,17 @@ class RecordPlayBackParse extends Emiter { @@ -32,9 +32,17 @@ class RecordPlayBackParse extends Emiter {
32 console.log(parseBuffer); 32 console.log(parseBuffer);
33 this._recordPlaybackTimestamp = 0;//回放的时间 33 this._recordPlaybackTimestamp = 0;//回放的时间
34 this._recordPlaybackMaxTime = 0;//录制回放的总时间 34 this._recordPlaybackMaxTime = 0;//录制回放的总时间
35 - this._isReady=false;//录制回放是否已经准备完成 35 + this._isReady = false;//录制回放是否已经准备完成
36 this._apes = {}; 36 this._apes = {};
37 this._messages = {}; 37 this._messages = {};
  38 +
  39 + this._conferApeMssages = {};//会议数据
  40 + this._chatApeMssages = {};//聊天数据
  41 + this._videoApeMssages = {};//视频数据
  42 + this._audioApeMssages = {};//音频数据
  43 + this._docApeMssages = {};//文档数据
  44 + this._whiteApeMssages = {};//白板数据
  45 +
38 this._timerCounter = new TimerCounter();//计时器 46 this._timerCounter = new TimerCounter();//计时器
39 this._timerCounter.addTimerCallBack(this._timerCounterUptate.bind(this), 1); 47 this._timerCounter.addTimerCallBack(this._timerCounterUptate.bind(this), 1);
40 } 48 }
@@ -45,8 +53,10 @@ class RecordPlayBackParse extends Emiter { @@ -45,8 +53,10 @@ class RecordPlayBackParse extends Emiter {
45 this._apes[ape._session_id] = ape; 53 this._apes[ape._session_id] = ape;
46 } 54 }
47 55
48 - // 录制回放EverSocket底层消息处理  
49 - _everSocketMsgReceivedHandler(data) { 56 + // 录制回放EverSocket底层消息处理 data-数据;timestamp-数据对应的时间戳
  57 + // 1.如果第二个参数timestamp不为空,数据就不往外发送,只做解析和储存
  58 + // 2.如果第二个参数timestamp为空,数据就发送给各个ape处理;
  59 + _everSocketMsgReceivedHandler(data, timestamp) {
50 let pduMsg = pdu.decode_pdu(data); 60 let pduMsg = pdu.decode_pdu(data);
51 let pduType = pduMsg.get("type"); 61 let pduType = pduMsg.get("type");
52 let pduData = pduMsg.get("data"); 62 let pduData = pduMsg.get("data");
@@ -82,13 +92,41 @@ class RecordPlayBackParse extends Emiter { @@ -82,13 +92,41 @@ class RecordPlayBackParse extends Emiter {
82 //先判断当前消息属于哪个APE 根据 sessionId来判断 92 //先判断当前消息属于哪个APE 根据 sessionId来判断
83 let ape = this._apes[pduMsg.sessionId]; 93 let ape = this._apes[pduMsg.sessionId];
84 let sessionLabel = ApeConsts(pduMsg.sessionId); 94 let sessionLabel = ApeConsts(pduMsg.sessionId);
85 - if (ape) {  
86 - let subTypeLabel = pdu.id2type(pduMsg.subType);  
87 - //loger.log('MCU-SecondLayer封装消息', 'sessionId', sessionLabel, pduMsg.sessionId, 'subtype', subTypeLabel, pduMsg.subType);  
88 - //ape广播事件,只要ape中监听就能收到  
89 - ape._emit(pduMsg.subType, pduMsg.data); 95 + if (timestamp) {
  96 + //只做解析存储,不对外发送
  97 + loger.log('解析数据-timestamp->', timestamp, 'sessionId->', pduMsg.sessionId, 'sessionLabel->', sessionLabel);
  98 + switch (pduMsg.sessionId) {
  99 + case ApeConsts.CONFERENCE_SESSION_ID:
  100 + this.saveParseData(data, timestamp, this._conferApeMssages);
  101 + break;
  102 + case ApeConsts.CHAT_SESSION_ID:
  103 + this.saveParseData(data, timestamp, this._chatApeMssages);
  104 + break;
  105 + case ApeConsts.DOCSHARING_SESSION_ID:
  106 + this.saveParseData(data, timestamp, this._docApeMssages);
  107 + break;
  108 + case ApeConsts.WHITEBOARD_SESSION_ID:
  109 + this.saveParseData(data, timestamp, this._whiteApeMssages);
  110 + break;
  111 + case ApeConsts.VIDEO_SESSION_ID:
  112 + this.saveParseData(data, timestamp, this._videoApeMssages);
  113 + break;
  114 + case ApeConsts.AUDIO_SESSION_ID:
  115 + this.saveParseData(data, timestamp, this._audioApeMssages);
  116 + break;
  117 + default:
  118 + break;
  119 + }
90 } else { 120 } else {
91 - loger.warn(sessionLabel + '尚未注册'); 121 + //对方发送消息
  122 + if (ape) {
  123 + let subTypeLabel = pdu.id2type(pduMsg.subType);
  124 + //loger.log('MCU-SecondLayer封装消息', 'sessionId', sessionLabel, pduMsg.sessionId, 'subtype', subTypeLabel, pduMsg.subType);
  125 + //ape广播事件,只要ape中监听就能收到
  126 + ape._emit(pduMsg.subType, pduMsg.data);
  127 + } else {
  128 + loger.warn(sessionLabel + '尚未注册');
  129 + }
92 } 130 }
93 break; 131 break;
94 default: 132 default:
@@ -96,6 +134,17 @@ class RecordPlayBackParse extends Emiter { @@ -96,6 +134,17 @@ class RecordPlayBackParse extends Emiter {
96 } 134 }
97 } 135 }
98 136
  137 + //保存数据
  138 + saveParseData(data, timestamp, apeMessages) {
  139 + let messageItem = apeMessages[timestamp];
  140 + if (!messageItem) {
  141 + apeMessages[timestamp] = [];//数组存数据,因为有1秒内收到多个消息的情况,timestamp是按秒记录的
  142 + messageItem = apeMessages[timestamp];
  143 + }
  144 + messageItem.push({"timestamp": timestamp, "byteData": data});
  145 +
  146 + }
  147 +
99 //开启计时器 148 //开启计时器
100 _startTimerCounter() { 149 _startTimerCounter() {
101 this._timerCounter.startTimer(); 150 this._timerCounter.startTimer();
@@ -108,23 +157,28 @@ class RecordPlayBackParse extends Emiter { @@ -108,23 +157,28 @@ class RecordPlayBackParse extends Emiter {
108 157
109 _timerCounterUptate() { 158 _timerCounterUptate() {
110 this._recordPlaybackTimestamp = this._recordPlaybackTimestamp + 1;//计时 159 this._recordPlaybackTimestamp = this._recordPlaybackTimestamp + 1;//计时
111 - if(this._recordPlaybackTimestamp>=this._recordPlaybackMaxTime){ 160 + if (this._recordPlaybackTimestamp >= this._recordPlaybackMaxTime) {
112 this._stopTimerCounter(); 161 this._stopTimerCounter();
113 - loger.log("录制回放结束...当前时间->", this._recordPlaybackTimestamp," 总时间->",this._recordPlaybackMaxTime);  
114 - this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE,{"status":STOP}); 162 + loger.log("录制回放结束...当前时间->", this._recordPlaybackTimestamp, " 总时间->", this._recordPlaybackMaxTime);
  163 + this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": STOP});
115 return; 164 return;
116 } 165 }
117 166
118 loger.log("录制回放中...", this._recordPlaybackTimestamp); 167 loger.log("录制回放中...", this._recordPlaybackTimestamp);
119 this._emit(MessageTypes.CLASS_UPDATE_TIMER, {"classTimestamp": this._recordPlaybackTimestamp}); 168 this._emit(MessageTypes.CLASS_UPDATE_TIMER, {"classTimestamp": this._recordPlaybackTimestamp});
120 169
121 - //根据时间查找消息数据  
122 - this._searchMessageFromTime(this._recordPlaybackTimestamp); 170 + //各个APE模块根据时间查找消息数据
  171 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._conferApeMssages);
  172 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._chatApeMssages);
  173 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._docApeMssages);
  174 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._whiteApeMssages);
  175 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._videoApeMssages);
  176 + this._searchMessageFromTime(this._recordPlaybackTimestamp, this._audioApeMssages);
123 } 177 }
124 178
125 //加载录制文件 179 //加载录制文件
126 readyRecordPlay() { 180 readyRecordPlay() {
127 - this._isReady=false; 181 + this._isReady = false;
128 this._stopTimerCounter(); 182 this._stopTimerCounter();
129 loger.log("读取回放数据"); 183 loger.log("读取回放数据");
130 //let url = `http://123.56.73.119:80/h5dev/20170306/1357644520_20170306.rec`; 184 //let url = `http://123.56.73.119:80/h5dev/20170306/1357644520_20170306.rec`;
@@ -182,103 +236,153 @@ class RecordPlayBackParse extends Emiter { @@ -182,103 +236,153 @@ class RecordPlayBackParse extends Emiter {
182 position += byteLen; 236 position += byteLen;
183 console.log(timestamp, byteLen, byteData); 237 console.log(timestamp, byteLen, byteData);
184 238
185 - let messageItem=this._messages[timestamp];  
186 - if(!messageItem){  
187 - this._messages[timestamp]=[];//数组存数据,因为有1秒内收到多个消息的情况,timestamp是按秒记录的  
188 - messageItem=this._messages[timestamp]; 239 + let messageItem = this._messages[timestamp];
  240 + if (!messageItem) {
  241 + this._messages[timestamp] = [];//数组存数据,因为有1秒内收到多个消息的情况,timestamp是按秒记录的
  242 + messageItem = this._messages[timestamp];
189 } 243 }
190 messageItem.push({"timestamp": timestamp, "byteData": byteData}); 244 messageItem.push({"timestamp": timestamp, "byteData": byteData});
191 245
  246 + this._everSocketMsgReceivedHandler(byteData, timestamp);
192 //记录最后一个数据的时间戳作为整个录制回放的总时间戳 247 //记录最后一个数据的时间戳作为整个录制回放的总时间戳
193 - this._recordPlaybackMaxTime=timestamp; 248 + this._recordPlaybackMaxTime = timestamp;
194 } 249 }
195 - this._recordPlaybackTimestamp=0;  
196 - this._isReady=true; 250 + this._recordPlaybackTimestamp = 0;
  251 + this._isReady = true;
197 this._stopTimerCounter(); 252 this._stopTimerCounter();
198 253
199 - GlobalConfig.recordPlaybackMaxTime=this._recordPlaybackMaxTime;  
200 - loger.log("录制回放数据解析完成,录制回放的总时间长为->",this._recordPlaybackMaxTime);  
201 - console.log(this._messages);  
202 - this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS,{"recordPlaybackMaxTime":this._recordPlaybackMaxTime}); 254 + GlobalConfig.recordPlaybackMaxTime = this._recordPlaybackMaxTime;
  255 + loger.log("录制回放数据解析完成,录制回放的总时间长为->", this._recordPlaybackMaxTime);
  256 + console.log("_messages", this._messages);
  257 + console.log("_conferApeMssages", this._conferApeMssages);
  258 + console.log("_chatApeMssages", this._chatApeMssages);
  259 + console.log("_docApeMssages", this._docApeMssages);
  260 + console.log("_whiteApeMssages", this._whiteApeMssages);
  261 + console.log("_videoApeMssages", this._videoApeMssages);
  262 + console.log("_audioApeMssages", this._audioApeMssages);
  263 +
  264 + this._emit(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, {"recordPlaybackMaxTime": this._recordPlaybackMaxTime});
203 } 265 }
204 266
205 //根据时间查找数据 267 //根据时间查找数据
206 - _searchMessageFromTime(_timestamp){  
207 - let msgDataArr=this._messages[_timestamp];  
208 - if(!msgDataArr){ 268 + _searchMessageFromTime(_timestamp, _apeMessages) {
  269 + let msgDataArr = _apeMessages[_timestamp];
  270 + if (!msgDataArr) {
209 //没有数据,需要查找当前时间点属于哪一个时间戳关键帧 271 //没有数据,需要查找当前时间点属于哪一个时间戳关键帧
210 - }else { 272 + } else {
211 //把时间点对应的数据发送,同一秒内有存在多个数据的情况 273 //把时间点对应的数据发送,同一秒内有存在多个数据的情况
212 - for(let i=0;i<msgDataArr.length;i++){ 274 + for (let i = 0; i < msgDataArr.length; i++) {
213 this._everSocketMsgReceivedHandler(msgDataArr[i].byteData); 275 this._everSocketMsgReceivedHandler(msgDataArr[i].byteData);
214 } 276 }
215 } 277 }
216 } 278 }
  279 +
  280 + /*_searchMessageFromTime(_timestamp,_apeMessages){
  281 + let msgDataArr=this._messages[_timestamp];
  282 + if(!msgDataArr){
  283 + //没有数据,需要查找当前时间点属于哪一个时间戳关键帧
  284 + }else {
  285 + //把时间点对应的数据发送,同一秒内有存在多个数据的情况
  286 + for(let i=0;i<msgDataArr.length;i++){
  287 + this._everSocketMsgReceivedHandler(msgDataArr[i].byteData);
  288 + }
  289 + }
  290 + }*/
  291 +
217 //method------------外部接口------------------------------------- 292 //method------------外部接口-------------------------------------
218 293
219 //开始播放 294 //开始播放
220 startRecordPlayback(_param) { 295 startRecordPlayback(_param) {
221 - if(!this._isReady){  
222 - return {"code": ApeConsts.RETURN_FAILED,"data": "录制回放还未准备完成"}; 296 + if (!this._isReady) {
  297 + return {"code": ApeConsts.RETURN_FAILED, "data": "录制回放还未准备完成"};
223 } 298 }
224 this._startTimerCounter(); 299 this._startTimerCounter();
225 - this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE,{"status":PLAY}); 300 + this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": PLAY});
226 } 301 }
227 302
228 //停止播放 303 //停止播放
229 stopRecordPlayback(_param) { 304 stopRecordPlayback(_param) {
230 this._recordPlaybackTimestamp = 0; 305 this._recordPlaybackTimestamp = 0;
231 this._stopTimerCounter(); 306 this._stopTimerCounter();
232 - this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE,{"status":STOP}); 307 + this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": STOP});
233 } 308 }
234 309
235 //暂停播放 310 //暂停播放
236 pauseRecordPlayback(_param) { 311 pauseRecordPlayback(_param) {
237 this._stopTimerCounter(); 312 this._stopTimerCounter();
238 - this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE,{"status":PAUSE}); 313 + this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": PAUSE});
239 } 314 }
240 315
241 //跳转到指定时间点播放 316 //跳转到指定时间点播放
242 seekRecordPlayback(_param) { 317 seekRecordPlayback(_param) {
243 - if(!this._isReady){  
244 - return {"code": ApeConsts.RETURN_FAILED,"data": "录制回放还未准备完成"}; 318 + if (!this._isReady) {
  319 + return {"code": ApeConsts.RETURN_FAILED, "data": "录制回放还未准备完成"};
245 } 320 }
246 - if(!_param||!_param.time){  
247 - return {"code": ApeConsts.RETURN_FAILED,"data": "参数不正确"}; 321 + if (!_param || !_param.time) {
  322 + return {"code": ApeConsts.RETURN_FAILED, "data": "参数不正确"};
248 } 323 }
249 //先暂停,更改进行的时间 324 //先暂停,更改进行的时间
250 this._stopTimerCounter() 325 this._stopTimerCounter()
251 this._recordPlaybackTimestamp = _param.time || 0; 326 this._recordPlaybackTimestamp = _param.time || 0;
252 327
253 - //查找关键帧  
254 - this._searchKeyFram(); 328 + //各个ape模块查找关键帧数据
  329 + this._searchKeyfram();
255 } 330 }
256 - _searchKeyFram(){ 331 +
  332 + _searchKeyfram() {
257 //查找关键帧,找到关键帧后再继续播放 333 //查找关键帧,找到关键帧后再继续播放
  334 + this._searchApeMessageKeyfram(this._conferApeMssages,ApeConsts.CONFERENCE_SESSION_ID);
  335 + this._searchApeMessageKeyfram(this._docApeMssages,ApeConsts.DOCSHARING_SESSION_ID);
  336 + this._searchApeMessageKeyfram(this._whiteApeMssages,ApeConsts.WHITEBOARD_SESSION_ID);
  337 + this._searchApeMessageKeyfram(this._videoApeMssages,ApeConsts.VIDEO_SESSION_ID);
  338 + this._searchApeMessageKeyfram(this._audioApeMssages,ApeConsts.AUDIO_SESSION_ID);
  339 +
  340 + //聊天模块的比较特殊,消息是累计的
  341 + this._searchChatApeMessageKeyfram(this._chatApeMssages,ApeConsts.CHAT_SESSION_ID);
  342 +
  343 +
  344 + //各个ape模块无论有没有找到关键帧数据,都继续播放
  345 + this._startTimerCounter();
  346 + }
  347 +
  348 + //查找ape关键帧数据
  349 + _searchApeMessageKeyfram(_apeMessages,_apeId) {
258 let messageItem; 350 let messageItem;
259 - let keyFrameSeek=0;  
260 - for(let i=this._recordPlaybackTimestamp;i>0;i--){  
261 - messageItem=this._messages[i];  
262 - if(messageItem){  
263 - break; 351 + let keyFrameSeek = 0;
  352 + for (let i = this._recordPlaybackTimestamp; i > 0; i--) {
  353 + messageItem = _apeMessages[i];
  354 + if (messageItem) {
  355 + keyFrameSeek = (this._recordPlaybackTimestamp - i)
  356 + loger.log("SEEK->APE",_apeId, this._recordPlaybackTimestamp, "查找到相连的数据, messageItem.timestamp->",i, this._recordPlaybackTimestamp,keyFrameSeek, "秒");
  357 + //把时间点对应的数据发送,同一秒内有存在多个数据的情况
  358 + for (let k = 0; k < messageItem.length; k++) {
  359 + this._everSocketMsgReceivedHandler(messageItem[k].byteData);
  360 + }
  361 + if(_apeId==ApeConsts.AUDIO_SESSION_ID||_apeId==ApeConsts.VIDEO_SESSION_ID){
  362 + this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE, {"status": SEEK, "keyFrameSeek": keyFrameSeek});
  363 + }
  364 + return;
264 } 365 }
265 } 366 }
266 - if(messageItem){  
267 - keyFrameSeek=(this._recordPlaybackTimestamp-messageItem.timestamp)  
268 - loger.log("SEEK->",this._recordPlaybackTimestamp,"查找到相连的数据,seek和关键帧的位置偏移",keyFrameSeek,"秒");  
269 - //把时间点对应的数据发送,同一秒内有存在多个数据的情况  
270 - for(let i=0;i<messageItem.length;i++){  
271 - this._everSocketMsgReceivedHandler(messageItem[i].byteData); 367 + loger.log("SEEK->APE",_apeId, this._recordPlaybackTimestamp, "没有查找到相连的数据");
  368 + //this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE,{"status":SEEK,"keyFrameSeek":keyFrameSeek});
  369 + }
  370 +
  371 + //查找聊天模块ape关键帧数据,聊天模块比较特殊,消息是累积的,当前时间戳之前的都需要显示
  372 + _searchChatApeMessageKeyfram(_apeMessages) {
  373 + let messageItem;
  374 + let keyFrameSeek = 0;
  375 + for (let i = this._recordPlaybackTimestamp; i > 0; i--) {
  376 + messageItem = _apeMessages[i];
  377 + if (messageItem) {
  378 + //把时间点对应的数据发送,同一秒内有存在多个数据的情况
  379 + for (let i = 0; i < messageItem.length; i++) {
  380 + this._everSocketMsgReceivedHandler(messageItem[i].byteData);
  381 + }
272 } 382 }
273 - }else {  
274 - loger.log("SEEK->",this._recordPlaybackTimestamp,"没有查找到相连的数据");  
275 } 383 }
276 -  
277 - this._emit(MessageTypes.RECORD_PLAYBACK_UPDATE,{"status":SEEK,"keyFrameSeek":keyFrameSeek});  
278 - //无论有没有找到关键帧数据,都继续播放  
279 - this._startTimerCounter();  
280 -  
281 } 384 }
  385 +
282 } 386 }
283 387
284 RecordPlayBackParse.prototype.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = 'class_join_recordPlayback_success';//加入录制回放成功 388 RecordPlayBackParse.prototype.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS = 'class_join_recordPlayback_success';//加入录制回放成功