C# 視頻監控系列(3):客戶端——連接服務器並預覽

前言

     近一個星期在寫服務器端,一直沒有成功,就沒有繼續往下寫文章,可喜的是這一局面在今天下午得到改變(客戶端已經能夠連接我自己寫的服務器端了!),順便說下客戶端大概2-3篇文章,接下來就會寫關於服務器的文章了,感謝關注,也希望能幫助得到你: )

 

推薦文章

     1.     C# 與 C++ 數據類型對照 ,極其推薦!!調用VC++的dll最主要的問題之一就是數據類型對應了!!

     2.     壓縮卡及硬盤錄像機常見故障集錦,裏面有很多關於視頻方面的知識。

     3.     大城小格 ,他的博客上有系列文章,雖然簡短,仍有很多幫助!

     4.     杭州海康威視數字技術有限公司-疑難解答|常見問題|FAQ

 

注意

     本系列文章限於學習交流,注重過程,由於涉及公司,所以不提供源代碼下載,非常抱歉!!但是請大家放心,核心、實現以及其他能夠貼出來的代碼我都會貼出來,並且爭取盡所能的回答評論裏的每一個問題,感謝大家關注,歡迎交流 :)

 

系列

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

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

     3.     C# 視頻監控系列(3):客戶端——連接服務器

 

正文

     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.cppOnInitDialog方法能看到如下兩行代碼:

    MP4_ClientSetNetPort(5050,6050);

    MP4_ClientStartup(WM_MYCOMMAND,
this->m_hWnd);

          很明顯這是調用了API,其他代碼就不用管了,那麼我把這代碼翻譯到C# WinForm的Form1_Load事件裏面,並且也這樣調用API(封裝好的SDK請看上篇文章):

            PcHikClient.MP4_ClientSetNetPort(50506050);
            PcHikClient.MP4_ClientStartup(PcHikClient.WM_USER 
+ 1this.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_ClientStopCapture(cs);
            PcHikClient.MP4_ClientStop(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功能,可以上電視牆。

 

結束

     如果本文能帶你實現預覽的功能,將使你信心百倍,效果纔是最有說服力的,並祝你好運: )

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