前言
从网上抄的demo,以此作为基准,准备持续更新。
一、SDK下载
SDK下载地址:https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10
此处我下载的是64位的SDK
二、使用步骤
1.新建项目
1.新建Qt项目。
2.将库文件复制到项目目录中。新建lib_64文件夹,将.lib文件全部复制到lib_64文件夹中。新建include_64文件夹,将.h文件全部复制到include_64文件夹中。ctrl+R,生成debug目录,将.dll文件全部复制到debug文件夹中.
、
2.调用SDK
代码如下(示例):
.pro文件
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = qtHkTest
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
INCLUDEPATH += $$PWD\include
CONFIG += c++11
SOURCES += \
main.cpp \
mainwindow.cpp
HEADERS += \
mainwindow.h
FORMS += \
mainwindow.ui
CONFIG += mobility
MOBILITY =
win32: LIBS += -L$$PWD/lib_64/ -lHCCore -lHCNetSDK -lPlayCtrl -lHCAlarm -lHCGeneralCfgMgr -lHCPreview
INCLUDEPATH += $$PWD/include_64
DEPENDPATH += $$PWD/include_64
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <HCNetSDK.h>
#include <plaympeg4.h>
#include <QString>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_LoginButton_clicked();
void on_StartButton_clicked();
void on_StopButton_clicked();
private:
Ui::MainWindow *ui;
LONG lUserID;
LONG lRealPlayHandle;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//NOTE 登录 2021-08-09
on_LoginButton_clicked();
//NOTE 预览 2021-08-09
on_StartButton_clicked();
}
MainWindow::~MainWindow()
{
delete ui;
//注销用户
NET_DVR_Logout(lUserID);
//释放 SDK 资源
NET_DVR_Cleanup();
}
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
char tempbuf[256] = {0};
switch(dwType)
{
case EXCEPTION_RECONNECT: //预览时重连
qDebug()<<"----------reconnect--------, "<<time(nullptr);
break;
default:
break;
}
}
void MainWindow::on_LoginButton_clicked()
{
// 初始化
bool initok = NET_DVR_Init();
if (initok) qDebug() << "init ok";
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30(const_cast<char*>("192.168.0.102"), 8000, const_cast<char*>("admin"), const_cast<char*>("admin123"), &struDeviceInfo);
if (lUserID < 0)
{
qDebug()<<"Login error: "<<NET_DVR_GetLastError();
NET_DVR_Cleanup();//释放 SDK 资源
return;
} else {
qDebug() << "login success";
}
}
void MainWindow::on_StartButton_clicked()
{
//---------------------------------------
//设置异常消息回调函数
NET_DVR_SetExceptionCallBack_V30(0, nullptr,g_ExceptionCallBack, nullptr);
//---------------------------------------
//启动预览并设置回调数据流
#if 01
HWND hWnd = (HWND)ui->graphicsView->winId(); //获取窗口句柄
#else
HWND hWnd = (HWND)ui->label->winId(); //获取窗口句柄
#endif
NET_DVR_PREVIEWINFO struPlayInfo;
struPlayInfo.hPlayWnd = hWnd; //需要 SDK 解码时句柄设为有效值,仅取流不解码时可设为空
struPlayInfo.lChannel = 33; //预览通道号
struPlayInfo.dwStreamType = 0; //0-主码流,1-子码流,2-码流 3,3-码流 4,以此类推
struPlayInfo.dwLinkMode = 0; //0- TCP 方式,1- UDP 方式,2- 多播方式,3- RTP 方式,4-RTP/RTSP,5-RSTP/HTTP
struPlayInfo.bBlocked = 1; //0- 非阻塞取流,1- 阻塞取流
qDebug() << "lUserID" << lUserID;
lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, nullptr, nullptr);
if (lRealPlayHandle < 0)
{
qDebug() << "lRealPlayHandle:" << lRealPlayHandle;
qDebug()<<"error: "<<&NET_DVR_RealPlay_V40 << NET_DVR_GetLastError();
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
exit(-1);
return;
}
}
void MainWindow::on_StopButton_clicked()
{
//---------------------------------------
//关闭预览
NET_DVR_StopRealPlay(lRealPlayHandle);
}
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.ui
编译运行即可
项目地址:https://gitee.com/seanqter/hik.git
总结
好记性不如烂笔头。