前言
參考
系列
注意
本系列文章限于學習交流,注重過程,由于涉及公司,是以不提供源代碼下載下傳,非常抱歉!!但是請大家放心,核心、實作以及其他能夠貼出來的代碼我都會貼出來,并且争取盡所能的回答評論裡的每一個問題,感謝大家關注,歡迎交流 :)
正文
本章主要是貼封裝好的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);
結束
我的用戶端主要實作的功能是播放視訊和音頻,有些api都沒有用到,我估計有些api參數類型仍然是不對的,請大家注意了!!
轉載:http://www.cnblogs.com/over140/archive/2009/02/18/1390890.html