win10系统海康威视SDK二次开发Qt环境配置

先下载海康SDK

我下载的win64版本: 海康SDK官网下载
在这里插入图片描述

解压后得到库文件和头文件

在这里插入图片描述
头文件
在这里插入图片描述
库文件
在这里插入图片描述

新建QWidget项目,选择64位的kits工具,在pro目录新建include文件夹和libs文件夹

进入解压好的海康库文件所在目录,将全部文件复制到libs里
进入解压好的海康头文件所在目录,将全部文件复制到include里
在这里插入图片描述

在.pro文件里加入以下代码:

INCLUDEPATH += \
        -L. $$PWD\include

# "-L. $$PWD" 表示pro所在目录
LIBS += \
        -L. $$PWD/libs/HCCore.lib \
        -L. $$PWD/libs/HCNetSDK.lib \
        -L. $$PWD/libs/PlayCtrl.lib \
        -L. $$PWD/libs/HCNetSDKCom\HCAlarm.lib \
        -L. $$PWD/libs/HCNetSDKCom\HCGeneralCfgMgr.lib \
        -L. $$PWD/libs/HCNetSDKCom\HCPreview.lib
遇到乱码问题需要将HCNetSDK.h文件保存为带bom的utf8格式

头文件:

#ifndef WIDGET_H
#define WIDGET_H
#pragma execution_character_set("utf-8")

#include <QWidget>

#include "HCNetSDK.h"

class QLabel;
class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();
    long play(HWND hWnd,NET_DVR_PREVIEWINFO struPlayInfo);
    bool initSDK();
    bool uninitSDK();
public slots:
    void OnClickedLogin();
    void OnClickedLogout();
    void OnClickedPreview();
    void OnClickedStopPreview();
    void OnClickedCapture();
private:
    long userID = -1;
    long previewID = -1;
    QLabel* label = nullptr;
};

#endif // WIDGET_H

源文件:

#include "widget.h"
#include <QDebug>
#include <iostream>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <windows.h>
#include <QMessageBox>
#include <QPushButton>
#include <QLabel>
#include <QDateTime>

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    setMinimumSize(800,600);

    label = new QLabel("text");
    auto  LoginButton = new QPushButton("登录",this);
    auto  LogoutButton= new QPushButton("注销",this);
    auto  PreviewButton= new QPushButton("实时画面",this);
    auto  StopPreviewButton= new QPushButton("停止实时画面",this);
    auto  CaptureButton= new QPushButton("抓图",this);
    connect(LoginButton,&QPushButton::clicked,this,&Widget::OnClickedLogin);
    connect(LogoutButton,&QPushButton::clicked,this,&Widget::OnClickedLogout);
    connect(PreviewButton,&QPushButton::clicked,this,&Widget::OnClickedPreview);
    connect(StopPreviewButton,&QPushButton::clicked,this,&Widget::OnClickedStopPreview);
    connect(CaptureButton,&QPushButton::clicked,this,&Widget::OnClickedCapture);

    QHBoxLayout* hbox = new QHBoxLayout();
    hbox->addWidget(LoginButton);
    hbox->addWidget(LogoutButton);
    hbox->addWidget(PreviewButton);
    hbox->addWidget(StopPreviewButton);
    hbox->addWidget(CaptureButton);
    QVBoxLayout* mainBox = new QVBoxLayout(this);
    mainBox->addWidget(label,1);
    mainBox->addLayout(hbox,0);

    if(initSDK())
        qDebug()<<"SDK init Success!";

}

Widget::~Widget()
{
    if(uninitSDK())
        qDebug()<<"SDK uninit Success!";
}

long Widget::play(HWND hWnd, NET_DVR_PREVIEWINFO struPlayInfo)
{
    struPlayInfo={0};
    struPlayInfo.hPlayWnd = hWnd;//需要 SDK 解码时句柄设为有效值,仅取流不解码时可设为空
    struPlayInfo.lChannel = 33;//预览通道号
    struPlayInfo.dwStreamType = 0;//码流类型:0-主码流,1-子码流,2-三码流,3-虚拟码流,以此类推
    struPlayInfo.dwLinkMode = 0;//0- TCP 方式,1- UDP 方式,2- 多播方式,3- RTP 方式,4-RTP/RTSP,5-RSTP/HTTP
    struPlayInfo.bBlocked = 1;//0- 非阻塞取流,1- 阻塞取流

    long IRealPlayHandle = NET_DVR_RealPlay_V40(userID,&struPlayInfo,NULL,NULL);

    if(IRealPlayHandle <0)
    {
        qDebug() << "NET_DVR_RealPlay_V40 error;error number " <<NET_DVR_GetLastError();
        QMessageBox::warning(this,"error","NET_DVR_RealPlay_V40 error;error number "+QString::number(NET_DVR_GetLastError()));
        NET_DVR_Logout(userID);
        userID=-1;
        return -1;
    }

    return IRealPlayHandle;
}

bool Widget::initSDK()
{
    bool isok = NET_DVR_Init();
    if(isok == false)
    {
        qDebug()<< "NET_DVR_Init error;error number is " <<NET_DVR_GetLastError();
        QMessageBox::warning(this,"error","NET_DVR_Init error;error number is "+QString::number(NET_DVR_GetLastError()));
        return isok;
    }
    //设置连接时间与重连时间
    NET_DVR_SetConnectTime(2000, 1);
    NET_DVR_SetReconnect(10000, true);
    return isok;
}

bool Widget::uninitSDK()
{
    bool isok = NET_DVR_Cleanup();
    if(isok == false)
    {
        qDebug()<< "NET_DVR_Cleanup error;error number is " <<NET_DVR_GetLastError();
        QMessageBox::warning(this,"error","NET_DVR_Cleanup error;error number "+QString::number(NET_DVR_GetLastError()));
        return isok;
    }
    return isok;
}

void Widget::OnClickedLogin()
{
    NET_DVR_USER_LOGIN_INFO struLoginInfo = {  };
    struLoginInfo.bUseAsynLogin = 0; //同步登录方式
    strcpy_s(struLoginInfo.sDeviceAddress, "192.168.1.143"); //设备IP地址
    struLoginInfo.wPort = 8000; //设备服务端口
    strcpy_s(struLoginInfo.sUserName, "admin"); //设备登录用户名
    strcpy_s(struLoginInfo.sPassword, "12345678"); //设备登录密码
    //设备信息, 输出参数
    NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {  };
    userID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
    if(userID<0)
    {
        qDebug() << "NET_DVR_Login_V40 error;" << "error number is " << NET_DVR_GetLastError();
        QMessageBox::warning(this,"error","NET_DVR_Login_V40 error;error number "+QString::number(NET_DVR_GetLastError()));
        return;
    }
    qDebug()<<"Login Success,userID:" << userID;

    NET_DVR_IPPARACFG_V40 ipcfg ={};
    DWORD bytesReturned = 0;
    ipcfg.dwSize = sizeof(NET_DVR_IPPARACFG_V40);
    int iGroupNO = 0;
    bool resCode = NET_DVR_GetDVRConfig(userID, NET_DVR_GET_IPPARACFG_V40, iGroupNO,  &ipcfg, sizeof(NET_DVR_IPPARACFG_V40), &bytesReturned);
    if (!resCode)
    {
        DWORD code = NET_DVR_GetLastError();
        std::cout << "NET_DVR_GetDVRConfig failed " << NET_DVR_GetErrorMsg((LONG*)(&code))  << std::endl;
        NET_DVR_Logout(userID);
        NET_DVR_Cleanup();
        return ;
    }
    std::wcout << "设备组 " << ipcfg.dwGroupNum << " 数字通道个数 " << ipcfg.dwDChanNum <<  " 起始通道 " << ipcfg.dwStartDChan << std::endl << std::endl;
    for (unsigned i = 0; i < ipcfg.dwDChanNum; i++)
    {
        NET_DVR_PICCFG_V30 channelInfo;
        bytesReturned = 0;
        channelInfo.dwSize = sizeof(NET_DVR_PICCFG_V30);
        unsigned channelNum = i + ipcfg.dwStartDChan;
        NET_DVR_GetDVRConfig(userID, NET_DVR_GET_PICCFG_V30, channelNum, &channelInfo,  sizeof(NET_DVR_PICCFG_V30), &bytesReturned);
        std::wcout <<u8"通道号 "<< channelNum << "\t通道名称 " << channelInfo.sChanName;
        std::wcout << "\t用户名 " << ipcfg.struIPDevInfo[i].sUserName << "\t密码 " <<  ipcfg.struIPDevInfo[i].sPassword;
        std::wcout << "\t设备ID " << (size_t)ipcfg.struIPDevInfo[i].szDeviceID;
        std::wcout << "\tip地址 " << ipcfg.struIPDevInfo[i].struIP.sIpV4 << "\t端口 " <<  ipcfg.struIPDevInfo[i].wDVRPort << std::endl;
    }

}

void Widget::OnClickedLogout()
{
    if(userID!=-1)
    {
        if(NET_DVR_Logout(userID)==false)
        {
            qDebug() << "NET_DVR_Logout error;" << "error number is " << NET_DVR_GetLastError();
            QMessageBox::warning(this,"error","NET_DVR_Logout error;error number "+QString::number(NET_DVR_GetLastError()));
            return;
        }
        userID=-1;
        qDebug() <<"Logout Success!";
    }
}

void Widget::OnClickedPreview()
{
    if(userID==-1)
    {
        qDebug() <<"Need Login!";
        QMessageBox::warning(this,"error","Need Login!");
        return;
    }
    HWND hWnd = (HWND)label->winId();
    NET_DVR_PREVIEWINFO struPlayInfo;
    previewID = play(hWnd,struPlayInfo);
    if(previewID==-1)
    {
        return;
    }
    qDebug()<<"Preview Success!" << userID;
}

void Widget::OnClickedStopPreview()
{
    if(previewID!=-1)
    {
        if(NET_DVR_StopRealPlay(previewID)==false)
        {
            qDebug() << "NET_DVR_StopRealPlay error;" << "error number is " << NET_DVR_GetLastError();
            QMessageBox::warning(this,"error","NET_DVR_StopRealPlay error;error number "+QString::number(NET_DVR_GetLastError()));
            return;
        }
        previewID=-1;
        qDebug() <<"Stop Preview Success!";
    }
}

void Widget::OnClickedCapture()
{

    if(userID!=-1)
    {
        NET_DVR_JPEGPARA IpJpegPara2;
        IpJpegPara2.wPicQuality=0;
        IpJpegPara2.wPicSize=0xff;

        QDateTime current_date_time =QDateTime::currentDateTime();
        QString current_date =current_date_time.toString("yyyy-MM-dd_hh-mm-ss_zzz");
        current_date="C:\\Picture\\"+current_date+".jpg";
        char*  fileName;
        QByteArray ba = current_date.toLatin1(); // must
        fileName=ba.data();


        if(NET_DVR_CaptureJPEGPicture(userID,1,&IpJpegPara2,fileName)==false)
        {
            qDebug() << "NET_DVR_CaptureJPEGPicture error;" << "error number is " << NET_DVR_GetLastError();
            QMessageBox::warning(this,"error","NET_DVR_CaptureJPEGPicture error;error number "+QString::number(NET_DVR_GetLastError()));
            return;
        }
        qDebug() <<"Capture Success!";
    }
}

遇到乱码问题需要将HCNetSDK.h文件保存为带bom的utf8格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值