天天看點

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

繼續閱讀