李勇

1.视频模块修复同步更新消息时nodeId不正确的问题;2.新增video模块由于频道占用问题导致推流消息不能同步,回放时缺少消息的问题,使用广播消息来匹配;3.修复webrtc视频界面名字显示

... ... @@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
super();
this.lastClassActiveTime=0;//最后一次课堂激活的时间戳
//sdk 信息
GlobalConfig.sdkVersion = "v2.36.4.20171201";
GlobalConfig.sdkVersion = "v2.36.11.20171204";
loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
console.log("sdkVersion:" + GlobalConfig.sdkVersion);
//设置
... ... @@ -801,6 +801,7 @@ export default class MessageEntrance extends Emiter {
//本地JOSN加载完成-获取IP信息完成
_getUserIpCallbackHandler(_data) {
//获取IP信息,返回一次就不再处理
loger.log("获取IP信息返回->",_data);
if (this.isGetUserIpCallback) {
return;
}
... ...
... ... @@ -164,14 +164,14 @@ class EverSocket extends Emiter {
}
_clear() {
loger.log('WebSocket,Timers销毁');
loger.log('WebSocket-Timers销毁');
window.clearInterval(this.pingTimer);
window.clearInterval(this.pongTimer);
window.clearInterval(this.reConnectionTimeout);
this._setConnected(false);//先设置状态
this._enableEverSocket = false;
if (this.websocket == null) {
loger.log('WebSocket,Timers已经销毁');
// loger.log('WebSocket,Timers已经销毁');
return;
}
this.websocket.onopen = undefined;
... ... @@ -188,7 +188,7 @@ class EverSocket extends Emiter {
}
_clearHistory() {
loger.log('WebSocket->清除记录');
//loger.log('WebSocket->清除记录');
window.clearInterval(this.pingTimer);
window.clearInterval(this.pongTimer);
window.clearInterval(this.reConnectionTimeout);
... ... @@ -196,7 +196,7 @@ class EverSocket extends Emiter {
this._connected = false;
this._enableEverSocket = false;
if (this.websocket == null) {
loger.log('WebSocket->已经销毁');
//loger.log('WebSocket->已经销毁');
return;
}
this.websocket.onopen = undefined;
... ... @@ -212,7 +212,7 @@ class EverSocket extends Emiter {
}
_onOpen() {
loger.log('WebSocket建立成功', this.wsURL);
loger.log('MCU连接成功', this.wsURL);
this.reConnectionCounter = 0;
this.mcuReconnectCounter=0;
... ... @@ -224,12 +224,12 @@ class EverSocket extends Emiter {
}
_onClose(closeEvent) {
loger.log(`WebSocket连接断开 CODE:${closeEvent.code} REASON:${closeEvent.reason} CLEAN: ${closeEvent.wasClean}`, this.wsURL);
loger.log(`MCU连接断开-CODE:${closeEvent.code} REASON:${closeEvent.reason} CLEAN: ${closeEvent.wasClean}`, this.wsURL);
this._reConnection();
}
_onError() {
loger.log('WebSocket错误出现');
loger.log('WebSocket->ERROR->准备重连');
this._connected = false;
this._reConnection();
}
... ... @@ -264,7 +264,7 @@ class EverSocket extends Emiter {
) {
} else {
loger.warn('---服务器PINGPONG超时-----');
loger.warn('服务器PINGPONG超时->准备重连',"lastActiveTime:"+this._lastActiveTime,"pongTime:"+pongTime);
this._reConnection();
}
}
... ...
... ... @@ -246,10 +246,10 @@ class RecordInfoMatch extends Emiter {
this.matchForUid(k, _recordMessages[k], _m3u8jsonDataList[k]);
}
console.log("unMatchUid", this.matchStreams);
console.log("matchStreams", this.matchStreams);
console.log("_recordMessages", _recordMessages);
console.log("_m3u8jsonDataList", _m3u8jsonDataList);
console.log("最终匹配完成的数量为->" + Object.keys(this.matchStreams).length, "未匹配成功的数量为->" + (this.streamInfoLen - parseInt(Object.keys(this.matchStreams).length)));
console.log("最终匹配完成的数量为->" + Object.keys(this.matchStreams).length);
console.log("没有录制文件的用户", this.unMatchUid);
this._emit(RecordInfoMatch.RECORD_INFO_MATCH_COMPLETE, this.matchStreams);
}
... ... @@ -317,22 +317,22 @@ class RecordInfoMatch extends Emiter {
if (uidRecordInfoArr.length != uidRecordFileArr.length && uidRecordFileArr.length > 0 && uidRecordInfoArr.length > 0) {
console.log(k + "->数量不同 消息数量:" + uidRecordInfoArr.length, "视频数量:" + uidRecordFileArr.length);
//按消息的数量大于视频数量处理
let lastFileItem;//记录最后一个
let lastVideoFileItem;//记录最后一个
for (let h = 0; h < uidRecordInfoArr.length; h++) {
let infoItem = uidRecordInfoArr[h];
let fileItem = uidRecordFileArr[h];
if (fileItem) {
infoItem.video_url = fileItem.video_url;
let videoFileItem = uidRecordFileArr[h];
if (videoFileItem) {
infoItem.video_url = videoFileItem.video_url;
//如果之前没有匹配到才设置
if (!this.matchStreams[infoItem.stream_id]) {
this.matchStreams[infoItem.stream_id] = infoItem;
}
lastFileItem = infoItem;//记录最后一个文件的数据
lastVideoFileItem = infoItem;//记录最后一个文件的数据
} else {
if (lastFileItem) {
infoItem.video_url = lastFileItem.video_url;
infoItem.seek = parseInt(infoItem.creatTimeUTC) - parseInt(lastFileItem.creatTimeUTC);
if (lastVideoFileItem) {
infoItem.video_url = lastVideoFileItem.video_url;
infoItem.seek = parseInt(infoItem.creatTimeUTC) - parseInt(lastVideoFileItem.creatTimeUTC);
if (!this.matchStreams[infoItem.stream_id]) {
this.matchStreams[infoItem.stream_id] = infoItem;
}
... ...
... ... @@ -282,6 +282,7 @@ class RecordPlayBackParse extends Emiter {
this._searchMessageFromTime(this._recordPlaybackTimestamp, this._whiteApeMssages, "whiteApe");
this._searchMessageFromTime(this._recordPlaybackTimestamp, this._videoApeMssages, "videoAp");
this._searchMessageFromTime(this._recordPlaybackTimestamp, this._audioApeMssages, "audioApe");
this._searchMessageFromTime(this._recordPlaybackTimestamp, this._videoApeBroadcastMssages, "videoApBroadcast");
}
//加载录制文件rec
... ... @@ -864,8 +865,12 @@ class RecordPlayBackParse extends Emiter {
//this._searchApeMessageKeyfram(this._audioApeMssages, ApeConsts.AUDIO_SESSION_ID);
*/
//先查广播消息再查频道消息,频道消息在广播消息之后
//视频广播消息
this.searchVideoBroadcastMessageKeyfram(this._videoApeBroadcastMssages);
//音视频模块的查找规则和其他模块不一样,音视频按频道查找,如果课堂内存在多个频道,都要查
this.searchMediaApeMessageKeyfram(this.mediaChannleList);
//this.searchMediaApeMessageKeyfram(this.mediaChannleList);
//媒体共享模块
this.searchMediaShareApeMessageKeyfram(this._mediaShareApeMssages);
... ... @@ -935,6 +940,31 @@ class RecordPlayBackParse extends Emiter {
}
}
//视频广播消息查找关键帧时间戳的消息
searchVideoBroadcastMessageKeyfram(_apeMessages) {
if (!_apeMessages) {
return;
}
console.log('SEEK->查找音视频模块广播数据', _apeMessages)
if (_apeMessages) {
for (let k in _apeMessages) {
let nodeIdVideoBrodcast = _apeMessages[k];
let messageItem;
let keyFrameSeekTime = 0;
for (let i = this._recordPlaybackTimestamp; i > 0; i--) {
messageItem = nodeIdVideoBrodcast[i];
if (messageItem) {
keyFrameSeekTime = (this._recordPlaybackTimestamp - i);
loger.log("nodeId:" + k + "->SEEK->查找音视频模块广播数据->", messageItem, 'keyFrameSeekTime->', keyFrameSeekTime)
this._everSocketMsgReceivedHandler(messageItem.byteData, keyFrameSeekTime);
break;
}
}
// loger.log("nodeId:" + k + "—>没有查找到数据")
}
}
}
//媒体共享模块查找关键帧时间戳的消息
searchMediaShareApeMessageKeyfram(_apeMessages) {
if (!_apeMessages) {
... ... @@ -1080,6 +1110,12 @@ class RecordPlayBackParse extends Emiter {
},.....
}*/
if(videoReceivePdu.data.status==1){
let videoChannelInfo=videoReceivePdu.data;
videoChannelInfo.creatTime=videoChannelInfo.timestamp;
this.videoPublishMessages.push(videoChannelInfo);
}
this._videoApeBroadcastMssages[videoReceivePdu.fromNodeId][timestamp] = {
parseData: videoReceivePdu,
byteData: data,
... ... @@ -1218,7 +1254,7 @@ class RecordPlayBackParse extends Emiter {
if (sessionId == ApeConsts.VIDEO_SESSION_ID) {
try {
let videoChannelInfo = pdu['RCVideoChannelInfoPdu'].decode(tableItem.itemData);
loger.log('RCVideoChannelInfoPdu->timestamp',timestamp,videoChannelInfo);
//loger.log('RCVideoChannelInfoPdu->timestamp',timestamp,videoChannelInfo);
//储存音视频模块的数据
if (!this.mediaChannleList[videoChannelInfo.channelId]) {
this.mediaChannleList[videoChannelInfo.channelId] = {};
... ...
... ... @@ -570,6 +570,7 @@ class VideoApe extends Ape {
//录制回放和H5需要处理
if(GlobalConfig.isRecordPlayBack){
//录制回放的处理
console.log("录制回放的处理视频模块控制消息->",videoReceivePdu);
if (videoReceivePdu.toNodeId!=0){
//只处理发送给所有人的消息,发给指定人的消息不处理
return;
... ... @@ -588,25 +589,24 @@ class VideoApe extends Ape {
"timestamp": 1505886364100,
"recordTimestamp": 27
}*/
/* switch (videoReceivePdu.actionType){
switch (videoReceivePdu.actionType){
case ApeConsts.MEDIA_ACTION_PUBLISH_STATUS:
//webRtc的推流和停止推流的消息
let videoInfo={};
let videoData=data;
videoData.streamId=data.channel+"_"+data.userId+"_"+data.uid+"_"+(parseInt(parseInt(data.timestamp)/1000));
if(data.status==1){
loger.log("播放文件->", "userName",data.userName,"uid",data.uid,"时间:"+new Date(1505886364100).toString());
loger.log("播放文件->", videoData);
videoInfo=this.packVideoInfoAndSendToClient(videoData,seek);
this._emit(MessageTypes.VIDEO_PLAY, videoInfo);
}else if(data.status==0){
loger.log("停止播放文件->", "userName",data.userName,"uid",data.uid,"时间:"+new Date(1505886364100).toString());
loger.log("停止播放文件->", videoData);
videoInfo=this.packVideoInfoAndSendToClient(videoData,seek);
this._emit(MessageTypes.VIDEO_STOP, videoInfo);
}
break;
default:
break
}*/
}
}else {
//判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
... ... @@ -835,6 +835,7 @@ class VideoApe extends Ape {
for (let i in this.mediaModule.mediaChannels) {
let channelInfo = this.mediaModule.mediaChannels[i];
if (channelInfo) {
channelInfo.nodeId = channelInfo.fromNodeId;//发送消息的人员nodeId
if (channelInfo.status == ApeConsts.CHANNEL_STATUS_RELEASED) {
channelInfo.owner = 0;
} else {
... ... @@ -877,7 +878,7 @@ class VideoApe extends Ape {
packPduModel.userId = _param.userId || "0";
packPduModel.mediaType = _param.mediaType || ApeConsts.MEDIA_TYPE_VIDEO;
packPduModel.timestamp = _param.timestamp || 0;
packPduModel.fromNodeId = _param.nodeId || GlobalConfig.nodeId;
packPduModel.fromNodeId = _param.nodeId||_param.fromNodeId || GlobalConfig.nodeId;
packPduModel.userName = _param.userName || GlobalConfig.userName;
packPduModel.toNodeId = 0;
packPduModel.userRole = _param.userRole || GlobalConfig.userRole;
... ... @@ -885,12 +886,12 @@ class VideoApe extends Ape {
packPduModel.screenHeight = _param.screenHeight || GlobalConfig.screenHeight;
packPduModel.deviceType = _param.deviceType || GlobalConfig.deviceType;
packPduModel.optionJsonData = GlobalConfig.optionJsonData;
loger.log('packPdu->', packPduModel);
loger.log('packPdu--------------->', packPduModel);
return packPduModel;
}
unPackPdu(owner, itemIdx, itemData) {
loger.log("unPackPdu->owner:", owner, "itemIdx->", itemIdx);
loger.log("unPackPdu-------------->owner:", owner, "itemIdx->", itemIdx);
if (owner == null || itemIdx == null || itemData == null) {
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return null;
... ...
... ... @@ -718,6 +718,7 @@ class WebRtcApe extends Emiter {
updateAllVideoSize() {
$("." + this.localWebRtcVideoClass).css("width", this.localVideoWidth * this.videoScale);
$("." + this.localWebRtcVideoClass).css("height", this.localVideoHeight * this.videoScale);
$("#videoOwnerName_" + this.uid).css("width", this.localVideoWidth * this.videoScale);
$("." + this.hostWebRtcVideoClass).css("width", this.hostRemoteVideoWidth * this.videoScale);
$("." + this.hostWebRtcVideoClass).css("height", this.hostRemoteVideoHeight * this.videoScale);
... ...
... ... @@ -206,7 +206,7 @@ class MCU extends Emiter {
// 主动断开MCU连接
leaveMCU() {
loger.log('leaveMCU');
loger.log('断开MCU连接');
GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3);
GlobalConfig.classJoinSuccess = false;
if( this._everSocket){
... ...