海康DVS预览例程

预览模块流程

  • 实时预览支持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_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

停止数据捕获

NET_DVR_StopSaveRealData


 

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值