C# 视频监控系列(3):客户端——连接服务器并预览

简介:

1.     将以下四个dll拷贝到system32目录下,这几个文件均在根目录的Bin目录下

               DS40xxSDK.dll

               hikclient.dll

               HikPlayM4.dll

               HikServer.dll

2.     先用自带的客户端Net Client Demo(Soft Decdoe)运行下确认没有问题再根据VC++客户端的例子写对应的C#代码。

3.     最好装一个Microsoft Visual C++ 6.0,这样能把VC++的例子跑起来并调试。注意他是Win32 Release的,需要切换至Win32 Debug模式才能断点调试!!

4.     打开API文档Hikvision 板卡网络开发包编程手册V4.7,在Doc目录下。

5.     代码分析和编写对应的C#代码

          5.1     第二章编程说明中第六条我们可以看到API依次调用的顺序,可以根据函数名直接在代码中搜索调用顺序,不难发现,在HKVisionDlg.cppOnInitDialog方法能看到如下两行代码:

    MP4_ClientSetNetPort( 5050 , 6050 );

    MP4_ClientStartup(WM_MYCOMMAND,
this -> m_hWnd);

          很明显这是调用了API,其他代码就不用管了,那么我把这代码翻译到C# WinForm的Form1_Load事件里面,并且也这样调用API(封装好的SDK请看上篇文章):

            PcHikClient.MP4_ClientSetNetPort( 5050 6050 );
            PcHikClient.MP4_ClientStartup(PcHikClient.WM_USER 
+   1 this .Handle);

          5.2     根据界面上Start按钮事件能找到关键的连接上服务器,如下:

     if  (m_showmode  ==   0 )
    {
        MP4_ClientSetShowMode(NORMALMODE,
0 );
    }
    
else
    {
        MP4_ClientSetShowMode(OVERLAYMODE,COLORREF(
0xff00ff ));
    }

    nn1
= nn2 = nn3 = nn4  =   - 1 ;

    
int  itemp  =  m_shownum;
    
char  ips[ 256 ];
    
    sprintf(ips,
" %s " ,m_ipadd);

    
    hWnd5 
=  m_video5.GetSafeHwnd(); //
    aa5.m_bRemoteChannel  =   0 ;
    
switch (m_linktype)
    {
    
case   0 :
        aa5.m_bSendMode 
=  TCPMODE;
        
break ;
    
case   1 :
        aa5.m_bSendMode 
=  UDPMODE;
        
break ;
    
case   2 :
        aa5.m_bSendMode 
=  MULTIMODE;
        
break ;
    
case   3 :
        aa5.m_bSendMode 
=  DIALING;
        
break ;
    
case   4 :
        aa5.m_bSendMode 
=  AUDIODETACH;
        
break ;
    
default :
        aa5.m_bSendMode 
=  TCPMODE;
        
break ;
    }

    aa5.m_sIPAddress 
=  ips;
    
// 2003.12.2
    
// 如果想只录像,而不进行解码,可以将m_hShowVideo设置成NULL
    
// If you just want to record without decode on client side,
    
// please set m_hShowVideo as NULL
#if  defined RECORD_ONLY
    aa5.m_hShowVideo 
=  NULL;
#else
    aa5.m_hShowVideo 
=  hWnd5;
#endif

    
//  add 2003.12.2
    
// m_nImgFormat 指明想要获取的图像格式
    
// 依赖服务器端的设置。如果不设置,获取的是服务器的缺省格式
    
// m_nImgFormat indicates the picture format you get on the client side,
    
// It depends on the setting of Server side.
    aa5.m_nImgFormat  =   0 ;     //  request CIF format
//     aa5.m_nImgFormat = 1;     //  request QCIF format

    aa5.m_sUserName 
=   " 123 " ;
    aa5.m_sUserPassword
= " w " ;
    aa5.m_bUserCheck 
=  TRUE;
    
    MP4_ClientSetTTL(
64 );
    nn1 
=  MP4_ClientStart( & aa5,ReadDataCallBack);
    
if  (nn1  ==   - 1 )
    {
        MessageBox(
" error " );
        
return ;
    }
    
//
    BOOL breturn;
    breturn 
=  MP4_ClientRigisterDrawFun(nn1,DrawFun, 0 );
    
switch (m_delaytype)
    {
    
case   0 :
        MP4_ClientSetBufferNum(nn1,
40 );
        MP4_ClientSetPlayDelay(nn1,
580 );
        
break ;
    
case   1 :
        MP4_ClientSetBufferNum(nn1,
15 );
        MP4_ClientSetPlayDelay(nn1,
40 );
        
break ;
    
case   2 :
        MP4_ClientSetBufferNum(nn1,
15 );
        MP4_ClientSetPlayDelay(nn1,
0 );
        
break ;
    
case   3 :
        MP4_ClientSetBufferNum(nn1,
0 );
        MP4_ClientSetPlayDelay(nn1,
0 );
        
break ;
    }


//     MP4_ClientThrowBFrame(nn1,m_bframenum);
    MP4_ClientSetCapPicCallBack(nn1,CapPicFun);

          有VC++代码可以看得出来接下来代码都和这差不多,应该就是初始化显示四个窗口的代码了,那我们就不需要把这个方法里面的代码全部翻译了,只需要达到连接一个视频窗口的目的就可以了,翻译的过程中可以自己先临时设置一些变量来让代码跑起来,翻译过程中每次都执行到MP4_ClientRigisterDrawFun方法的时候就报错了,但是画面确已经出来了,所有我就从这里截断了,先达到目的再说,请看翻译对象的C#代码:

int  cs;

        
private   void  button1_Click( object  sender, EventArgs e)
        {
            CLIENT_VIDEOINFO cVideo 
=   new  CLIENT_VIDEOINFO();
            
// 对应服务端通道号
            cVideo.m_bRemoteChannel  =  ( byte ) 0 ;
            
// 网络连接模式
            cVideo.m_bSendMode  =  ( byte )SEND_MODE.TCPMODE;
            
// 服务端IP地址
            cVideo.m_sIPAddress  =   " 192.168.0.188" ;
            
// 显示区域
            cVideo.m_hShowVideo  =  pVideo.Handle; // (IntPtr)null;
            
// 图像格式
            cVideo.m_nImgFormat  =  ( byte ) 0 ;
            
// 用户名
            cVideo.m_sUserName  =   " 123 " ;
            
// 密码
            cVideo.m_sUserPassword  =   " w " ;
            
// 是否需要发生密码
            cVideo.m_bUserCheck  =   true ;

            
// 设置多播的TTL参数
            PcHikClient.MP4_ClientSetTTL(( char ) 64 );
            
// 启动客户端
            cs  =  PcHikClient.MP4_ClientStart( ref  cVideo,  new  ReadDataCallBack(MyRealDataCallBack1));
        }

        
private   void  MyRealDataCallBack1( ulong  port, [MarshalAs(UnmanagedType.LPArray)]  byte [] pBuffer,  ulong  pSize)
        {
            MessageBox.Show(pBuffer.Length.ToString());
        }

          需要注意的是,VC++里面的指针类型,如HWND一般可以对应C#里面的IntPtr数据类型,ReadDataCallBack是回调函数,但是没有执行,不过至此画面已经能够显示出来!!

那么接下来做画面切割,右键事件什么的都只需要你WinForm的开发经验了,我是用的四个面板(Panel)切换隐藏显示的;pVideo是Panel控件;用户名和密码随便设置也能连得上。

          5.3     关闭连接

               同样找到VC++代码:

     if  (nn1  >=   0 )
    {
        MP4_ClientStopCapture(nn1);
        MP4_ClientStop(nn1);
    }

               对应C#代码:

         private   void  Close()
        {
            PcHikClient.MP4_ClientStopCapture(cs);
            PcHikClient.MP4_ClientStop(cs);
            pVideo.Invalidate(
true );
        }

               需要注意的是这个cs变量,在连接的时候MP4_ClientStart返回值,需要拿全局变量保存起来,以便这里关闭的时候需要,从API文章里面我们也能看到这样的说明。这段代码最好在窗体关闭的时候也加上!!

本文转自博客园农民伯伯的博客,原文链接:C# 视频监控系列(3):客户端——连接服务器并预览,如需转载请自行联系原博主。

目录
相关文章
|
22天前
|
设计模式 IDE API
C# 一分钟浅谈:GraphQL 客户端调用
本文介绍了如何在C#中调用GraphQL API,涵盖基本步骤、常见问题及解决方案。首先,通过安装`GraphQL.Client`库并创建客户端实例,连接到GraphQL服务器。接着,展示了如何编写查询和突变,以及处理查询语法错误、变量类型不匹配等常见问题。最后,通过具体案例(如管理用户和订单)演示了如何在实际项目中应用这些技术,帮助开发者更高效地利用GraphQL。
65 38
C# 一分钟浅谈:GraphQL 客户端调用
|
25天前
|
设计模式 API 数据处理
C# 一分钟浅谈:GraphQL 客户端调用
本文介绍了如何在C#中使用`GraphQL.Client`库调用GraphQL API,涵盖基本查询、变量使用、批量请求等内容,并详细说明了常见问题及其解决方法,帮助开发者高效利用GraphQL的强大功能。
95 57
|
2月前
|
IDE 网络安全 开发工具
IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了),打开文件夹后切换文件夹。
本文介绍了如何使用VS Code通过Remote-SSH插件连接远程服务器进行代码开发,并与PyCharm进行了对比。作者认为VS Code在连接和配置多个服务器时更为简单,推荐使用VS Code。文章详细说明了VS Code的安装、远程插件安装、SSH配置文件编写、服务器连接以及如何在连接后切换文件夹。此外,还提供了使用密钥进行免密登录的方法和解决权限问题的步骤。
874 0
IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了),打开文件夹后切换文件夹。
|
2月前
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
446 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
|
2月前
|
Apache 数据中心 Windows
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
|
2月前
|
弹性计算 安全 Windows
通过远程桌面连接Windows服务器提示“由于协议错误,会话将被中断,请重新连接到远程计算机”错误怎么办?
通过远程桌面连接Windows服务器提示“由于协议错误,会话将被中断,请重新连接到远程计算机”错误怎么办?
|
数据采集 监控 网络协议
linux系统中利用QT实现视频监控的基本方法
linux系统中利用QT实现视频监控的基本方法
392 0
|
2天前
|
机器学习/深度学习 传感器 人工智能
AI视频监控系统在养老院中的技术实现
AI视频监控系统在养老院的应用,结合了计算机视觉、深度学习和传感器融合技术,实现了对老人体征、摔倒和异常行为的实时监控与分析。系统通过高清摄像头和算法模型,能够准确识别老人的动作和健康状况,并及时向护理人员发出警报,提高护理质量和安全性。
28 14
|
监控 定位技术 安全
Qt编写安防视频监控系统10-视频轮询
一、前言 视频轮询在视频监控系统中是一个基础的核心功能,尤其是上了大屏以后,这个功能是必须的,根据预先设定的轮询间隔逐个加载视频到预先设定的通道画面数中,轮询间隔、轮询画面数、轮询采用的码流类型(主码流、子码流)都可以在系统设置中进行统一设置,轮询的视频源采用摄像机表中的所有摄像机,当画面数不够的时候,其余留空显示即可,轮询到最后一个视频,重新从第一个开始轮询。
1646 0
|
7月前
|
存储 监控 安全
【亮剑】指导初学者如何搭建和使用网络视频监控系统。
【4月更文挑战第30天】本文指导初学者如何搭建和使用网络视频监控系统。核心设备包括摄像头(如固定、PTZ、多目、夜视)、存储选项(NVR、DVR、云存储)及网络交换机等。安装配置步骤涉及规划布局、安装摄像头、设置存储设备和软件配置。实时监控包括实时查看、接收警报和录像回放。理解设备功能、合理布局并细心操作,就能建立稳定监控体系。随着技术进步,未来监控系统将更智能、高效,保障安全。
624 0

热门文章

最新文章

下一篇
DataWorks