diff --git a/src/EngineEntrance.js b/src/EngineEntrance.js
index 337154c..2ec445e 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.12.6.20170925";
+    GlobalConfig.sdkVersion = "v2.12.8.20170926";
     loger.warn("sdkVersion:" + GlobalConfig.sdkVersion);
 
     //设置
diff --git a/src/apes/VideoApe.js b/src/apes/VideoApe.js
index eb6bd6e..6bfb464 100644
--- a/src/apes/VideoApe.js
+++ b/src/apes/VideoApe.js
@@ -389,7 +389,6 @@ class VideoApe extends Ape {
     }
     // to, message
     loger.log('视频模块广播消息.', _param);
-
     //如果是控制开启摄像头推流,需要判断是否还有空闲频道
     if (_param.actionType != null && _param.actionType == ApeConsts.MEDIA_ACTION_OPEN_CAMERA) {
       //判断当前开启的视频数量是否已经是最大值,如果已经是最大值,不能再开启
@@ -466,9 +465,8 @@ class VideoApe extends Ape {
   }
 
   /////收到消息处理//////////////////////////////////////////////////
-
   // 视频消息处理,内部处理,不需要告诉应用层
-  receiveVideoCommandHandler(_data) {
+  receiveVideoCommandHandler(_data,seek) {
     let videoReceivePdu = pdu['RCVideoSendDataRequestPdu'].decode(_data);
     if (videoReceivePdu == null) {
       loger.warn("视频控制消息处理,收到的消息为null,不做处理");
@@ -484,13 +482,56 @@ class VideoApe extends Ape {
       dataObj = videoReceivePdu.data;
     }
     videoReceivePdu.data = dataObj;
-    //判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
-    if (videoReceivePdu.toNodeId != 0 && videoReceivePdu.toNodeId != GlobalConfig.nodeId) {
-      loger.log('视频消息不处理 toNodeId=', videoReceivePdu.toNodeId, "my nodeId=", GlobalConfig.nodeId);
-    } else {
-      loger.log('视频控制消息处理 .', videoReceivePdu);
-      this._emit(MessageTypes.VIDEO_BROADCAST, videoReceivePdu);
+    if(GlobalConfig.isRecordPlayBack){
+      //录制回放的处理
+      if (videoReceivePdu.toNodeId!=0){
+        //只处理发送给所有人的消息,发给指定人的消息不处理
+        return;
+      }
+      let data=videoReceivePdu.data;
+      if(!data) return;
+     /* "data": {
+        "appId": "eb253cc7b40c4a8b82f0a5b6f93c2ce0",
+          "channel": "markettest_1880101695",
+          "channelKey": "",
+          "uid": 886346081,
+          "status": 1,
+          "userId": "user_338621",
+          "userName": "user_338621",
+          "userRole": "normal",
+          "timestamp": 1505886364100,
+          "recordTimestamp": 27
+      }*/
+      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);
+          }
+          break;
+        default:
+          break
+      }
+
+    }else {
+      //判断接收者的id,如果不是0,并且也不是自己的nodeId,那么消息不做处理
+      if (videoReceivePdu.toNodeId != 0 && videoReceivePdu.toNodeId != GlobalConfig.nodeId) {
+        loger.log('视频消息不处理 toNodeId=', videoReceivePdu.toNodeId, "my nodeId=", GlobalConfig.nodeId);
+      } else {
+        loger.log('视频控制消息处理 .', videoReceivePdu);
+        this._emit(MessageTypes.VIDEO_BROADCAST, videoReceivePdu);
+      }
     }
+
   }
   //切换了MS,重新更新一下当前正在播放的流地址
   changeMediaMs(){
@@ -609,6 +650,45 @@ class VideoApe extends Ape {
 
   }
 
+  /*
+  * 组织视频数据发送给客户端
+  * */
+  packVideoInfoAndSendToClient(_param,seek){
+    let mediaChannelInfo = {};
+    mediaChannelInfo.mediaId = _param.channelId;
+    mediaChannelInfo.fromNodeId = _param.fromNodeId;
+    mediaChannelInfo.userName = _param.userName || "";
+    mediaChannelInfo.userRole = _param.userRole || ApeConsts.normal;
+    mediaChannelInfo.mediaType = _param.mediaType || ApeConsts.MEDIA_TYPE_DEFAULT;
+    mediaChannelInfo.screenWidth = _param.screenWidth || GlobalConfig.screenWidth;
+    mediaChannelInfo.screenHeight = _param.screenHeight || GlobalConfig.screenHeight;
+    mediaChannelInfo.deviceType = _param.deviceType || 0;
+    mediaChannelInfo.optionJsonData = _param.optionJsonData || "";
+    mediaChannelInfo.m3u8Url = "";
+    mediaChannelInfo.rtmpUrl = "";
+    mediaChannelInfo.replay = "";
+    mediaChannelInfo.seek = seek || 0;//这个是录制回放时使用的seek
+    //消息不是自己同步的,需要处理
+    if (_param.status == ApeConsts.CHANNEL_STATUS_OPENING) {
+      let m3u8Stream = this.mediaModule.getMediaPlayPath({"type": "m3u8", "streamId": _param.streamId});
+      let rtmpStream = this.mediaModule.getMediaPlayPath({"type": "rtmp", "streamId": _param.streamId});
+      let replay = this.mediaModule.getMediaRecordPlaybackPath({
+        "type": "m3u8",
+        "streamId": _param.streamId
+      });
+      if (m3u8Stream.code == 0) {
+        mediaChannelInfo.m3u8Url = m3u8Stream.playUrl;
+      }
+      if (rtmpStream.code == 0) {
+        mediaChannelInfo.rtmpUrl = rtmpStream.playUrl;
+      }
+      if (replay.code == 0) {
+        mediaChannelInfo.replay = replay.playUrl;
+      }
+    }
+    return mediaChannelInfo;
+  }
+
   //更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次
   updaterRecordApeStatus(_param) {
     loger.warn("录制状态发送改变->更新当前的状态->", this.mediaModule.mediaChannels);