天天看點

C# 視訊監控系列(2):用戶端——封裝API

本章主要是貼封裝好的API調用代碼,是以直接就貼代碼了。

     代碼說明:

          1.     C#調用VC++寫好的DLL在這裡就不介紹了,重點和難點在于參數資料類型對應,下一章将有所總結。

          2.     注釋比較詳盡,注釋裡summary節點裡有函數的VC++原型。

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

}

修改記錄

          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);

繼續閱讀