李勇

视频模块在录制回放的时候增加对广播消息type 40做处理,webRtc的推流和停止推流消息目前是使用广播消息处理的

... ... @@ -62,7 +62,7 @@ export default class MessageEntrance extends Emiter {
constructor() {
super();
//sdk 信息
GlobalConfig.sdkVersion = "v2.12.6.20170925";
GlobalConfig.sdkVersion = "v2.12.8.20170926";
loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
//设置
... ...
... ... @@ -389,7 +389,6 @@ class VideoApe extends Ape {
}
// to, message
loger.log('视频模块广播消息.', _param);
//如果是控制开启摄像头推流,需要判断是否还有空闲频道
if (_param.actionType != null && _param.actionType == ApeConsts.MEDIA_ACTION_OPEN_CAMERA) {
//判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启
... ... @@ -466,9 +465,8 @@ class VideoApe extends Ape {
}
/////收到消息处理//////////////////////////////////////////////////
// 视频消息处理,内部处理,不需要告诉应用层
receiveVideoCommandHandler(_data) {
receiveVideoCommandHandler(_data,seek) {
let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(_data);
if (videoReceivePdu == null) {
loger.warn("视频控制消息处理,收到的消息为null,不做处理");
... ... @@ -484,13 +482,56 @@ class VideoApe extends Ape {
dataObj = videoReceivePdu.data;
}
videoReceivePdu.data = dataObj;
//判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
if (videoReceivePdu.toNodeId != 0 && videoReceivePdu.toNodeId != GlobalConfig.nodeId) {
loger.log('视频消息不处理 toNodeId=', videoReceivePdu.toNodeId, "my nodeId=", GlobalConfig.nodeId);
} else {
loger.log('视频控制消息处理 .', videoReceivePdu);
this._emit(MessageTypes.VIDEO_BROADCAST, videoReceivePdu);
if(GlobalConfig.isRecordPlayBack){
//录制回放的处理
if (videoReceivePdu.toNodeId!=0){
//只处理发送给所有人的消息,发给指定人的消息不处理
return;
}
let data=videoReceivePdu.data;
if(!data) return;
/* "data": {
"appId": "eb253cc7b40c4a8b82f0a5b6f93c2ce0",
"channel": "markettest_1880101695",
"channelKey": "",
"uid": 886346081,
"status": 1,
"userId": "user_338621",
"userName": "user_338621",
"userRole": "normal",
"timestamp": 1505886364100,
"recordTimestamp": 27
}*/
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());
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());
videoInfo=this.packVideoInfoAndSendToClient(videoData,seek);
this._emit(MessageTypes.VIDEO_STOP, videoInfo);
}
break;
default:
break
}
}else {
//判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
if (videoReceivePdu.toNodeId != 0 && videoReceivePdu.toNodeId != GlobalConfig.nodeId) {
loger.log('视频消息不处理 toNodeId=', videoReceivePdu.toNodeId, "my nodeId=", GlobalConfig.nodeId);
} else {
loger.log('视频控制消息处理 .', videoReceivePdu);
this._emit(MessageTypes.VIDEO_BROADCAST, videoReceivePdu);
}
}
}
//切换了MS,重新更新一下当前正在播放的流地址
changeMediaMs(){
... ... @@ -609,6 +650,45 @@ class VideoApe extends Ape {
}
/*
* 组织视频数据发送给客户端
* */
packVideoInfoAndSendToClient(_param,seek){
let mediaChannelInfo = {};
mediaChannelInfo.mediaId = _param.channelId;
mediaChannelInfo.fromNodeId = _param.fromNodeId;
mediaChannelInfo.userName = _param.userName || "";
mediaChannelInfo.userRole = _param.userRole || ApeConsts.normal;
mediaChannelInfo.mediaType = _param.mediaType || ApeConsts.MEDIA_TYPE_DEFAULT;
mediaChannelInfo.screenWidth = _param.screenWidth || GlobalConfig.screenWidth;
mediaChannelInfo.screenHeight = _param.screenHeight || GlobalConfig.screenHeight;
mediaChannelInfo.deviceType = _param.deviceType || 0;
mediaChannelInfo.optionJsonData = _param.optionJsonData || "";
mediaChannelInfo.m3u8Url = "";
mediaChannelInfo.rtmpUrl = "";
mediaChannelInfo.replay = "";
mediaChannelInfo.seek = seek || 0;//这个是录制回放时使用的seek
//消息不是自己同步的,需要处理
if (_param.status == ApeConsts.CHANNEL_STATUS_OPENING) {
let m3u8Stream = this.mediaModule.getMediaPlayPath({"type": "m3u8", "streamId": _param.streamId});
let rtmpStream = this.mediaModule.getMediaPlayPath({"type": "rtmp", "streamId": _param.streamId});
let replay = this.mediaModule.getMediaRecordPlaybackPath({
"type": "m3u8",
"streamId": _param.streamId
});
if (m3u8Stream.code == 0) {
mediaChannelInfo.m3u8Url = m3u8Stream.playUrl;
}
if (rtmpStream.code == 0) {
mediaChannelInfo.rtmpUrl = rtmpStream.playUrl;
}
if (replay.code == 0) {
mediaChannelInfo.replay = replay.playUrl;
}
}
return mediaChannelInfo;
}
//更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次
updaterRecordApeStatus(_param) {
loger.warn("录制状态发送改变->更新当前的状态->", this.mediaModule.mediaChannels);
... ...