diff --git a/src/EngineEntrance.js b/src/EngineEntrance.js index d724b08..7aca902 100644 --- a/src/EngineEntrance.js +++ b/src/EngineEntrance.js @@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter { super(); this.lastClassActiveTime=0;//最后一次课堂激活的时间戳 //sdk 信息 - GlobalConfig.sdkVersion = "v2.38.11.20171214"; + GlobalConfig.sdkVersion = "v2.38.13.20171216"; loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); console.log("sdkVersion:" + GlobalConfig.sdkVersion); //设置 diff --git a/src/RecordInfoMatch.js b/src/RecordInfoMatch.js index d7a0bbc..1deaf6a 100644 --- a/src/RecordInfoMatch.js +++ b/src/RecordInfoMatch.js @@ -250,7 +250,9 @@ class RecordInfoMatch extends Emiter { console.log("_recordMessages", _recordMessages); console.log("_m3u8jsonDataList", _m3u8jsonDataList); console.log("最终匹配完成的数量为->" + Object.keys(this.matchStreams).length); - console.error("没有录制文件的用户", this.unMatchUid); + if(Object.keys(this.unMatchUid).length>0){ + console.error("没有录制文件的用户", this.unMatchUid); + } this._emit(RecordInfoMatch.RECORD_INFO_MATCH_COMPLETE, this.matchStreams); } @@ -274,9 +276,12 @@ class RecordInfoMatch extends Emiter { if (uidRecordInfoArr.length == uidRecordFileArr.length && uidRecordFileArr.length > 0) { //1.如果文件数量和消息数量相等,直接关联即可 - console.log(k + "->数量相同->直接匹配", uidRecordInfoArr.length); + console.log(k + "->数量相同->直接匹配->数量:", uidRecordInfoArr.length); for (let h = 0; h < uidRecordInfoArr.length; h++) { let item = uidRecordInfoArr[h]; + let interval=this.utcdateToTimestamp(uidRecordFileArr[h].creatTimeUTC)-this.utcdateToTimestamp(item.creatTimeUTC); + interval=parseInt(interval/1000); + console.log("数量相同->直接匹配->间隔->视频文件时间-视频消息时间=",interval); item.video_url = uidRecordFileArr[h].video_url; this.matchStreams[item.stream_id] = item; } @@ -319,11 +324,20 @@ class RecordInfoMatch extends Emiter { console.log(k + "->数量不同 消息数量:" + uidRecordInfoArr.length, "视频数量:" + uidRecordFileArr.length); //按消息的数量大于视频数量处理 let lastVideoFileItem;//记录最后一个 + let messageAndFileInterval=0;//默认为录制消息和录制视频生成的时间戳差距为0,实际情况为视频生成的时间戳要晚于消息的时间戳 for (let s = 0; s < uidRecordInfoArr.length; s++) { + console.log("开始查找->",s,uidRecordInfoArr); if(s==0){ let infoItem = uidRecordInfoArr[s]; let videoFileItem = uidRecordFileArr[s]; infoItem.video_url = videoFileItem.video_url; + let interval=this.utcdateToTimestamp(videoFileItem.creatTimeUTC)-this.utcdateToTimestamp(infoItem.creatTimeUTC); + interval=parseInt(interval/1000); + //第一个视频消息和第一个生成的视频文件时间不能超过40秒,超过30秒就是没有生成视频文件 + if(Math.abs(interval)<40){ + messageAndFileInterval=interval;//记录第一个视频文件和消息的间隔,后面的文件都需要减去这个间隔 + } + console.log("数量不同->间隔->视频文件时间-视频消息时间=",interval); //如果之前没有匹配到才设置 if (!this.matchStreams[infoItem.stream_id]) { this.matchStreams[infoItem.stream_id] = infoItem; @@ -331,11 +345,10 @@ class RecordInfoMatch extends Emiter { }else { let infoItem = JSON.stringify(uidRecordInfoArr[s]); infoItem=JSON.parse(infoItem); - console.log("查找->",s,uidRecordInfoArr); let videoFileItem=this.getNearestTimeData(infoItem.creatTimeUTC,uidRecordFileArr); if(videoFileItem){ infoItem.video_url = videoFileItem.video_url; - infoItem.seek=videoFileItem.seek; + infoItem.seek=parseInt(videoFileItem.seek+messageAndFileInterval);//减去视频和录制消息生成的间隔 //如果之前没有匹配到才设置 if (!this.matchStreams[infoItem.stream_id]) { this.matchStreams[infoItem.stream_id] = infoItem; @@ -371,9 +384,86 @@ class RecordInfoMatch extends Emiter { * 根据时间获取间隔最短的的数据 * */ getNearestTimeData(time,videoArr){ - let _time=parseInt(time); - let _nearstTimeDistance=100000;//默认设置为一个超长的值 - let nearstTimeItem=null; + let _time=parseInt(time); + let _nearstTimeDistance=100000;//默认设置为一个超长的值 + let nearstTimeItem=null; + for(let k=0;k<videoArr.length;k++){ + //计算最近时间 + let interval=this.utcdateToTimestamp(_time)-this.utcdateToTimestamp(videoArr[k].creatTimeUTC); + interval=parseInt(interval/1000); + console.log("getNearestTimeData-视频消息和视频文件时间差->",interval); + if(interval>-12&&interval<_nearstTimeDistance){ + //记录时间点最接近 + nearstTimeItem=videoArr[k]; + //nearstTimeItem.seek=interval; + _nearstTimeDistance=Math.abs(interval); + } + } + + let itemJson=""; + if(nearstTimeItem){ + itemJson=JSON.stringify(nearstTimeItem); + let finelItem=JSON.parse(itemJson); + finelItem.seek=parseInt((this.utcdateToTimestamp(_time)-this.utcdateToTimestamp(finelItem.creatTimeUTC))/1000); + console.log("nearstTimeItem->",finelItem); + return finelItem; + } + console.log("nearstTimeItem->没有找到数据"); + return null + } + + /* + * + * utc时间转换为时间戳 + * */ + utcdateToTimestamp (_d) { + _d=""+_d;//转换为字符串 + if(!_d||_d.length!=14){ + console.error("时间长度不正确->必须是->YYMMDDhhmmss",_d); + return 0; + } + let year = parseInt(_d.substr(0, 4)); + let month = parseInt(_d.substr(4, 2)); + let date = parseInt(_d.substr(6, 2)); + let hour = parseInt(_d.substr(8, 2)); + let minute = parseInt(_d.substr(10, 2)); + let second = parseInt(_d.substr(12, 2)); + //console.log(_d,"->",year,month,date,hour,minute,second); + let timestamp=new Date(year,(month-1),date,hour,minute,second).getTime(); + return timestamp; + } + //getNearestTimeData(time,videoArr){ + // let _time=parseInt(time); + // let _nearstTimeDistance=100000;//默认设置为一个超长的值 + // let nearstTimeItem=null; + // for(let k=0;k<videoArr.length;k++){ + // //计算最近时间 + // let interval=parseInt(parseInt(_time)-parseInt(videoArr[k].creatTime))/1000; + // console.log("getNearestTimeData",interval,_time,k,videoArr[k].creatTime); + // if(interval>-12&&interval<_nearstTimeDistance){ + // //记录时间点最接近 + // nearstTimeItem=videoArr[k]; + // nearstTimeItem.seek=interval; + // _nearstTimeDistance=Math.abs(interval); + // } + // } + // + // let itemJson=""; + // if(nearstTimeItem){ + // itemJson=JSON.stringify(nearstTimeItem); + // let finelItem=JSON.parse(itemJson); + // finelItem.seek=parseInt(parseInt(_time)-parseInt(videoArr[k].creatTime))/1000; + // console.log("nearstTimeItem->",finelItem); + // return finelItem; + // } + // console.log("nearstTimeItem->没有找到数据"); + // return null + //} + + /*getNearestTimeData(time,_creatTime,videoArr){ + let _time=parseInt(time); + let _nearstTimeDistance=100000;//默认设置为一个超长的值 + let nearstTimeItem=null; for(let k=0;k<videoArr.length;k++){ //计算最近时间 let interval=_time-parseInt(videoArr[k].creatTimeUTC); @@ -396,7 +486,7 @@ class RecordInfoMatch extends Emiter { } console.log("nearstTimeItem->没有找到数据"); return null - } + }*/ timestampToUTCTime(_timestamp) { let date = new Date(_timestamp - 8 * 60 * 60 * 1000);//GMT 转UTC 减8 diff --git a/src/RecordPlayBackParse.js b/src/RecordPlayBackParse.js index 24c7c4c..25fd582 100644 --- a/src/RecordPlayBackParse.js +++ b/src/RecordPlayBackParse.js @@ -141,6 +141,7 @@ class RecordPlayBackParse extends Emiter { //解析和储存,录制回放EverSocket底层消息处理 data-数据;timestamp-数据对应的时间戳 _parseSaveSocketMsgReceivedHandler(data, timestamp) { + //console.log("脚本消息时间",timestamp); let pduMsg = pdu.decode_pdu(data); let pduType = pduMsg.get("type"); let pduData = pduMsg.get("data"); @@ -739,10 +740,37 @@ class RecordPlayBackParse extends Emiter { } console.log("TX MediaModule.streams", MediaModule.streams); } - //解析录制的rec数据 parseArrayBuf() { - //this._messages = {}; + let lowTimestamp = 0; + let isLowTime = false; + + /* let byteLength = parseBuffer.offset; + parseBuffer.byteOffset = 0; + var position = 0; + while (position < byteLength) { + let timestamp = parseBuffer.readUInt32(position); + position += 4;//4字节 + let byteLen = parseBuffer.readUInt32(position); + position += 4;//4字节 + let byteData = parseBuffer.buffer.slice(position, (position + byteLen)); + position += byteLen; + + if (timestamp < this._recordPlaybackMaxTime) { + if (isLowTime == false) { + lowTimestamp = timestamp; + this._recordPlaybackMaxTime += 10; + } + isLowTime = true; + timestamp = this._recordPlaybackMaxTime + (timestamp - lowTimestamp) + } else { + isLowTime = false; + } + this._recordPlaybackMaxTime = Math.max(this._recordPlaybackMaxTime, timestamp); + //按时间戳解保存数据 + this._parseSaveSocketMsgReceivedHandler(byteData, timestamp); + }*/ + let byteLength = parseBuffer.offset; parseBuffer.byteOffset = 0; var position = 0; @@ -755,7 +783,7 @@ class RecordPlayBackParse extends Emiter { position += byteLen; if(this._recordPlaybackMaxTime>timestamp){ - loger.warn("脚本录制文件中的数据时间戳重叠了!!!!",this._recordPlaybackMaxTime,timestamp,"相差:"+this._recordPlaybackMaxTime-timestamp); + loger.warn("脚本录制文件中的数据时间戳重叠了!!!!",this._recordPlaybackMaxTime,timestamp); if( this.lastParseTime==0){ this.lastParseTime=this._recordPlaybackMaxTime; this.lastParseTimeDistance=(this._recordPlaybackMaxTime-timestamp)*2; @@ -764,10 +792,10 @@ class RecordPlayBackParse extends Emiter { } //记录最后一个数据的时间戳作为整个录制回放的总时间戳 this._recordPlaybackMaxTime = Math.max(this._recordPlaybackMaxTime,timestamp); - //按时间戳解保存数据 this._parseSaveSocketMsgReceivedHandler(byteData, timestamp); } + this._recordPlaybackTimestamp = 0; this._isReady = true; this._stopTimerCounter(); diff --git a/src/apes/VideoApe.js b/src/apes/VideoApe.js index cd00c66..d6004e9 100644 --- a/src/apes/VideoApe.js +++ b/src/apes/VideoApe.js @@ -716,7 +716,7 @@ class VideoApe extends Ape { } if (replay.code == 0) { receiveChannelInfo.replay = replay.playUrl; - receiveChannelInfo.seek=receiveChannelInfo.seek+replay.seek; + receiveChannelInfo.seek=parseInt(parseInt(receiveChannelInfo.seek)+parseInt(replay.seek)); } if (unpackChannelInfo.mediaType != ApeConsts.MEDIA_TYPE_SHARE&&