修复录制回放消息和视频文件对应的问题;在多个消息对应一个视频的时候,原有的规则是第一个消息直接对应视频问题,这个存在一个问题,有可能第一个消息没有视频文件生成,…
…第二个消息才是正真对应视频数据的,需要判断消息和视频文件生成时间的间隔,第一个消息和视频文件的间隔大于30秒以上就不能做直接对应
正在显示
4 个修改的文件
包含
132 行增加
和
14 行删除
@@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter { | @@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter { | ||
63 | super(); | 63 | super(); |
64 | this.lastClassActiveTime=0;//最后一次课堂激活的时间戳 | 64 | this.lastClassActiveTime=0;//最后一次课堂激活的时间戳 |
65 | //sdk 信息 | 65 | //sdk 信息 |
66 | - GlobalConfig.sdkVersion = "v2.38.11.20171214"; | 66 | + GlobalConfig.sdkVersion = "v2.38.13.20171216"; |
67 | loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); | 67 | loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); |
68 | console.log("sdkVersion:" + GlobalConfig.sdkVersion); | 68 | console.log("sdkVersion:" + GlobalConfig.sdkVersion); |
69 | //设置 | 69 | //设置 |
@@ -250,7 +250,9 @@ class RecordInfoMatch extends Emiter { | @@ -250,7 +250,9 @@ class RecordInfoMatch extends Emiter { | ||
250 | console.log("_recordMessages", _recordMessages); | 250 | console.log("_recordMessages", _recordMessages); |
251 | console.log("_m3u8jsonDataList", _m3u8jsonDataList); | 251 | console.log("_m3u8jsonDataList", _m3u8jsonDataList); |
252 | console.log("最终匹配完成的数量为->" + Object.keys(this.matchStreams).length); | 252 | console.log("最终匹配完成的数量为->" + Object.keys(this.matchStreams).length); |
253 | - console.error("没有录制文件的用户", this.unMatchUid); | 253 | + if(Object.keys(this.unMatchUid).length>0){ |
254 | + console.error("没有录制文件的用户", this.unMatchUid); | ||
255 | + } | ||
254 | this._emit(RecordInfoMatch.RECORD_INFO_MATCH_COMPLETE, this.matchStreams); | 256 | this._emit(RecordInfoMatch.RECORD_INFO_MATCH_COMPLETE, this.matchStreams); |
255 | } | 257 | } |
256 | 258 | ||
@@ -274,9 +276,12 @@ class RecordInfoMatch extends Emiter { | @@ -274,9 +276,12 @@ class RecordInfoMatch extends Emiter { | ||
274 | 276 | ||
275 | if (uidRecordInfoArr.length == uidRecordFileArr.length && uidRecordFileArr.length > 0) { | 277 | if (uidRecordInfoArr.length == uidRecordFileArr.length && uidRecordFileArr.length > 0) { |
276 | //1.如果文件数量和消息数量相等,直接关联即可 | 278 | //1.如果文件数量和消息数量相等,直接关联即可 |
277 | - console.log(k + "->数量相同->直接匹配", uidRecordInfoArr.length); | 279 | + console.log(k + "->数量相同->直接匹配->数量:", uidRecordInfoArr.length); |
278 | for (let h = 0; h < uidRecordInfoArr.length; h++) { | 280 | for (let h = 0; h < uidRecordInfoArr.length; h++) { |
279 | let item = uidRecordInfoArr[h]; | 281 | let item = uidRecordInfoArr[h]; |
282 | + let interval=this.utcdateToTimestamp(uidRecordFileArr[h].creatTimeUTC)-this.utcdateToTimestamp(item.creatTimeUTC); | ||
283 | + interval=parseInt(interval/1000); | ||
284 | + console.log("数量相同->直接匹配->间隔->视频文件时间-视频消息时间=",interval); | ||
280 | item.video_url = uidRecordFileArr[h].video_url; | 285 | item.video_url = uidRecordFileArr[h].video_url; |
281 | this.matchStreams[item.stream_id] = item; | 286 | this.matchStreams[item.stream_id] = item; |
282 | } | 287 | } |
@@ -319,11 +324,20 @@ class RecordInfoMatch extends Emiter { | @@ -319,11 +324,20 @@ class RecordInfoMatch extends Emiter { | ||
319 | console.log(k + "->数量不同 消息数量:" + uidRecordInfoArr.length, "视频数量:" + uidRecordFileArr.length); | 324 | console.log(k + "->数量不同 消息数量:" + uidRecordInfoArr.length, "视频数量:" + uidRecordFileArr.length); |
320 | //按消息的数量大于视频数量处理 | 325 | //按消息的数量大于视频数量处理 |
321 | let lastVideoFileItem;//记录最后一个 | 326 | let lastVideoFileItem;//记录最后一个 |
327 | + let messageAndFileInterval=0;//默认为录制消息和录制视频生成的时间戳差距为0,实际情况为视频生成的时间戳要晚于消息的时间戳 | ||
322 | for (let s = 0; s < uidRecordInfoArr.length; s++) { | 328 | for (let s = 0; s < uidRecordInfoArr.length; s++) { |
329 | + console.log("开始查找->",s,uidRecordInfoArr); | ||
323 | if(s==0){ | 330 | if(s==0){ |
324 | let infoItem = uidRecordInfoArr[s]; | 331 | let infoItem = uidRecordInfoArr[s]; |
325 | let videoFileItem = uidRecordFileArr[s]; | 332 | let videoFileItem = uidRecordFileArr[s]; |
326 | infoItem.video_url = videoFileItem.video_url; | 333 | infoItem.video_url = videoFileItem.video_url; |
334 | + let interval=this.utcdateToTimestamp(videoFileItem.creatTimeUTC)-this.utcdateToTimestamp(infoItem.creatTimeUTC); | ||
335 | + interval=parseInt(interval/1000); | ||
336 | + //第一个视频消息和第一个生成的视频文件时间不能超过40秒,超过30秒就是没有生成视频文件 | ||
337 | + if(Math.abs(interval)<40){ | ||
338 | + messageAndFileInterval=interval;//记录第一个视频文件和消息的间隔,后面的文件都需要减去这个间隔 | ||
339 | + } | ||
340 | + console.log("数量不同->间隔->视频文件时间-视频消息时间=",interval); | ||
327 | //如果之前没有匹配到才设置 | 341 | //如果之前没有匹配到才设置 |
328 | if (!this.matchStreams[infoItem.stream_id]) { | 342 | if (!this.matchStreams[infoItem.stream_id]) { |
329 | this.matchStreams[infoItem.stream_id] = infoItem; | 343 | this.matchStreams[infoItem.stream_id] = infoItem; |
@@ -331,11 +345,10 @@ class RecordInfoMatch extends Emiter { | @@ -331,11 +345,10 @@ class RecordInfoMatch extends Emiter { | ||
331 | }else { | 345 | }else { |
332 | let infoItem = JSON.stringify(uidRecordInfoArr[s]); | 346 | let infoItem = JSON.stringify(uidRecordInfoArr[s]); |
333 | infoItem=JSON.parse(infoItem); | 347 | infoItem=JSON.parse(infoItem); |
334 | - console.log("查找->",s,uidRecordInfoArr); | ||
335 | let videoFileItem=this.getNearestTimeData(infoItem.creatTimeUTC,uidRecordFileArr); | 348 | let videoFileItem=this.getNearestTimeData(infoItem.creatTimeUTC,uidRecordFileArr); |
336 | if(videoFileItem){ | 349 | if(videoFileItem){ |
337 | infoItem.video_url = videoFileItem.video_url; | 350 | infoItem.video_url = videoFileItem.video_url; |
338 | - infoItem.seek=videoFileItem.seek; | 351 | + infoItem.seek=parseInt(videoFileItem.seek+messageAndFileInterval);//减去视频和录制消息生成的间隔 |
339 | //如果之前没有匹配到才设置 | 352 | //如果之前没有匹配到才设置 |
340 | if (!this.matchStreams[infoItem.stream_id]) { | 353 | if (!this.matchStreams[infoItem.stream_id]) { |
341 | this.matchStreams[infoItem.stream_id] = infoItem; | 354 | this.matchStreams[infoItem.stream_id] = infoItem; |
@@ -371,9 +384,86 @@ class RecordInfoMatch extends Emiter { | @@ -371,9 +384,86 @@ class RecordInfoMatch extends Emiter { | ||
371 | * 根据时间获取间隔最短的的数据 | 384 | * 根据时间获取间隔最短的的数据 |
372 | * */ | 385 | * */ |
373 | getNearestTimeData(time,videoArr){ | 386 | getNearestTimeData(time,videoArr){ |
374 | - let _time=parseInt(time); | ||
375 | - let _nearstTimeDistance=100000;//默认设置为一个超长的值 | ||
376 | - let nearstTimeItem=null; | 387 | + let _time=parseInt(time); |
388 | + let _nearstTimeDistance=100000;//默认设置为一个超长的值 | ||
389 | + let nearstTimeItem=null; | ||
390 | + for(let k=0;k<videoArr.length;k++){ | ||
391 | + //计算最近时间 | ||
392 | + let interval=this.utcdateToTimestamp(_time)-this.utcdateToTimestamp(videoArr[k].creatTimeUTC); | ||
393 | + interval=parseInt(interval/1000); | ||
394 | + console.log("getNearestTimeData-视频消息和视频文件时间差->",interval); | ||
395 | + if(interval>-12&&interval<_nearstTimeDistance){ | ||
396 | + //记录时间点最接近 | ||
397 | + nearstTimeItem=videoArr[k]; | ||
398 | + //nearstTimeItem.seek=interval; | ||
399 | + _nearstTimeDistance=Math.abs(interval); | ||
400 | + } | ||
401 | + } | ||
402 | + | ||
403 | + let itemJson=""; | ||
404 | + if(nearstTimeItem){ | ||
405 | + itemJson=JSON.stringify(nearstTimeItem); | ||
406 | + let finelItem=JSON.parse(itemJson); | ||
407 | + finelItem.seek=parseInt((this.utcdateToTimestamp(_time)-this.utcdateToTimestamp(finelItem.creatTimeUTC))/1000); | ||
408 | + console.log("nearstTimeItem->",finelItem); | ||
409 | + return finelItem; | ||
410 | + } | ||
411 | + console.log("nearstTimeItem->没有找到数据"); | ||
412 | + return null | ||
413 | + } | ||
414 | + | ||
415 | + /* | ||
416 | + * | ||
417 | + * utc时间转换为时间戳 | ||
418 | + * */ | ||
419 | + utcdateToTimestamp (_d) { | ||
420 | + _d=""+_d;//转换为字符串 | ||
421 | + if(!_d||_d.length!=14){ | ||
422 | + console.error("时间长度不正确->必须是->YYMMDDhhmmss",_d); | ||
423 | + return 0; | ||
424 | + } | ||
425 | + let year = parseInt(_d.substr(0, 4)); | ||
426 | + let month = parseInt(_d.substr(4, 2)); | ||
427 | + let date = parseInt(_d.substr(6, 2)); | ||
428 | + let hour = parseInt(_d.substr(8, 2)); | ||
429 | + let minute = parseInt(_d.substr(10, 2)); | ||
430 | + let second = parseInt(_d.substr(12, 2)); | ||
431 | + //console.log(_d,"->",year,month,date,hour,minute,second); | ||
432 | + let timestamp=new Date(year,(month-1),date,hour,minute,second).getTime(); | ||
433 | + return timestamp; | ||
434 | + } | ||
435 | + //getNearestTimeData(time,videoArr){ | ||
436 | + // let _time=parseInt(time); | ||
437 | + // let _nearstTimeDistance=100000;//默认设置为一个超长的值 | ||
438 | + // let nearstTimeItem=null; | ||
439 | + // for(let k=0;k<videoArr.length;k++){ | ||
440 | + // //计算最近时间 | ||
441 | + // let interval=parseInt(parseInt(_time)-parseInt(videoArr[k].creatTime))/1000; | ||
442 | + // console.log("getNearestTimeData",interval,_time,k,videoArr[k].creatTime); | ||
443 | + // if(interval>-12&&interval<_nearstTimeDistance){ | ||
444 | + // //记录时间点最接近 | ||
445 | + // nearstTimeItem=videoArr[k]; | ||
446 | + // nearstTimeItem.seek=interval; | ||
447 | + // _nearstTimeDistance=Math.abs(interval); | ||
448 | + // } | ||
449 | + // } | ||
450 | + // | ||
451 | + // let itemJson=""; | ||
452 | + // if(nearstTimeItem){ | ||
453 | + // itemJson=JSON.stringify(nearstTimeItem); | ||
454 | + // let finelItem=JSON.parse(itemJson); | ||
455 | + // finelItem.seek=parseInt(parseInt(_time)-parseInt(videoArr[k].creatTime))/1000; | ||
456 | + // console.log("nearstTimeItem->",finelItem); | ||
457 | + // return finelItem; | ||
458 | + // } | ||
459 | + // console.log("nearstTimeItem->没有找到数据"); | ||
460 | + // return null | ||
461 | + //} | ||
462 | + | ||
463 | + /*getNearestTimeData(time,_creatTime,videoArr){ | ||
464 | + let _time=parseInt(time); | ||
465 | + let _nearstTimeDistance=100000;//默认设置为一个超长的值 | ||
466 | + let nearstTimeItem=null; | ||
377 | for(let k=0;k<videoArr.length;k++){ | 467 | for(let k=0;k<videoArr.length;k++){ |
378 | //计算最近时间 | 468 | //计算最近时间 |
379 | let interval=_time-parseInt(videoArr[k].creatTimeUTC); | 469 | let interval=_time-parseInt(videoArr[k].creatTimeUTC); |
@@ -396,7 +486,7 @@ class RecordInfoMatch extends Emiter { | @@ -396,7 +486,7 @@ class RecordInfoMatch extends Emiter { | ||
396 | } | 486 | } |
397 | console.log("nearstTimeItem->没有找到数据"); | 487 | console.log("nearstTimeItem->没有找到数据"); |
398 | return null | 488 | return null |
399 | - } | 489 | + }*/ |
400 | 490 | ||
401 | timestampToUTCTime(_timestamp) { | 491 | timestampToUTCTime(_timestamp) { |
402 | let date = new Date(_timestamp - 8 * 60 * 60 * 1000);//GMT 转UTC 减8 | 492 | let date = new Date(_timestamp - 8 * 60 * 60 * 1000);//GMT 转UTC 减8 |
@@ -141,6 +141,7 @@ class RecordPlayBackParse extends Emiter { | @@ -141,6 +141,7 @@ class RecordPlayBackParse extends Emiter { | ||
141 | 141 | ||
142 | //解析和储存,录制回放EverSocket底层消息处理 data-数据;timestamp-数据对应的时间戳 | 142 | //解析和储存,录制回放EverSocket底层消息处理 data-数据;timestamp-数据对应的时间戳 |
143 | _parseSaveSocketMsgReceivedHandler(data, timestamp) { | 143 | _parseSaveSocketMsgReceivedHandler(data, timestamp) { |
144 | + //console.log("脚本消息时间",timestamp); | ||
144 | let pduMsg = pdu.decode_pdu(data); | 145 | let pduMsg = pdu.decode_pdu(data); |
145 | let pduType = pduMsg.get("type"); | 146 | let pduType = pduMsg.get("type"); |
146 | let pduData = pduMsg.get("data"); | 147 | let pduData = pduMsg.get("data"); |
@@ -739,10 +740,37 @@ class RecordPlayBackParse extends Emiter { | @@ -739,10 +740,37 @@ class RecordPlayBackParse extends Emiter { | ||
739 | } | 740 | } |
740 | console.log("TX MediaModule.streams", MediaModule.streams); | 741 | console.log("TX MediaModule.streams", MediaModule.streams); |
741 | } | 742 | } |
742 | - | ||
743 | //解析录制的rec数据 | 743 | //解析录制的rec数据 |
744 | parseArrayBuf() { | 744 | parseArrayBuf() { |
745 | - //this._messages = {}; | 745 | + let lowTimestamp = 0; |
746 | + let isLowTime = false; | ||
747 | + | ||
748 | + /* let byteLength = parseBuffer.offset; | ||
749 | + parseBuffer.byteOffset = 0; | ||
750 | + var position = 0; | ||
751 | + while (position < byteLength) { | ||
752 | + let timestamp = parseBuffer.readUInt32(position); | ||
753 | + position += 4;//4字节 | ||
754 | + let byteLen = parseBuffer.readUInt32(position); | ||
755 | + position += 4;//4字节 | ||
756 | + let byteData = parseBuffer.buffer.slice(position, (position + byteLen)); | ||
757 | + position += byteLen; | ||
758 | + | ||
759 | + if (timestamp < this._recordPlaybackMaxTime) { | ||
760 | + if (isLowTime == false) { | ||
761 | + lowTimestamp = timestamp; | ||
762 | + this._recordPlaybackMaxTime += 10; | ||
763 | + } | ||
764 | + isLowTime = true; | ||
765 | + timestamp = this._recordPlaybackMaxTime + (timestamp - lowTimestamp) | ||
766 | + } else { | ||
767 | + isLowTime = false; | ||
768 | + } | ||
769 | + this._recordPlaybackMaxTime = Math.max(this._recordPlaybackMaxTime, timestamp); | ||
770 | + //按时间戳解保存数据 | ||
771 | + this._parseSaveSocketMsgReceivedHandler(byteData, timestamp); | ||
772 | + }*/ | ||
773 | + | ||
746 | let byteLength = parseBuffer.offset; | 774 | let byteLength = parseBuffer.offset; |
747 | parseBuffer.byteOffset = 0; | 775 | parseBuffer.byteOffset = 0; |
748 | var position = 0; | 776 | var position = 0; |
@@ -755,7 +783,7 @@ class RecordPlayBackParse extends Emiter { | @@ -755,7 +783,7 @@ class RecordPlayBackParse extends Emiter { | ||
755 | position += byteLen; | 783 | position += byteLen; |
756 | 784 | ||
757 | if(this._recordPlaybackMaxTime>timestamp){ | 785 | if(this._recordPlaybackMaxTime>timestamp){ |
758 | - loger.warn("脚本录制文件中的数据时间戳重叠了!!!!",this._recordPlaybackMaxTime,timestamp,"相差:"+this._recordPlaybackMaxTime-timestamp); | 786 | + loger.warn("脚本录制文件中的数据时间戳重叠了!!!!",this._recordPlaybackMaxTime,timestamp); |
759 | if( this.lastParseTime==0){ | 787 | if( this.lastParseTime==0){ |
760 | this.lastParseTime=this._recordPlaybackMaxTime; | 788 | this.lastParseTime=this._recordPlaybackMaxTime; |
761 | this.lastParseTimeDistance=(this._recordPlaybackMaxTime-timestamp)*2; | 789 | this.lastParseTimeDistance=(this._recordPlaybackMaxTime-timestamp)*2; |
@@ -764,10 +792,10 @@ class RecordPlayBackParse extends Emiter { | @@ -764,10 +792,10 @@ class RecordPlayBackParse extends Emiter { | ||
764 | } | 792 | } |
765 | //记录最后一个数据的时间戳作为整个录制回放的总时间戳 | 793 | //记录最后一个数据的时间戳作为整个录制回放的总时间戳 |
766 | this._recordPlaybackMaxTime = Math.max(this._recordPlaybackMaxTime,timestamp); | 794 | this._recordPlaybackMaxTime = Math.max(this._recordPlaybackMaxTime,timestamp); |
767 | - | ||
768 | //按时间戳解保存数据 | 795 | //按时间戳解保存数据 |
769 | this._parseSaveSocketMsgReceivedHandler(byteData, timestamp); | 796 | this._parseSaveSocketMsgReceivedHandler(byteData, timestamp); |
770 | } | 797 | } |
798 | + | ||
771 | this._recordPlaybackTimestamp = 0; | 799 | this._recordPlaybackTimestamp = 0; |
772 | this._isReady = true; | 800 | this._isReady = true; |
773 | this._stopTimerCounter(); | 801 | this._stopTimerCounter(); |
@@ -716,7 +716,7 @@ class VideoApe extends Ape { | @@ -716,7 +716,7 @@ class VideoApe extends Ape { | ||
716 | } | 716 | } |
717 | if (replay.code == 0) { | 717 | if (replay.code == 0) { |
718 | receiveChannelInfo.replay = replay.playUrl; | 718 | receiveChannelInfo.replay = replay.playUrl; |
719 | - receiveChannelInfo.seek=receiveChannelInfo.seek+replay.seek; | 719 | + receiveChannelInfo.seek=parseInt(parseInt(receiveChannelInfo.seek)+parseInt(replay.seek)); |
720 | } | 720 | } |
721 | 721 | ||
722 | if (unpackChannelInfo.mediaType != ApeConsts.MEDIA_TYPE_SHARE&& | 722 | if (unpackChannelInfo.mediaType != ApeConsts.MEDIA_TYPE_SHARE&& |
-
请 注册 或 登录 后发表评论