海康威视SDK控制台程序consoleDemo获取码流

陈拓 2021/08/28-2020/08/28

1. 概述

在《海康威视SDK控制台程序consoleDemo》

https://zhuanlan.zhihu.com/p/403903892

https://blog.csdn.net/chentuo2000/article/details/119939573

一文中我们已经编译成功了海康威视SDK的控制台程序consoleDemo。

在《海康威视SDK控制台程序consoleDemo获取视频通道参数》

https://zhuanlan.zhihu.com/p/404390272

https://blog.csdn.net/chentuo2000/article/details/119963580

一文中我们获取到了NVR的视频通道号。

本文我们用获取的通道号获取码流。

2. 重写GetStream.cpp

将GetStream.cpp原来的全部代码删除,替换成下面的代码:

#include <unistd.h> 
#include "HCNetSDK.h"
#include "public.h"
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <iostream>
using namespace std;

void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,void* dwUser) {
    printf("pyd---(private_v30)Get data,the size is %ld,%d.\n", time(NULL), dwBufSize);
	switch (dwDataType) {
	case NET_DVR_SYSHEAD: //系统头
        printf("NET_DVR_SYSHEAD data,the size is %ld,%d.\n", time(NULL), dwBufSize);
        break; 
	case NET_DVR_STREAMDATA: //码流数据
		if (dwBufSize > 0) {
            printf("NET_DVR_STREAMDATA data,the size is %ld,%d.\n", time(NULL), dwBufSize);
		}
        break; 
    default: //其他数据
            printf("Other data,the size is %ld,%d.\n", time(NULL), dwBufSize);
        break;      
	}
}

int Demo_GetStream_V30(LONG lUserID) {
    long lRealPlayHandle;
    NET_DVR_PREVIEWINFO struPlayInfo = {0};
    struPlayInfo.hPlayWnd     = 0;  // 仅取流不解码。这是Linux写法,Windows写法是struPlayInfo.hPlayWnd = NULL;
    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- 阻塞取流
    //struPlayInfo.dwDisplayBufNum = 1;

    lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, g_RealDataCallBack_V30, NULL); // NET_DVR_RealPlay_V40 实时预览(支持多码流)。
    //lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, NULL, NULL, 0); // NET_DVR_RealPlay_V30 实时预览。
    if (lRealPlayHandle < 0) {
        printf("NET_DVR_RealPlay_V40 error, %d\n", NET_DVR_GetLastError());

        return HPR_ERROR;
    }
    cout << "取流成功!" << endl;
    sleep(5); // 取流时间长度 秒
    NET_DVR_StopRealPlay(lRealPlayHandle); // 停止取流
   
    return HPR_OK;
}

说明:

  • 例子使用33号通道
  • Linux系统不支持软解码功能(仅Windows版本支持),因此需要将窗口句柄传NULL,设置回调函数,只取流不解码。
  • 设备网络SDK开发使用手册 - 预览录像抓图模块流程

##方式二##:预览接口NET_DVR_RealPlay_V40中预览参数的播放窗口句柄(hPlayWnd)可以设置为空值,直接设置回调函数,或者调用预览接口之后,通过NET_DVR_SetRealDataCallBack、NET_DVR_SetStandardDataCallBack设置回调函数,回调获取实时流数据(前两个接口设置的回调获取的是PS封装的码流,后者获取的是标准RTP封装的码流)之后用户后续自己处理,比如二进制流方式写入文件保存成录像或者调用播放库解码显示等操作。

3. 编译、运行

编译运行操作见概述中提到的《海康威视SDK控制台程序consoleDemo》一文。

在菜单中选择1,运行结果:

在这里我们获取到了码流,后续我们将码流保存为视频文件。

猜你喜欢

转载自blog.csdn.net/chentuo2000/article/details/119971526