diff --git a/src/EngineEntrance.js b/src/EngineEntrance.js
index cc0edea..4d2c3ba 100644
--- a/src/EngineEntrance.js
+++ b/src/EngineEntrance.js
@@ -63,7 +63,7 @@ export default class MessageEntrance extends Emiter {
     super();
     this.lastClassActiveTime=0;//最后一次课堂激活的时间戳
     //sdk 信息
-    GlobalConfig.sdkVersion = "v2.31.1.20171120";
+    GlobalConfig.sdkVersion = "v2.31.10.20171122";
     loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
     console.log("sdkVersion:" + GlobalConfig.sdkVersion);
     //设置
@@ -644,7 +644,7 @@ export default class MessageEntrance extends Emiter {
 
 
     //如果没有名字的时候需要随机生成
-    let randUserId =parseInt(Math.random()*1000)+""+parseInt(Math.random()*1000)+""+parseInt(Math.random()*1000);
+    let randUserId =parseInt(Math.random()*1000)+"_"+parseInt(Math.random()*1000)+"_"+parseInt(Math.random()*1000);
     if (GlobalConfig.userRole == ApeConsts.host) {
       randUserId = "T" + randUserId;
     } else if (GlobalConfig.userRole == ApeConsts.assistant) {
@@ -1051,6 +1051,13 @@ export default class MessageEntrance extends Emiter {
 
   //开始MCU选点操作
   _getFastestMcuServer(_callback) {
+    //不再做MCU http测速
+    if (_callback) {
+      _callback(null);
+    }
+    return;
+
+    //正常的测试流程
     if (_ipManager) {
       _ipManager.getFastestMcuServer(GlobalConfig.mcuListFinal, _callback);
     } else {
@@ -1184,7 +1191,7 @@ export default class MessageEntrance extends Emiter {
 
     //判断是否需要获取加入音视频通话频道的channelKey
     if (GlobalConfig.appCertificate) {
-      loger.log("加入视频通话模块->需要先获取channelKey")
+      //loger.log("加入视频通话模块->需要先获取channelKey")
       //获取channelKey
       _sass.getChannelKeyToken((_data)=> {
         //{"code":200,"channelKey":"005AQAoAEQzQUQxNzFDOEQwOEU3OTVGMjlCMzZDRUZENTNGOTU0RDY4N0ZGMUEQANylukzO70ocgrNX9hlkNNWvpLBZ9buDAy/fuVkAAA==","uid":"751373669"}
@@ -1194,7 +1201,7 @@ export default class MessageEntrance extends Emiter {
         this._joinClassSuccessSeting();
       })
     } else {
-      loger.log("加入视频通话模块->不需要获取channelKey")
+      //loger.log("加入视频通话模块->不需要获取channelKey")
       this._joinClassSuccessSeting();
     }
   }
@@ -1283,7 +1290,7 @@ export default class MessageEntrance extends Emiter {
     this._emit(MessageTypes.CLASS_JOIN_SUCCESS, joinClassSuccessCallBackData);
 
     //主讲人和老师可以设置旁录
-    if (GlobalConfig.appId && !GlobalConfig.openFlash) {
+    if (GlobalConfig.appId && !GlobalConfig.openFlash&&GlobalConfig.deviceType!=GlobalConfig.deviceH5) {
       //加入之前先设置旁录地址,老师和主讲人开启旁路
       if (_webRtc && GlobalConfig.isTeachOrAssistant) {
         let curTimestamp = new Date().getTime();
@@ -2568,7 +2575,7 @@ export default class MessageEntrance extends Emiter {
   docJoinChannelSuccess() {
     let interval=new Date().getTime()-parseInt(this.lastClassActiveTime);
     interval=interval/1000;
-    loger.log("最后一次记录的时间->"+this.lastClassActiveTime,"当前时间:"+new Date().getTime(),"间隔:"+interval+"秒");
+    //loger.log("最后一次记录的时间->"+this.lastClassActiveTime,"当前时间:"+new Date().getTime(),"间隔:"+interval+"秒");
     loger.log("文档加入频道成功->isHost=", GlobalConfig.isHost, "当前总人数:", GlobalConfig.rosterNumber, "sassDoclength=", GlobalConfig.docListPrepare.length);
 
 
diff --git a/src/EverSocket.js b/src/EverSocket.js
index db2f15b..d333238 100644
--- a/src/EverSocket.js
+++ b/src/EverSocket.js
@@ -83,12 +83,7 @@ class EverSocket extends Emiter {
           loger.warn('发送到MCU的数据文件超过10k-->byteLength->'+len,"type:"+type);
           return;
         }
-
-        this.sendToMcuList.push("c2s_"+EngineUtils.creatTimestampStr()+"_"+len+"_"+type);
-        if(this.sendToMcuList.length>80){
-          loger.log("发送到MCU数据统计->",this.sendToMcuList);
-          this.sendToMcuList=[];
-        }
+        this.send2mcu(len,type);
       }
       this.websocket.send(data);
     } else {
@@ -96,6 +91,32 @@ class EverSocket extends Emiter {
     }
   }
 
+  //统计发送到MCU的数据
+  /*
+  * len 长度
+  * type 类型
+  * */
+  send2mcu(len,type){
+    this.sendToMcuList.push(""+len+":"+type);
+    if(this.sendToMcuList.length>=50){
+      loger.log("发送到MCU数据统计->",this.sendToMcuList);
+      this.sendToMcuList=[];
+    }
+  }
+
+  //统计收到MCU的数据
+  /*
+   * len 长度
+   * type 类型
+   * */
+  mcu2client(len,type){
+    this.receiveFromMcuList.push(""+len+":"+type);
+    if(this.receiveFromMcuList.length>50){
+      loger.log("收到MCU数据统计->",this.receiveFromMcuList);
+      this.receiveFromMcuList=[];
+    }
+  }
+
   _setConnected(isConn = true) {
     this._connected = isConn;
     if (this._connected) {
@@ -218,18 +239,17 @@ class EverSocket extends Emiter {
     const bufferData = messageEvent.data;
     //loger.log('RECEIVE-->byteLength->',bufferData.byteLength);
     let len=bufferData.byteLength;
-    this.receiveFromMcuList.push("s2c_"+EngineUtils.creatTimestampStr()+"_"+len);
-    if(this.receiveFromMcuList.length>80){
-      loger.log("收到MCU数据统计->",this.receiveFromMcuList);
-      this.receiveFromMcuList=[];
-    }
     if (len> 0) {
       this._emit(EverSocket.MESSAGE, bufferData);
+      this.mcu2client(len,"消息");
+    }else {
+      this.mcu2client(0,"回应");
     }
   }
 
   _sendPingHandler() {
     if (this._connected) {
+      this.send2mcu(0,"心跳");
       this.websocket.send(new ArrayBuffer);
     } else {
       this._reConnection();
diff --git a/src/RecordPlayBackParse.js b/src/RecordPlayBackParse.js
index 6b27c55..bf72657 100644
--- a/src/RecordPlayBackParse.js
+++ b/src/RecordPlayBackParse.js
@@ -1240,7 +1240,10 @@ class RecordPlayBackParse extends Emiter {
                     }
 
                   }
-                  this.videoPublishMessages.push(videoChannelInfo);
+                  //****1310721是屏幕共享和外部流  不需要匹配*****
+                  if(parseInt(videoChannelInfo.channelId)<1310721){
+                    this.videoPublishMessages.push(videoChannelInfo);
+                  }
                 }
                 this.mediaChannleList[videoChannelInfo.channelId][timestamp] = {
                   parseData: videoChannelInfo,
diff --git a/src/apes/Ape.js b/src/apes/Ape.js
index 218c40e..cc818e6 100644
--- a/src/apes/Ape.js
+++ b/src/apes/Ape.js
@@ -28,393 +28,385 @@ import RecordPlayBackParse from 'RecordPlayBackParse';
 const loger = Loger.getLoger('Ape');
 
 export default class Ape extends Emiter {
-    constructor(session_id,
-                session_name,
-                session_tag) {
-        super();
-        this._session_id = session_id;
-        this._channel_id = session_id; // session_id === channel_id
-        this._session_name = session_name;
-        this._session_tag = session_tag;
-        this._session_channels = {};
-        this._adapter_pdu = new pdu['RCAdapterPdu'];
-        this._classInfo = null;
-        this._rCArrayBufferUtil = ArrayBufferUtil;
-        this._apeDelayed = true;
-        this._apeDelayedMsgs = [];
-        this._apeDelayedTimer = 0;
-
-        //Ape 通用消息处理
-        this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this));
-        this.on(pdu.RCPDU_CHANNEL_JOIN_RESPONSE, this._joinChannelHandler.bind(this));
-        this.on(pdu.RCPDU_REG_ADAPTER, this._pduMessageHandler.bind(this));
-
-        //先收到onJoinSessionHandlerSuccess   后收到 onJoinChannelHandlerSuccess
-
-        // 监听底层MCU课堂
-        this.mcu = McuObj;
-        this.mcu.on(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this._mcuConferenceJoinSuccessHandler.bind(this));
-        this.mcu.registerApe(this);
-
-        //录制回放
-        this.recordPlayBackParse = RecordPlayBackParse;
-        this.recordPlayBackParse.on(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, this._joinRecordPlaybackSuccessHandler.bind(this));
-        this.recordPlayBackParse.registerApe(this);
+  constructor(session_id,
+              session_name,
+              session_tag) {
+    super();
+    this._session_id = session_id;
+    this._channel_id = session_id; // session_id === channel_id
+    this._session_name = session_name;
+    this._session_tag = session_tag;
+    this._session_channels = {};
+    this._adapter_pdu = new pdu['RCAdapterPdu'];
+    this._classInfo = null;
+    this._rCArrayBufferUtil = ArrayBufferUtil;
+    this._apeDelayed = true;
+    this._apeDelayedMsgs = [];
+    this._apeDelayedTimer = 0;
+
+    //Ape 通用消息处理
+    this.on(pdu.RCPDU_SESSION_JOIN_RESPONSE, this._joinSessionHandler.bind(this));
+    this.on(pdu.RCPDU_CHANNEL_JOIN_RESPONSE, this._joinChannelHandler.bind(this));
+    this.on(pdu.RCPDU_REG_ADAPTER, this._pduMessageHandler.bind(this));
+
+    //先收到onJoinSessionHandlerSuccess   后收到 onJoinChannelHandlerSuccess
+
+    // 监听底层MCU课堂
+    this.mcu = McuObj;
+    this.mcu.on(MessageTypes.CLASS_JOIN_MCU_SUCCESS, this._mcuConferenceJoinSuccessHandler.bind(this));
+    this.mcu.registerApe(this);
+
+    //录制回放
+    this.recordPlayBackParse = RecordPlayBackParse;
+    this.recordPlayBackParse.on(RecordPlayBackParse.CLASS_JOIN_RECORD_PLAYBACK_SUCCESS, this._joinRecordPlaybackSuccessHandler.bind(this));
+    this.recordPlayBackParse.registerApe(this);
+
+  }
+
+  regResponsePduHandler() {
+
+  }
+
+  //停止APE一切操作
+  stopApe() {
+    // loger.log("stopApe==============================");
+  }
+
+  // 消息处理
+  _pduMessageHandler(regBuffer, _seekTime) {
+    let seekTime = _seekTime || 0;//这个只有在录制回放的时候才有
+    this._pduRegAdapterHandler(regBuffer, seekTime);
+  }
+
+  // 数据同步处理
+  _pduRegAdapterHandler(regBuffer, seekTime) {
+    let regPdu = pdu['RCAdapterPdu'].decode(regBuffer);
+    let regItems = regPdu.item;
+    let regItemSize = regItems.length;
+    //console.log("RCAdapterPdu数据同步处理",regPdu);
+    //loger.log(this._session_name + '数据同步消息');
+    //loger.log(this._session_name + '数据同步消息.同步条数', regItemSize,"seekTime->",seekTime);
+    for (var i = 0; i < regItemSize; ++i) {
+      let regItem = regItems[i];
+      let regItemType = regItem.type;
+      let regItemData = regItem.itemData;
+
+      //根据数据包中的type处理数据是否同步
+      if (pdu.RCPDU_REG_UPDATE_OBJ !== regItemType) {
+        if (pdu.RCPDU_REG_RESPONSE_OBJ == regItemType) {
+          let regResponsePdu = pdu['RCRegistryResponseObjPdu'].decode(regItemData);
+          this.regResponsePduHandler(regResponsePdu);
+        }
+        // 只处理两种类型
+        continue;
+      }
 
+      //具体的数据包
+      let regUpdatedItem = pdu['RCRegistryUpdateObjPdu'].decode(regItemData);
+      let sub_type = regUpdatedItem.subType;
+      let object_id = regUpdatedItem.objId;
+      let user_data = regUpdatedItem.userData;
+
+      //loger.log('REG OBJECT EVENT ->', pdu.id2type(sub_type));
+      switch (sub_type) {
+        case pdu.RCPDU_REG_ROSTER_INSERT_PDU:
+          //let rosterInsertData = pdu['RCRegstryRosterInsertItemPdu'].decode(user_data);
+          //loger.log('RCPDU_REG_ROSTER_INSERT_PDU---->');
+          try{
+            let rosterInsertData = pdu['RCRegistryRosterInsertItemPdu'].decode(user_data);
+            let rosterInsertItems = rosterInsertData.items;
+            let rosterInsertItemsLen = rosterInsertItems.length;
+            for (let i = 0; i < rosterInsertItemsLen; ++i) {
+              let record = rosterInsertItems[i];
+              let recordId = record.item_id;
+              let recordData = pdu['RCNodeInfoRecordPdu'].decode(record.item_data);
+              this.rosterInsertHandler(recordId, recordData);
+            }
+          }catch (err){
+            console.log("RCPDU_REG_ROSTER_INSERT_PDU err",err)
+          }
+          break;
+        case pdu.RCPDU_REG_ROSTER_DELETE_PDU:
+          let rosterDelData = pdu['RCRegistryRosterDeleteItemPdu'].decode(user_data);
+          this.rosterDelHandler(rosterDelData.nodeId);
+          break;
+        case pdu.RCPDU_REG_ROSTER_UPDATE_PDU:
+          let rosterUpdateData = pdu['RCRegistryRosterUpdateItemPdu'].decode(user_data);
+          let rosterUpdateItems = rosterUpdateData.items;
+          let rosterUpdateItemsLen = rosterUpdateItems.length;
+          for (let i = 0; i < rosterUpdateItemsLen; ++i) {
+            let node = rosterUpdateItems[i];
+            let nodeId = node.nodeId;
+            let nodeData = pdu['RCNodeInfoRecordPdu'].decode(node.nodeData);
+            this.rosterUpdateHandler(nodeId, nodeData);
+          }
+          break;
+        case pdu.RCPDU_REG_TABLE_INSERT_PDU:
+          let tableInsertData = pdu['RCRegistryTableInsertItemPdu'].decode(user_data);
+          let tableInsertItems = tableInsertData.items;
+          let tableInsertItemsLen = tableInsertItems.length;
+          for (let i = 0; i < tableInsertItemsLen; ++i) {
+            let insertItem = tableInsertItems[i];
+            //loger.log("insertItem",insertItem);
+            this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
+          }
+
+          //文档数据数组内部自己处理数组
+          this.tableInsertApeHandler(tableInsertItems, seekTime);
+          break;
+        case pdu.RCPDU_REG_TABLE_DELETE_PDU:
+          let tableDeleteData = pdu['RCRegistryTableDeleteItemPdu'].decode(user_data);
+          //console.log("tableDeleteData",object_id,tableDeleteData);
+          this.tableDeleteHandler(object_id, tableDeleteData);
+          break;
+        case pdu.RCPDU_REG_TABLE_UPDATE_PDU:
+          let tableUpdateData = pdu['RCRegistryTableUpdateItemPdu'].decode(user_data);
+          let tableUpdateItems = tableUpdateData.items;
+          let tableUpdateItemsLen = tableUpdateItems.length;
+          //loger.log("RCRegistryTableUpdateItemPdu " + tableUpdateItemsLen);
+          //loger.log(tableUpdateData);
+
+
+          for (let i = 0; i < tableUpdateItemsLen; ++i) {
+            let tableItem = tableUpdateItems[i];
+            this.tableUpdateHandler(tableItem.owner, tableItem.itemIdx, tableItem.itemData, seekTime);
+          }
+
+          //白板,文档数据数组内部自己处理数组
+          this.tableUpdateApeHandler(tableUpdateItems, seekTime);
+          break;
+        case pdu.RCPDU_REG_QUEUE_UPDATE_PDU:
+        case pdu.RCPDU_REG_QUEUE_DELETE_PDU:
+        case pdu.RCPDU_REG_QUEUE_INSERT_PDU:
+          loger.warn('REG QUEUE ARE IGNORED');
+          break;
+
+      }
     }
+  }
 
-    regResponsePduHandler() {
+  rosterInsertHandler(recordId, recordData) {
+    // loger.warn(this._session_name + ' rosterInsertHandler 应有子类具体覆盖处理.');
+  }
 
-    }
+  rosterUpdateHandler(nodeId, nodeData) {
+    //loger.warn(this._session_name + ' rosterUpdateHandler 应有子类具体覆盖处理.');
+  }
 
-    //停止APE一切操作
-    stopApe() {
-       // loger.log("stopApe==============================");
-    }
+  rosterDelHandler(recordData) {
+    //loger.warn(this._session_name + ' rosterDelHandler 应有子类具体覆盖处理.');
+  }
 
-    // 消息处理
-    _pduMessageHandler(regBuffer,_seekTime) {
-        let seekTime=_seekTime||0;//这个只有在录制回放的时候才有
-  /*      loger.warn('APE->收到消息处理->',GlobalConfig.mcuDelay,GlobalConfig.messageDelay);
-        //延迟处理消息(3个条件--->ape允许延迟&&客户端设置需要延迟&&Sass设置的延迟时间大于0)
-        if (this._apeDelayed&&GlobalConfig.messageDelay&&GlobalConfig.mcuDelay>0) {
-            loger.warn('延迟处理消息->',GlobalConfig.mcuDelay);
-            setTimeout(() => {
-                this._pduRegAdapterHandler(regBuffer,seekTime);
-            }, GlobalConfig.mcuDelay*1000);//mcuDelay单位是秒,这里需要换算为毫秒
-            return;
-        }
-*/
-        //不延迟,立即处理
-        this._pduRegAdapterHandler(regBuffer,seekTime);
-    }
+  tableInsertHandler(tableId, record) {
+    //loger.warn(this._session_name + ' tableInsertHandler 应有子类具体覆盖处理.');
+  }
 
-    // 数据同步处理
-    _pduRegAdapterHandler(regBuffer,seekTime) {
-        let regPdu = pdu['RCAdapterPdu'].decode(regBuffer);
-        let regItems = regPdu.item;
-        let regItemSize = regItems.length;
-        //console.log("RCAdapterPdu数据同步处理",regPdu);
-        //loger.log(this._session_name + '数据同步消息');
-        //loger.log(this._session_name + '数据同步消息.同步条数', regItemSize,"seekTime->",seekTime);
-        for (var i = 0; i < regItemSize; ++i) {
-            let regItem = regItems[i];
-            let regItemType = regItem.type;
-            let regItemData = regItem.itemData;
-
-            //根据数据包中的type处理数据是否同步
-
-            if (pdu.RCPDU_REG_UPDATE_OBJ !== regItemType) {
-                if (pdu.RCPDU_REG_RESPONSE_OBJ == regItemType) {
-                    let regResponsePdu = pdu['RCRegistryResponseObjPdu'].decode(regItemData);
-                    this.regResponsePduHandler(regResponsePdu);
-                }
-                // 只处理两种类型
-                continue;
-            }
+  tableUpdateHandler(ownerId, recordId, recordData, seekTime) {
+    //loger.warn(this._session_name + ' tableUpdateHandler 应有子类具体覆盖处理.');
+  }
 
-            //具体的数据包
-            let regUpdatedItem = pdu['RCRegistryUpdateObjPdu'].decode(regItemData);
-            let sub_type = regUpdatedItem.subType;
-            let object_id = regUpdatedItem.objId;
-            let user_data = regUpdatedItem.userData;
-
-            //loger.log('REG OBJECT EVENT ->', pdu.id2type(sub_type));
-            switch (sub_type) {
-                case pdu.RCPDU_REG_ROSTER_INSERT_PDU:
-                    //let rosterInsertData = pdu['RCRegstryRosterInsertItemPdu'].decode(user_data);
-                    //loger.log('RCPDU_REG_ROSTER_INSERT_PDU---->');
-                    console.log(user_data);
-                    let rosterInsertData = pdu['RCRegistryRosterInsertItemPdu'].decode(user_data);
-                    let rosterInsertItems = rosterInsertData.items;
-                    let rosterInsertItemsLen = rosterInsertItems.length;
-                    for (let i = 0; i < rosterInsertItemsLen; ++i) {
-                        let record = rosterInsertItems[i];
-                        let recordId = record.item_id;
-                        let recordData = pdu['RCNodeInfoRecordPdu'].decode(record.item_data);
-                        this.rosterInsertHandler(recordId, recordData);
-                    }
-                    break;
-                case pdu.RCPDU_REG_ROSTER_DELETE_PDU:
-                    let rosterDelData = pdu['RCRegistryRosterDeleteItemPdu'].decode(user_data);
-                    this.rosterDelHandler(rosterDelData.nodeId);
-                    break;
-                case pdu.RCPDU_REG_ROSTER_UPDATE_PDU:
-                    let rosterUpdateData = pdu['RCRegistryRosterUpdateItemPdu'].decode(user_data);
-                    let rosterUpdateItems = rosterUpdateData.items;
-                    let rosterUpdateItemsLen = rosterUpdateItems.length;
-                    for (let i = 0; i < rosterUpdateItemsLen; ++i) {
-                        let node = rosterUpdateItems[i];
-                        let nodeId = node.nodeId;
-                        let nodeData = pdu['RCNodeInfoRecordPdu'].decode(node.nodeData);
-                        this.rosterUpdateHandler(nodeId, nodeData);
-                    }
-                    break;
-                case pdu.RCPDU_REG_TABLE_INSERT_PDU:
-                    let tableInsertData = pdu['RCRegistryTableInsertItemPdu'].decode(user_data);
-                    let tableInsertItems = tableInsertData.items;
-                    let tableInsertItemsLen = tableInsertItems.length;
-                    for (let i = 0; i < tableInsertItemsLen; ++i) {
-                        let insertItem = tableInsertItems[i];
-                        //loger.log("insertItem",insertItem);
-                        this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
-                    }
-
-                    //文档数据数组内部自己处理数组
-                    this.tableInsertApeHandler(tableInsertItems,seekTime);
-                    break;
-                case pdu.RCPDU_REG_TABLE_DELETE_PDU:
-                    let tableDeleteData = pdu['RCRegistryTableDeleteItemPdu'].decode(user_data);
-                    //console.log("tableDeleteData",object_id,tableDeleteData);
-                    this.tableDeleteHandler(object_id, tableDeleteData);
-                    break;
-                case pdu.RCPDU_REG_TABLE_UPDATE_PDU:
-                    let tableUpdateData = pdu['RCRegistryTableUpdateItemPdu'].decode(user_data);
-                    let tableUpdateItems = tableUpdateData.items;
-                    let tableUpdateItemsLen = tableUpdateItems.length;
-                    //loger.log("RCRegistryTableUpdateItemPdu " + tableUpdateItemsLen);
-                    //loger.log(tableUpdateData);
-
-
-                    for (let i = 0; i < tableUpdateItemsLen; ++i) {
-                        let tableItem = tableUpdateItems[i];
-                        this.tableUpdateHandler(tableItem.owner, tableItem.itemIdx, tableItem.itemData,seekTime);
-                    }
-
-                    //白板,文档数据数组内部自己处理数组
-                    this.tableUpdateApeHandler(tableUpdateItems,seekTime);
-                    break;
-                case pdu.RCPDU_REG_QUEUE_UPDATE_PDU:
-                case pdu.RCPDU_REG_QUEUE_DELETE_PDU:
-                case pdu.RCPDU_REG_QUEUE_INSERT_PDU:
-                    loger.warn('REG QUEUE ARE IGNORED');
-                    break;
+  tableUpdateApeHandler(tableUpdateItems, seekTime) {
 
-            }
-        }
-    }
+  }
 
-    rosterInsertHandler(recordId, recordData) {
-       // loger.warn(this._session_name + ' rosterInsertHandler 应有子类具体覆盖处理.');
-    }
+  tableInsertApeHandler(tableInsertItems, seekTime) {
 
-    rosterUpdateHandler(nodeId, nodeData) {
-        //loger.warn(this._session_name + ' rosterUpdateHandler 应有子类具体覆盖处理.');
-    }
+  }
 
-    rosterDelHandler(recordData) {
-        //loger.warn(this._session_name + ' rosterDelHandler 应有子类具体覆盖处理.');
-    }
+  tableDeleteHandler(tableId, record) {
+    //loger.warn(this._session_name + ' tableDelHandler 应有子类具体覆盖处理.');
+  }
 
-    tableInsertHandler(tableId, record) {
-        //loger.warn(this._session_name + ' tableInsertHandler 应有子类具体覆盖处理.');
-    }
+  onJoinChannelHandlerSuccess() {
+    //loger.warn(this._session_name + ' onJoinChannelHandlerSuccess 应有子类具体覆盖处理.');
+  }
 
-    tableUpdateHandler(ownerId, recordId, recordData,seekTime) {
-        //loger.warn(this._session_name + ' tableUpdateHandler 应有子类具体覆盖处理.');
-    }
-    tableUpdateApeHandler(tableUpdateItems,seekTime){
+  onJoinSessionHandlerSuccess() {
+    //loger.warn(this._session_name + ' onJoinSessionHandlerSuccess 应有子类具体覆盖处理.');
+  }
 
-    }
-    tableInsertApeHandler(tableInsertItems,seekTime){
+  //录制状态发生改变后ape模块数据更新
+  updaterRecordApeStatus(_data) {
+    loger.warn(this._session_name + 'updaterRecordApeStatus->应有子类具体覆盖处理.');
+  }
 
-    }
-    tableDeleteHandler(tableId, record) {
-        //loger.warn(this._session_name + ' tableDelHandler 应有子类具体覆盖处理.');
-    }
+  // 加入Session处理
+  _joinSessionHandler(data) {
+    //loger.log(this._session_name, ' -> 加入Session');
+    this.onJoinSessionHandlerSuccess();
+  }
 
-    onJoinChannelHandlerSuccess() {
-        //loger.warn(this._session_name + ' onJoinChannelHandlerSuccess 应有子类具体覆盖处理.');
+  // 加入Channel处理
+  _joinChannelHandler(data) {
+    let joinedChannel = pdu['RCChannelJoinResponsePdu'].decode(data);
+    if (joinedChannel.result === pdu.RET_SUCCESS) {
+      //loger.log(this._session_name, ' -> 加入Channel成功. ChannelId', joinedChannel.requestedChannelId);
+      this._session_channels[joinedChannel.requestedChannelId] = ApeConsts.CJS_JOINNED;
+      this.onJoinChannelHandlerSuccess();
+    } else {
+      loger.warn(this._session_name, ' -> 加入Channel失败.', joinedChannel);
     }
-
-    onJoinSessionHandlerSuccess() {
-        //loger.warn(this._session_name + ' onJoinSessionHandlerSuccess 应有子类具体覆盖处理.');
+  }
+
+  // 依赖的课堂创建完毕 - 发起Ape加入
+  _mcuConferenceJoinSuccessHandler(_data) {
+    //loger.log('创建Ape->',
+    //    'SessionId',
+    //    this._session_id,
+    //    'SessionName',
+    //    this._session_name,
+    //    'SessionTag',
+    //    this._session_tag);
+
+    // 课堂依赖底层课堂信息
+    //this._classInfo = classInfo;
+    this._classInfo = GlobalConfig.getClassInfo();
+
+    var joinSessionPdu = new pdu['RCSessionJoinRequestPdu'];
+    joinSessionPdu.id = this._session_id;
+    joinSessionPdu.name = this._session_name;
+    joinSessionPdu.tag = this._session_tag;
+    joinSessionPdu.sessionData = this._adapter_pdu.toArrayBuffer();
+    this.sendUniform(joinSessionPdu, true);
+
+    var joinChannelPdu = new pdu['RCChannelJoinRequestPdu'];
+    joinChannelPdu.initiator = this.mcu.classInfo.nodeId;
+    joinChannelPdu.channelId = this._session_id;
+    this.send(joinChannelPdu);
+  }
+
+  // 依赖的录制回放创建完毕 - 发起Ape加入
+  _joinRecordPlaybackSuccessHandler(_data) {
+    loger.log('录制回放->Ape已经创建完毕->',
+      'SessionId',
+      this._session_id,
+      'SessionName',
+      this._session_name,
+      'SessionTag',
+      this._session_tag);
+  }
+
+  // 注册Key对象
+  registerKey(id, name, tag, user_data) {
+    let adapterItemPdu = new pdu['RCAdapterItemPdu'];
+    adapterItemPdu.type = pdu.RCPDU_REG_REGISTER_KEY;
+
+    // pack register key pdus
+    let registerKeyPdu = new pdu['RCRegistryRegisterKeyPdu'];
+    registerKeyPdu.id = id;
+    registerKeyPdu.name = name;
+    registerKeyPdu.tag = tag;
+    if (user_data.length) {
+      registerKeyPdu.userData = user_data;
     }
-    //录制状态发生改变后ape模块数据更新
-    updaterRecordApeStatus(_data){
-        loger.warn(this._session_name + 'updaterRecordApeStatus->应有子类具体覆盖处理.');
+
+    adapterItemPdu.itemData = registerKeyPdu.toArrayBuffer();
+    this._adapter_pdu.item.push(adapterItemPdu);
+  }
+
+  // 注册Object对象  等同于flash中的 RCRegistryOperator
+  registerObj(type, id, name, tag, owner, user_data) {
+    let adapterItemPdu = new pdu['RCAdapterItemPdu'];
+    adapterItemPdu.type = pdu.RCPDU_REG_REGISTER_OBJ;
+
+    let registerObjPdu = new pdu['RCRegistryRegisterObjPdu'];
+    registerObjPdu.type = type;
+    registerObjPdu.objId = id;
+    registerObjPdu.name = name;
+    registerObjPdu.tag = tag;
+    if (owner) {
+      registerObjPdu.owner = owner;
     }
-    // 加入Session处理
-    _joinSessionHandler(data) {
-        //loger.log(this._session_name, ' -> 加入Session');
-        this.onJoinSessionHandlerSuccess();
+    if (user_data.length) {
+      registerObjPdu.userData = user_data;
     }
 
-    // 加入Channel处理
-    _joinChannelHandler(data) {
-        let joinedChannel = pdu['RCChannelJoinResponsePdu'].decode(data);
-        if (joinedChannel.result === pdu.RET_SUCCESS) {
-            //loger.log(this._session_name, ' -> 加入Channel成功. ChannelId', joinedChannel.requestedChannelId);
-            this._session_channels[joinedChannel.requestedChannelId] = ApeConsts.CJS_JOINNED;
-            this.onJoinChannelHandlerSuccess();
-        } else {
-            loger.warn(this._session_name, ' -> 加入Channel失败.', joinedChannel);
-        }
-    }
+    adapterItemPdu.itemData = registerObjPdu.toArrayBuffer();
+    this._adapter_pdu.item.push(adapterItemPdu);
+  }
 
-    // 依赖的课堂创建完毕 - 发起Ape加入
-    _mcuConferenceJoinSuccessHandler(_data) {
-        //loger.log('创建Ape->',
-        //    'SessionId',
-        //    this._session_id,
-        //    'SessionName',
-        //    this._session_name,
-        //    'SessionTag',
-        //    this._session_tag);
-
-        // 课堂依赖底层课堂信息
-        //this._classInfo = classInfo;
-        this._classInfo = GlobalConfig.getClassInfo();
-
-        var joinSessionPdu = new pdu['RCSessionJoinRequestPdu'];
-        joinSessionPdu.id = this._session_id;
-        joinSessionPdu.name = this._session_name;
-        joinSessionPdu.tag = this._session_tag;
-        joinSessionPdu.sessionData = this._adapter_pdu.toArrayBuffer();
-        this.sendUniform(joinSessionPdu, true);
-
-        var joinChannelPdu = new pdu['RCChannelJoinRequestPdu'];
-        joinChannelPdu.initiator = this.mcu.classInfo.nodeId;
-        joinChannelPdu.channelId = this._session_id;
-        this.send(joinChannelPdu);
+  send(appPdu) {
+    //loger.log('Ape发送数据NORMAL PDU');
+    if (!this.mcu || !this.mcu.connected || GlobalConfig.classExit) {
+      this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
+      return;
     }
-
-    // 依赖的录制回放创建完毕 - 发起Ape加入
-    _joinRecordPlaybackSuccessHandler(_data) {
-        loger.log('录制回放->Ape已经创建完毕->',
-            'SessionId',
-            this._session_id,
-            'SessionName',
-            this._session_name,
-            'SessionTag',
-            this._session_tag);
+    if (!this._classInfo) {
+      loger.warn('Ape发送数据NORMAL PDU->失败->ape课堂数据无效->', this._classInfo);
+      return;
     }
+    let normalPdu = pdu.create_normal_pdu(
+      appPdu.type,
+      this._classInfo.nodeId,
+      this._classInfo.classId,
+      this._session_id,
+      this._channel_id,
+      true,
+      true,
+      PduConsts.DP_TOP,
+      this._classInfo.topNodeID,
+      PduConsts.SEG_ONCE
+    );
+    normalPdu.data = appPdu.toArrayBuffer();
+    // Mcu发送
+    this.mcu.send(normalPdu);
+  }
+
+  // 发送当前APE(session uniform包)
+  sendUniform(appPdu, top) {
+    if (!this.mcu || !this.mcu.connected || GlobalConfig.classExit) {
 
-    // 注册Key对象
-    registerKey(id, name, tag, user_data) {
-        let adapterItemPdu = new pdu['RCAdapterItemPdu'];
-        adapterItemPdu.type = pdu.RCPDU_REG_REGISTER_KEY;
-
-        // pack register key pdus
-        let registerKeyPdu = new pdu['RCRegistryRegisterKeyPdu'];
-        registerKeyPdu.id = id;
-        registerKeyPdu.name = name;
-        registerKeyPdu.tag = tag;
-        if (user_data.length) {
-            registerKeyPdu.userData = user_data;
-        }
-
-        adapterItemPdu.itemData = registerKeyPdu.toArrayBuffer();
-        this._adapter_pdu.item.push(adapterItemPdu);
     }
-
-    // 注册Object对象  等同于flash中的 RCRegistryOperator
-    registerObj(type, id, name, tag, owner, user_data) {
-        let adapterItemPdu = new pdu['RCAdapterItemPdu'];
-        adapterItemPdu.type = pdu.RCPDU_REG_REGISTER_OBJ;
-
-        let registerObjPdu = new pdu['RCRegistryRegisterObjPdu'];
-        registerObjPdu.type = type;
-        registerObjPdu.objId = id;
-        registerObjPdu.name = name;
-        registerObjPdu.tag = tag;
-        if (owner) {
-            registerObjPdu.owner = owner;
-        }
-        if (user_data.length) {
-            registerObjPdu.userData = user_data;
-        }
-
-        adapterItemPdu.itemData = registerObjPdu.toArrayBuffer();
-        this._adapter_pdu.item.push(adapterItemPdu);
+    if (!this._classInfo) {
+      loger.warn('Ape发送数据UNIFORM PDU->失败->ape课堂数据无效->', this._classInfo);
+      return;
     }
-
-    send(appPdu) {
-        //loger.log('Ape发送数据NORMAL PDU');
-        //console.log(appPdu);
-        //loger.log('当前的状态============',GlobalConfig.getCurrentStatus().code);
-      /*  if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) {
-            this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
-            return;
-        }*/
-      if(!this.mcu||!this.mcu.connected){
-        this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
-        return;
-      }
-        if(!this._classInfo){
-            loger.warn('Ape发送数据NORMAL PDU->失败->ape课堂数据无效->', this._classInfo);
-            return;
-        }
-        let normalPdu = pdu.create_normal_pdu(
-            appPdu.type,
-            this._classInfo.nodeId,
-            this._classInfo.classId,
-            this._session_id,
-            this._channel_id,
-            true,
-            true,
-            PduConsts.DP_TOP,
-            this._classInfo.topNodeID,
-            PduConsts.SEG_ONCE
-        );
-        normalPdu.data = appPdu.toArrayBuffer();
-        // Mcu发送
-        this.mcu.send(normalPdu);
+    let uniformPdu = pdu.create_uniform_pdu(
+      appPdu.type,
+      this._classInfo.nodeId,
+      this._classInfo.classId,
+      this._session_id,
+      top ? ApeConsts.BROADCAST_CHANNEL_ID : this._channel_id,
+      true,
+      PduConsts.DP_TOP,
+      top ? this._classInfo.topNodeID : (appPdu.peer || 0),
+      PduConsts.SEG_ONCE
+    );
+    uniformPdu.data = appPdu.toArrayBuffer();
+    // Mcu发送
+    if (this.mcu) {
+      this.mcu.send(uniformPdu);
+    } else {
+      loger.warn('MCU为空->无法发送消息', uniformPdu);
     }
 
-    // 发送当前APE(session uniform包)
-    sendUniform(appPdu, top) {
-        if(!this._classInfo){
-            loger.warn('Ape发送数据UNIFORM PDU->失败->ape课堂数据无效->', this._classInfo);
-            return;
-        }
-        let uniformPdu = pdu.create_uniform_pdu(
-            appPdu.type,
-            this._classInfo.nodeId,
-            this._classInfo.classId,
-            this._session_id,
-            top ? ApeConsts.BROADCAST_CHANNEL_ID : this._channel_id,
-            true,
-            PduConsts.DP_TOP,
-            top ? this._classInfo.topNodeID : (appPdu.peer || 0),
-            PduConsts.SEG_ONCE
-        );
-        uniformPdu.data = appPdu.toArrayBuffer();
-        // Mcu发送
-        if(this.mcu){
-            this.mcu.send(uniformPdu);
-        }else {
-            loger.warn('MCU为空->无法发送消息',uniformPdu);
-        }
+  }
 
+  sendChatUniform(appPdu, top) {
+    //loger.log('当前的状态============',GlobalConfig.getCurrentStatus().code);
+    if (!this.mcu || !this.mcu.connected || GlobalConfig.classExit) {
+      this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
+      return;
     }
-
-    sendChatUniform(appPdu, top) {
-        //console.log(appPdu);
-        //loger.log('当前的状态============',GlobalConfig.getCurrentStatus().code);
-        if (GlobalConfig.getCurrentStatus().code == 0 || GlobalConfig.getCurrentStatus().code == 1) {
-            this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
-            return;
-        }
-        if(!this._classInfo){
-            loger.warn("课堂数据还未获取,不能发送消息");
-            return;
-        }
-        let uniformPdu = pdu.create_uniform_pdu(
-            appPdu.type,
-            this._classInfo.nodeId,
-            this._classInfo.classId,
-            this._session_id,
-            top ? ApeConsts.BROADCAST_CHANNEL_ID : this._channel_id,
-            true,
-            PduConsts.DP_TOP,
-            0,//flash中这个值设置为0
-            PduConsts.SEG_ONCE
-        );
-        uniformPdu.data = appPdu.toArrayBuffer();
-        //loger.log('Ape发送数据UNIFORM PDU',uniformPdu);
-        // Mcu发送
-        this.mcu.send(uniformPdu);
+    if (!this._classInfo) {
+      loger.warn("课堂数据还未获取,不能发送消息");
+      return;
     }
+    let uniformPdu = pdu.create_uniform_pdu(
+      appPdu.type,
+      this._classInfo.nodeId,
+      this._classInfo.classId,
+      this._session_id,
+      top ? ApeConsts.BROADCAST_CHANNEL_ID : this._channel_id,
+      true,
+      PduConsts.DP_TOP,
+      0,//flash中这个值设置为0
+      PduConsts.SEG_ONCE
+    );
+    uniformPdu.data = appPdu.toArrayBuffer();
+    //loger.log('Ape发送数据UNIFORM PDU',uniformPdu);
+    // Mcu发送
+    this.mcu.send(uniformPdu);
+  }
 }
 
diff --git a/src/apes/ApeConsts.js b/src/apes/ApeConsts.js
index 73f5ae0..da9a8ed 100644
--- a/src/apes/ApeConsts.js
+++ b/src/apes/ApeConsts.js
@@ -194,16 +194,16 @@ ApeConsts.MUSIC_SESSION_TAG = "mis-tag";
 ApeConsts.SCREENSHARING_SESSION_TAG = "scr-tag";
 ApeConsts.QUESTION_SESSION_TAG = "qst-tag";
 
-ApeConsts.CONFERENCE_OBJ_ROSTER_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 1);
+ApeConsts.CONFERENCE_OBJ_ROSTER_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 1);//720897
 ApeConsts.CONFERENCE_OBJ_ROSTER_NAME = "node list";
 ApeConsts.CONFERENCE_OBJ_ROSTER_TAG = "node list tag";
 
-ApeConsts.CONFERENCE_OBJ_QUEUE_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 2);
+ApeConsts.CONFERENCE_OBJ_QUEUE_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 2);//720898
 ApeConsts.CONFERENCE_OBJ_QUEUE_NAME = "mic list";
 ApeConsts.CONFERENCE_OBJ_QUEUE_TAG = "mic list tag";
 
 // conference tab pages
-ApeConsts.CONFERENCE_OBJ_TABLE_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 3);
+ApeConsts.CONFERENCE_OBJ_TABLE_ID = ((ApeConsts.CONFERENCE_SESSION_ID << 16) + 3);//720899
 ApeConsts.CONFERENCE_OBJ_TABLE_NAME = "tabbar list";
 ApeConsts.CONFERENCE_OBJ_TABLE_TAG = "tabbar list tag";
 
diff --git a/src/apes/ConferApe.js b/src/apes/ConferApe.js
index 8efec74..c85a595 100644
--- a/src/apes/ConferApe.js
+++ b/src/apes/ConferApe.js
@@ -23,6 +23,7 @@ class ConferApe extends Ape {
       ApeConsts.CONFERENCE_SESSION_NAME,
       ApeConsts.CONFERENCE_SESSION_TAG
     );
+    this.isSendInsterRoster=false;//这个很重要,每次MCU连接成功之后只发一次
     this.isLeave=false;//记录自己是否已经离开
     this.rosters = {}; //用户列表
     this.rosterLen = 0;//当前课堂人数
@@ -57,8 +58,11 @@ class ConferApe extends Ape {
 
   //加入课堂
   _joinSessionHandler(_data) {
-    //let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self;
-    let nodeInfoRecordPdu = this.getNodeInfo();
+    if(this.isSendInsterRoster){
+      loger.warn("已经发送过insertRoster,不能再次发送");
+      return
+    }
+   let nodeInfoRecordPdu = this.getNodeInfo();
 
     let userDataPdu = new pdu['RCNodeInfoUserDataPdu'];
     userDataPdu.qq = '';
@@ -67,14 +71,12 @@ class ConferApe extends Ape {
     nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer();
     nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType; //设备类型
 
-    //loger.log('开始加入->', nodeInfoRecordPdu);
-
     let item = new pdu['RCRegistryRosterItemPdu'];
     item.nodeId = nodeInfoRecordPdu.nodeId;
     item.nodeData = nodeInfoRecordPdu.toArrayBuffer();
 
     let rosterUpdateItem = new pdu['RCRegistryRosterInsertItemPdu'];
-    rosterUpdateItem.type = pdu.RCPDU_REG_ROSTER_UPDATE_PDU;
+    rosterUpdateItem.type =pdu.RCPDU_REG_ROSTER_UPDATE_PDU;// pdu.RCPDU_REG_ROSTER_INSERT_PDU 暂时用update的类型,MCU第一次会当insert处理,目前insert解包出错
     rosterUpdateItem.items.push(item);
 
     let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
@@ -91,6 +93,9 @@ class ConferApe extends Ape {
     adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
     adapterPdu.item.push(adapterItemPdu);
     this.sendUniform(adapterPdu, true);
+
+    this.isSendInsterRoster=true;
+    loger.log('发送insertRoster->', nodeInfoRecordPdu);
   }
 
   //获取角色信息
@@ -289,7 +294,7 @@ class ConferApe extends Ape {
       loger.warn('目前已经是录制状态->当前课堂人数:' + this.rosterLen);
       return false;
     }
-    //如果是host或者当前课堂只有1个人
+    //如果是host或者当前课堂只有1个人,并且不是H5
     if (this.checkHasRecordControl()) {
       loger.warn('开启录制', "isHost", GlobalConfig.isHost, "recordStatus", GlobalConfig.recordStatus, "当前人数:" + this.rosterLen);
       //如果录制的文件名不存在,需要创建一个名字
@@ -619,6 +624,9 @@ class ConferApe extends Ape {
   sendUpdaterClassStatusInfo(_param) {
     //{"actionType": 1,isStopAllPublishMedia:false}    //actionType课堂状态   isStopAllPublishMedia是否停止当前的所有推流
     //console.log('发送更新课堂信息->');
+    if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5==true){
+      return;
+    }
     if (_param == null || EngineUtils.isEmptyObject(_param)) {
       loger.log('发送更新课堂信息->参数错误');
       this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
@@ -733,6 +741,10 @@ class ConferApe extends Ape {
     //更新录制进行时间
     GlobalConfig.recordTimestamp = GlobalConfig.recordTimestamp + 1;
     if (this.checkHasRecordControl()) {
+
+      if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5==true){
+        return;
+      }
       //以一定的时间间隔同步课堂内所有人的累积上课时间
       if (GlobalConfig.recordTimestamp % GlobalConfig.updateRecordTimeDelay == 0) {
         //保存数据到Sass
@@ -945,7 +957,6 @@ class ConferApe extends Ape {
   }
 
   rosterInsertHandler(nodeId, nodeData) {
-    //loger.log("人员进入--->");
     if (GlobalConfig.nodeId == nodeId) {
       loger.log("人员进入课堂模块--->自己");
     } else {
@@ -1026,8 +1037,10 @@ class ConferApe extends Ape {
         loger.log("人员加入->", newNodeData);
       }
 
-      this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});
-      this.emitRosterChange();
+      if(!GlobalConfig.isH5){
+        this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});
+        this.emitRosterChange();
+      }
     } else {
       //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists);
       this.rosterLen = Object.keys(this.rosters).length;
@@ -1038,7 +1051,10 @@ class ConferApe extends Ape {
           loger.log("人员更新信息->", newNodeData);
         }
       }
-      this._emit(MessageTypes.CLASS_UPDATE_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});
+      if(!GlobalConfig.isH5){
+        this._emit(MessageTypes.CLASS_UPDATE_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});
+      }
+
     }
   }
 
@@ -1105,29 +1121,33 @@ class ConferApe extends Ape {
       this.rosterLen = Object.keys(this.rosters).length;
       GlobalConfig.rosterNumber = this.rosterLen;//记录当前的总人数
 
-      this.emitRosterChange();
-      this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId": nodeId, "rosterLen": this.rosterLen});
-
-      //当前人员列表中抽一个人来检查离开人员是否占用频道
-      for (let key in this.rosters) {
-        let randNodeId = parseInt(key);
-        //判断是否是自己就处理以下操作
-        if (randNodeId == GlobalConfig.nodeId) {
-          loger.log("检查离开的人员是否占用channel");
-          this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": nodeId, "rosterLen": this.rosterLen});
-          //如果离开的人员是老师,需要暂停当前的课堂
-          if (user && user.role == ApeConsts.NR_HOST) {
-            this.pauseClass();
+      if(!GlobalConfig.isH5) {
+        this.emitRosterChange();
+        this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId": nodeId, "rosterLen": this.rosterLen});
+
+        //当前人员列表中抽一个人来检查离开人员是否占用频道
+        for (let key in this.rosters) {
+          let randNodeId = parseInt(key);
+          //判断是否是自己就处理以下操作
+          if (randNodeId == GlobalConfig.nodeId) {
+            loger.log("检查离开的人员是否占用channel");
+            this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": nodeId, "rosterLen": this.rosterLen});
+            //如果离开的人员是老师,需要暂停当前的课堂
+            if (user && user.role == ApeConsts.NR_HOST) {
+              this.pauseClass();
+            }
           }
+          return;
         }
-        return;
       }
     }
   }
 
   //广播当前的人数
   emitRosterChange() {
-    this._emit(MessageTypes.CLASS_UPDATE_ROSTER_NUM, Object.keys(this.rosters).length);
+    if(!GlobalConfig.isH5){
+      this._emit(MessageTypes.CLASS_UPDATE_ROSTER_NUM, Object.keys(this.rosters).length);
+    }
   }
 
   ///////数据的封包和解包/////////////////////////////////////////
@@ -1206,6 +1226,7 @@ class ConferApe extends Ape {
     GlobalConfig.rosterNumber = this.rosterLen;
     GlobalConfig.rosters = this.rosters;
     this.isLeave=true;
+    this.isSendInsterRoster=false;
   }
 
 }
diff --git a/src/apes/VideoApe.js b/src/apes/VideoApe.js
index d24f3ce..9e76b67 100644
--- a/src/apes/VideoApe.js
+++ b/src/apes/VideoApe.js
@@ -406,6 +406,12 @@ class VideoApe extends Ape {
       loger.warn(GlobalConfig.getCurrentStatus());
       return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"};
     }
+    clearTimeout(this.releaseTimeId);
+    if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5){
+      //直播时H5不处理
+      return;
+    }
+
     loger.log("释放nodeId占用的所有频道->", nodeId);
     let openingChannelInfo = this.mediaModule.getOpeningMediaChannelForNodeId(nodeId);
     if (openingChannelInfo.channelId == 0) {
@@ -423,10 +429,6 @@ class VideoApe extends Ape {
 
     this.sendTableUpdateHandler(channelInfo);
     //递归检查,800毫秒之后执行
-    clearTimeout(this.releaseTimeId);
-    if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5){
-      return;
-    }
     this.releaseTimeId = setTimeout(function () {
       loger.warn(nodeId, "检查频道是否占用");
       this._releaseNodeIdAllChannel(nodeId);
@@ -501,7 +503,10 @@ class VideoApe extends Ape {
       //已经离开课堂就不再做处理
       return;
     }
-
+    if(GlobalConfig.classType==ApeConsts.CLASS_TYPE_ZHIBO&&GlobalConfig.isH5){
+      //直播时H5不做处理
+      return;
+    }
     let updateModelPdu = this.packPdu(_channelInfo, _channelInfo.channelId);//let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2);
 
     if (updateModelPdu == null) {