#ifndef IHIKDEVICE_H #define IHIKDEVICE_H #include #include #include // 海康相机配置结构体 struct HikDeviceConfig { std::string name; // 相机名称 std::string ip; // IP地址 int port = 8000; // 端口号 std::string username; // 用户名 std::string password; // 密码 int channelNo = 1; // 通道号 int streamType = 0; // 码流类型 0-主码流 1-子码流 bool enabled = true; // 是否启用 }; // 海康相机工作状态 enum class EHikDeviceStatus { Disconnected = 0, // 断开连接 Connected, // 已连接 Previewing, // 正在预览 Reconnecting, // 重连中 Error // 错误状态 }; // 海康异常类型 enum class EHikExceptionType { None = 0, Reconnect, // 预览时重连 PreviewException, // 预览异常 SerialException, // 透明通道异常 AlarmReconnect, // 报警重连 ExchangeException // 用户交换异常 }; // 解码帧信息 struct HikFrameInfo { int width = 0; // 图像宽度 int height = 0; // 图像高度 int frameType = 0; // 帧类型 long long timestamp = 0; // 时间戳 }; // 解码后的帧数据回调 // 参数: pRGBData-RGB数据, dataSize-数据大小, frameInfo-帧信息, pUser-用户数据 using HikDecodedFrameCallback = std::function; // 设备状态回调 // 参数: status-设备状态, pUser-用户数据 using HikDeviceStatusCallback = std::function; // 异常回调 // 参数: exceptionType-异常类型, pUser-用户数据 using HikExceptionCallback = std::function; /** * @brief 海康相机设备接口 * * 封装海康威视HCNetSDK和PlayM4解码库,提供统一的相机操作接口 */ class IHikDevice { public: virtual ~IHikDevice() = default; /** * @brief 创建海康设备对象 * @param ppDevice 设备对象指针的指针 * @return 0:成功, 其他:错误码 */ static int CreateObject(IHikDevice** ppDevice); /** * @brief 初始化海康SDK * @return 0:成功, 其他:错误码 */ virtual int InitSDK() = 0; /** * @brief 清理海康SDK */ virtual void CleanupSDK() = 0; /** * @brief 登录海康相机 * @param config 相机配置 * @return 0:成功, 其他:错误码 */ virtual int Login(const HikDeviceConfig& config) = 0; /** * @brief 登出海康相机 */ virtual void Logout() = 0; /** * @brief 判断是否已登录 * @return true:已登录, false:未登录 */ virtual bool IsLoggedIn() const = 0; /** * @brief 开始实时预览 * @return 0:成功, 其他:错误码 */ virtual int StartPreview() = 0; /** * @brief 开始实时预览(直接渲染到窗口,硬件解码,低延迟) * @param hWnd 窗口句柄,传入则使用硬件渲染,nullptr则使用软解码回调 * @return 0:成功, 其他:错误码 */ virtual int StartPreviewEx(void* hWnd) = 0; /** * @brief 停止实时预览 */ virtual void StopPreview() = 0; /** * @brief 判断是否正在预览 * @return true:正在预览, false:未预览 */ virtual bool IsPreviewing() const = 0; /** * @brief 获取当前设备状态 * @return 设备状态 */ virtual EHikDeviceStatus GetStatus() const = 0; /** * @brief 设置解码帧回调函数 * @param callback 回调函数 * @param pUser 用户数据指针 */ virtual void SetDecodedFrameCallback(HikDecodedFrameCallback callback, void* pUser) = 0; /** * @brief 设置设备状态回调函数 * @param callback 回调函数 * @param pUser 用户数据指针 */ virtual void SetStatusCallback(HikDeviceStatusCallback callback, void* pUser) = 0; /** * @brief 设置异常回调函数 * @param callback 回调函数 * @param pUser 用户数据指针 */ virtual void SetExceptionCallback(HikExceptionCallback callback, void* pUser) = 0; /** * @brief 获取当前帧的RGB数据 * @param pBuffer 数据缓冲区(由调用者分配) * @param bufferSize 缓冲区大小 * @param frameInfo 帧信息(输出) * @return 实际数据大小, -1表示失败 */ virtual int GetCurrentFrame(unsigned char* pBuffer, int bufferSize, HikFrameInfo& frameInfo) = 0; /** * @brief 获取当前配置 * @return 当前配置 */ virtual const HikDeviceConfig& GetConfig() const = 0; /** * @brief 抓图保存到文件 * @param filePath 文件路径 * @param isJpeg true:JPEG格式, false:BMP格式 * @return 0:成功, 其他:错误码 */ virtual int CaptureToFile(const std::string& filePath, bool isJpeg = true) = 0; /** * @brief 云台控制 * @param command 控制命令 * @param stop true:停止, false:开始 * @param speed 速度(1-7) * @return 0:成功, 其他:错误码 */ virtual int PTZControl(int command, bool stop, int speed = 4) = 0; /** * @brief 配置OSD显示 * @param showChanName 是否显示通道名称 * @param showOsd 是否显示OSD(时间) * @return 0:成功, 其他:错误码 */ virtual int ConfigureOSD(bool showChanName, bool showOsd) = 0; }; #endif // IHIKDEVICE_H