VS2010海康威视二次开发-测试代码

标签:
海康微视it |
分类: Misc |
由于本次需求简单,只需要可以看到远端的图像就行,因此可直接参考SDK文档中,预览模块的样例程序,具体如下:
*****************************************************
****流程图基本说明了问题
****两段示例程序都可以
*我是在之前建好的那个基于Dialog的工程中使用的这两段代码,
*之前创建的控制台工程也测试过这段代码,但是没有成功,
*问题我想可能是在于那句窗口句柄的代码:
*HWND hWnd =
GetConsoleWindow(); //获取窗口句柄
*当然在基于Dialog中,也不能完全Copy示例代码,因为
*程序最后关闭预览、注销用户和释放SDK资源,应该在需要的时候这么干
****************************************************
预览模块流程
- 实时预览支持TCP、UDP、RTP、MULTICAST网络传输模式。
-
实时预览时,DS-80xx、DS-70xx、DS-71xx、DS-72xx、
DS-60xx、DS-61xx系列设备每个通道最多支持6路同时连接,每台设备最多支持24路同时连接;
DS-81xx、DS-71xxHV、72xxHV等系列设备每个通道最多支持6路同时连接,每台设备最多支持18路同时连接;
DS-90xx混合型硬盘录像机每个通道最多支持6路同时连接,每台设备最多支持64路同时连接;
DS-91xx系列设备每个通道最多支持6路同时连接,每台设备最多支持64路同时连接;
IP设备每个通道最多支持6路同时连接;
DS-91xx-ST系列通道连接数没有限制,每台设备最多支持128路同时连接。
-
预览和与预览相关的模块流程图
-
图中虚线框部分的模块是与预览模块相关,必须在启动预览后才能调用,这些模块之间是并列的关系,各自完成相应的功能。
-
声音控制功能主要实现独占、共享声音的打开和关闭;音量的控制。相关接口有:NET_DVR_OpenSound、NET_DVR_CloseSound、NET_DVR_OpenSoundShare、NET_DVR_CloseSoundShare、NET_DVR_Volume等。
-
实时流数据捕获和录像模块主要实现数据回调和本地录像的功能,可以供用户后续处理。相关接口有:NET_DVR_SetRealDataCallBack、NET_DVR_SetStandardDataCallBack、NET_DVR_SaveRealData等。
-
抓图功能主要实现对当前解码图像的捕获,保存格式为BMP。相关接口有:NET_DVR_CapturePicture。
-
云台控制模块主要是在开启预览的前提下实现对云台控制的操作功能,包括云台预置点、巡航、轨迹和透明云台等。相关接口有:NET_DVR_PTZControl、NET_DVR_PTZControl_EX、NET_DVR_PTZPreset、NET_DVR_PTZPreset_EX、NET_DVR_PTZCruise、NET_DVR_PTZCruise_EX、NET_DVR_PTZTrack、NET_DVR_PTZTrack_EX、NET_DVR_TransPTZ、NET_DVR_TransPTZ_EX。
-
声音控制功能主要实现独占、共享声音的打开和关闭;音量的控制。相关接口有:NET_DVR_OpenSound、NET_DVR_CloseSound、NET_DVR_OpenSoundShare、NET_DVR_CloseSoundShare、NET_DVR_Volume等。
-
实时流解码方式
-
-
方式一:在预览接口NET_DVR_RealPlay_V30中预览参数的播放窗口句柄赋成有效句柄,则由SDK实现解码功能。在初始化SDK和注册设备两步骤后,直接调用启动预览和停止预览接口。
- 方式二:用户可以通过设置预览接口NET_DVR_RealPlay_V30中预览参数的播放窗口句柄为空值,并通过调用捕获数据的接口(即设置NET_DVR_RealPlay_V30接口中的回调函数或调用NET_DVR_SetRealDataCallBack、NET_DVR_SetStandardDataCallBack接口),获取码流数据进行后续解码播放处理。
下面示例代码以设置NET_DVR_RealPlay_V30()接口中的回调为例进行说明。
示例代码
方式一(由SDK实现解码显示)
#include
#include
#include "Windows.h"
#include "HCNetSDK.h"
#include
using namespace std;
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
char tempbuf[256] = {0};
switch(dwType)
{
case EXCEPTION_RECONNECT: //预览时重连
printf("----------reconnect--------%d\n", time(NULL));
break;
default:
break;
}
}
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("192.0.0.64", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %d\n", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//设置异常消息回调函数
NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL);
//---------------------------------------
//启动预览并设置回调数据流
LONG lRealPlayHandle;
HWND hWnd = GetConsoleWindow(); //获取窗口句柄
NET_DVR_CLIENTINFO ClientInfo = {0};
ClientInfo.hPlayWnd = hWnd; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空
ClientInfo.lChannel = 1; //预览通道号
ClientInfo.lLinkMode = 0; //最高位(31)为0表示主码流,为1表示子码流0~30位表示连接方式:0-TCP方式;1-UDP方式;2-多播方式;3-RTP方式;
ClientInfo.sMultiCastIP = NULL; //多播地址,需要多播预览时配置
BOOL bPreviewBlock = false; //请求码流过程是否阻塞,0:否,1:是
lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, NULL, NULL, 0);
if (lRealPlayHandle < 0)
{
printf("NET_DVR_RealPlay_V30 error\n");
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//关闭预览
NET_DVR_StopRealPlay(lRealPlayHandle);
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
return;
}
方式二(由用户自行处理回调得到的码流数据,此处以软解显示为例,代码中带有PlayM4_的函数参见软解码库说明文档《播放器SDK编程指南》)
#include
#include
#include "Windows.h"
#include "HCNetSDK.h"
#include "plaympeg4.h"
#include
using namespace std;
LONG lPort; //全局的播放库port号
void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,void* dwUser)
{
HWND hWnd=GetConsoleWindow();
switch (dwDataType)
{
case NET_DVR_SYSHEAD: //系统头
if (!PlayM4_GetPort(&lPort)) //获取播放库未使用的通道号
{
break;
}
//m_iPort = lPort; //第一次回调的是系统头,将获取的播放库port号赋值给全局port,下次回调数据时即使用此port号播放
if (dwBufSize > 0)
{
if (!PlayM4_SetStreamOpenMode(lPort, STREAME_REALTIME)) //设置实时流播放模式
{
break;
}
if (!PlayM4_OpenStream(lPort, pBuffer, dwBufSize, 1024*1024)) //打开流接口
{
break;
}
if (!PlayM4_Play(lPort, hWnd)) //播放开始
{
break;
}
}
case NET_DVR_STREAMDATA: //码流数据
if (dwBufSize > 0 && lPort != -1)
{
if (!PlayM4_InputData(lPort, pBuffer, dwBufSize))
{
break;
}
}
}
}
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
char tempbuf[256] = {0};
switch(dwType)
{
case EXCEPTION_RECONNECT: //预览时重连
printf("----------reconnect--------%d\n", time(NULL));
break;
default:
break;
}
}
void main() {
//---------------------------------------
// 初始化
NET_DVR_Init();
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
lUserID = NET_DVR_Login_V30("172.0.0.100", 8000, "admin", "12345", &struDeviceInfo);
if (lUserID < 0)
{
printf("Login error, %d\n", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//设置异常消息回调函数
NET_DVR_SetExceptionCallBack_V30(0, NULL,g_ExceptionCallBack, NULL);
//---------------------------------------
//启动预览并设置回调数据流
LONG lRealPlayHandle;
NET_DVR_CLIENTINFO ClientInfo = {0};
ClientInfo.hPlayWnd = NULL; //需要SDK解码时句柄设为有效值,仅取流不解码时可设为空
ClientInfo.lChannel = 1; //预览通道号
ClientInfo.lLinkMode = 0; //最高位(31)为0表示主码流,为1表示子码流0~30位表示连接方式:0-TCP方式;1-UDP方式;2-多播方式;3-RTP方式;
ClientInfo.sMultiCastIP = NULL; //多播地址,需要多播预览时配置
BOOL bPreviewBlock = false; //请求码流过程是否阻塞,0:否,1:是
lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, g_RealDataCallBack_V30, NULL, 0);
if (lRealPlayHandle < 0)
{
printf("NET_DVR_RealPlay_V30 error\n");
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return;
}
//---------------------------------------
//关闭预览
NET_DVR_StopRealPlay(lRealPlayHandle);
//注销用户
NET_DVR_Logout_V30(lUserID);
NET_DVR_Cleanup();
return;
} -
方式一:在预览接口NET_DVR_RealPlay_V30中预览参数的播放窗口句柄赋成有效句柄,则由SDK实现解码功能。在初始化SDK和注册设备两步骤后,直接调用启动预览和停止预览接口。
后一篇:Python入门学习