预览模块流程
- 实时预览支持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路同时连接。
-
预览和与预览相关的模块流程图
图中虚线框部分的模块是与预览模块相关,必须在启动预览后才能调用,这些模块之间是并列的关系,各自完成相应的功能。
- 声音控制功能主要实现独占、共享声音的打开和关闭;音量的控制。相关接口有: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_RealPlay_V30中预览参数的播放窗口句柄赋成有效句柄,则由SDK实现解码功能。在初始化SDK和注册设备两步骤后,直接调用启动预览和停止预览接口。
- 方式二:用户可以通过设置预览接口NET_DVR_RealPlay_V30中预览参数的播放窗口句柄为空值,并通过调用捕获数据的接口(即设置NET_DVR_RealPlay_V30接口中的回调函数或调用NET_DVR_SetRealDataCallBack、NET_DVR_SetStandardDataCallBack接口),获取码流数据进行后续解码播放处理。
下面示例代码以设置NET_DVR_RealPlay_V30()接口中的回调为例进行说明。
示例代码
方式一(由SDK实现解码显示)
#include <stdio.h> #include <iostream> #include "Windows.h" #include "HCNetSDK.h" #include <time.h> 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 <stdio.h> #include <iostream> #include "Windows.h" #include "HCNetSDK.h" #include "plaympeg4.h" #include <time.h> 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;
}
相关API
设备型号 | 功能 | 接口 | 相关参数 |
---|---|---|---|
预览相关功能 | |||
DS-90xx、DS-91xx系列设备 | 设置播放显示模式 | NET_DVR_SetShowMode | |
DS-90xx、DS-91xx系列设备 | 主码流动态产生一个关键帧 | NET_DVR_MakeKeyFrame | |
DS-90xx、DS-91xx系列设备 | 子码流动态产生一个关键帧 | NET_DVR_MakeKeyFrameSub | |
DS-90xx、DS-91xx系列设备 | 实时预览 | NET_DVR_RealPlay_V30 | |
DS-90xx、DS-91xx系列设备 | 停止预览 | NET_DVR_StopRealPlay | |
DS-90xx、DS-91xx系列设备 | 获取预览时用来解码和显示的播放器句柄 | NET_DVR_GetRealPlayerIndex | |
DS-90xx、DS-91xx系列设备 | 获取预览视频显示参数 | NET_DVR_ClientGetVideoEffect | |
DS-90xx、DS-91xx系列设备 | 设置预览视频显示参数 | NET_DVR_ClientSetVideoEffect | |
DS-90xx、DS-91xx系列设备 | 预览画面叠加字符和图像 | NET_DVR_RigisterDrawFun | |
DS-90xx、DS-91xx系列设备 | 设置播放库的帧缓冲区个数 | NET_DVR_SetPlayerBufNumber | |
DS-90xx、DS-91xx系列设备 | 设置解码时丢弃B帧的个数 | NET_DVR_ThrowBFrame | |
DS-90xx、DS-91xx系列设备 | 设置声音播放模式 | NET_DVR_SetAudioMode | |
DS-90xx、DS-91xx系列设备 | 独占声卡模式下开启声音 | NET_DVR_OpenSound | |
DS-90xx、DS-91xx系列设备 | 独占声卡模式下关闭声音 | NET_DVR_CloseSound | |
DS-90xx、DS-91xx系列设备 | 共享声卡模式下开启声音 | NET_DVR_OpenSoundShare | |
DS-90xx、DS-91xx系列设备 | 共享声卡模式下关闭声音 | NET_DVR_CloseSoundShare | |
DS-90xx、DS-91xx系列设备 | 调节播放音量 | NET_DVR_Volume | |
DS-90xx、DS-91xx系列设备 | 初始化系统中的显示设备 | NET_DVR_InitDDrawDevice | |
DS-90xx、DS-91xx系列设备 | 释放显示设备占用的资源 | NET_DVR_ReleaseDDrawDevice | |
DS-90xx、DS-91xx系列设备 | 获取系统的显示设备的数量 | NET_DVR_GetDDrawDeviceTotalNums | |
DS-90xx、DS-91xx系列设备 | 设置播放窗口所使用的显卡 | NET_DVR_SetDDrawDevice | |
DS-90xx、DS-91xx系列设备 | 注册回调函数,捕获实时码流数据 | NET_DVR_SetRealDataCallBack | |
DS-90xx、DS-91xx系列设备 | 注册回调函数,捕获实时码流数据(标准码流) | NET_DVR_SetStandardDataCallBack | |
DS-90xx、DS-91xx系列设备 | 捕获数据并存放到指定的文件中 | NET_DVR_SaveRealData | |
DS-90xx、DS-91xx系列设备 抓图相关API | 停止数据捕获 | ||
DS-90xx、DS-91xx系列设备 | 单帧数据捕获并保存成BMP位图 | NET_DVR_CapturePicture | |
DS-90xx、DS-91xx系列设备 | 单帧数据捕获并保存成JPEG图 | NET_DVR_CaptureJPEGPicture | |
DS-90xx、DS-91xx系列设备 | 单帧数据捕获并保存成JPEG存放在指定的内存空间中 | NET_DVR_CaptureJPEGPicture_NEW |
设置抓图模式
NET_DVR_SetCapturePictureMode