开发者社区> 科技小先锋> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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(50506050);
            PcHikClient.MP4_ClientStartup(PcHikClient.WM_USER 
+ 1this.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文章里面我们也能看到这样的说明。这段代码最好在窗体关闭的时候也加上!!

 

注意

     摘抄:

DS400xM/DS400xH卡在客户端机器运行的要求     主要是针对运行客户端程序的计算机显卡有要求,需支持Overlay功能,目前主流的显卡nvidia,ati,Intel845GL集成的系列都支持Overlay功能。

     在PIII 833的计算机上,可以比较流畅的软解码4路普通的实时图象;在PIV 2G的计算机上,可以比较流畅的软解码8-9路普通的实时图象;如果用我们公司的硬解码卡,只要显卡支持Overlay功能,就可以支持最多达24路的实时图象,并且支持VideoOut功能,可以上电视墙。

 


本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586696,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ESP32-C3 应用 篇(实例一、通过MQTT协议连接ONENET上报传感器数据,云平台下发灯光调色)
ESP32-C3学到现在,我们已经掌握了从基本外设到网络服务端的相关知识, 这篇文章就是做一个简单的应用,使用开发板连接ONENET云平台, 使用MQTT协议,上报温湿度和光照数据,平台下发命令控制全彩灯颜色切换。
0 0
unity3d检测网络是wifi连接还是数据连接或者已断开连接
using UnityEngine; public class NwtWork : MonoBehaviour { private float time = 0f; void Update() { time += Time.
541 0
如何用fiddler + 手机设置无线代理 下载只有 手机才能访问的资源。
我主要用来获取,一些特定的API,研究学习。 责任声明: 如果你用来违法犯罪,与我无关。   1.使电脑成为代理服务器 架代理服务器的软件有很多,自己百度一下。也可以用现成的代理软件。(其实Fiddler就是一种可以设置成代理的软件) 2.设置手机代理 退出 手机的代理设置后,方能生效   3.设置fiddler 中的选项       4.用手机访问资源,在Fiddler中看到 向下的绿色箭头时,一般是视频资源。
1002 0
使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)
原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图。下面就来看看本文实现的功能: Silverlight 与服务器利用Socket通讯,实时从服务器获取数据(本文中的数据是地理坐标),由于没有GPS,所以本文在服务器写了一个构造新坐标的函数(本文是一个三角函数),然后利用Timer组件,实时调用,得到新的坐标,并将新的坐标发送给客户端,客户端接收到发回的新的坐标,并在地图相应的位置进行标识。
666 0
【技术贴】最新唯一解决:未能创建视频预览,请检查设备连接,确定没有其他应用程序或用户使用该设备
【技术贴】最新唯一解决:摄像头未能创建视频预览,请检查设备连接,确定没有其他应用程序或用户使用该设备。     搞了两个月都没有解决,今天给解决了!!!!哇哈哈哈哈   1.百度一下【终极解码2011】,下载进行安装,立即可以解决!!!最终确定就是暴风影音的问题,它占用了摄像头的影像编码。
792 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
新浪微博混合云创新:15分钟自动扩容1000台服务器
立即下载
网站/服务器取证 实践与挑战
立即下载
网站/服务器取证实践与挑战
立即下载