diff --git a/src/EngineEntrance.js b/src/EngineEntrance.js
index a9baa27..49030e8 100644
--- a/src/EngineEntrance.js
+++ b/src/EngineEntrance.js
@@ -62,9 +62,9 @@ export default class MessageEntrance extends Emiter {
   constructor() {
     super();
     //sdk 信息
-    GlobalConfig.sdkVersion = "v2.20.5.20171023";
+    GlobalConfig.sdkVersion = "v2.21.3.20171024";
     loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
-
+    console.log("sdkVersion:" + GlobalConfig.sdkVersion);
     //设置
     let locationProtocol= location.protocol;
     if(locationProtocol=="https:"){
@@ -92,6 +92,7 @@ export default class MessageEntrance extends Emiter {
     this.isGetFastestHlsPullCallback = false; //是否HLS拉流地址测试结束
     this.isGetFastestRsCallback = false; //是否录制回放HLS拉流地址测试结束
     this.saveClassStatusTimer=0;//保存课堂数据的计时器间隔,防止同一瞬间多次提交
+    this.joinChannelTimer=0;//加入音视频通道的间隔
     //全局的Error处理
     this.on(MessageTypes.MCU_ERROR, this._mcuErrorHandler.bind(this));
 
@@ -307,6 +308,8 @@ export default class MessageEntrance extends Emiter {
     this.setDebugInfo = this._setDebugInfo.bind(this); //设置debug信息
     this.setOpenSendLogToServer = this._setOpenSendLogToServer.bind(this); //设置是否上报日志
 
+    this.reJoinChannel = this._reJoinChannel.bind(this); //重新加入频道
+
     this.addLog = this._addLog.bind(this);
     this.addWarn = this._addWarn.bind(this);
     this.addError = this._addError.bind(this);
@@ -1677,11 +1680,11 @@ export default class MessageEntrance extends Emiter {
     }
 
     //离开视频通话频道
-    if(GlobalConfig.deviceType==0||GlobalConfig.deviceType==3){
+   /* if(GlobalConfig.deviceType==0||GlobalConfig.deviceType==3){
       if(_webRtc){
-        _webRtc.leaveChannel();;
+        _webRtc.leaveChannel();
       }
-    }
+    }*/
 
     //停止推流
     if (_video_ape) {
@@ -1712,6 +1715,8 @@ export default class MessageEntrance extends Emiter {
       _mcu.leaveMCU();
       GlobalConfig.setCurrentStatus(GlobalConfig.statusCode_3);
     }
+    //离开视频通话模块
+    this._leaveChannel();
   }
 
   //获取课堂所有参数(20170727新规则) api/meeting/detail.do? flash中的接口文件是 getClassParam.do
@@ -2830,7 +2835,36 @@ export default class MessageEntrance extends Emiter {
       });
     }
   }
+  /*
+  * 重新加入频道
+  * */
+  _reJoinChannel(_params){
+    if(GlobalConfig.appId&&!GlobalConfig.openFlash){
+        //先离开频道
+        this._leaveChannel();
+      //主讲人和老师可以设置旁录
 
+      //加入之前先设置旁录地址,只有直播支持旁路(1路流)
+      if(_webRtc&&GlobalConfig.isTeachOrAssistant&&GlobalConfig.maxMediaChannels==1){
+        let curTimestamp = new Date().getTime();
+        let streamId=GlobalConfig.siteId+"_"+GlobalConfig.classId+"_"+GlobalConfig.userId+"_"+curTimestamp;
+        //传入固定的流Id
+        let publishData=this._getVideoPublishPath({streamId:streamId});
+        loger.log("加入之前先设置旁录地址",publishData);
+        if(publishData&&publishData.code==0){
+          _webRtc.setConfigPublisherUrl(publishData.publishUrl);
+          let m3u8Stream = _video_ape.getPlayVideoPath({"type": "m3u8", "streamId":streamId});
+          let rtmpStream = _video_ape.getPlayVideoPath({"type": "rtmp", "streamId":streamId});
+          _webRtc.setRtmpM3u8Path({m3u8Url:m3u8Stream.playUrl,rtmpUrl:rtmpStream.playUrl});
+        }
+      }
+      clearTimeout(this.joinChannelTimer);
+      this.joinChannelTimer=setTimeout(()=>{
+        //加入音视频通话模块,延迟一秒处理,因为视频需要根据用户列表信息来判断放的位置,太早的话用户列表没有数据
+        this._joinChannel({channelId:GlobalConfig.channelId,channelKey:GlobalConfig.channelKey ,uid:GlobalConfig.userUid,info:""+GlobalConfig.userRole});
+      },1600);
+    }
+  }
   /*
   * 加入视频通话
   * */
diff --git a/src/apes/WebRtcApe.js b/src/apes/WebRtcApe.js
index f955883..0a44cd9 100644
--- a/src/apes/WebRtcApe.js
+++ b/src/apes/WebRtcApe.js
@@ -416,10 +416,11 @@ class WebRtcApe extends Emiter {
   }
 
   leaveChannel() {
-    loger.log("离开视频通话频道");
+    loger.log("调用离开视频通话频道->isPublish"+this.isPublish);
     if (!this.client) {
       return;
     }
+    this.unpublish();
     this.client.leave(() => {
       loger.log("离开视频通话频道->成功");
     }, (err)=> {