public OResult <Boolean> Stop()
        {
            if (_playbackHandle < 0)
            {
                return(new OResult <Boolean>(true));
            }

            if (_playerStatus == PlayerStatus.Stop)
            {
                return(new OResult <Boolean>(true));
            }

            try
            {
                var succ = CHCNetSDK.NET_DVR_StopPlayBack(_playbackHandle);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"停止播放失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                _playerStatus = PlayerStatus.Stop;
                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 2
0
        public OResult <Boolean> Logout()
        {
            if (_userId < 0)
            {
                return(new OResult <Boolean>(true));
            }

            try
            {
                StopPreviewService();
                StopPlaybackService();

                var succ = CHCNetSDK.NET_DVR_Logout(_userId);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"注销失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                _userId = -1;
                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
        public OResult <Boolean> Play(DateTime startTime, DateTime endTime)
        {
            var stopResult = Stop();

            if (!stopResult.Success)
            {
                return(new OResult <Boolean>(false, stopResult.ErrorCode, stopResult.Message));
            }

            try
            {
                var playParameter = CreateVideoPlayParameter(startTime, endTime);
                _playbackHandle = CHCNetSDK.NET_DVR_PlayBackByTime_V40(_userId, ref playParameter);
                if (_playbackHandle < 0)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"回放播放失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                UInt32 iOutValue = 0;
                var    succ      = CHCNetSDK.NET_DVR_PlayBackControl_V40(_playbackHandle, CHCNetSDK.NET_DVR_PLAYSTART, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"回放播放失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                _playerStatus = PlayerStatus.Play;
                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 4
0
        public OResult <Boolean> Close()
        {
            if (_userId < 0)
            {
                return(new OResult <Boolean>(false, "用户未登录"));
            }

            try
            {
                this.StopRecord();
                var succ = CHCNetSDK.NET_DVR_StopRealPlay(_realHandle);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"停止预览失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                _inRealPlay = false;

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 5
0
        public OResult <Boolean> StopRecord()
        {
            if (_userId < 0)
            {
                return(new OResult <Boolean>(false, "用户未登录"));
            }

            if (!_inRecord)
            {
                return(new OResult <Boolean>(true));
            }

            try
            {
                var succ = CHCNetSDK.NET_DVR_StopSaveRealData(_realHandle);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"停止录像失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                _inRecord = false;
                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
        public OResult <DateTime> GetPlayBackOsdTime()
        {
            try
            {
                if (_playbackHandle < 0)
                {
                    return(new OResult <DateTime>(DateTime.MinValue, "未找到的视频"));
                }

                var lpOsdTime = new CHCNetSDK.NET_DVR_TIME();
                var succ      = CHCNetSDK.NET_DVR_GetPlayBackOsdTime(_playbackHandle, ref lpOsdTime);

                if (!succ)
                {
                    return(new OResult <DateTime>(DateTime.MinValue, HkvsErrorCode.GetLastErrorCode(), $"获取OSD时间失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                var dt = new DateTime((Int32)lpOsdTime.dwYear, (Int32)lpOsdTime.dwMonth, (Int32)lpOsdTime.dwDay, (Int32)lpOsdTime.dwHour, (Int32)lpOsdTime.dwMinute, (Int32)lpOsdTime.dwSecond);
                return(new OResult <DateTime>(dt));
            }
            catch (Exception ex)
            {
                return(new OResult <DateTime>(DateTime.MinValue, ex));
            }
        }
        public OResult <Boolean> Play(String fileName)
        {
            var stopResult = Stop();

            if (!stopResult.Success)
            {
                return(new OResult <Boolean>(false, stopResult.ErrorCode, stopResult.Message));
            }

            try
            {
                _playbackHandle = CHCNetSDK.NET_DVR_PlayBackByName(_userId, fileName, _hPlayWnd);
                if (_playbackHandle < 0)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"回放播放失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                UInt32 iOutValue = 0;
                var    succ      = CHCNetSDK.NET_DVR_PlayBackControl_V40(_playbackHandle, CHCNetSDK.NET_DVR_PLAYSTART, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"回放播放失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                _playerStatus = PlayerStatus.Play;
                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 8
0
        public OResult <String> StartRecord(String fileName)
        {
            if (_userId < 0)
            {
                return(new OResult <String>(null, "用户未登录"));
            }

            if (_inRecord)
            {
                return(new OResult <String>(null, "正在录制"));
            }

            try
            {
                CHCNetSDK.NET_DVR_MakeKeyFrame(_userId, _channelNo);
                var succ = CHCNetSDK.NET_DVR_SaveRealData(_realHandle, fileName);
                if (!succ)
                {
                    return(new OResult <String>(null, HkvsErrorCode.GetLastErrorCode(), $"录制失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                _inRecord = true;
                return(new OResult <String>(fileName));//TODO:返回文件路径
            }
            catch (Exception ex)
            {
                return(new OResult <String>(null, ex));
            }
        }
Exemplo n.º 9
0
        public OResult <Boolean> StopPTZControl(PTZCommand cmd, Int32 speed = 4)
        {
            try
            {
                var succ = CHCNetSDK.NET_DVR_PTZControlWithSpeed_Other(_userId, _loginRequest.ChannelNo, (UInt32)cmd, 1, (UInt32)speed);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"停止摄像头移动失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 10
0
        public OResult <Boolean> GetDeviceOnlineStatus()
        {
            try
            {
                var succ = CHCNetSDK.NET_DVR_RemoteControl(_userId, 20005, IntPtr.Zero, 0);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, $"获取设备在线状态失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 11
0
        public OResult <Boolean> UpdateRecordIndex()
        {
            try
            {
                var succ = CHCNetSDK.NET_DVR_UpdateRecordIndex(_userId, _loginRequest.ChannelNo);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"即时刷新录像索引失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 12
0
        public OResult <Boolean> StopRecord()
        {
            try
            {
                var succ = CHCNetSDK.NET_DVR_StopDVRRecord(_userId, _loginRequest.ChannelNo);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"停止录像失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 13
0
        public OResult <Boolean> Control(Int32 cmd)
        {
            try
            {
                UInt32 iOutValue = 0;
                var    succ      = CHCNetSDK.NET_DVR_PlayBackControl_V40(_playbackHandle, (UInt32)cmd, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"操作失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 14
0
        public OResult <Byte[]> CapturePicture()
        {
            if (_userId < 0)
            {
                return(new OResult <Byte[]>(null, "用户未登录"));
            }

            try
            {
                //图片保存路径和文件名
                //var picFileName = $"User_{_userId}_{DateTimeHelper.GetTimestamp()}.jpg";

                CHCNetSDK.NET_DVR_JPEGPARA lpJpegPara = new CHCNetSDK.NET_DVR_JPEGPARA();
                lpJpegPara.wPicQuality = 0;    //图像质量 Image quality
                lpJpegPara.wPicSize    = 0xff; //抓图分辨率 Picture size: 2- 4CIF,0xff- Auto(使用当前码流分辨率),抓图分辨率需要设备支持,更多取值请参考SDK文档

                //var captureSucc = CHCNetSDK.NET_DVR_CaptureJPEGPicture(_userId, _loginRequest.ChannelNo, ref lpJpegPara, picFileName);
                //if (!captureSucc)
                //{
                //    return new OResult<Byte[]>(null, $"抓图失败:{GetLastErrorCode()}");
                //}

                UInt32 iBuffSize       = 10 * 1024 * 1024; //缓冲区大小需要不小于一张图片数据的大小 The buffer size should not be less than the picture size
                Byte[] byJpegPicBuffer = new Byte[iBuffSize];
                UInt32 dwSizeReturned  = 0;

                var captureSucc = CHCNetSDK.NET_DVR_CaptureJPEGPicture_NEW(_userId, _loginRequest.ChannelNo, ref lpJpegPara, byJpegPicBuffer, iBuffSize, ref dwSizeReturned);

                if (!captureSucc)
                {
                    return(new OResult <Byte[]>(null, HkvsErrorCode.GetLastErrorCode(), $"抓图失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                var data = new Byte[dwSizeReturned];

                Buffer.BlockCopy(byJpegPicBuffer, 0, data, 0, data.Length);

                return(new OResult <Byte[]>(data));
            }
            catch (Exception ex)
            {
                return(new OResult <Byte[]>(null, ex));
            }
        }
Exemplo n.º 15
0
        public OResult <Boolean> Login(CameraLoginRequest request)
        {
            try
            {
                var struLogInfo = new CHCNetSDK.NET_DVR_USER_LOGIN_INFO();

                //设备IP地址或者域名
                Byte[] byIP = Encoding.Default.GetBytes(request.IP);
                struLogInfo.sDeviceAddress = new Byte[129];
                byIP.CopyTo(struLogInfo.sDeviceAddress, 0);

                //设备服务端口号
                struLogInfo.wPort = (UInt16)request.LoginPort;

                //设备用户名
                Byte[] byUserName = Encoding.Default.GetBytes(request.UserName);
                struLogInfo.sUserName = new Byte[64];
                byUserName.CopyTo(struLogInfo.sUserName, 0);

                //设备密码
                Byte[] byPassword = Encoding.Default.GetBytes(request.Password);
                struLogInfo.sPassword = new Byte[64];
                byPassword.CopyTo(struLogInfo.sPassword, 0);

                struLogInfo.cbLoginResult = new CHCNetSDK.LOGINRESULTCALLBACK(LoginCallBack);
                struLogInfo.bUseAsynLogin = false;

                _deviceInfo = new CHCNetSDK.NET_DVR_DEVICEINFO_V40();
                _userId     = CHCNetSDK.NET_DVR_Login_V40(ref struLogInfo, ref _deviceInfo);

                if (_userId < 0)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"登录失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                _loginRequest = request;
                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 16
0
        public OResult <Boolean> Open()
        {
            if (_userId < 0)
            {
                return(new OResult <Boolean>(false, "用户未登录"));
            }

            if (_inRealPlay)
            {
                return(new OResult <Boolean>(true));
            }

            try
            {
                var lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
                lpPreviewInfo.hPlayWnd        = _hPlayWnd;           //预览窗口
                lpPreviewInfo.lChannel        = _channelNo;          //预览的设备通道
                lpPreviewInfo.dwStreamType    = (UInt32)_streamType; //码流类型:0-主码流,1-子码流,2-码流3,3-码流4,以此类推
                lpPreviewInfo.dwLinkMode      = 0;                   //连接方式:0-TCP方式,1-UDP方式,2-多播方式,3-RTP方式,4-RTP/RTSP,5-RSTP/HTTP
                lpPreviewInfo.bBlocked        = true;                //0-非阻塞取流,1-阻塞取流
                lpPreviewInfo.dwDisplayBufNum = 15;                  //播放库播放缓冲区最大缓冲帧数
                lpPreviewInfo.byProtoType     = 0;
                lpPreviewInfo.byPreviewMode   = 0;


                _realHandle = CHCNetSDK.NET_DVR_RealPlay_V40(_userId, ref lpPreviewInfo, null, IntPtr.Zero);
                if (_realHandle < 0)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"开始预览失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                _inRealPlay = true;

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 17
0
        private OResult <Boolean> PTZPreset(Int32 command, Int32 presetIndex)
        {
            try
            {
                if (presetIndex < 1 || presetIndex > 255)
                {
                    return(new OResult <Boolean>(false, "预置点超出范围[1-255]"));
                }

                var succ = CHCNetSDK.NET_DVR_PTZPreset_Other(_userId, _loginRequest.ChannelNo, (UInt32)command, (UInt32)presetIndex);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"操作预置点失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 18
0
        public OResult <Boolean> Reboot()
        {
            try
            {
                if (_userId < 0)
                {
                    return(new OResult <Boolean>(false, "用户未登录"));
                }

                var succ = CHCNetSDK.NET_DVR_RebootDVR(_userId);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"重启摄像头失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 19
0
        public OResult <Boolean> CapturePicture(String savePath)
        {
            if (_userId < 0)
            {
                return(new OResult <Boolean>(false, "用户未登录"));
            }

            try
            {
                var captureSucc = CHCNetSDK.NET_DVR_PlayBackCaptureFile(_playbackHandle, savePath);

                if (!captureSucc)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"抓图失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 20
0
        public OResult <Boolean> Fast()
        {
            if (_playerStatus == PlayerStatus.Stop)
            {
                return(new OResult <Boolean>(false, "播放已停止"));
            }

            try
            {
                UInt32 iOutValue = 0;
                var    succ      = CHCNetSDK.NET_DVR_PlayBackControl_V40(_playbackHandle, CHCNetSDK.NET_DVR_PLAYFAST, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"快进失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 21
0
        public OResult <Boolean> Resume()
        {
            if (_playerStatus != PlayerStatus.Pause)
            {
                return(new OResult <Boolean>(true));
            }

            try
            {
                UInt32 iOutValue = 0;
                var    succ      = CHCNetSDK.NET_DVR_PlayBackControl_V40(_playbackHandle, CHCNetSDK.NET_DVR_PLAYNORMAL, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"暂停播放失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                _playerStatus = PlayerStatus.Play;
                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 22
0
        private OResult <IEnumerable <CameraPlaybackRecordTimeRange> > GetDayRecordTimeRanges(Int32 channelNo, DateTime date)
        {
            try
            {
                CHCNetSDK.NET_DVR_FILECOND_V40 struFileCond_V40 = new CHCNetSDK.NET_DVR_FILECOND_V40();

                struFileCond_V40.lChannel   = channelNo; //通道号
                struFileCond_V40.dwFileType = 0xff;      //0xff-全部,0-定时录像,1-移动侦测,2-报警触发,...
                struFileCond_V40.dwIsLocked = 0xff;      //0-未锁定文件,1-锁定文件,0xff表示所有文件(包括锁定和未锁定)

                //设置录像查找的开始时间
                struFileCond_V40.struStartTime.dwYear   = (UInt32)date.Year;
                struFileCond_V40.struStartTime.dwMonth  = (UInt32)date.Month;
                struFileCond_V40.struStartTime.dwDay    = (UInt32)date.Day;
                struFileCond_V40.struStartTime.dwHour   = 0;
                struFileCond_V40.struStartTime.dwMinute = 0;
                struFileCond_V40.struStartTime.dwSecond = 0;

                //设置录像查找的结束时间
                struFileCond_V40.struStopTime.dwYear   = (UInt32)date.Year;
                struFileCond_V40.struStopTime.dwMonth  = (UInt32)date.Month;
                struFileCond_V40.struStopTime.dwDay    = (UInt32)date.Day;
                struFileCond_V40.struStopTime.dwHour   = 23;
                struFileCond_V40.struStopTime.dwMinute = 59;
                struFileCond_V40.struStopTime.dwSecond = 59;

                //开始录像文件查找 Start to search video files
                var m_lFindHandle = CHCNetSDK.NET_DVR_FindFile_V40(_userId, ref struFileCond_V40);

                if (m_lFindHandle < 0)
                {
                    return(new OResult <IEnumerable <CameraPlaybackRecordTimeRange> >(null, HkvsErrorCode.GetLastErrorCode(), $"查找录像文件失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }
                else
                {
                    CHCNetSDK.NET_DVR_FINDDATA_V30 struFileData = new CHCNetSDK.NET_DVR_FINDDATA_V30();

                    var ranges = new List <CameraPlaybackRecordTimeRange>();

                    while (true)
                    {
                        //逐个获取查找到的文件信息
                        var result = CHCNetSDK.NET_DVR_FindNextFile_V30(m_lFindHandle, ref struFileData);
                        if (result == CHCNetSDK.NET_DVR_ISFINDING)  //正在查找请等待
                        {
                            continue;
                        }
                        else if (result == CHCNetSDK.NET_DVR_FILE_SUCCESS) //获取文件信息成功
                        {
                            var startTime = new DateTime((Int32)struFileData.struStartTime.dwYear, (Int32)struFileData.struStartTime.dwMonth, (Int32)struFileData.struStartTime.dwDay, (Int32)struFileData.struStartTime.dwHour, (Int32)struFileData.struStartTime.dwMinute, (Int32)struFileData.struStartTime.dwSecond);
                            var endTime   = new DateTime((Int32)struFileData.struStopTime.dwYear, (Int32)struFileData.struStopTime.dwMonth, (Int32)struFileData.struStopTime.dwDay, (Int32)struFileData.struStopTime.dwHour, (Int32)struFileData.struStopTime.dwMinute, (Int32)struFileData.struStopTime.dwSecond);
                            ranges.Add(new CameraPlaybackRecordTimeRange()
                            {
                                StartTime = startTime,
                                EndTime   = endTime
                            });
                        }
                        else if (result == CHCNetSDK.NET_DVR_FILE_NOFIND || result == CHCNetSDK.NET_DVR_NOMOREFILE)
                        {
                            break; //未查找到文件或者查找结束,退出
                        }
                        else
                        {
                            break;
                        }
                    }

                    MergetRanges(ref ranges);

                    return(new OResult <IEnumerable <CameraPlaybackRecordTimeRange> >(ranges.Any() ? ranges : null));
                }
            }
            catch (Exception ex)
            {
                return(new OResult <IEnumerable <CameraPlaybackRecordTimeRange> >(null, ex));
            }
        }
Exemplo n.º 23
0
        public async Task <OResult <Boolean> > BackupByTimeAsync(DateTime from, DateTime to, CancellationToken cancellationToken = default)
        {
            try
            {
                var lpDiskList = new CHCNetSDK.NET_DVR_DISKABILITY_LIST();
                lpDiskList.dwSize = (UInt32)Marshal.SizeOf(lpDiskList);

                var succ = CHCNetSDK.NET_DVR_GetDiskList(_userId, ref lpDiskList);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"获取磁盘列表失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                if (!lpDiskList.struDescNode.Any())
                {
                    return(new OResult <Boolean>(false, "可用磁盘列表为空"));
                }

                var availableDesc = lpDiskList.struDescNode.Where(x => x.dwFreeSpace > 0).Select(x => x.byDescribe).FirstOrDefault();
                if (availableDesc == null || !availableDesc.Any())
                {
                    return(new OResult <Boolean>(false, "磁盘空间不足"));
                }

                var lpBackupByTime = new CHCNetSDK.NET_DVR_BACKUP_TIME_PARAM();

                lpBackupByTime.lChannel = _loginRequest.ChannelNo;

                lpBackupByTime.struStartTime.dwYear   = (UInt32)from.Year;
                lpBackupByTime.struStartTime.dwMonth  = (UInt32)from.Month;
                lpBackupByTime.struStartTime.dwDay    = (UInt32)from.Day;
                lpBackupByTime.struStartTime.dwHour   = (UInt32)from.Hour;
                lpBackupByTime.struStartTime.dwMinute = (UInt32)from.Minute;
                lpBackupByTime.struStartTime.dwSecond = (UInt32)from.Second;

                lpBackupByTime.struStopTime.dwYear   = (UInt32)to.Year;
                lpBackupByTime.struStopTime.dwMonth  = (UInt32)to.Month;
                lpBackupByTime.struStopTime.dwDay    = (UInt32)to.Day;
                lpBackupByTime.struStopTime.dwHour   = (UInt32)to.Hour;
                lpBackupByTime.struStopTime.dwMinute = (UInt32)to.Minute;
                lpBackupByTime.struStopTime.dwSecond = (UInt32)to.Second;

                lpBackupByTime.byDiskDes    = availableDesc; //备份磁盘的描述
                lpBackupByTime.byWithPlayer = 0;             //是否备份播放器,0-不备份,1-备份
                lpBackupByTime.byContinue   = 0;             //是否继续备份,0-不继续,1-继续
                lpBackupByTime.byDrawFrame  = 0;             //0-不抽帧,1-抽帧

                var backUpHandle = CHCNetSDK.NET_DVR_BackupByTime(_userId, ref lpBackupByTime);
                if (backUpHandle < 0)
                {
                    return(new OResult <Boolean>(false, $"按时间备份录像失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                var tcs = new TaskCompletionSource <Boolean>();

                _ = Task.Run(async() =>
                {
                    UInt32 iPos   = 0;
                    IntPtr pState = Marshal.AllocHGlobal((Int32)iPos);
                    Marshal.StructureToPtr(iPos, pState, false);

                    try
                    {
                        while (!cancellationToken.IsCancellationRequested)
                        {
                            var succ = CHCNetSDK.NET_DVR_GetBackupProgress(backUpHandle, pState);
                            if (succ)
                            {
                                iPos = (UInt32)Marshal.PtrToStructure(pState, typeof(UInt32));

                                if (iPos == 100)
                                {
                                    CHCNetSDK.NET_DVR_StopBackup(backUpHandle);
                                    tcs.SetResult(true);
                                    return;
                                }
                                else if (iPos == 101 || iPos >= 400)
                                {
                                    CHCNetSDK.NET_DVR_StopBackup(backUpHandle);
                                    return;
                                }
                            }

                            await Task.Delay(1000);
                        }
                    }
                    finally
                    {
                        Marshal.FreeHGlobal(pState);
                    }
                }, CancellationToken.None);

                succ = await tcs.Task;

                if (!succ)
                {
                    return(new OResult <Boolean>(false, "按时间下载失败"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }
Exemplo n.º 24
0
        public async Task <OResult <Boolean> > DownloadByTimeAsync(DownloadFileByTimeRequest request, CancellationToken cancellationToken = default)
        {
            try
            {
                var now = DateTime.Now;

                if (request.From > now)
                {
                    request.From = now;
                }

                if (request.To > now)
                {
                    request.To = now;
                }

                if (request.From > request.To)
                {
                    request.To = DateTime.Now;
                }

                CHCNetSDK.NET_DVR_PLAYCOND struDownPara = new CHCNetSDK.NET_DVR_PLAYCOND();
                struDownPara.dwChannel = (UInt32)_loginRequest.ChannelNo;

                //设置下载的开始时间
                struDownPara.struStartTime.dwYear   = (UInt32)request.From.Year;
                struDownPara.struStartTime.dwMonth  = (UInt32)request.From.Month;
                struDownPara.struStartTime.dwDay    = (UInt32)request.From.Day;
                struDownPara.struStartTime.dwHour   = (UInt32)request.From.Hour;
                struDownPara.struStartTime.dwMinute = (UInt32)request.From.Minute;
                struDownPara.struStartTime.dwSecond = (UInt32)request.From.Second;

                //设置下载的结束时间
                struDownPara.struStopTime.dwYear   = (UInt32)request.To.Year;
                struDownPara.struStopTime.dwMonth  = (UInt32)request.To.Month;
                struDownPara.struStopTime.dwDay    = (UInt32)request.To.Day;
                struDownPara.struStopTime.dwHour   = (UInt32)request.To.Hour;
                struDownPara.struStopTime.dwMinute = (UInt32)request.To.Minute;
                struDownPara.struStopTime.dwSecond = (UInt32)request.To.Second;

                var m_lDownHandle = CHCNetSDK.NET_DVR_GetFileByTime_V40(_userId, request.FilePath, ref struDownPara);
                if (m_lDownHandle < 0)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"按时间下载失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                UInt32 iOutValue = 0;
                var    succ      = CHCNetSDK.NET_DVR_PlayBackControl_V40(m_lDownHandle, CHCNetSDK.NET_DVR_PLAYSTART, IntPtr.Zero, 0, IntPtr.Zero, ref iOutValue);
                if (!succ)
                {
                    return(new OResult <Boolean>(false, HkvsErrorCode.GetLastErrorCode(), $"按时间下载失败:{HkvsErrorCode.GetLastErrorMessage()}"));
                }

                var tcs = new TaskCompletionSource <Boolean>();

                _ = Task.Run(async() =>
                {
                    var iPos = 0;
                    while (!cancellationToken.IsCancellationRequested)
                    {
                        iPos = CHCNetSDK.NET_DVR_GetDownloadPos(m_lDownHandle);

                        switch (iPos)
                        {
                        case 100:
                            CHCNetSDK.NET_DVR_StopGetFile(m_lDownHandle);
                            tcs.SetResult(true);
                            return;

                        case 200:
                            tcs.SetException(new SystemException("网络中断"));
                            CHCNetSDK.NET_DVR_StopGetFile(m_lDownHandle);
                            return;
                        }

                        await Task.Delay(1000);
                    }
                }, CancellationToken.None);

                succ = await tcs.Task;

                if (!succ)
                {
                    return(new OResult <Boolean>(false, "按时间下载失败"));
                }

                return(new OResult <Boolean>(true));
            }
            catch (Exception ex)
            {
                return(new OResult <Boolean>(false, ex));
            }
        }