天天看点

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  : )

继续阅读