天天看点

C# 视频监控系列(2):客户端——封装API

前言

参考

系列

注意

     本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心、实现以及其他能够贴出来的代码我都会贴出来,并且争取尽所能的回答评论里的每一个问题,感谢大家关注,欢迎交流 :)

正文

     本章主要是贴封装好的api调用代码,所以直接就贴代码了。

     代码说明:

          1.     c#调用vc++写好的dll在这里就不介绍了,重点和难点在于参数数据类型对应,下一章将有所总结。

          2.     注释比较详尽,注释里summary节点里有函数的vc++原型。

C# 视频监控系列(2):客户端——封装API

using system;

using system.runtime.interopservices;

namespace hikclient

{

    #region struct

    /// <summary>

    /// 客户端的参数结构

    /// 说明:如果将m_busercheck置为false,则把用户名和密码作为空指针发送到服务器。虽然用户名和密

    /// 码的内容不能超过50字节,但是用户名和密码缓冲区长度必须大于等于50,因为内部操作的时候直接从

    /// 用户名或密码缓冲区拷贝50字节到发送缓冲区里。 

    /// </summary>

    public struct client_videoinfo

    {

        /// <summary>

        /// 对应服务端的的通道号

        /// </summary>

        public byte m_bremotechannel;

        /// 网络连接方式

        public byte m_bsendmode;

        /// 图像格式,0为服务端主通道的图像 ;1为服务端子通道的图像

        public byte m_nimgformat;

        /// 服务端的ip地址

        public string m_sipaddress;

        /// 用户名 

        public string m_susername;

        /// 密码 

        public string m_suserpassword;

        /// 是否需要发送用户名和密码

        public bool m_busercheck;

        /// 显示区域

        public system.intptr m_hshowvideo;

    }

    #endregion

    #region enum

    /// 网络连接方式

    public enum send_mode

        /// udp方式

        udpmode = 0,

        /// tcp方式

        tcpmode,

        /// 多播方式

        multimode,

        /// 电话线方式

        dialing,

        /// 音频流畅模式

        audiodetach

    };

    /// 显示模式

    public enum disp_mode

        /// 可以同时显示多个窗口,但对显卡有一定要求

        normalmode = 0,

        /// 只能同时显示一个窗口,但是对显卡没有什么要求

        overlaymode

    #region delegate

    /// 读实时数据回调。用于读取数据流。如果readdatacallback为null,表示不需要读取数据流

    /// 

    /// void(callback*readdatacallback)(dword nchannel,uchar *ppacketbuffer,dword npacketsize)); 

    /// <param name="nchannel">表示通道号</param>

    /// <param name="ppacketbuffer">数据缓存指针</param>

    /// <param name="npacketsize">数据个数</param>

    public delegate void readdatacallback(ulong nchannel, [marshalas(unmanagedtype.lparray)] byte[] ppacketbuffer, ulong npacketsize);

    /// 捕图回调

    /// void (callback* cappicfun)(long stockhandle, char * pbuf, long nsize, long nwidth, long nheight, long nstamp, long ntype, long nreceaved)

    /// <param name="stockhandle">mp4_clientstart成功返回的值。</param>

    /// <param name="pbuf">返回图像数据</param>

    /// <param name="nsize">返回图像数据大小</param>

    /// <param name="nwidth">画面宽,单位像素</param>

    /// <param name="nheight">画面高</param>

    /// <param name="nstamp">时标信息,单位毫秒</param>

    /// <param name="ntype">数据类型, t_rgb32,t_uyvy详见宏定义说明。</param>

    /// <param name="nreceaved">保留</param>

    public delegate void cappicfun(int stockhandle, intptr pbuf, int nsize, int nwidth, int nheight, int nstamp, int ntype, int nreceaved);

    /// 画

    public delegate void drawfun(int stockhandle, system.drawing.graphics hdc, int nuser);

    /// hikclient.dll   hikclient

    public class pchikclient

        public static readonly uint wm_user = 0x0400;

        #region 客户端函数

        /// 对客户端初始化

        ///     注:在调用所有其他客户端函数之前调用。

        /// 

        /// 1.  bool  __stdcall mp4_clientstartup(uint nmessage,hwnd hwnd);

        /// <param name="nmessage">表示对应接收程序的消息。</param>

        /// <param name="hwnd">表示应用程序窗口句柄。</param>

        /// <returns>返回true表示成功,返回false表示失败。</returns>

        [dllimport("hikclient.dll")]

        public static extern bool mp4_clientstartup(uint nmessage, intptr hwnd);

        /// 结束调用客户端函数。

        ///     注:调用mp4_clientcleanup()后不能再调用其他客户端函数。

        /// 2.  bool  __stdcall mp4_clientcleanup();

        public static extern bool mp4_clientcleanup();

        /// 启动客户端

        ///     注 :mp4_clientstart返回成功,并不表示已经成功连接服务端。您需要通过mp4_clientgetstate函数 

        ///     去获得网络连接的状态 

        /// 3.  long __stdcall mp4_clientstart(pclient_videoinfo pclientinfo, void(callback*readdatacallback)(dword nchannel,uchar *ppacketbuffer,dword npacketsize));

        /// <param name="pclientinfo"></param>

        /// <param name="rdcb">用来读取数据流。如果readdatacallback为null,表示不需要读取数据流。 </param>

        /// <returns>返回-1表示失败,其他值表示成功。作为后续操作的参数。</returns>

        public static extern int mp4_clientstart(ref client_videoinfo pclientinfo, readdatacallback rdcb);

        /// 停止客户端。

        /// 4.  bool  __stdcall mp4_clientstop(long stockhandle); 

        /// <param name="stockhandle">mp4_clientstart成功返回的值。</param>

        public static extern bool mp4_clientstop(long stockhandle);

        /// 获取客户端状态

        ///     -1  :   无效

        ///     1   :   连接

        ///     2   :   开始接收图像

        ///     3   :   异常退出

        ///     4   :   接收完毕,退出

        ///     5   :   无法联系服务器

        ///     6   :   服务器拒绝访问

        /// 5.long  __stdcall mp4_clientgetstate(long stockhandle);

        /// <param name="stockhandle">成功返回的值</param>

        /// <returns></returns>

        public static extern int mp4_clientgetstate(long stockhandle);

        /// 开始客户端的数据捕获(回调方式,使用mp4_clientstart中的readdatacallback函数)。

        /// 6.bool __stdcall mp4_clientstartcapture(long stockhandle);

        public static extern bool mp4_clientstartcapture(long stockhandle);

        /// 开始客户端的数据捕获(直接写文件方式)。

        /// 7.bool  __stdcall mp4_clientstartcapturefile(long stockhandle, lptstr filename);

        /// <param name="filename">文件名。 </param>

        public static extern bool mp4_clientstartcapturefile(int stockhandle, string filename);

        /// 停止客户端的数据捕获。

        ///     对mp4_clientstartcapture和mp4_clientstartcapturefile都有效。 

        /// 8.bool __stdcall mp4_clientstopcapture(long stockhandle); 

        public static extern bool mp4_clientstopcapture(int stockhandle);

        /// 获取服务端的通道数。

        /// 9.word  __stdcall mp4_clientgetserverchannum(lpctstr m_sipaddress);

        /// <param name="m_sipaddress">服务端的ip地址。</param>

        /// <returns>返回0表示失败,其他值表示通道数。</returns>

        public static extern ushort mp4_clientgetserverchannum(string m_sipaddress);

        /// 给服务器发送字符串

        /// 10.bool  __stdcall mp4_clientcommandtoserver(lpctstr m_laddrip, char *m_scommand,word m_wlen)

        /// <param name="m_laddrip">服务器ip地址</param>

        /// <param name="m_scommand">消息缓冲指针</param>

        /// <param name="m_wlen">消息缓冲长度,必须小于900个字节</param>

        /// <returns>返回0表示失败,其他值表示通道数。 </returns>

        public static extern bool mp4_clientcommandtoserver(string m_laddrip, string m_scommand, ushort m_wlen);

        /// 对服务端的nchannel通道网络连接初始化,结束当前所有用户对它的访问。

        /// 11.bool  __stdcall mp4_clientshut(lpctstr m_laddrip,char nchannel);

        /// <param name="m_laddrip">表示服务端的ip地址。</param>

        /// <param name="cchannel">表示服务端通道号。</param>

        /// <returns>返回true表示成功,返回false表示失败。 </returns>

        public static extern bool mp4_clientshut(string m_laddrip, char cchannel);

        /// 读取服务端消息。

        ///     读取服务端mp4_serverstringtoclient函数发送过来的消息。(不超过900字节)

        /// 12.  void  __stdcall mp4_clientreadlastmessage(char * m_sip ,char *m_scommand,word *m_wlen); 

        /// <param name="m_sip">消息来自哪个ip地址。</param>

        /// <param name="m_scommand">消息缓冲区指针。 </param>

        /// <param name="m_wlen">消息缓冲区长度。</param>

        public static extern void mp4_clientreadlastmessage(string m_sip, out string m_scommand, out ushort m_wlen);

        /// 设置当前播放器音量。

        /// 13.bool  __stdcall mp4_clientaudiovolume(word wvolume); 

        /// <param name="wvolume">音量值(0-0xffff) </param>

        public static extern bool mp4_clientaudiovolume(ushort wvolume);

        /// 选定某个播放器播放声音,其他播放器静止。

        /// 14.  bool  __stdcall mp4_clientaudiostart(long stockhandle);

        public static extern bool mp4_clientaudiostart(long stockhandle);

        /// 停止播放声音

        /// 15.  bool  __stdcall mp4_clientaudiostop();

        public static extern bool mp4_clientaudiostop();

        /// 功能同mp4_clientcommandtoserver,只是第一个参数使用了mp4_clientstart成功返回的值。

        /// 16. bool __stdcall mp4_clientcommandtoserver_handle(long stockhandle,char *m_scommand, word m_wlen); 

        /// <param name="stockhandle"></param>

        /// <param name="m_scommand"></param>

        /// <param name="m_wlen"></param>

        public static extern bool mp4_clientcommandtoserver_handle(int stockhandle, out string m_scommand, ushort m_wlen);

        /// 系统是否支持网络播放器(在显示模式设为normalmode的情况下)。

        /// 17.int   __stdcall mp4_clientissupport(); 

        /// <returns>返回值的低8位每位表示一个信息。每一位的定义如上所示,0表示不支持,1表示支持。 

        /// 如果support_ddraw、support_blt、support_cpu其中有一个为0,表示播放器根本无法播放; 

        /// 如果support_bltfour、support_bltshrinkx、support_bltshrinky、 

        /// support_bltstretchx、support_bltstretchy其中有一个为0,表示播放器虽然能够播放,但

        /// 是效率很低,有可能因为cpu利用率太高而无法显示。 

        /// 播放器必须在增强色(16位),或者真彩色(32位)模式下运行。如果出现support_bltfourcc、 

        /// support_bltshrinkx、support_bltshrinky、support_bltstretchx、 

        /// support_bltstretchy其中有一个为0,会采用软件显示方式,这时候必须在真彩色(32位)模式下才

        /// 能运行。 

        /// </returns>

        public static extern int mp4_clientissupport();

        /// 增加接收缓冲区大小。

        ///     说明:wbufnum值每增加1,表示接收缓冲区增加1帧的数据量。如果以5帧/秒的帧率播放,那么wbufnum=5,表示增加了5帧的缓冲区。 

        /// 18.  bool  __stdcall mp4_clientsetbuffernum(long stockhandle,word wbufnum);

        /// <param name="wbufnum">增加缓冲区个数,0-50。</param>

        public static extern bool mp4_clientsetbuffernum(long stockhandle, ushort wbufnum);

        /// 设置服务端的网络端口号和客户端的网络端口号。同mp4_serversetnetport

        /// 19.  bool  __stdcall mp4_clientsetnetport(word dserverport,word dclientport); 

        /// <param name="dserverport">服务端的起始网络端口号。</param>

        /// <param name="dclientport">客户端的网络端口号。</param>

        public static extern bool mp4_clientsetnetport(ushort dserverport, ushort dclientport);

        /// 设置多播的ttl参数。

        /// 20.  bool     __stdcall mp4_clientsetttl(unsigned char cttlval);

        /// <param name="cttlval">ttl值。1-255,默认32。 </param>

        public static extern bool mp4_clientsetttl(char cttlval);

        /// 接收多少数据后才开始播放。 

        /// 21.  bool  __stdcall mp4_clientsetplaydelay(long stockhandle,word delaylen); 

        /// <param name="delaylen">预先接收的数据量。单位:k。范围:0-600</param>

        public static extern bool mp4_clientsetplaydelay(long stockhandle, ushort delaylen);

        /// 设置连接服务端的等待时间和尝试次数。参数说明同mp4_serversetwait。

        /// 22.  bool  __stdcall mp4_clientsetwait(dword deachwaittime,dword dtrynum);

        /// <param name="deachwaittime"></param>

        /// <param name="dtrynum"></param>

        public static extern bool mp4_clientsetwait(ulong deachwaittime, ulong dtrynum);

        /// 设置播放器的显示模式。

        /// 23.  bool  __stdcall mp4_clientsetshowmode(dword dshowtype,colorref colorkey);

        /// <param name="dshowtype">显示模式。normalmode或者overlaymode。</param>

        /// <param name="colorkey">用户设置的透明色,透明色相当于一层透视膜,显示的画面只能穿过这种颜色,而其他的颜色

        /// 将挡住显示的画面。用户应该在显示窗口中涂上这种颜色,那样才能看到显示画面。一般应该使用一种不

        /// 常用的颜色作为透明色。这是一个双字节值0x00rrggbb,最高字节为0,后三个字节分别表示r,g,b的值。</param>

        //public static extern bool mp4_clientsetshowmode(uint32 dshowtype, system.drawing.color colorkey);

        public static extern bool mp4_clientsetshowmode(ulong dshowtype, int colorkey);

        /// 设置图象质量。

        ///     说明:设置图像质量,当设置成高质量时画面效果好,但cpu利用率高。在支持多路播放时,可以设为

        ///     低质量(lowquality),以降低cpu利用率;当某路放大播放时将该路设置成高质量(highquality),

        ///     以达到好的画面效果。 

        /// 24.  bool  __stdcall mp4_clientsetquality(long stockhandle,word wpicquality);

        /// <param name="wpicquality">图象质量。lowquality表示低图象质量,highquality表示高图象质量。</param>

        public static extern bool mp4_clientsetquality(long stockhandle, ushort wpicquality);

        /// 设置抓图回调函数。

        ///     注意要尽快返回,如果要停止回调,可以把回调函数指针cappicfun设为null。一旦设置回调函数,则

        ///     一直有效,直到程序退出。

        /// 25.  bool __stdcall mp4_clientsetcappiccallback(long stockhandle,  void (callback* cappicfun)(long stockhandle, char * pbuf, long nsize, long nwidth, long nheight, long nstamp, long ntype, long nreceaved)); 

        /// <param name="x"></param>

        public static extern bool mp4_clientsetcappiccallback(int stockhandle, cappicfun x);

        /// 将抓图得到的图像数据保存成bmp文件。

        ///     保存函数需要占用的较多cpu资源,如果不需要保存图片,则不要调用。

        /// 26.bool __stdcall  mp4_clientsavepicfile(char * pbuf,long nsize,long nwidth,long nheight,long ntype,char *sfilename); 

        /// <param name="pbuf">返回图像数据</param>

        /// <param name="nsize">返回图像数据大小</param>

        /// <param name="nwidth">画面宽,单位像素</param>

        /// <param name="nheight">画面高</param>

        /// <param name="ntype">数据类型, t_rgb32,t_uyvy详见宏定义说明。</param>

        /// <param name="sfilename">要保存的文件名</param>

        public static extern bool mp4_clientsavepicfile(intptr pbuf, int nsize, int nwidth, int nheight, int ntype, string sfilename);

        /// 设置解码时丢弃b帧的个数。

        ///     说明: 丢弃的b帧个数越多,cpu利用率越低,动画感越明显。

        /// 27.bool  __stdcall mp4_clientthrowbframe(long stockhandle,dword dnum);

        /// <param name="stockhandle">mp4_clientstart成功返回的值。 </param>

        /// <param name="dnum">丢弃的帧个数。(0,1,2)</param>

        public static extern bool mp4_clientthrowbframe(long stockhandle, ulong dnum);

        /// 获取已经解码的总帧数。 

        /// 28. dword  __stdcall mp4_clientgetframenum(long stockhandle); 

        /// <returns>返回帧数值。</returns>

        public static extern ulong mp4_clientgetframenum(int stockhandle);

        /// 获取版本号。

        /// 29.dword  __stdcall  mp4_clientgetsdkversion() 

        public static extern uint mp4_clientgetsdkversion();

        /// 30.设置播放声音的模式。

        ///     1> singleaudio模式下只能调用 mp4_clientaudiostart和mp4_clientaudiostop。 

        ///     2> multiaudio模式下只能调用 mp4_clientaudiostartshare和mp4_clientaudiostopshare。 

        ///     3>两种模式下都可以调用mp4_clientaudiovolume。 

        ///     4>在客户端软件运行过程中,用户可以在关闭所有播放器的声音之后,可以调用该函数修改播放模式。但

        ///     是建议用户最好在客户端软件初始化的时候设置一次播放模式,之后不再修改。 

        /// 30.bool  __stdcall mp4_clientaudiomode(word wmode) 

        /// <param name="wmode">有两个选项。默认使用singleaudio。

        /// singleaudio:开发包原来的模式。在一个客户端软件中,同时最多只有一个播放器可以播放声音;

        /// multiaudio:新增加的模式。在一个客户端软件中,同时可以有多个播放器播放声音。 

        /// </param>

        public static extern bool mp4_clientaudiomode(ushort wmode);

        /// 开始播放某一路声音。multiaudio模式下使用。

        /// 31. bool  __stdcall mp4_clientaudiostartshare(long stockhandle)

        public static extern bool mp4_clientaudiostartshare(long stockhandle);

        /// 停止播放声音。multiaudio模式下使用。

        /// 32. bool  __stdcall mp4_clientaudiostopshare(long stockhandle) 

        public static extern bool mp4_clientaudiostopshare(long stockhandle);

        /// 设置多播组地址和网络端口号。 

        /// 说明: 

        ///     1>目前的多播组采用了两种方式:一是开发包内部分配,用户不需要考虑多播组参数细节,默认采用这种

        ///     方式;另一种是调用mp4_clientcastgroup设置多播组参数。 

        ///     2>该函数在mp4_clientstart或mp4_clientstart_card之后调用。 

        ///     3>每个多播组会占用wport开始的4个端口。 

        /// 33.bool  __stdcall mp4_clientcastgroup(long stockhandle,char *sip,word wport)

        /// <param name="sip">多播组地址。</param>

        /// <param name="wport">多播组网络端口号。 </param>

        public static extern bool mp4_clientcastgroup(long stockhandle, out string sip, ushort wport);

        /// 设置叠加字幕的回调函数。

        /// 34. bool  __stdcall  mp4_clientrigisterdrawfun(long stockhandle, void (callback* drawfun)(long stockhandle,hdc hdc,long nuser),long nuser).

        /// <param name="x">dc句柄。</param>

        /// <param name="nuser">保留。设置成null。</param>

        public static extern bool mp4_clientrigisterdrawfun(long stockhandle, drawfun x, long nuser);

        /// 清除数据缓冲区。包括客户端和服务端

        /// 35.bool __stdcall mp4_clientcleanbuffer(long nport,int ncleantype)

        /// <param name="nport">mp4_clientstart的返回值。 </param>

        /// <param name="ncleantype">

        /// 清除类型。 ncleantype为0只清除客户端缓冲区,ncleantype为1只清除服务端缓冲区,

        /// ncleantype为2清除客户端/服务端缓冲区。 

        public static extern bool mp4_clientcleanbuffer(long nport, int ncleantype);

        /// 设置视频参数。

        /// 36.bool  mp4_clientsetvideopara(long stockhandle,dword nregionnum, int nbrightness, int ncontrast, int nsaturation, int nhue) 

        /// <param name="nregionnum">暂时不用,设置成0。</param>

        /// <param name="nbrightness">亮度,默认64; 范围0-128;</param>

        /// <param name="ncontrast">对比度,默认64; 范围0-128;</param>

        /// <param name="nsaturation">饱和度,默认64; 范围0-128;</param>

        /// <param name="nhue">色调,默认64; 范围0-128;</param>

        public static extern bool mp4_clientsetvideopara(long stockhandle, ulong nregionnum, int nbrightness, int ncontrast, int nsaturation, int nhue);

        /// 获取视频参数。

        /// 37.bool  mp4_clientgetvideopara(long stockhandle,dword nregionnum, int *pbrightness, int *pcontrast, int *psaturation, int *phue) 

        /// <param name="nregionnum">暂时不用,设置成0。 </param>

        /// <param name="pbrightness">亮度,默认64; 范围0-128;</param>

        /// <param name="pcontrast">对比度,默认64; 范围0-128;</param>

        /// <param name="psaturation">饱和度,默认64; 范围0-128;</param>

        /// <param name="phue">色调,默认64; 范围0-128;</param>

        public static extern bool mp4_clientgetvideopara(long stockhandle, ulong nregionnum, out int pbrightness, out int pcontrast, out int psaturation, out int phue);

        #endregion

}

C# 视频监控系列(2):客户端——封装API

修改记录

          1.     2009-2-27,截图函数有问题

               1.1     委托cappicfun的参数pbuf数据类型改为intptr

                    改前代码:public delegate void cappicfun(int stockhandle, [marshalas(unmanagedtype.lparray, sizeconst = 152064)] byte[] pbuf, int nsize, int nwidth, int nheight, int nstamp, int ntype, int nreceaved);

                    改后代码:public delegate void cappicfun(int stockhandle, intptr pbuf, int nsize, int nwidth, int nheight, int nstamp, int ntype, int nreceaved);

               1.2     截图函数参数

                    改前代码:public static extern bool mp4_clientsavepicfile([marshalas(unmanagedtype.lparray)] byte[] pbuf, int nsize, int nwidth, int nheight, int ntype,

string sfilename);

                    改后代码:public static extern bool mp4_clientsavepicfile(intptr pbuf, int nsize, int nwidth, int nheight, int ntype, string sfilename);

          2.     2009-3-4,客户端的数据捕获(录像)

               2.1     开始录像

                    改前代码:public static extern bool mp4_clientstartcapturefile(long stockhandle, string filename);

                    改后代码:public static extern bool mp4_clientstartcapturefile(int stockhandle, string filename);

               2.2     停止录像

                    改前代码:public static extern bool mp4_clientstopcapture(long stockhandle);

                    改后代码:public static extern bool mp4_clientstopcapture(int stockhandle);

结束

     我的客户端主要实现的功能是播放视频和音频,有些api都没有用到,我估计有些api参数类型仍然是不对的,请大家注意了!!

转载:http://www.cnblogs.com/over140/archive/2009/02/18/1390890.html

继续阅读