李勇

修复录制回放消息和视频文件对应的问题;在多个消息对应一个视频的时候,原有的规则是第一个消息直接对应视频问题,这个存在一个问题,有可能第一个消息没有视频文件生成,…

…第二个消息才是正真对应视频数据的,需要判断消息和视频文件生成时间的间隔,第一个消息和视频文件的间隔大于30秒以上就不能做直接对应
... ... @@ -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);
//设置
... ...
... ... @@ -250,7 +250,9 @@ class RecordInfoMatch extends Emiter {
console.log("_recordMessages", _recordMessages);
console.log("_m3u8jsonDataList", _m3u8jsonDataList);
console.log("最终匹配完成的数量为->" + Object.keys(this.matchStreams).length);
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;
... ... @@ -376,6 +389,83 @@ class RecordInfoMatch extends Emiter {
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);
console.log("getNearestTimeData",interval,_time,k,videoArr[k].creatTimeUTC);
if(interval>-12&&interval<_nearstTimeDistance){
... ... @@ -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
... ...
... ... @@ -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();
... ...
... ... @@ -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&&
... ...