1.將以下四個dll拷貝到system32目錄下,這幾個文件均在根目錄的Bin目錄下
DS40xxSDK.dll
hikclient.dll
HikPlayM4.dll
HikServer.dll
2.先用自帶的客戶端Net Client Demo(Soft Decdoe)運行下確認沒有問題再根據VC++客戶端的例子寫對應的C#代碼。
3.最好裝一個Microsoft Visual C++ 6.0,這樣能把VC++的例 子跑起來並調試。注意他是Win32 Release的,需要切換至Win32 Debug模式才能斷點調試!!
4.打開API文檔Hikvision 板卡網絡開發 包編程手冊V4.7,在Doc目錄下。
5.代碼分析和編寫對應的C#代碼
5.1 第二章編程說明中第六條我們可以看到API依次調用的順 序,可以根據函數名直接在代碼中搜索調用順序,不難發現,在HKVisionDlg.cpp的OnInitDialog方法能看到如下兩行代碼:
MP4_ClientSetNetPort(5050,6050);
MP4_ClientStartup(WM_MYCOMMAND,this->m_hWnd);
很明顯這是調用了API,其他代碼就不用管了,那麼我把這代碼 翻譯到C# WinForm的Form1_Load事件裡面,並且也這樣調用API(封裝好的SDK請看上篇文章):
PcHikClient.MP4_ClientSetNetPort(5050, 6050);
PcHikClient.MP4_ClientStartup(PcHikClient.WM_USER + 1, this.Handle);
5.2 根據界面上Start 按鈕事件能找到關鍵的連接上服務器,如下:
if (m_showmode == 0)
{
MP4_ClientSetShowMode(NORMALMODE,0);
}
else
{
MP4_ClientSetShowMode(OVERLAYMODE,COLORREF(0xff00ff));
}
nn1=nn2=nn3=nn4 = -1;
int itemp = m_shownum;
char ips[256];
sprintf(ips,"%s",m_ipadd);
hWnd5 = m_video5.GetSafeHwnd();//
aa5.m_bRemoteChannel = 0;
switch(m_linktype)
{
case 0:
aa5.m_bSendMode = TCPMODE;
break;
case 1:
aa5.m_bSendMode = UDPMODE;
break;
case 2:
aa5.m_bSendMode = MULTIMODE;
break;
case 3:
aa5.m_bSendMode = DIALING;
break;
case 4:
aa5.m_bSendMode = AUDIODETACH;
break;
default:
aa5.m_bSendMode = TCPMODE;
break;
}
aa5.m_sIPAddress = ips;
//2003.12.2
//如果想只錄像,而不進行解碼,可以將m_hShowVideo設置成NULL
//If you just want to record without decode on client side,
//please set m_hShowVideo as NULL
#if defined RECORD_ONLY
aa5.m_hShowVideo = NULL;
#else
aa5.m_hShowVideo = hWnd5;
#endif
// add 2003.12.2
//m_nImgFormat 指明想要獲取的圖像格式
//依賴服務器端的設置。如果不設置,獲取的是服務器的缺省格式
//m_nImgFormat indicates the picture format you get on the client side,
//It depends on the setting of Server side.
aa5.m_nImgFormat = 0; // request CIF format
// aa5.m_nImgFormat = 1; // request QCIF format
aa5.m_sUserName = "123";
aa5.m_sUserPassword="w";
aa5.m_bUserCheck = TRUE;
MP4_ClientSetTTL(64);
nn1 = MP4_ClientStart(&aa5,ReadDataCallBack);
if (nn1 == -1)
{
MessageBox("error");
return;
}
//
BOOL breturn;
breturn = MP4_ClientRigisterDrawFun(nn1,DrawFun,0);
switch(m_delaytype)
{
case 0:
MP4_ClientSetBufferNum(nn1,40);
MP4_ClientSetPlayDelay(nn1,580);
break;
case 1:
MP4_ClientSetBufferNum(nn1,15);
MP4_ClientSetPlayDelay(nn1,40);
break;
case 2:
MP4_ClientSetBufferNum(nn1,15);
MP4_ClientSetPlayDelay(nn1,0);
break;
case 3:
MP4_ClientSetBufferNum(nn1,0);
MP4_ClientSetPlayDelay(nn1,0);
break;
}
// MP4_ClientThrowBFrame(nn1,m_bframenum);
MP4_ClientSetCapPicCallBack(nn1,CapPicFun);
有VC++代碼可以看得出來接下來代碼都和這差不多,應該就是初始化 顯示四個窗口的代碼了,那我們就不需要把這個方法裡面的代碼全部翻譯了,只需要達到連接一個視頻窗口的目的就可以了,翻譯的過程中可 以自己先臨時設置一些變量來讓代碼跑起來,翻譯過程中每次都執行到MP4_ClientRigisterDrawFun方法的時候就報錯了,但是畫面確已經出來 了,所有我就從這裡截斷了,先達到目的再說,請看翻譯對象的C#代碼:
int cs;
private void button1_Click(object sender, EventArgs e)
{
CLIENT_VIDEOINFO cVideo = new CLIENT_VIDEOINFO();
//對應服務端通道號
cVideo.m_bRemoteChannel = (byte)0;
//網絡連接模式
cVideo.m_bSendMode = (byte)SEND_MODE.TCPMODE;
//服務端IP地址
cVideo.m_sIPAddress = "192.168.0.188";
//顯示區域
cVideo.m_hShowVideo = pVideo.Handle;//(IntPtr)null;
//圖像格式
cVideo.m_nImgFormat = (byte)0;
//用戶名
cVideo.m_sUserName = "123";
//密碼
cVideo.m_sUserPassword = "w";
//是否需要發生密碼
cVideo.m_bUserCheck = true;
//設置多播的TTL參數
PcHikClient.MP4_ClientSetTTL((char)64);
//啟動客戶端
cs = PcHikClient.MP4_ClientStart(ref cVideo, new ReadDataCallBack(MyRealDataCallBack1));
}
private void MyRealDataCallBack1(ulong port, [MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer, ulong pSize)
{
MessageBox.Show(pBuffer.Length.ToString());
}
需要注意的是,VC++裡面的指針類型,如 HWND一般可以對應C#裡面的IntPtr數據類型,ReadDataCallBack是回調函數,但是沒有執行,不過至此畫面已經能夠顯示出來!!
那麼 接下來做畫面切割,右鍵事件什麼的都只需要你WinForm的開發經驗了,我是用的四個面板(Panel)切換隱藏顯示的;pVideo是Panel控件;用戶 名和密碼隨便設置也能連得上。
5.3 關閉連接
同樣找到VC++代碼:
if (nn1 >= 0)
{
MP4_ClientStopCapture(nn1);
MP4_ClientStop(nn1);
}
對應C#代碼:
private void Close()
{
PcHikClient.MP4_ClientStop(cs);
PcHikClient.MP4_ClientStopCapture(cs);
pVideo.Invalidate(true);
}
需要注意的是這個cs變量,在連接的時候MP4_ClientStart返回值,需要拿全局變量保存起來,以便這裡關閉 的時候需要,從API文章裡面我們也能看到這樣的說明。這段代碼最好在窗體關閉的時候也加上!!
注意
摘抄:
DS400xM/DS400xH卡在客戶端機器運行的要求
主要是針對運行客戶端程序的計算機顯卡有要求,需支持Overlay功能,目前主流 的顯卡nvidia,ati,Intel845GL集成的系列都支持Overlay功能。
在PIII 833的計算機上,可以比較流暢的軟解碼4路普通的實時圖象; 在PIV 2G的計算機上,可以比較流暢的軟解碼8-9路普通的實時圖象;如果用我們公司的硬解碼卡,只要顯卡支持Overlay功能,就可以支持最 多達24路的實時圖象,並且支持VideoOut功能,可以上電視牆。
結束
如果本文能帶你實現預覽的功能,將使你信心百倍,效果 才是最有說服力的,並祝你好運: )