Linux C++海康SDK取流

下载海康Linux开发SDK

  1. 进入 海康开放平台 , 点击 设备集成SDK ,点击 资源下载
    海康设备集成SDK资源下载

  2. 下载Linux x64的SDK
    设备网络SDK_LinuxX64下载

设置环境变量

  1. 把SDK的库放进Linux里解压
  2. 库文件文件夹和子文件夹HCNetSDKCom里的所有文件拷贝在 ~/hkSdk/lib 目录下
  3. 往 ~/.bashrc 添加如下:
# hk sdk
export LD_LIBRARY_PATH=$HOME/lib/hkSdk/lib:$LD_LIBRARY_PATH
  1. 使得环境变量生效
source ~/.bashrc

C++使用海康SDK取流

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <unistd.h>
using namespace std;

#include "HCNetSDK.h"
#include "LinuxPlayM4.h"

int g_nPort = -1;

void Get_HK_SDK_Version()
{
    unsigned int uiVersion = NET_DVR_GetSDKBuildVersion();

    char strTemp[1024] = {0};
    sprintf(strTemp, "HCNetSDK V%d.%d.%d.%d\n", \
        (0xff000000 & uiVersion)>>24, \
        (0x00ff0000 & uiVersion)>>16, \
        (0x0000ff00 & uiVersion)>>8, \
        (0x000000ff & uiVersion));
    printf(strTemp);
}

// 视频流解码成功后的回调函数
void CALLBACK DecodeCallBackFun(int nPort, char* pBuf, int nSize, FRAME_INFO* pFrameInfo, void* nUser, int nReserved)
{
    if (pFrameInfo->nType == T_YV12) {
        printf("Get Decode Stream ok.\n");
        // TODO, 自行处理解码后的 YV12 数据
    }
}

void CALLBACK g_HikDataCallBack(int lRealHandle, unsigned int dwDataType, unsigned char *pBuffer, unsigned int dwBufSize, void *dwUser)
{
    //printf("pyd---(private)Get data,the size is %d.\n", dwBufSize);
    unsigned int ret;
    switch (dwDataType) {
    case NET_DVR_SYSHEAD:
        if(!PlayM4_GetPort(&g_nPort)) {
            printf("pyd---PlayM4_GetPort error, %d\n", NET_DVR_GetLastError());
            NET_DVR_Cleanup();
            exit(0); // TODO 自行处理, 重新登录等操作
            break;
        }

        if(dwBufSize > 0) {
            // 打开流
            if(!PlayM4_OpenStream(g_nPort, pBuffer, dwBufSize, 1024*1024)) {
                ret = PlayM4_GetLastError(g_nPort);
                printf("PlayM4_OpenStream failed: %d\n", ret);
                break;
            }

            // 设置视频流解码成功后的回调函数, 封装成类时, 可把 PlayM4_SetDecCallBackExMend 第四个参数 为 this 指针
            if(!PlayM4_SetDecCallBackExMend(g_nPort, DecodeCallBackFun, NULL, 0, 0)) {
                ret = PlayM4_GetLastError(g_nPort);
                printf("PlayM4_SetDecCallBackExMend failed: %d\n", ret);
                break;
            }

            // 打开视频解码
            if(!PlayM4_Play(g_nPort, NULL)) {
                //todo
                ret = PlayM4_GetLastError(g_nPort);
                printf("PlayM4_Play failed: %d\n", ret);
                break;
            }

            // 播放声音
            if (!PlayM4_PlaySound(g_nPort)) {

            }
        }
        break;

    case NET_DVR_STREAMDATA:
        if(dwBufSize > 0 && g_nPort != -1) {
            bool in_data = PlayM4_InputData(g_nPort, pBuffer, dwBufSize);
            while (!in_data) {
                in_data = PlayM4_InputData(g_nPort, pBuffer, dwBufSize);
                sleep(1);
            }
        }
        break;

    default:
        break;
    }
}

void CALLBACK ExceptionCallBackFun(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
    switch(dwType) {
        case EXCEPTION_RECONNECT: //预览时重连
            printf("----------reconnect--------%d\n", time(NULL));
        break;
        default:
        break;
    }
}

int main()
{
    BOOL iRet = NET_DVR_Init();
    if (!iRet) {
        printf("Alarm! NET_DVR_Init fail!\n");
        printf("NET_DVR_GetLastError is %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return false;
    }
    Get_HK_SDK_Version();

    //设置连接时间与重连时间
    iRet = NET_DVR_SetConnectTime(2000, 1);
    if (!iRet) {
        printf("NET_DVR_SetConnectTime failed: %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return false;
    }
    iRet = NET_DVR_SetReconnect(10000, true);
    if (!iRet) {
        printf("NET_DVR_SetReconnect failed: %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return false;
    }

    // 设置日志
    iRet = NET_DVR_SetLogToFile(3, "./sdkLog");
    if (!iRet) {
        printf("NET_DVR_SetReconnect failed: %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return false;
    }
    
    //设置异常消息回调函数
    iRet = NET_DVR_SetExceptionCallBack_V30(0, NULL, ExceptionCallBackFun, NULL);
    if (!iRet) {
        printf("NET_DVR_SetReconnect failed: %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return false;
    }

    // 登录设备
    NET_DVR_USER_LOGIN_INFO struLoginInfo = {0};
    NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = {0};
    struLoginInfo.bUseAsynLogin = false;

    struLoginInfo.wPort = 8000;
    memcpy(struLoginInfo.sDeviceAddress, "xxx.xxx.xxx.xxx", NET_DVR_DEV_ADDRESS_MAX_LEN);
    memcpy(struLoginInfo.sUserName, "admin", NAME_LEN);
    memcpy(struLoginInfo.sPassword, "123456", NAME_LEN);

    int lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
    if (lUserID < 0) {
        printf("pyd---Login error, %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return false;
    }

    // 启动预览 设置参数
    NET_DVR_PREVIEWINFO struct_play_info = {0};
    struct_play_info.hPlayWnd = 0;      // SDK解码时播放窗口的句柄,仅取流不解码时可设为空
    struct_play_info.lChannel = 1;      // 通道号
    struct_play_info.dwLinkMode = 0;    // 0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP
    struct_play_info.bBlocked = 1;      // 0-非阻塞取流, 1-阻塞取流, 如果阻塞SDK内部connect失败将会有5s的超时才能够返回,不适合于轮询取流操作.
    struct_play_info.dwDisplayBufNum = 1;
    long lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struct_play_info, NULL, NULL);
    if(lRealPlayHandle < 0) {
        printf("pyd---NET_DVR_RealPlay_V40 error, %d\n", NET_DVR_GetLastError());
        NET_DVR_Logout_V30(lUserID);
        NET_DVR_Cleanup();
        return false;
    }

    // 设置回调函数取流, 封装成类时, 可把 NET_DVR_SetRealDataCallBackEx 第三个参数 为 this 指针
    iRet = NET_DVR_SetRealDataCallBackEx(lRealPlayHandle, g_HikDataCallBack, 0);
    if (!iRet) {
        printf("pyd---NET_DVR_SetRealDataCallBackEx error, %d\n", NET_DVR_GetLastError());
        NET_DVR_StopRealPlay(lRealPlayHandle);
        NET_DVR_Logout_V30(lUserID);
        NET_DVR_Cleanup();  
        return false;
    }

    getchar();
    return 1;
}

错误处理

海康SDK和TensorRT库一起使用导致 NET_DVR_Init 失败

注释(不要使用) TensorRT 库的函数 initLibNvInferPlugins

报错 29

环境变量没设置,先参考上文设置号环境变量

其他报错

请参考海康SDK下的开发文档自行解决

参考

【1】: 海康开发平台

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
从提供的引用中,我们可以看到以下几点信息: 1. 引用提供了一个使用ffmpeg将PS流的视频录像文件转封装成MP4格式的Java类示例。 2. 引用介绍了设备网络SDK,它是基于设备私有网络通信协议开发的,用于远程访问和控制设备软件的二次开发。 3. 引用列举了设备网络SDK的一些功能,包括图像预览、文件回放和下载、云台控制、布防/撤防、语音对讲、远程升级等。 根据以上信息,如果您想在Spring Boot中使用海康SDK取流硬盘录像机,您可以按照以下步骤进行操作: 1. 导入设备网络SDK:根据您的需求,下载并导入适用于您的平台和语言的设备网络SDK。 2. 设置连接参数:在Spring Boot应用程序中,使用设备网络SDK提供的API,设置连接硬盘录像机所需的参数,如IP地址、端口号、用户名和密码等。 3. 建立连接:使用SDK提供的函数建立与硬盘录像机的连接。 4. 取流:通过SDK提供的函数,从硬盘录像机中获取视频流。 5. 处理视频流:您可以使用ffmpeg或其他工具对视频流进行处理,如转封装成MP4格式、进行编解码等。 6. 进行其他操作:根据您的需求,可以使用SDK提供的其他功能,如图像预览、云台控制等。 请注意,具体的操作步骤可能因您使用的设备网络SDK版本和具体需求而有所不同。建议您参考设备网络SDK的官方文档和示例代码,以获得更详细和准确的操作指南。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值