加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2013-01-15 23:01:43)
标签:

海康微视

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路同时连接。
预览和与预览相关的模块流程图

https://www.evernote.com/shard/s117/res/64c0aca3-9b2f-4c41-8f5e-0b637b29a762.png?resizeSmall&width=721

图中虚线框部分的模块是与预览模块相关,必须在启动预览后才能调用,这些模块之间是并列的关系,各自完成相应的功能。



实时流解码方式



下面示例代码以设置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;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有