Qt5实现海康NVR预览视频


前言

从网上抄的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


总结

好记性不如烂笔头。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qter_Sean

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值