李勇

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

@@ -62,7 +62,7 @@ export default class MessageEntrance extends Emiter { @@ -62,7 +62,7 @@ export default class MessageEntrance extends Emiter {
62 constructor() { 62 constructor() {
63 super(); 63 super();
64 //sdk 信息 64 //sdk 信息
65 - GlobalConfig.sdkVersion = "v2.12.6.20170925"; 65 + GlobalConfig.sdkVersion = "v2.12.8.20170926";
66 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); 66 loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
67 67
68 //设置 68 //设置
@@ -389,7 +389,6 @@ class VideoApe extends Ape { @@ -389,7 +389,6 @@ class VideoApe extends Ape {
389 } 389 }
390 // to, message 390 // to, message
391 loger.log('视频模块广播消息.', _param); 391 loger.log('视频模块广播消息.', _param);
392 -  
393 //如果是控制开启摄像头推流,需要判断是否还有空闲频道 392 //如果是控制开启摄像头推流,需要判断是否还有空闲频道
394 if (_param.actionType != null && _param.actionType == ApeConsts.MEDIA_ACTION_OPEN_CAMERA) { 393 if (_param.actionType != null && _param.actionType == ApeConsts.MEDIA_ACTION_OPEN_CAMERA) {
395 //判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启 394 //判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启
@@ -466,9 +465,8 @@ class VideoApe extends Ape { @@ -466,9 +465,8 @@ class VideoApe extends Ape {
466 } 465 }
467 466
468 /////收到消息处理////////////////////////////////////////////////// 467 /////收到消息处理//////////////////////////////////////////////////
469 -  
470 // 视频消息处理,内部处理,不需要告诉应用层 468 // 视频消息处理,内部处理,不需要告诉应用层
471 - receiveVideoCommandHandler(_data) { 469 + receiveVideoCommandHandler(_data,seek) {
472 let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(_data); 470 let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(_data);
473 if (videoReceivePdu == null) { 471 if (videoReceivePdu == null) {
474 loger.warn("视频控制消息处理,收到的消息为null,不做处理"); 472 loger.warn("视频控制消息处理,收到的消息为null,不做处理");
@@ -484,13 +482,56 @@ class VideoApe extends Ape { @@ -484,13 +482,56 @@ class VideoApe extends Ape {
484 dataObj = videoReceivePdu.data; 482 dataObj = videoReceivePdu.data;
485 } 483 }
486 videoReceivePdu.data = dataObj; 484 videoReceivePdu.data = dataObj;
487 - //判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理  
488 - if (videoReceivePdu.toNodeId != 0 && videoReceivePdu.toNodeId != GlobalConfig.nodeId) {  
489 - loger.log('视频消息不处理 toNodeId=', videoReceivePdu.toNodeId, "my nodeId=", GlobalConfig.nodeId);  
490 - } else {  
491 - loger.log('视频控制消息处理 .', videoReceivePdu);  
492 - this._emit(MessageTypes.VIDEO_BROADCAST, videoReceivePdu); 485 + if(GlobalConfig.isRecordPlayBack){
  486 + //录制回放的处理
  487 + if (videoReceivePdu.toNodeId!=0){
  488 + //只处理发送给所有人的消息,发给指定人的消息不处理
  489 + return;
  490 + }
  491 + let data=videoReceivePdu.data;
  492 + if(!data) return;
  493 + /* "data": {
  494 + "appId": "eb253cc7b40c4a8b82f0a5b6f93c2ce0",
  495 + "channel": "markettest_1880101695",
  496 + "channelKey": "",
  497 + "uid": 886346081,
  498 + "status": 1,
  499 + "userId": "user_338621",
  500 + "userName": "user_338621",
  501 + "userRole": "normal",
  502 + "timestamp": 1505886364100,
  503 + "recordTimestamp": 27
  504 + }*/
  505 + switch (videoReceivePdu.actionType){
  506 + case ApeConsts.MEDIA_ACTION_PUBLISH_STATUS:
  507 + //webRtc的推流和停止推流的消息
  508 + let videoInfo={};
  509 + let videoData=data;
  510 + videoData.streamId=data.channel+"_"+data.userId+"_"+data.uid+"_"+(parseInt(parseInt(data.timestamp)/1000));
  511 + if(data.status==1){
  512 + loger.log("播放文件->", "userName",data.userName,"uid",data.uid,"时间:"+new Date(1505886364100).toString());
  513 + videoInfo=this.packVideoInfoAndSendToClient(videoData,seek);
  514 + this._emit(MessageTypes.VIDEO_PLAY, videoInfo);
  515 + }else if(data.status==0){
  516 + loger.log("停止播放文件->", "userName",data.userName,"uid",data.uid,"时间:"+new Date(1505886364100).toString());
  517 + videoInfo=this.packVideoInfoAndSendToClient(videoData,seek);
  518 + this._emit(MessageTypes.VIDEO_STOP, videoInfo);
  519 + }
  520 + break;
  521 + default:
  522 + break
  523 + }
  524 +
  525 + }else {
  526 + //判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
  527 + if (videoReceivePdu.toNodeId != 0 && videoReceivePdu.toNodeId != GlobalConfig.nodeId) {
  528 + loger.log('视频消息不处理 toNodeId=', videoReceivePdu.toNodeId, "my nodeId=", GlobalConfig.nodeId);
  529 + } else {
  530 + loger.log('视频控制消息处理 .', videoReceivePdu);
  531 + this._emit(MessageTypes.VIDEO_BROADCAST, videoReceivePdu);
  532 + }
493 } 533 }
  534 +
494 } 535 }
495 //切换了MS,重新更新一下当前正在播放的流地址 536 //切换了MS,重新更新一下当前正在播放的流地址
496 changeMediaMs(){ 537 changeMediaMs(){
@@ -609,6 +650,45 @@ class VideoApe extends Ape { @@ -609,6 +650,45 @@ class VideoApe extends Ape {
609 650
610 } 651 }
611 652
  653 + /*
  654 + * 组织视频数据发送给客户端
  655 + * */
  656 + packVideoInfoAndSendToClient(_param,seek){
  657 + let mediaChannelInfo = {};
  658 + mediaChannelInfo.mediaId = _param.channelId;
  659 + mediaChannelInfo.fromNodeId = _param.fromNodeId;
  660 + mediaChannelInfo.userName = _param.userName || "";
  661 + mediaChannelInfo.userRole = _param.userRole || ApeConsts.normal;
  662 + mediaChannelInfo.mediaType = _param.mediaType || ApeConsts.MEDIA_TYPE_DEFAULT;
  663 + mediaChannelInfo.screenWidth = _param.screenWidth || GlobalConfig.screenWidth;
  664 + mediaChannelInfo.screenHeight = _param.screenHeight || GlobalConfig.screenHeight;
  665 + mediaChannelInfo.deviceType = _param.deviceType || 0;
  666 + mediaChannelInfo.optionJsonData = _param.optionJsonData || "";
  667 + mediaChannelInfo.m3u8Url = "";
  668 + mediaChannelInfo.rtmpUrl = "";
  669 + mediaChannelInfo.replay = "";
  670 + mediaChannelInfo.seek = seek || 0;//这个是录制回放时使用的seek
  671 + //消息不是自己同步的,需要处理
  672 + if (_param.status == ApeConsts.CHANNEL_STATUS_OPENING) {
  673 + let m3u8Stream = this.mediaModule.getMediaPlayPath({"type": "m3u8", "streamId": _param.streamId});
  674 + let rtmpStream = this.mediaModule.getMediaPlayPath({"type": "rtmp", "streamId": _param.streamId});
  675 + let replay = this.mediaModule.getMediaRecordPlaybackPath({
  676 + "type": "m3u8",
  677 + "streamId": _param.streamId
  678 + });
  679 + if (m3u8Stream.code == 0) {
  680 + mediaChannelInfo.m3u8Url = m3u8Stream.playUrl;
  681 + }
  682 + if (rtmpStream.code == 0) {
  683 + mediaChannelInfo.rtmpUrl = rtmpStream.playUrl;
  684 + }
  685 + if (replay.code == 0) {
  686 + mediaChannelInfo.replay = replay.playUrl;
  687 + }
  688 + }
  689 + return mediaChannelInfo;
  690 + }
  691 +
612 //更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次 692 //更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次
613 updaterRecordApeStatus(_param) { 693 updaterRecordApeStatus(_param) {
614 loger.warn("录制状态发送改变->更新当前的状态->", this.mediaModule.mediaChannels); 694 loger.warn("录制状态发送改变->更新当前的状态->", this.mediaModule.mediaChannels);