GrabBag/Device/HikDevice/Inc/IHikDevice.h

203 lines
5.6 KiB
C
Raw Normal View History

2026-03-28 10:49:55 +08:00
#ifndef IHIKDEVICE_H
#define IHIKDEVICE_H
#include <functional>
#include <string>
#include <vector>
// 海康相机配置结构体
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<void(unsigned char* pRGBData, int dataSize,
const HikFrameInfo& frameInfo, void* pUser)>;
// 设备状态回调
// 参数: status-设备状态, pUser-用户数据
using HikDeviceStatusCallback = std::function<void(EHikDeviceStatus status, void* pUser)>;
// 异常回调
// 参数: exceptionType-异常类型, pUser-用户数据
using HikExceptionCallback = std::function<void(EHikExceptionType exceptionType, void* pUser)>;
/**
* @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