ubuntu环境使用海康威视SDK获取视频流

获取监控摄像头视频流可以采用rtsp快速获取,但是该方案可能出现延时较大的情况,而采用海康威视提供的SDK可以降低延时。

#include <stdio.h>
#include <sys/time.h>
#include <chrono>
#include <opencv2/opencv.hpp>
#include <unistd.h>
#include <errno.h>
#include "HCNetSDK.h"
#include "iniFile.h"
#include "PlayM4.h"


//解码回调 视频为YUV数据(YV12),音频为PCM数据
void CALLBACK G_DecCBFun(int nPort, char * pBuf, int nSize, FRAME_INFO * pFrameInfo, void* nReserved1, int nReserved2)
{
	// std::cout << "****************" << std::endl;
    long lFrameType = pFrameInfo->nType;
    if (lFrameType == T_YV12)
    {
        cv::Mat pImg(pFrameInfo->nHeight, pFrameInfo->nWidth, CV_8UC3);
        cv::Mat src(pFrameInfo->nHeight + pFrameInfo->nHeight / 2, pFrameInfo->nWidth, CV_8UC1, pBuf);
		cv::cvtColor(src, pImg, cv::COLOR_YUV2BGR_YV12);
		cv::Mat img = pImg.clone();
		cv::resize(img, img, cv::Size(0, 0), 0.5, 0.5);
		cv::imshow("image", img);
		cv::waitKey(10);
    }
}

LONG G_nPort = -1;
void PsDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pPacketBuffer, DWORD nPacketSize, void* pUser)
{
	switch (dwDataType)
    {
    case NET_DVR_SYSHEAD: //系统头
        if (!PlayM4_GetPort(&G_nPort))  //获取播放库未使用的通道号
        {
            break;
        }
        //m_iPort = lPort; //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放
        if (nPacketSize > 0)
        {
            if (!PlayM4_SetStreamOpenMode(G_nPort, STREAME_REALTIME))  //设置实时流播放模式
            {
				
                break;
            }

            if (!PlayM4_OpenStream(G_nPort, pPacketBuffer, nPacketSize, 10 * 1024 * 1024)) //打开流接口
            {
				
                break;
            }

            if (!PlayM4_Play(G_nPort, NULL)) //播放开始
            {
				
                break;
            }

			if (!PlayM4_SetDecCallBack(G_nPort, G_DecCBFun))
			{
				
				break;
			}
            
        }
        break;
    case NET_DVR_STREAMDATA:   //码流数据
        if (nPacketSize > 0 && G_nPort != -1)
        {
            if (!PlayM4_InputData(G_nPort, pPacketBuffer, nPacketSize))
            {
                // std::cout << "error" << PlayM4_GetLastError(G_nPort) << std::endl;
                break;
            }
        }
        break;
    default: //其他数据
        if (nPacketSize > 0 && G_nPort != -1)
        {
            if (!PlayM4_InputData(G_nPort, pPacketBuffer, nPacketSize))
            {
                break;
            }
        }
        break;
    }
}

void GetStream()
{
	std::vector<std::string> paths;
	paths.push_back("../config/Device.ini");		// 配置信息

	for(int k=0; k<1; k++)
	{
		// 从配置文件读取设备信息 
		IniFile ini(paths.at(k).c_str());
		unsigned int dwSize = 0;
		char sSection[16] = "DEVICE";
		
		char *sIP = ini.readstring(sSection, "ip", "error", dwSize);
		int iPort = ini.readinteger(sSection, "port", 0);
		char *sUserName = ini.readstring(sSection, "username", "error", dwSize); 
		char *sPassword = ini.readstring(sSection, "password", "error", dwSize);
		int iChannel = ini.readinteger(sSection, "channel", 0);

		NET_DVR_DEVICEINFO_V30 struDeviceInfo;
		int iUserID = NET_DVR_Login_V30(sIP, iPort, sUserName, sPassword, &struDeviceInfo);
		std::cout << iUserID << std::endl;

		if(iUserID >= 0)
		{
			NET_DVR_PREVIEWINFO struPreviewInfo = {0};
			struPreviewInfo.lChannel =iChannel;
			struPreviewInfo.dwStreamType = 0;
			struPreviewInfo.dwLinkMode = 0;
			struPreviewInfo.bBlocked = 1;
			struPreviewInfo.bPassbackRecord  = 1;
			LONG nPort = -1;
			int iRealPlayHandle = NET_DVR_RealPlay_V40(iUserID, &struPreviewInfo, PsDataCallBack, &nPort);
			if(iRealPlayHandle >= 0)
			{
				printf("[GetStream]---RealPlay %s:%d success, \n", sIP, iChannel, NET_DVR_GetLastError());

			}
			else
			{
				printf("[GetStream]---RealPlay %s:%d failed, error = %d\n", sIP, iChannel, NET_DVR_GetLastError());
			}
		}
		else
		{
			printf("[GetStream]---Login %s failed, error = %d\n", sIP, NET_DVR_GetLastError());
		}
	}
}


int main()
{
    NET_DVR_Init();
	
	GetStream();
	char c = 0;
	while('q' != c)
	{
		printf("input 'q' to quit\n");
		printf("input: ");
		scanf("%c", &c);
	}

    NET_DVR_Cleanup();
    return 0;
}

在该程序中,将监控信息作为配置文件,方便修改

[DEVICE]
ip = 192.168.1.100		    	//
port = 8000			    				//
username = admin		    	//
password = passwd 			//
channel = 1			    			//

x64平台源码
arm平台源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值