视频实时处理软件的开发
摘要: 在实际工业使用中,光电设备平台上安装海康硬盘录像机需要进行视频的实时处理开发,文中介绍了在Visual C++6.0编程环境中,使用海康威视SDK实现光电视频实时预览、视频存储和回放功能的方法,并给出了关键代码及解析,使用简单可靠。

海康硬盘录像机通过将光电设备采集的视频信号通过网络通信方式发送到视频显示端,在Visual C++6.0 编程环境下,调用海康威视SDK软件开发包设计和开发实时视频处理软件,进行视频的实时预览及录像回放功能。视频处理软件的主体控制界面如图1所示。

1.png图1 视频及控制界面

1 海康威视SDK简介

1.1 SDK介绍

海康威视SDK是一种软件开发工具包,它集成海康威视各类产品的API,从而使得开发者能够在自己的应用中调用这些设备的功能。海康威视SDK主要包含设备网络SDK和播放库SDK。

设备网络SDK的主要是用于实时码流预览、视频文件回放、云台控制、远程升级、格式化硬盘、参数配置(系统配置、通道配置、串口配置、报警配置、用户配置)等。

播放库SDK主要是为海康威视的设备提供视频播放的功能,开发者可以轻松地实现视频播放、暂停、停止等功能。可以支持多种设备的接入,如硬盘录像机、视频服务器、网络摄像机等。开发者可以通过这个SDK来访问和控制这些设备,获取实时视频并进行播放[1

1.2 SDK导入

海康威视SDK中含有不同功能库的DLL(Dynamic LinkLibrary,动态链接库),DLL中封装了海康威视的功能函数。用户开发过程中为了调用DLL中的函数,必须要有函数原型声明的头文件(.h文件)和库文件(.lib文件)。因此,用户必须将需要使用的功能库的DLL文件、头文件和lib库文件导入编程环境中[2]

视频处理软件主要运用了海康提供的SDK中的网络通讯库(HCNetSDK.h头文件、HCNetSDK.lib  LIB 库文件、HCNetSDK.dll  DLL 库文件)。

2 SDK开发

视频实时处理软件中调用海康威视SDK实现实时视频预览、视频存储、视频回放的基本功能,视频实时处理软件调用的主要流程如图2所示。图2中,视频实时处理开发按实现功能的不同可以分为不同模块,实现每个模块的功能时初始化SDK、用户注册设备,初始化SDK是对整个网络SDK系统的初始化。注册设备实现用户的注册功能,注册成功后,返回的用户ID作为其他功能操作的唯一标识,然后获取设备的通道资源成功后,就可以进行视频实时预览,当不再使用SDK后,需要释放其使用的资源[3]

由于视频处理软件是采用网络传输的方式对工作区域实现监控的,所以在添加用户时必须要获取到网络硬盘录像机的IP地址,NET_DVR_Login_V30 接口用于进行用户的注册,注册成功会返回一个IUserID,使用IUserID可以进行下文一系列的操作,这个当其返回值为-1 时表示用户注册失败,此时用户可以通过调用NET_DVR_GetLastError 接口来查看注册错误的原因[4]

m_ctrlDevIp.SetAddress(192,168,1,64);//设置IP地址

 do{ //进行用户注册

  lLoginID = NET_DVR_Login_V30(DeviceIp.GetBuffer(DeviceIp.GetLength()),m_nDevPort, \m_csUser.GetBuffer(m_csUser.GetLength()),m_csPWD.GetBuffer(m_csPWD.GetLength()),&DeviceInfoTmp);

}while(lLoginID == -1);

由于海康提供的SDK支持多通道的同时解码预览,所以在解码之前我们必须要准确的预览通道号,利用NET_DVR_GetDVRConfig获取设备的通道资源。

1.png

图2 视频实时处理软件调用流程图

2.1 视频预览模块

视频预览模块实现从网络设备取实时码流,解码显示以及播放控制功能。本文采用实时流解码方式,由SDK实现解码功能。在完成初始化SDK、注册设备和获取通道资源后,直接调用启动预览接口函数。预览接口NET_DVR_RealPlay_V30(lUserID, &struPlayInfo, RealDataCallBack, NULL, bPreviewBlock)进行预览。其中 lUserID 为接口NET_DVR_Login_V30 的返回值,struPlayInfo 为包含播放句柄(此处设置为空)、预览通道号等的预览参数结构体。通过SDK直接进行解码预览,在界面上添加一个静态文本框作为视频预览窗口。视频预览功能开发的主要代码如下所示:

/ / 实时预览参数设置

NET_DVR_CLIENTINFO ClientInfo;

ClientInfo.hPlayWnd     = GetDlgItem(IDC_STATIC_PLAY)->m_hWnd;//获取窗口句柄

ClientInfo.lChannel     = 1;

ClientInfo.lLinkMode    = 0;

ClientInfo.sMultiCastIP = NULL;

TRACE("Channel number:%d\n",ClientInfo.lChannel);

m_lPlayHandle=NET_DVR_RealPlay_V30(m_struDeviceInfo.lLoginID,&ClientInfo,NULL,NULL,TRUE);//启动预览

if(-1 == m_lPlayHandle)

{

DWORD err=NET_DVR_GetLastError();

playerr=1;//播放出错

}

m_bIsPlaying = TRUE;

playflag=1;

2.2 视频存储模块

视频存储模块主要实现硬盘录像机实时数据流的存储。开发过程中主要涉及视频存储路径,视频文件的命名格式,视频文件的固定时长截断,循环视频等。在实时预览下,调用海康威视SDK中NET_DVR_SaveRealData()函数捕获数据并存储在指定的文件目录下,调用NET_DVR_StopSave_RealData()可停止录像。

2.3 视频回放模块

视频回放模块可以通过按时间和按文件名的方式回放视频文件。采用NET_DVR_SaveRealData()存储的视频文件,必须使用海康威视的解码器解码后才能播放。播放库SDK中有文件模式播放和流模式播放,本文中采用文件模式播放。视频回放的主要流程如图3所示。

2.png

图3 视频回放软件调用流程图

本文利用视频处理软件接收到控制箱的“回放”按键信息和海康威视播放库SDK中的播放函数,在接收到“回放”指令后实现视频的回放,在回放结束后重新进行视频预览。

视频回放开发的过程如下:

在串口接收函数里建立两个消息队列,当收到“回放”按键按下指令调用:

::PostMessage(hDlg,WM_MYHUI,0,0);

当收到“回放”按键抬起指令调用:

::PostMessage(hDlg,WM_MYFANG,0,0);

LRESULT CRealPlayDlg::OnMyHuiHandler(WPARAM,LPARAM)

{

StopPlay();

    //获取查找的时间段

NET_DVR_TIME StartSearchTime, StopSearchTime;

CTime StartDay,StartTime;

CTime StopDay,StopTime;

.........

    //文件查找结构体

NET_DVR_FILECOND   FileCond;

FileCond.dwFileType = 0xff;

FileCond.dwIsLocked = 0;

FileCond.dwUseCardNo = 0;

FileCond.lChannel = 1;

    memcpy(&FileCond.struStartTime,&StartSearchTime,sizeof(NET_DVR_TIME));

memcpy(&FileCond.struStopTime,&StopSearchTime,sizeof(NET_DVR_TIME));

//复制给m_FileCond

memcpy(&m_FileCond,&FileCond,sizeof(NET_DVR_FILECOND));

if(playflag==2)

{

DWORD threadID = 0;

threadHandle = (HANDLE)::CreateThread(NULL, 0,LPTHREAD_START_ROUTINE(RemoteFileSearchThread), this, 0, &threadID);//启动查找文件线程

 }

return TRUE;

}

按文件名回放首先需要通过查找录像文件功能,获取到录像文件的信息后,然后根据获取到的文件名对录像文件进行回放。用户注册登录成功后,通过调用接口 NET_DVR_FindFile_V30 获取文件的名称、大小、开始时间和结束时间等信息,接口调用成功后就可以调用 NET_DVR_FindNextFile 接口来获取文件信息,可以根据返回值查看文件错误的原因。当查找完成时调用接口 NET_DVR_FindClose_V30 来结束查找。文件查找结束后可以利用得到的录像文件名,调用接口函数 NET_DVR_PlayBackByName 对录像文件进行播放。 其中当接口NET_DVR_PlayBackByName调用成功后,需要调用接口NET_DVR_PlayBackControl 对录像文件的播放状态进行控制。用户可以通过调用NET_DVR_GetLastError 接口来查看回放错误的原因[5]

LRESULT CRealPlayDlg::OnMyFangHandler(WPARAM,LPARAM)

{

StopPlayback(); //关闭回放

Sleep(1000);

if(playflag==4)

{

StartPlay(0);//视频预览

}

return TRUE;

}

3 结束语

利用海康SDK开发的视频实时处理软件在光电设备平台上运行,操作简便,视频预览、存储和回放功能正常。本方法可以应用到其他实时监控系统视频显示软件中,对使用海康威视硬盘录像机视频监控功能的实现具有参考价值。

参考文献:

[1] 海康威视. 设备(NVR) 网络SDK 编程指南[EB / OL].http: / /www.

hikvision.com / cn / download_61.html

[2]海康威视.播放库SDK 编程指南[EB/OL].http:/ /www.hikvision.com /

cn / download_61.html

[3] 陈俊良,葛俊锋,叶林等 基于海康威视SDK的视频监控软件的开发[J].工业控制计算机.2015.28[7]:97-98

[4] 刘辰飞 智能视频监控系统中运动目标的检测与跟踪[M].济南大学 2012

作者简介:陈小娟,女,1982年生,硕士研究生,高级工程师,现从事电气设计研究工作。