203 lines
5.8 KiB
C
203 lines
5.8 KiB
C
|
|
#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
|