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); }
/// <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); }
/// <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); }
private bool TryGetReplayStatusByScreenHandle(IntPtr screenHandle, out RelayStatusModel replayHandle) { replayHandle = null; if (_replayingStatusModelDict.ContainsKey(screenHandle)) { replayHandle = _replayingStatusModelDict[screenHandle]; return(true); } return(false); }
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); }
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); } } } }
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); }