Qt5实现海康NVR预览视频

文章目录

  • 前言
  • 一、SDK下载
  • 二、使用步骤
    • 1.新建项目
    • 2.调用SDK
  • 总结


前言

从网上抄的demo,以此作为基准,准备持续更新。


一、SDK下载

SDK下载地址:https://open.hikvision.com/download/5cda567cf47ae80dd41a54b3?type=10
Qt5实现海康NVR预览视频_第1张图片

此处我下载的是64位的SDK

二、使用步骤

1.新建项目

1.新建Qt项目。
2.将库文件复制到项目目录中。新建lib_64文件夹,将.lib文件全部复制到lib_64文件夹中。新建include_64文件夹,将.h文件全部复制到include_64文件夹中。ctrl+R,生成debug目录,将.dll文件全部复制到debug文件夹中.
Qt5实现海康NVR预览视频_第2张图片

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 
#include 
#include 
#include 

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 
#include 

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 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.ui
Qt5实现海康NVR预览视频_第3张图片

编译运行即可
Qt5实现海康NVR预览视频_第4张图片
项目地址:https://gitee.com/seanqter/hik.git


总结

好记性不如烂笔头。

你可能感兴趣的:(QT,qt,c++,sdk)