天天看點

C# 視訊監控系列(4):用戶端——音頻接收和截圖

一、     寫了三篇文章,來一張界面的草圖,讓大夥心裡有個數。

二、     音頻接受

               音頻接受的代碼比較簡單,伺服器端是預設打開的,隻要你将拾音器接上闆卡接上标有AID 1/2/3/4白色線就可以了。

               VC++ Code:

    if (nn1 >= 0 )

    {

        MP4_ClientAudioStart(nn1);

        MP4_ClientAudioVolume(0xfff0);

    }

               C# Code:

            if (cs >= 0)

            {

                PcHikClient.MP4_ClientAudioStart(cs);

                PcHikClient.MP4_ClientAudioVolume(0xffff);

            }

               注意MP4_ClientAudioVolume設定的音量值範圍:(0-0xffff)。

三、     抓圖、截圖    

MP4_ClientSetCapPicCallBack(nn1,CapPicFun);

void CALLBACK CapPicFun(long nPort,\

                           char * pBuf,long nSize,\

                           long nWidth,long nHeight,\

                           long nStamp,long nType,long nReceaved)

{

    if(!((g_bCapPic) && (nPort == ipos)))

        return;

    CString csFile;

    switch(nType)

    case T_UYVY:

        csFile="c:\\uyvy.bmp";

        break;

    case T_YV12:

        csFile="c:\\yv12.bmp";

    case T_RGB32:

        csFile="c:\\rgb.bmp";

    default: 

        return ;

    MP4_ClientSavePicFile(pBuf,nSize,nWidth,nHeight,nType,csFile.GetBuffer(csFile.GetLength()));    

    g_bCapPic=FALSE;

}

               可以看得出,截圖是通過回調來實作了,這裡注意了,我們在寫對應的回調函數的時候,需要把回調執行個體成成員變量。

        private const int T_UYVY = 1;

        private const int T_YV12 = 3;

        private const int T_RGB32 = 7;

        private CapPicFun cpf;

        private void button3_Click(object sender, EventArgs e)

        {

            PcHikClient.MP4_ClientSetCapPicCallBack(cs, cpf);

        }

        //public void CapPicFun1(int StockHandle, [MarshalAs(UnmanagedType.LPArray, SizeConst = 152064)] byte[] pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved)

        public void CapPicFun1(int StockHandle, IntPtr pBuf, int nSize, int nWidth, int nHeight, int nStamp, int nType, int nReceaved)

            string csFile = string.Empty;

            switch (nType)

                case T_UYVY:

                    csFile = @"c:\uyvy.bmp";

                    break;

                case T_YV12:

                    csFile = @"c:\yv12.bmp";

                case T_RGB32:

                    csFile = @"c:\rgb32.bmp";

            PcHikClient.MP4_ClientSavePicFile(pBuf, nSize, nWidth, nHeight, nType, csFile);

            //停止執行回調

            PcHikClient.MP4_ClientSetCapPicCallBack(cs, null);

               代碼說明:

                    1.     button3點選事件對應的是界面上點選截圖按鈕的事件。

                    2.     從API文檔中我們可以看到關于MP4_ClientSetCapPicCallBack的說明:“注意要盡快傳回,如果要停止回調,可以把回調函數指針CapPicFun設為NULL。一旦設定回調函數,則一直有效,直到程式退出。”。

                    3.     請注意在上文的基礎上運作用戶端連上伺服器并顯示視訊畫面後再調用本函數,否則函數既不報錯也不會截取圖檔。

                    4.     委托private CapPicFun cpf;的執行個體化我是在Form1_Load中進行的:cpf = new CapPicFun(CapPicFun1);

                    5.     不出意外的話,按照預設配置您的C槽根目錄下應該會有yv12.bmp  : )

繼續閱讀