diff --git a/src/EngineEntrance.js b/src/EngineEntrance.js
index 2060d80..5a831b2 100644
--- a/src/EngineEntrance.js
+++ b/src/EngineEntrance.js
@@ -116,6 +116,8 @@ export default class MessageEntrance extends Emiter {
     this.getPublishVideoPath = this._getPublishVideoPath;
     this.publishVideo = this._publishVideo;
     this.stopPublishVideo = this._stopPublishVideo;
+    this.sendVideoCommandMsg=this.sendVideoCommandMsg;
+
 
     //whiteBoradApe
     this.sendInsertAnnotaion = this._sendInsertAnnotaion;
@@ -620,6 +622,12 @@ export default class MessageEntrance extends Emiter {
   }
 
   //VidoeApe
+  sendVideoCommandMsg(_param){
+    if(_video_ape){
+       _video_ape.sendVideoCommandMsg(_param);
+    }
+  }
+
   _getPlayVideoPath(_param){
     if(_video_ape){
       return _video_ape.getPlayVideoPath(_param);
diff --git a/src/EverSocket.js b/src/EverSocket.js
index f7faa8d..0c46b9e 100644
--- a/src/EverSocket.js
+++ b/src/EverSocket.js
@@ -102,8 +102,8 @@ class EverSocket extends Emiter {
     loger.log('WebSocket建立成功', this.wsURL);
 
     //启动心跳,检查socket链接状态
-    //this.pingTimer = window.setInterval(this._sendPingHandler.bind(this), EverSocket.PING_INTERVAL);
-    //this.pongTimer = window.setInterval(this._checkPongHandler.bind(this), EverSocket.PONG_INTERVAL);
+    this.pingTimer = window.setInterval(this._sendPingHandler.bind(this), EverSocket.PING_INTERVAL);
+    this.pongTimer = window.setInterval(this._checkPongHandler.bind(this), EverSocket.PONG_INTERVAL);
 
     this._setConnected();
   }
diff --git a/src/GlobalConfig.js b/src/GlobalConfig.js
index 49feaaf..3ad6d8c 100644
--- a/src/GlobalConfig.js
+++ b/src/GlobalConfig.js
@@ -253,9 +253,9 @@ GlobalConfig.port="80";
 GlobalConfig.MCUServerIP="114.215.195.70";
 GlobalConfig.docServer="";//当前的文档地址加载的服务器地址
 GlobalConfig.MCUServerPort=9003;
-GlobalConfig.maxVideoChannels=1;
-GlobalConfig.maxAudioChannels=1;
-GlobalConfig.maxMediaChannels=2;
+GlobalConfig.maxVideoChannels=0;
+GlobalConfig.maxAudioChannels=0;
+GlobalConfig.maxMediaChannels=0;
 GlobalConfig.isDebug=false;
 GlobalConfig.deBugData={};
 
diff --git a/src/Sass.js b/src/Sass.js
index abf75d3..42142fb 100644
--- a/src/Sass.js
+++ b/src/Sass.js
@@ -3,6 +3,8 @@ import Loger from 'Loger';
 import MessageTypes from 'MessageTypes';
 import GlobalConfig from 'GlobalConfig';
 import MD5 from "md5";
+import ApeConsts from 'apes/ApeConsts';
+
 // 日志对象
 const loger = Loger.getLoger('Sass');
 
@@ -105,7 +107,7 @@ class Sass extends Emiter {
     */
     //判断是否是老师
     let isTeacher=0;
-    if(confInfo.userRole=="host"){
+    if(confInfo.userRole==ApeConsts.host){
       isTeacher=1
     }
 
diff --git a/src/apes/ApeConsts.js b/src/apes/ApeConsts.js
index 325b946..76d6302 100644
--- a/src/apes/ApeConsts.js
+++ b/src/apes/ApeConsts.js
@@ -6,6 +6,7 @@ export default function ApeConsts(id) {
   }
 }
 
+
 //课堂状态
 ApeConsts.CLASS_STATUS_WAIT= 0;//课堂还未开始
 ApeConsts.CLASS_STATUS_STARTED= 1;//直播中
@@ -27,6 +28,19 @@ ApeConsts.CLASS_ACTION_CLOSE_ALL=1;//所有人关闭会议
 ApeConsts.CLASS_TYPE_INTERACT= 1; // 互动课堂,通过MS转发音视频,不能进行H5观看
 ApeConsts.CLASS_TYPE_LIVE= 2; // 直播课堂,通过CDN转发音视频,不能进行音视频互动
 
+
+/*
+flash
+public static const NR_GUEST:uint   = 0;       // 客人
+public static const NR_NORMAL:uint  = 1;       // 普通与会者
+public static const NR_ADMIN:uint   = 2;       // 管理员
+public static const NR_MASTER:uint  = 4;       // 主持人
+public static const NR_SLAVE:uint   = 8;       // 主讲人
+public static const NR_ASSISTANT:uint   = 16;      // 助教
+public static const NR_INVISIBLE:uint   = 32;      // 隐身用户
+*/
+
+
 //角色身份
 ApeConsts.NR_GUEST = 0; // 客人
 ApeConsts.NR_NORMAL = 1;// 普通与会者
@@ -36,7 +50,6 @@ ApeConsts.NR_SLAVE = 8; // 主讲人
 ApeConsts.NR_ASSISTANT = 16; // 助教
 ApeConsts.NR_INVISIBLE = 32; // 隐身用户
 
-
 //用户的身份,5种类型:
 ApeConsts.host="host";//(主持人/老师)
 ApeConsts.presenter="presenter";//(主讲人)
@@ -45,6 +58,37 @@ ApeConsts.normal="normal";//(普通角色/学生)
 ApeConsts.record="record";//(暂时没用.
 
 
+/*msType type*/
+ApeConsts.MS_TYPE_DEFAULT= 0;//默认MS,(废弃)
+ApeConsts.MS_TYPE_FMS= 1;//第三方FMS,目前一直用这个
+
+
+//用户状态
+ApeConsts.USER_HAND_UP     = 0x0020;       // 举手
+ApeConsts.USER_MIC_OPEN    = 0x0040;       // 麦克风开启
+ApeConsts.USER_CAMERA_OPEN = 0x0080;       // 视频开启
+
+
+//VIDEO MIC
+ApeConsts.OPEN_CAMERA= "open.camera";
+ApeConsts.CLOSE_CAMERA= "close.camera";
+ApeConsts.OPEN_MIC= "open.mic";
+ApeConsts.CLOSE_MIC= "close.mic";
+
+
+// VIDEO AUDIO CHANNEL使用状态
+ApeConsts.CHANNEL_STATUS_RELEASED = 0;///< 无人占用状态
+ApeConsts.CHANNEL_STATUS_OPENING = 1;///< 已经占用成功
+
+
+//FLASH中使用下面4个
+ApeConsts.CGS_RELEASED = 0;///< 无人占用状态
+ApeConsts.CGS_PENDING = 1;///< 占用成功,等待打开
+ApeConsts.CGS_OPENNED = 2;///< 打开成功
+ApeConsts.CGS_GRABBING = 3; ///< 准备占用中, 属于本地状态机需要用的状态,在多点数据库中不存在。
+
+
+
 ApeConsts.INVALIDATE_CHANNEL_ID = -1;
 ApeConsts.INVALIDATE_NODE_ID = -1;
 
@@ -55,12 +99,6 @@ ApeConsts.DOC_ACTION_SWITCH_PAGE=2;//文档翻页
 ApeConsts.DOC_ACTION_COMMAND=3;//文档操作:滚动、缩放
 
 
-// RCChannelGrabStatus
-ApeConsts.CGS_RELEASED = 0;///< 无人占用状态
-ApeConsts.CGS_PENDING = 1;///< 占用成功,等待打开
-ApeConsts.CGS_OPENNED = 2;///< 打开成功
-ApeConsts.CGS_GRABBING = 3; ///< 准备占用中, 属于本地状态机需要用的状态,在多点数据库中不存在。
-
 // defs for common session id
 ApeConsts.CONFERENCE_SESSION_ID = 11;
 ApeConsts.CHAT_SESSION_ID = 12;
diff --git a/src/apes/DocApe.js b/src/apes/DocApe.js
index b1e9fc0..a607d75 100644
--- a/src/apes/DocApe.js
+++ b/src/apes/DocApe.js
@@ -163,7 +163,7 @@ class DocApe extends Ape {
     }
 
     if(fullPath&&fullPath.indexOf("http://")<0){
-      fullPath="http;//"+fullPath;
+      fullPath="http://"+fullPath;
     }
     loger.warn('getDocFullPath ->',fullPath);
     return [fullPath];
diff --git a/src/apes/VideoApe.js b/src/apes/VideoApe.js
index 1a002b9..4c473c4 100644
--- a/src/apes/VideoApe.js
+++ b/src/apes/VideoApe.js
@@ -18,6 +18,8 @@ import ApeConsts from './ApeConsts';
 import pdu from 'pdus';
 import Loger from 'Loger';
 import MessageTypes from 'MessageTypes';
+import GlobalConfig from 'GlobalConfig';
+import EngineUtils from 'EngineUtils';
 
 let loger = Loger.getLoger('VideoChat');
 
@@ -41,9 +43,8 @@ class VideoChat extends Ape {
     this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
     this.registerObj(pdu.RCPDU_REG_REGISTER_TABLE, ApeConsts.VIDEO_OBJ_TABLE_ID, ApeConsts.VIDEO_OBJ_TABLE_NAME, ApeConsts.VIDEO_OBJ_TABLE_TAG, 0, new ArrayBuffer);
 
-
-    // ape listeners
-    this.on(pdu.RCPDU_VIDEO_SEND_DATA_REQUEST, this.videoIncomingHandler.bind(this));
+    // videoApe 监听视频控制消息,用户之间的消息传递
+    this.on(pdu.RCPDU_VIDEO_SEND_DATA_REQUEST, this.videoCommandHandler.bind(this));
   }
   /////////////发送数据操作//////////////////////////////////////////////////////
   //获取播流地址
@@ -54,24 +55,207 @@ class VideoChat extends Ape {
   //获取推流地址
   getPublishVideoPath(_param){
     loger.log('getPublishVideoPath');
+    //判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启
+
     return {"code":0,"data":"推流地址XXXXXXXXXXXXXXXXXXXXXXX"};
   }
 
   //推流
   publishVideo(_param){
-    loger.log('publishVideo');
+    loger.log('publishVideo -> maxVideoChannels',GlobalConfig.maxVideoChannels);
+    this.sendTableUpdateHandler();
+ /*   protected function startPushMessageFlash():void
+    {
+      if((!Config.enableCDNServer && !Config.isH5Moudle) ||
+          Config.customer == Config.customerTaobao ||
+          Config.msType == Config.MS_TYPE_FMS
+      )
+        return;
+
+      var obj:Object = new Object;
+      obj.confID = Config.confID;
+      obj.streamType = RCNetStream.PRT_CAM_SOUND_FLASH;
+      obj.uriPush = "rtmp://" + Config.liveServerAddr + ":" + Config.liveServerPort + "/3m/" + streamName;
+      _streamPublished.send("startPush", obj);
+      log.info("startPushMessageFlash,startPush streamType:" + obj.streamType);
+    }*/
+
+/*    var rtmpUrl:String = "";
+    if(Config.msType == Config.MS_TYPE_DEFAULT)
+    {
+      rtmpUrl = "rtmp://" + mediaServerAddr + ":" + mediaServerPort;
+    }
+    else if(Config.msType == Config.MS_TYPE_FMS)//fms下链接地址  pzm+ 2016.4.12
+    {
+      if(Config.clientType == Config.CT_RECORDPLAYER)
+      {
+        rtmpUrl = "rtmp://" + mediaServerAddr + ":" + mediaServerPort + "/vod";
+      }
+      else
+      {
+        rtmpUrl = "rtmp://" + mediaServerAddr + ":" + mediaServerPort + "/live/" + Config.confID;
+      }
+    }*/
   }
   //停止推流
   stopPublishVideo(_param){
-    loger.log('stopPublishVideo.');
+    loger.log('stopPublishVideo -> maxVideoChannels',GlobalConfig.maxVideoChannels);
+    this.sendTableUpdateHandler();
+  }
+
+  //
+  //aaaa(){
+  //  if (event.cmd == ApplicationFacade.OPEN_MIC)
+  //  {
+  //    if (audioDeviceOpenedUsers() >= Config.maxAudioChannels)
+  //    {
+  //      item.closeAudioDevice();
+  //      Alert.show(resourceManager.getString('meeting', 'CannotOpenDeviceAnyMore'),
+  //          resourceManager.getString('meeting', 'AlertWarning'), Alert.OK, item);
+  //      event.stopImmediatePropagation();
+  //    }
+  //    else
+  //    {
+  //      super.updateCamMicStatus(event.camOpened, event.micOpened, event.node_id);
+  //    }
+  //  }
+  //  else if (event.cmd == ApplicationFacade.OPEN_CAMERA)
+  //  {
+  //    if (videoDeviceOpenedUsers() >= Config.maxVideoChannels)
+  //    {
+  //      item.closeVideoDevice();
+  //      Alert.show(resourceManager.getString('meeting', 'CannotOpenDeviceAnyMore'),
+  //          resourceManager.getString('meeting', 'AlertWarning'), Alert.OK, item);
+  //      event.stopImmediatePropagation();
+  //    }
+  //    else
+  //    {
+  //      super.updateCamMicStatus(event.camOpened, event.micOpened, event.node_id);
+  //    }
+  //  }
+  //}
+
+  curAudioDeviceOpenedUsers()
+  {
+    //var openedUsers:int = 0;
+    //var index:int = 0;
+    //
+    //for(index = 0; index < _userArray.length; index++)
+    //{
+    //  var tmpNode:RCNodeInfoRecordPdu = RCNodeInfoRecordPdu(_userArray.getItemAt(index));
+    //  if(tmpNode.status & RCNodeStatus_E.NR_MIC_OPEN)
+    //  {
+    //    openedUsers++;
+    //  }
+    //}
+    //
+    //return openedUsers;
+  }
+
+  curVideoDeviceOpenedUsers()
+  {
+    //var openedUsers:int = 0;
+    //var index:int = 0;
+    //
+    //for(index = 0; index < _userArray.length; index++)
+    //{
+    //  var tmpNode:RCNodeInfoRecordPdu = RCNodeInfoRecordPdu(_userArray.getItemAt(index));
+    //  if(tmpNode.status & RCNodeStatus_E.NR_CAMERA_OPEN)
+    //  {
+    //    openedUsers++;
+    //  }
+    //}
+    //return openedUsers;
+  }
+
+  sendVideoCommandMsg(_messageInfo) {
+    if(this._classInfo===null||EngineUtils.isEmptyObject(this._classInfo)){
+      loger.log('不能发送Video消息.McuClient还未初始化数据!');
+      if(GlobalConfig.getCurrentStatus().code==0||GlobalConfig.getCurrentStatus().code==1){
+        this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_SEND_FAILED_NO_JOIN);
+        return;
+      }
+      return ;
+    }
+    // to, message
+    loger.log('发送Video消息.', _messageInfo);
+
+
+  /*    message RCVideoSendDataRequestPdu {
+      optional uint32 initiator = 1;
+      optional bool key_frame = 2;
+      optional uint32 sequence_id = 3;
+      optional uint32 slice_id = 4;
+      optional bytes user_data = 5;
+    }
+    */
+
+    let videoSendPdu = new pdu['RCVideoSendDataRequestPdu'];
+    videoSendPdu.type = pdu.RCPDU_VIDEO_SEND_DATA_REQUEST;
+    videoSendPdu.initiator = GlobalConfig.nodeId;//发起人
+    videoSendPdu.peer = parseInt(_messageInfo.to);//发送给谁,公聊的时候是0,私聊的时候是指定的用户id
+    videoSendPdu.userData = this._rCArrayBufferUtil.strToUint8Array("h5" + _messageInfo.message);//开头两个字会乱码
+    videoSendPdu.isPublic = true;
+    videoSendPdu.sliceId=_messageInfo.sliceId||0;
+
+    if (!videoSendPdu.isPublic && 0!=videoSendPdu.peer) {
+      //发送给制定的人
+      loger.log('发送私聊Video消息.');
+      this.send(videoSendPdu);
+    } else {
+      //发送给所有人
+      loger.log('发送公聊Video消息.');
+      this.sendChatUniform(videoSendPdu);
+    }
   }
 
+  sendTableUpdateHandler(){
+    loger.log("video===sendTableUpdateHandler ");
+   /* //验证坐标点集合数组是否合法
+    if(_docDataModel==null||_itemIdx==null){
+      this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
+      return null;
+    }*/
+    loger.log("video===sendTableUpdateHandler ");
+
+    let updateModelPdu=this.packPdu({},ApeConsts.VIDEO_OBJ_TABLE_ID+2);
+
+
+
+    let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
+    tableItemPdu.itemIdx=ApeConsts.VIDEO_OBJ_TABLE_ID+2;//直接用时间戳作为id
+    tableItemPdu.owner = 0;//收到flash的是这个值,不清楚先写固定
+    tableItemPdu.itemData =updateModelPdu.toArrayBuffer();
 
+    //insert
+    let tableInsertItemPdu = new pdu['RCRegistryTableUpdateItemPdu'];
+    //optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
+    //repeated RCRegistryTableItemPdu items = 2;
+    tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU;//
+    tableInsertItemPdu.items.push(tableItemPdu);
+
+    let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
+    updateObjPdu.objId = ApeConsts.VIDEO_OBJ_TABLE_ID;//
+    updateObjPdu.subType = tableInsertItemPdu.type;
+    updateObjPdu.userData = tableInsertItemPdu.toArrayBuffer();
+
+    //同步
+    let adapterItemPdu = new pdu['RCAdapterItemPdu'];
+    adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
+    adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
+
+    let adapterPdu = new pdu['RCAdapterPdu'];
+    adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
+    adapterPdu.item.push(adapterItemPdu);
+
+    loger.log("发送更新文档.itemIdx="+tableItemPdu.itemIdx);
+    this.sendUniform(adapterPdu,true);
+  }
   /////收到消息处理/////////////////////////////////////////////////////////////////////////////////
 
   // 视频消息处理
-  videoIncomingHandler(videoBuffer) {
-    let videoReceivePdu = pdu['VideoSendDataRequestPdu'].decode(videoBuffer);
+  videoCommandHandler(videoBuffer) {
+    let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(videoBuffer);
 
     let video_data = { };
     video_data._initiator = videoReceivePdu.initiator;
@@ -80,46 +264,45 @@ class VideoChat extends Ape {
     video_data._slice_id = videoReceivePdu.sliceId;
     video_data._data = videoReceivePdu.userData;
 
-
     // this._notify(RCApeEvent.E_VIDEO_DATA, videoReceivePdu.sessionId, videoReceivePdu.channelId, video_data);
-    loger.log('视频消息处理 videoIncomingHandler.', video_data);
-    this._emit(MessageTypes.VIDEO_RECEIVE, video_data);
-
+    loger.log('视频消息处理 videoCommandHandler.', video_data);
+    //this._emit(MessageTypes.VIDEO_RECEIVE, video_data);
   }
 
   tableUpdateHandler(owner, itemIdx, itemData) {
    // debugger;
-    let videoChannelInfo = pdu['RCVideoChannelInfoRecordPdu'].decode(itemData);
-    videoChannelInfo.owner = owner;
-    videoChannelInfo.channelId = itemIdx;
-    videoChannelInfo.status = owner === 0 ? ApeConsts.CGS_RELEASED : videoChannelInfo.status;
-
-    loger.log('视频消息处理 tableUpdateHandler.',videoChannelInfo);
-
+    let videoChannelInfo =this.unPackPdu(owner, itemIdx, itemData);
+    //videoChannelInfo.owner = owner;
+    //videoChannelInfo.channelId = itemIdx;
+    //videoChannelInfo.status = owner === 0 ? ApeConsts.CHANNEL_STATUS_RELEASED : videoChannelInfo.status;
+    //loger.log('视频消息处理 tableUpdateHandler.',videoChannelInfo);
     this.videoChannels[itemIdx] = videoChannelInfo;
-    switch (videoChannelInfo.status) {
-    case ApeConsts.CGS_RELEASED:
-    case ApeConsts.CGS_PENDING:
-    case ApeConsts.CGS_GRABBING:
-      // 只能关闭自己的流
-      if (this.activeChannelId === videoChannelInfo.channelId) {
-        this.activeChannelId = 0;
-        this.activeURL = '';
+
+/*    switch (videoChannelInfo.status) {
+      case ApeConsts.CHANNEL_STATUS_RELEASED:
+        // 只能关闭自己的流
+        if (this.activeChannelId === videoChannelInfo.channelId) {
+          this.activeChannelId = 0;
+          this.activeURL = '';
+          this.emitVideoChange();
+        }
+        break;
+      case ApeConsts.CHANNEL_STATUS_OPENING:
+        //_playUrl = "rtmfp://" + Config.mediaServerAddr + ":" + Config.mediaServerPort + "/message/" + _streamName;
+        //_cdnUrl =  "rtmp://" + Config.mediaCDNServerAddr + ":" + Config.mediaCDNServerPort + "/message/" + _streamName;
+        //this.activeChannelId = videoChannelInfo.channelId;
+        //// AMS/FMS
+        //if (this._classInfo.msType ==ApeConsts.MS_TYPE_FMS) {
+        //      this.activeURL = `http://dazhi.3mang.com/live/${this._classInfo.classId}/${this._classInfo.classId}_${videoChannelInfo.channelId}_flash_cam_mic_aac/playlist.m3u8`;
+        //}else {
+        //     this.activeURL = `http://hls.3mang.com/live/${this._classInfo.classId}_${videoChannelInfo.channelId}_flash_cam_mic_aac/playlist.m3u8`;
+        //}
+        // 任何人都可以打开流
         this.emitVideoChange();
-      }
-      break;
-    case ApeConsts.CGS_OPENNED:
-      this.activeChannelId = videoChannelInfo.channelId;
-      // AMS
-      if (this._classInfo.msType === '1') {
-            this.activeURL = `http://dazhi.3mang.com/live/${this._classInfo.classId}/${this._classInfo.classId}_${videoChannelInfo.channelId}_flash_cam_mic_aac/playlist.m3u8`;
-      }else {
-           this.activeURL = `http://hls.3mang.com/live/${this._classInfo.classId}_${videoChannelInfo.channelId}_flash_cam_mic_aac/playlist.m3u8`;
-      }
-      // 任何人都可以打开流
-      this.emitVideoChange();
-      break;
-    }
+        break;
+      default:
+            break;
+    }*/
   }
 
   emitVideoChange() {
@@ -129,6 +312,53 @@ class VideoChat extends Ape {
     });
   };
 
+
+  ///////数据的封包和解包/////////////////////////////////////////
+  packPdu(_param,_itemIdx){
+    loger.log("VIDEO===packPdu ");
+    //验证坐标点集合数组是否合法
+    if(_param==null||_itemIdx==null){
+      this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
+      return null;
+    }
+
+  /*  message RCVideoChannelInfoPdu {
+      optional uint32 status = 1;//开启的状态
+      optional uint32 channel_id = 2;//唯一的频道id
+      optional uint32 timestamp = 3;//更新的时间戳
+      optional uint32 from_node_id = 4;//发起者的id
+      optional uint32 to_node_id = 5;//接收者的id,(如果是0,所有人都接收)
+    }*/
+
+    //判断type类型,根据type设置不同的参数
+    let packPduModel =new pdu['RCVideoChannelInfoPdu'];
+    packPduModel.status=ApeConsts.CHANNEL_STATUS_OPENING;
+    packPduModel.channelId=_itemIdx;
+    packPduModel.timestamp=EngineUtils.creatTimestamp();
+    packPduModel.fromNodeId  =GlobalConfig.nodeId;
+    packPduModel.toNodeId  = 0;
+    console.log(packPduModel);
+    return packPduModel;
+  }
+
+  unPackPdu(owner, itemIdx,itemData){
+    loger.log("VIDEO==unPackPdu ");
+    if(owner==null||itemIdx==null||itemData==null){
+      this._emit(MessageTypes.MCU_ERROR,MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
+      return null;
+    }
+    try{
+
+      let videoChannelInfo = pdu['RCVideoChannelInfoPdu'].decode(itemData);
+      loger.log(videoChannelInfo);
+      return videoChannelInfo;
+    }catch (err){
+      loger.log("VIDEO收到数据 unPackPdu Pdu解析错误,itemIdx="+itemIdx+"  err:"+err.message);
+    }
+    return null;
+  }
+
+
 }
 
 export default VideoChat;
diff --git a/src/pdus/pro.js b/src/pdus/pro.js
index f8ac066..2a11adc 100644
--- a/src/pdus/pro.js
+++ b/src/pdus/pro.js
@@ -735,11 +735,12 @@ message RCAudioSendDataRequestPdu {
 }
 
 message RCVideoSendDataRequestPdu {
-    optional uint32 initiator = 1;
-    required bool key_frame = 2;
-    required uint32 sequence_id = 3;
-    required uint32 slice_id = 4;
-    required bytes user_data = 5;
+    required uint32 initiator = 1;
+    optional bool key_frame = 2;
+    optional uint32 sequence_id = 3;
+    optional uint32 slice_id = 4;
+    optional bytes user_data = 5;
+    optional uint32 action  = 6;
 }
 
 message RCAudioChannelInfoRecordPdu {
@@ -750,6 +751,14 @@ message RCAudioChannelInfoRecordPdu {
     required uint32 codec = 5;
 }
 
+message RCVideoChannelInfoPdu {
+    optional uint32 status = 1;//开启的状态
+    optional uint32 channel_id = 2;//唯一的频道id
+    optional uint32 timestamp = 3;//更新的时间戳
+    optional uint32 from_node_id = 4;//发起者的id
+    optional uint32 to_node_id = 5;//接收者的id,(如果是0,所有人都接收)
+}
+
 message RCVideoChannelInfoRecordPdu {
     optional uint32 status = 1;
     optional uint32 device_id = 2;