From 12f562be9af678a8322a562adddc01757bf6b17b Mon Sep 17 00:00:00 2001 From: liyong <liyong@3mang.com> Date: Sat, 14 Oct 2017 14:43:55 +0800 Subject: [PATCH] webRtc增加老师和主讲人的旁路推流设置,视频的分辨率为480X360 ,新增对H5的支持,提供m3u8地址 --- src/EngineEntrance.js | 18 +++++++++--------- src/apes/VideoApe.js | 47 +++++++++++++++++++++++++++++++++++++++++++++-- src/apes/WebRtcApe.js | 33 ++++++++++++--------------------- 3 files changed, 66 insertions(+), 32 deletions(-) diff --git a/src/EngineEntrance.js b/src/EngineEntrance.js index 79c488d..05a82f8 100644 --- a/src/EngineEntrance.js +++ b/src/EngineEntrance.js @@ -62,7 +62,7 @@ export default class MessageEntrance extends Emiter { constructor() { super(); //sdk 信息 - GlobalConfig.sdkVersion = "v2.16.8.20171012"; + GlobalConfig.sdkVersion = "v2.17.11.20171014"; loger.warn("sdkVersion:" + GlobalConfig.sdkVersion); //设置 @@ -1225,15 +1225,15 @@ export default class MessageEntrance extends Emiter { //主讲人和老师可以设置旁录 if(GlobalConfig.appId&&!GlobalConfig.openFlash){ + //加入之前先设置旁录地址,只有直播支持旁路 + if(_webRtc&&GlobalConfig.isTeachOrAssistant){ + let publishData=this._getVideoPublishPath(); + loger.log("加入之前先设置旁录地址",publishData); + if(publishData&&publishData.code==0){ + _webRtc.setConfigPublisherUrl(publishData.publishUrl); + } + } setTimeout(()=>{ - /*//加入之前先设置旁录地址,只有直播支持旁路 - if(_webRtc&&GlobalConfig.isTeachOrAssistant){ - let publishData=this._getVideoPublishPath(); - loger.log("加入之前先设置旁录地址",publishData); - if(publishData&&publishData.code==0){ - _webRtc.setConfigPublisherUrl(publishData.publishUrl); - } - }*/ //加入音视频通话模块,延迟一秒处理,因为视频需要根据用户列表信息来判断放的位置,太早的话用户列表没有数据 this._joinChannel({channelId:GlobalConfig.channelId,channelKey:GlobalConfig.channelKey ,uid:GlobalConfig.userUid,info:""+GlobalConfig.userRole}); },1600); diff --git a/src/apes/VideoApe.js b/src/apes/VideoApe.js index 6f279c3..41fbf76 100644 --- a/src/apes/VideoApe.js +++ b/src/apes/VideoApe.js @@ -121,6 +121,7 @@ class VideoApe extends Ape { //根据推流的地址获取对应的频道信息 let needPublishChannelInfo = this.mediaModule.getNeedPublishMediaChannel(_param.publishUrl); + console.log("needPublishChannelInfo",needPublishChannelInfo); if (needPublishChannelInfo == null) { loger.warn('推流->推流数据已经无效', _param); this._emit(MessageTypes.VIDEO_PUBLISH_RESULT, { @@ -223,6 +224,18 @@ class VideoApe extends Ape { "toNodeId": 0, "data":_data|| "" }); + + //如果是老师或主讲人助教,推流需要同步 + if(GlobalConfig.isTeachOrAssistant){ + _data.nodeId=GlobalConfig.nodeId; + if(_data.status==1){ + this.publishVideo(_data); + }else if(_data.status==0){ + _data.nodeId=GlobalConfig.nodeId; + this.stopPublishVideo(_data) + } + } + } //==========================屏幕共享========================================================================= @@ -482,6 +495,7 @@ class VideoApe extends Ape { dataObj = videoReceivePdu.data; } videoReceivePdu.data = dataObj; + //录制回放和H5需要处理 if(GlobalConfig.isRecordPlayBack){ //录制回放的处理 if (videoReceivePdu.toNodeId!=0){ @@ -502,7 +516,7 @@ class VideoApe extends Ape { "timestamp": 1505886364100, "recordTimestamp": 27 }*/ - switch (videoReceivePdu.actionType){ + /* switch (videoReceivePdu.actionType){ case ApeConsts.MEDIA_ACTION_PUBLISH_STATUS: //webRtc的推流和停止推流的消息 let videoInfo={}; @@ -520,7 +534,7 @@ class VideoApe extends Ape { break; default: break - } + }*/ }else { //判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理 @@ -529,6 +543,35 @@ class VideoApe extends Ape { } else { loger.log('视频控制消息处理 .', videoReceivePdu); this._emit(MessageTypes.VIDEO_BROADCAST, videoReceivePdu); + + let data=videoReceivePdu.data; + if(data){ + 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); + }*/ + /* if(data.status==1){ + this.publishVideo(data); + }else if(data.status==0){ + data.nodeId=videoReceivePdu.toNodeId; + this.stopPublishVideo(data) + }*/ + break; + default: + break + } + } } } diff --git a/src/apes/WebRtcApe.js b/src/apes/WebRtcApe.js index 0bc11b4..5108b81 100644 --- a/src/apes/WebRtcApe.js +++ b/src/apes/WebRtcApe.js @@ -45,8 +45,8 @@ class WebRtcApe extends Emiter { this.pFrameRate=30; this.pBitrate=500; - //this.videoResolution = "360P_8";//480x360 30 490 - this.videoResolution = "240P";// + this.videoResolution = "360P_8";//480x360 30 490 + //this.videoResolution = "240P";// this.isOpenVideo = true; this.isPublish = false;//当前是否正在推流 @@ -251,7 +251,7 @@ class WebRtcApe extends Emiter { for (let i=normalList.length-1;i>=0;i--){ divItem=normalList[i]; if(divItem&&divItem.children.length<2){ - console.log("删除无效的视图",divItem); + console.log("删除无效的学生视图"); divItem.remove(); } } @@ -261,7 +261,7 @@ class WebRtcApe extends Emiter { for (let i=hostList.length-1;i>=0;i--){ divItem=hostList[i]; if(divItem&&divItem.children.length<2){ - console.log("删除无效的视图",divItem); + console.log("删除无效的老师视图"); divItem.remove(); } } @@ -271,7 +271,7 @@ class WebRtcApe extends Emiter { for (let i=localList.length-1;i>=0;i--){ divItem=localList[i]; if(divItem&&divItem.children.length<2){ - console.log("删除无效的视图",divItem); + console.log("删除无效的本地视图"); divItem.remove(); } } @@ -423,12 +423,13 @@ class WebRtcApe extends Emiter { * 设置旁录地址 * */ setConfigPublisherUrl(_publishUrl){ - loger.warn("设置旁路地址->",_publishUrl); this.configPublisherUrl=_publishUrl; if(this.client&& this.configPublisherUrl){ - this.client.configPublisher( - {width: this.pWidth, height: this.pHeight, framerate: this.pFrameRate, bitrate: this.pBitrate, publishUrl: this.configPublisherUrl} - ); + let configObj={width: parseInt(this.pWidth), height: parseInt(this.pHeight), framerate: parseInt(this.pFrameRate), bitrate: parseInt(this.pBitrate), publishUrl:""+this.configPublisherUrl}; + //let configObj={width: 480, height:360, framerate:30, bitrate:500, publishUrl:_publishUrl}; + //let configObj={width: 480, height:360, framerate:30, bitrate:500, publishUrl:'rtmp://txlivepush.xuedianyun.com/live/markettest_395312484_T8440_983041_1507888360?bizid=11220&txSecret=15cc50d93f86f9e1a2a76a10db2b09a8&txTime=59e135a8&record=hls|flv&record_interval=5400'}; + loger.warn("设置旁路地址->",configObj); + this.client.configPublisher(configObj); }else { loger.warn("设置旁路地址->失败->为初始化或旁路地址无效",_publishUrl); } @@ -556,9 +557,6 @@ class WebRtcApe extends Emiter { $("."+this.normalWebRtcVideoClass).css("width",this.normalRemoteVideoWidth*this.videoScale); $("."+this.normalWebRtcVideoClass).css("height",this.normalRemoteVideoHeight*this.videoScale); - //监课的不需要设置 - //$("."+this.invisibleWebRtcVideoClass).css("width",this.localVideoWidth); - //$("."+this.invisibleWebRtcVideoClass).css("height",this.localVideoHeight); } /* @@ -575,14 +573,6 @@ class WebRtcApe extends Emiter { } this.videoScale=scale; loger.log("更新视频视图大小->videoScale:"+this.videoScale); - /* this.localVideoWidth=this.localVideoWidth*this.videoScale; - this.localVideoHeight=this.localVideoHeight*this.videoScale; - - this.hostRemoteVideoWidth=this.hostRemoteVideoWidth*this.videoScale; - this.hostRemoteVideoHeight=this.hostRemoteVideoHeight*this.videoScale; - - this.normalRemoteVideoWidth=this.normalRemoteVideoWidth*this.videoScale; - this.normalRemoteVideoHeight=this.normalRemoteVideoHeight*this.videoScale;*/ this.updateAllVideoSize(); } @@ -751,7 +741,8 @@ class WebRtcApe extends Emiter { userName: GlobalConfig.userName, userRole: GlobalConfig.userRole, timestamp: curTimestamp, - recordTimestamp: GlobalConfig.recordTimestamp + recordTimestamp: GlobalConfig.recordTimestamp, + publishUrl:this.configPublisherUrl }); return data; } -- libgit2 0.24.0