示例#1
0
        public long StartReplay(IReplayModel iReplayModel)
        {
            ReplayModel replayModel = iReplayModel as ReplayModel;

            if (!ValidateReplayParam(replayModel))
            {
                return(-1);
            }

            if (!VideoRecordCache.HasTimeSpecificRecordFile(replayModel.ReplayCamera.ChannelID, replayModel.ReplayTimeRange.BeginTime))
            {
                return(-1);
            }

            long replayHandle = ReplayAdapter.StartReplay(replayModel);

            if (replayHandle < 0)
            {
                return(-1);
            }

            RelayStatusModel playStatus = new RelayStatusModel
            {
                Camera = replayModel.ReplayCamera,
                PlayingScreenHandle = replayModel.ScreenHandle,
                StartPlayDateTime   = replayModel.ReplayTimeRange.BeginTime,
                PlayingHandle       = replayHandle,
                PlayingStatus       = PlayStatus.Play,
                PlayingSpeed        = 1,
            };

            _replayingStatusModelDict.TryAdd(replayModel.ScreenHandle, playStatus);

            return(replayHandle);
        }
示例#2
0
        /// <summary>
        /// 查询单个录像播放的进度
        /// </summary>
        /// <param name="replayStatus"></param>
        private void QueryReplayStatus(RelayStatusModel replayStatus)
        {
            if (replayStatus == null)
            {
                return;
            }

            //非播放状态下的录像回放无需进行进度查询
            if (!IsNeedQueryReplayPosition(replayStatus))
            {
                return;
            }

            //查询失败或得到错误的结果时不做任何处理
            DateTime replayDateTime = ReplayAdapter.GetReplayPositon(replayStatus.PlayingHandle);

            if (replayDateTime == DateTime.MinValue)
            {
                return;
            }

            //如果播放时间进度已经超过录像文件的最大时间,则通知消息订阅者停止播放
            if (VideoRecordCache.IsTimeBeyondTimeRangeOfVideoFiles(replayStatus.Camera.ChannelID, replayDateTime))
            {
                ReplayPositionChangedEvent?.Invoke(replayStatus.PlayingScreenHandle, DateTime.MaxValue);
                return;
            }

            ReplayPositionChangedEvent?.Invoke(replayStatus.PlayingScreenHandle, replayDateTime);
        }
示例#3
0
 /// <summary>
 /// 判断是否需要进行录像播放进度查询
 /// </summary>
 /// <param name="replayStatus"></param>
 /// <returns></returns>
 private bool IsNeedQueryReplayPosition(RelayStatusModel replayStatus)
 {
     //只有处于播放状态(普通播放,快放,慢放,快退,慢退等)中的回放才需要查询进度
     return(replayStatus.PlayingStatus == PlayStatus.Play ||
            replayStatus.PlayingStatus == PlayStatus.FastForward ||
            replayStatus.PlayingStatus == PlayStatus.SlowForward ||
            replayStatus.PlayingStatus == PlayStatus.FastBackward);
 }
示例#4
0
        private bool TryGetReplayStatusByScreenHandle(IntPtr screenHandle, out RelayStatusModel replayHandle)
        {
            replayHandle = null;

            if (_replayingStatusModelDict.ContainsKey(screenHandle))
            {
                replayHandle = _replayingStatusModelDict[screenHandle];
                return(true);
            }

            return(false);
        }
示例#5
0
        private bool DirectlySetReplayPosition(RelayStatusModel replayStatus, DateTime replayTime)
        {
            if (replayStatus.PlayingStatus == PlayStatus.Pause)
            {
                ResumeReplay(replayStatus.PlayingScreenHandle);
                Thread.Sleep(200);
            }

            bool result = ReplayAdapter.SetReplayPositon(replayStatus.PlayingHandle, replayTime);

            if (result)
            {
                replayStatus.PlayingStatus = PlayStatus.Play;
            }

            return(true);
        }
示例#6
0
 private void ContinuousQueryReplayPosition()
 {
     while (_isQueryReplayPosition)
     {
         foreach (KeyValuePair <IntPtr, RelayStatusModel> playStatusKVPair in _replayingStatusModelDict)
         {
             try
             {
                 RelayStatusModel replayStatus = playStatusKVPair.Value;
                 QueryReplayStatus(replayStatus);
             }
             catch (Exception ex)
             {
                 LogHelper.Default.DebugFormatted("录像进度查询失败,播放句柄:{0}, 错误原因:{1}", playStatusKVPair.Value.PlayingHandle, ex.ToString());
             }
             finally
             {
                 Thread.Sleep(500);
             }
         }
     }
 }
示例#7
0
        private bool SetReplaySpeed(RelayStatusModel replayStatus, double replaySpeed)
        {
            if (replayStatus.PlayingStatus != PlayStatus.Play)
            {
                LogHelper.Default.Debug("设置回放速度失败,当前回放不处于播放状态中,无法设置播放速度");
                return(false);
            }

            if (!ValidateSettingReplaySpeed(replaySpeed))
            {
                return(false);
            }

            bool result = ReplayAdapter.SetReplaySpeed(replayStatus.PlayingHandle, replaySpeed);

            if (result)
            {
                replayStatus.PlayingSpeed = replaySpeed;
            }

            return(result);
        }