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

前言

     本章主要是在C#封裝的海康DVR客戶端SDK 的代碼上修改的,並參考《Hikvision 板卡網絡開發包編程手冊V4.7.pdf》補上更完整的註釋,並且參照VC++源碼做了小部分修改。

 

參考

     1.     C#封裝的海康DVR客戶端SDK

 

系列

     1.     C# 視頻監控系列(1):準備

     2.     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;
        
/// <summary>
        
/// 網絡連接方式
        
/// </summary>
        public byte m_bSendMode;
        
/// <summary>
        
/// 圖像格式,0爲服務端主通道的圖像 ;1爲服務端子通道的圖像
        
/// </summary>
        public byte m_nImgFormat;
        
/// <summary>
        
/// 服務端的IP地址
        
/// </summary>
        public string m_sIPAddress;
        
/// <summary>
        
/// 用戶名 
        
/// </summary>
        public string m_sUserName;
        
/// <summary>
        
/// 密碼 
        
/// </summary>
        public string m_sUserPassword;
        
/// <summary>
        
/// 是否需要發送用戶名和密碼
        
/// </summary>
        public bool m_bUserCheck;
        
/// <summary>
        
/// 顯示區域
        
/// </summary>
        public System.IntPtr m_hShowVideo;
    }

    
#endregion

    
#region enum

    
/// <summary>
    
/// 網絡連接方式
    
/// </summary>
    public enum SEND_MODE
    {
        
/// <summary>
        
/// UDP方式
        
/// </summary>
        UDPMODE = 0,
        
/// <summary>
        
/// TCP方式
        
/// </summary>
        TCPMODE,
        
/// <summary>
        
/// 多播方式
        
/// </summary>
        MULTIMODE,
        
/// <summary>
        
/// 電話線方式
        
/// </summary>
        DIALING,
        
/// <summary>
        
/// 音頻流暢模式
        
/// </summary>
        AUDIODETACH
    };

    
/// <summary>
    
/// 顯示模式
    
/// </summary>
    public enum DISP_MODE
    {
        
/// <summary>
        
/// 可以同時顯示多個窗口,但對顯卡有一定要求
        
/// </summary>
        NORMALMODE = 0,
        
/// <summary>
        
/// 只能同時顯示一個窗口,但是對顯卡沒有什麼要求
        
/// </summary>
        OVERLAYMODE
    };

    
#endregion

    
#region delegate

    
/// <summary>
    
/// 讀實時數據回調。用於讀取數據流。如果ReadDataCallBack爲null,表示不需要讀取數據流
    
/// 
    
/// Void(CALLBACK*ReadDataCallBack)(DWORD nChannel,UCHAR *pPacketBuffer,DWORD nPacketSize)); 
    
/// </summary>
    
/// <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);

    
/// <summary>
    
/// 捕圖回調
    
/// 
    
/// void (CALLBACK* CapPicFun)(long StockHandle, char * pBuf, long nSize, long nWidth, long nHeight, long nStamp, long nType, long nReceaved)
    
/// </summary>
    
/// <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);

    
/// <summary>
    
/// 畫
    
/// </summary>
    public delegate void DrawFun(int StockHandle, System.Drawing.Graphics hDc, int nUser);


    
#endregion

    
/// <summary>
    
/// hikclient.dll   HikClient
    
/// </summary>
    public class PcHikClient
    {

        
public static readonly uint WM_USER = 0x0400;

        
#region 客戶端函數

        
/// <summary>
        
/// 對客戶端初始化
        
///     注:在調用所有其他客戶端函數之前調用。
        
/// 
        
/// 1.  BOOL  __stdcall MP4_ClientStartup(UINT nMessage,HWND hWnd);
        
/// </summary>
        
/// <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);

        
/// <summary>
        
/// 結束調用客戶端函數。
        
///     注:調用MP4_ClientCleanup()後不能再調用其他客戶端函數。
        
/// 
        
/// 2.  BOOL  __stdcall MP4_ClientCleanup();
        
/// </summary>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientCleanup();

        
/// <summary>
        
/// 啓動客戶端
        
///     注 :MP4_ClientStart返回成功,並不表示已經成功連接服務端。您需要通過MP4_ClientGetState函數 
        
///     去獲得網絡連接的狀態 
        
/// 
        
/// 3.  LONG __stdcall MP4_ClientStart(PCLIENT_VIDEOINFO pClientinfo, Void(CALLBACK*ReadDataCallBack)(DWORD nChannel,UCHAR *pPacketBuffer,DWORD nPacketSize));
        
/// </summary>
        
/// <param name="pClientinfo"></param>
        
/// <param name="rdcb">用來讀取數據流。如果ReadDataCallBack爲NULL,表示不需要讀取數據流。 </param>
        
/// <returns>返回-1表示失敗,其他值表示成功。作爲後續操作的參數。</returns>
        [DllImport("hikclient.dll")]
        
public static extern int MP4_ClientStart(ref CLIENT_VIDEOINFO pClientinfo, ReadDataCallBack rdcb);

        
/// <summary>
        
/// 停止客戶端。
        
/// 
        
/// 4.  BOOL  __stdcall MP4_ClientStop(LONG StockHandle); 
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientStop(long StockHandle);

        
/// <summary>
        
/// 獲取客戶端狀態
        
///     -1  :   無效
        
///     1   :   連接
        
///     2   :   開始接收圖像
        
///     3   :   異常退出
        
///     4   :   接收完畢,退出
        
///     5   :   無法聯繫服務器
        
///     6   :   服務器拒絕訪問
        
/// 
        
/// 5.LONG  __stdcall MP4_ClientGetState(LONG StockHandle);
        
/// </summary>
        
/// <param name="StockHandle">成功返回的值</param>
        
/// <returns></returns>
        [DllImport("hikclient.dll")]
        
public static extern int MP4_ClientGetState(long StockHandle);

        
/// <summary>
        
/// 開始客戶端的數據捕獲(回調方式,使用MP4_ClientStart中的ReadDataCallBack函數)。
        
/// 
        
/// 6.BOOL __stdcall MP4_ClientStartCapture(LONG StockHandle);
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientStartCapture(long StockHandle);

        
/// <summary>
        
/// 開始客戶端的數據捕獲(直接寫文件方式)。
        
/// 
        
/// 7.BOOL  __stdcall MP4_ClientStartCaptureFile(LONG StockHandle, LPTSTR FileName);
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <param name="FileName">文件名。 </param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientStartCaptureFile(int StockHandle, string FileName);

        
/// <summary>
        
/// 停止客戶端的數據捕獲。
        
///     對MP4_ClientStartCapture和MP4_ClientStartCaptureFile都有效。 
        
/// 
        
/// 8.BOOL __stdcall MP4_ClientStopCapture(LONG StockHandle); 
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientStopCapture(int StockHandle);
        
        
/// <summary>
        
/// 獲取服務端的通道數。
        
/// 
        
/// 9.WORD  __stdcall MP4_ClientGetServerChanNum(LPCTSTR m_sIPAddress);
        
/// </summary>
        
/// <param name="m_sIPAddress">服務端的IP地址。</param>
        
/// <returns>返回0表示失敗,其他值表示通道數。</returns>
        [DllImport("hikclient.dll")]
        
public static extern ushort MP4_ClientGetServerChanNum(string m_sIPAddress);

        
/// <summary>
        
/// 給服務器發送字符串
        
/// 
        
/// 10.BOOL  __stdcall MP4_ClientCommandtoServer(LPCTSTR m_lAddrIP, char *m_sCommand,WORD m_wLen)
        
/// </summary>
        
/// <param name="m_lAddrIP">服務器IP地址</param>
        
/// <param name="m_sCommand">消息緩衝指針</param>
        
/// <param name="m_wLen">消息緩衝長度,必須小於900個字節</param>
        
/// <returns>返回0表示失敗,其他值表示通道數。 </returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientCommandtoServer(string m_lAddrIP, string m_sCommand, ushort m_wLen);

        
/// <summary>
        
/// 對服務端的nChannel通道網絡連接初始化,結束當前所有用戶對它的訪問。
        
/// 
        
/// 11.BOOL  __stdcall MP4_ClientShut(LPCTSTR m_lAddrIP,char nChannel);
        
/// </summary>
        
/// <param name="m_lAddrIP">表示服務端的IP地址。</param>
        
/// <param name="cChannel">表示服務端通道號。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。 </returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientShut(string m_lAddrIP, char cChannel);

        
/// <summary>
        
/// 讀取服務端消息。
        
///     讀取服務端MP4_ServerStringToClient函數發送過來的消息。(不超過900字節)
        
/// 
        
/// 12.  void  __stdcall MP4_ClientReadLastMessage(char * m_sIP ,char *m_sCommand,WORD *m_wLen); 
        
/// </summary>
        
/// <param name="m_sIP">消息來自哪個IP地址。</param>
        
/// <param name="m_sCommand">消息緩衝區指針。 </param>
        
/// <param name="m_wLen">消息緩衝區長度。</param>
        [DllImport("hikclient.dll")]
        
public static extern void MP4_ClientReadLastMessage(string m_sIP, out string m_sCommand, out ushort m_wLen);

        
/// <summary>
        
/// 設置當前播放器音量。
        
/// 
        
/// 13.BOOL  __stdcall MP4_ClientAudioVolume(WORD wVolume); 
        
/// </summary>
        
/// <param name="wVolume">音量值(0-0xffff) </param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientAudioVolume(ushort wVolume);

        
/// <summary>
        
/// 選定某個播放器播放聲音,其他播放器靜止。
        
/// 
        
/// 14.  BOOL  __stdcall MP4_ClientAudioStart(LONG StockHandle);
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientAudioStart(long StockHandle);

        
/// <summary>
        
/// 停止播放聲音
        
/// 
        
/// 15.  BOOL  __stdcall MP4_ClientAudioStop();
        
/// </summary>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。 </returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientAudioStop();

        
/// <summary>
        
/// 功能同MP4_ClientCommandtoServer,只是第一個參數使用了MP4_ClientStart成功返回的值。
        
/// 
        
/// 16. BOOL __stdcall MP4_ClientCommandtoServer_Handle(LONG StockHandle,char *m_sCommand, WORD m_wLen); 
        
/// </summary>
        
/// <param name="StockHandle"></param>
        
/// <param name="m_sCommand"></param>
        
/// <param name="m_wLen"></param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientCommandtoServer_Handle(int StockHandle, out string m_sCommand, ushort m_wLen);

        
/// <summary>
        
/// 系統是否支持網絡播放器(在顯示模式設爲NORMALMODE的情況下)。
        
/// 
        
/// 17.int   __stdcall MP4_ClientIsSupport(); 
        
/// </summary>
        
/// <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>
        [DllImport("hikclient.dll")]
        
public static extern int MP4_ClientIsSupport();

        
/// <summary>
        
/// 增加接收緩衝區大小。
        
///     說明:WBufNum值每增加1,表示接收緩衝區增加1幀的數據量。如果以5幀/秒的幀率播放,那麼WbufNum=5,表示增加了5幀的緩衝區。 
        
/// 
        
/// 18.  BOOL  __stdcall MP4_ClientSetBufferNum(LONG StockHandle,WORD wBufNum);
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <param name="wBufNum">增加緩衝區個數,0-50。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientSetBufferNum(long StockHandle, ushort wBufNum);

        
/// <summary>
        
/// 設置服務端的網絡端口號和客戶端的網絡端口號。同MP4_ServerSetNetPort
        
/// 
        
/// 19.  BOOL  __stdcall MP4_ClientSetNetPort(WORD dServerPort,WORD dClientPort); 
        
/// </summary>
        
/// <param name="dServerPort">服務端的起始網絡端口號。</param>
        
/// <param name="dClientPort">客戶端的網絡端口號。</param>
        
/// <returns></returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientSetNetPort(ushort dServerPort, ushort dClientPort);

        
/// <summary>
        
/// 設置多播的TTL參數。
        
/// 
        
/// 20.  BOOL     __stdcall MP4_ClientSetTTL(unsigned char cTTLVal);
        
/// </summary>
        
/// <param name="cTTLVal">TTL值。1-255,默認32。 </param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientSetTTL(char cTTLVal);

        
/// <summary>
        
/// 接收多少數據後纔開始播放。 
        
/// 
        
/// 21.  BOOL  __stdcall MP4_ClientSetPlayDelay(LONG StockHandle,WORD DelayLen); 
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <param name="DelayLen">預先接收的數據量。單位:K。範圍:0-600</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientSetPlayDelay(long StockHandle, ushort DelayLen);

        
/// <summary>
        
/// 設置連接服務端的等待時間和嘗試次數。參數說明同MP4_ServerSetWait。
        
/// 
        
/// 22.  BOOL  __stdcall MP4_ClientSetWait(DWORD dEachWaitTime,DWORD dTrynum);
        
/// </summary>
        
/// <param name="dEachWaitTime"></param>
        
/// <param name="dTrynum"></param>
        
/// <returns></returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientSetWait(ulong dEachWaitTime, ulong dTrynum);

        
/// <summary>
        
/// 設置播放器的顯示模式。
        
/// 
        
/// 23.  BOOL  __stdcall MP4_ClientSetShowMode(DWORD dShowType,COLORREF colorKey);
        
/// </summary>
        
/// <param name="dShowType">顯示模式。NORMALMODE或者OVERLAYMODE。</param>
        
/// <param name="colorKey">用戶設置的透明色,透明色相當於一層透視膜,顯示的畫面只能穿過這種顏色,而其他的顏色
        
/// 將擋住顯示的畫面。用戶應該在顯示窗口中塗上這種顏色,那樣才能看到顯示畫面。一般應該使用一種不
        
/// 常用的顏色作爲透明色。這是一個雙字節值0x00rrggbb,最高字節爲0,後三個字節分別表示r,g,b的值。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
//public static extern bool MP4_ClientSetShowMode(UInt32 dShowType, System.Drawing.Color colorKey);
        public static extern bool MP4_ClientSetShowMode(ulong dShowType, int colorKey);

        
/// <summary>
        
/// 設置圖象質量。
        
///     說明:設置圖像質量,當設置成高質量時畫面效果好,但CPU利用率高。在支持多路播放時,可以設爲
        
///     低質量(LOWQUALITY),以降低CPU利用率;當某路放大播放時將該路設置成高質量(HIGHQUALITY),
        
///     以達到好的畫面效果。 
        
/// 
        
/// 24.  BOOL  __stdcall MP4_ClientSetQuality(LONG StockHandle,WORD wPicQuality);
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <param name="wPicQuality">圖象質量。LOWQUALITY表示低圖象質量,HIGHQUALITY表示高圖象質量。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientSetQuality(long StockHandle, ushort wPicQuality);

        
/// <summary>
        
/// 設置抓圖回調函數。
        
///     注意要儘快返回,如果要停止回調,可以把回調函數指針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)); 
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <param name="x"></param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientSetCapPicCallBack(int StockHandle, CapPicFun x);

        
/// <summary>
        
/// 將抓圖得到的圖像數據保存成BMP文件。
        
///     保存函數需要佔用的較多cpu資源,如果不需要保存圖片,則不要調用。
        
/// 
        
/// 26.BOOL __stdcall  MP4_ClientSavePicFile(char * pBuf,long nSize,long nWidth,long nHeight,long nType,char *sFileName); 
        
/// </summary>
        
/// <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>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientSavePicFile(IntPtr pBuf, int nSize, int nWidth, int nHeight, int nType, string sFileName);


        
/// <summary>
        
/// 設置解碼時丟棄B幀的個數。
        
///     說明: 丟棄的B幀個數越多,CPU利用率越低,動畫感越明顯。
        
/// 
        
/// 27.BOOL  __stdcall MP4_ClientThrowBFrame(LONG StockHandle,DWORD dNum);
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。 </param>
        
/// <param name="dNum">丟棄的幀個數。(0,1,2)</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。 </returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientThrowBFrame(long StockHandle, ulong dNum);

        
/// <summary>
        
/// 獲取已經解碼的總幀數。 
        
/// 
        
/// 28. DWORD  __stdcall MP4_ClientGetFrameNum(LONG StockHandle); 
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <returns>返回幀數值。</returns>
        [DllImport("hikclient.dll")]
        
public static extern ulong MP4_ClientGetFrameNum(int StockHandle);

        
/// <summary>
        
/// 獲取版本號。
        
/// 
        
/// 29.DWORD  __stdcall  MP4_ClientGetSdkVersion() 
        
/// </summary>
        
/// <returns></returns>
        [DllImport("hikclient.dll")]
        
public static extern uint MP4_ClientGetSdkVersion();

        
/// <summary>
        
/// 30.設置播放聲音的模式。
        
///     1> SINGLEAUDIO模式下只能調用 MP4_ClientAudioStart和MP4_ClientAudioStop。 
        
///     2> MULTIAUDIO模式下只能調用 MP4_ClientAudioStartShare和MP4_ClientAudioStopShare。 
        
///     3>兩種模式下都可以調用MP4_ClientAudioVolume。 
        
///     4>在客戶端軟件運行過程中,用戶可以在關閉所有播放器的聲音之後,可以調用該函數修改播放模式。但
        
///     是建議用戶最好在客戶端軟件初始化的時候設置一次播放模式,之後不再修改。 
        
/// 
        
/// 30.BOOL  __stdcall MP4_ClientAudioMode(WORD wMode) 
        
/// </summary>
        
/// <param name="wMode">有兩個選項。默認使用SINGLEAUDIO。
        
/// SINGLEAUDIO:開發包原來的模式。在一個客戶端軟件中,同時最多隻有一個播放器可以播放聲音;
        
/// MULTIAUDIO:新增加的模式。在一個客戶端軟件中,同時可以有多個播放器播放聲音。 
        
/// </param>
        
/// <returns></returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientAudioMode(ushort wMode);

        
/// <summary>
        
/// 開始播放某一路聲音。MULTIAUDIO模式下使用。
        
/// 
        
/// 31. BOOL  __stdcall MP4_ClientAudioStartShare(LONG StockHandle)
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientAudioStartShare(long StockHandle);

        
/// <summary>
        
/// 停止播放聲音。MULTIAUDIO模式下使用。
        
/// 
        
/// 32. BOOL  __stdcall MP4_ClientAudioStopShare(LONG StockHandle) 
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientAudioStopShare(long StockHandle);

        
/// <summary>
        
/// 設置多播組地址和網絡端口號。 
        
/// 說明: 
        
///     1>目前的多播組採用了兩種方式:一是開發包內部分配,用戶不需要考慮多播組參數細節,默認採用這種
        
///     方式;另一種是調用MP4_ClientCastGroup設置多播組參數。 
        
///     2>該函數在MP4_ClientStart或MP4_ClientStart_Card之後調用。 
        
///     3>每個多播組會佔用wPort開始的4個端口。 
        
/// 
        
/// 33.BOOL  __stdcall MP4_ClientCastGroup(LONG StockHandle,char *sIP,WORD wPort)
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <param name="sIP">多播組地址。</param>
        
/// <param name="wPort">多播組網絡端口號。 </param>
        
/// <returns></returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientCastGroup(long StockHandle, out string sIP, ushort wPort);

        
/// <summary>
        
/// 設置疊加字幕的回調函數。
        
/// 
        
/// 34. BOOL  __stdcall  MP4_ClientRigisterDrawFun(LONG StockHandle, void (CALLBACK* DrawFun)(LONG StockHandle,HDC hDc,LONG nUser),LONG nUser).
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <param name="x">DC句柄。</param>
        
/// <param name="nUser">保留。設置成NULL。</param>
        
/// <returns></returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientRigisterDrawFun(long StockHandle, DrawFun x, long nUser);

        
/// <summary>
        
/// 清除數據緩衝區。包括客戶端和服務端
        
/// 
        
/// 35.BOOL __stdcall MP4_ClientCleanBuffer(LONG nPort,int nCleanType)
        
/// </summary>
        
/// <param name="nPort">MP4_ClientStart的返回值。 </param>
        
/// <param name="nCleanType">
        
/// 清除類型。 nCleanType爲0只清除客戶端緩衝區,nCleanType爲1只清除服務端緩衝區,
        
/// nCleanType爲2清除客戶端/服務端緩衝區。 
        
/// </param>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientCleanBuffer(long nPort, int nCleanType);

        
/// <summary>
        
/// 設置視頻參數。
        
/// 
        
/// 36.BOOL  MP4_ClientSetVideoPara(LONG StockHandle,DWORD nRegionNum, int nBrightness, int nContrast, int nSaturation, int nHue) 
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <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>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。 </returns>
        [DllImport("hikclient.dll")]
        
public static extern bool MP4_ClientSetVideoPara(long StockHandle, ulong nRegionNum, int nBrightness, int nContrast, int nSaturation, int nHue);

        
/// <summary>
        
/// 獲取視頻參數。
        
/// 
        
/// 37.BOOL  MP4_ClientGetVideoPara(LONG StockHandle,DWORD nRegionNum, int *pBrightness, int *pContrast, int *pSaturation, int *pHue) 
        
/// </summary>
        
/// <param name="StockHandle">MP4_ClientStart成功返回的值。</param>
        
/// <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>
        
/// <returns>返回TRUE表示成功,返回FALSE表示失敗。</returns>
        [DllImport("hikclient.dll")]
        
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);


結束

     我的客戶端主要實現的功能是播放視頻和音頻,有些API都沒有用到,我估計有些API參數類型仍然是不對的,請大家注意了!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章