GrabBag/Device/HikDevice/Inc/IHikDevice.h

203 lines
5.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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