C# 视频监控系列(4):客户端——音频接收和截图
前言
由于音频接收这块的代码和说明不多,就和截图功能一起写了,Let's GO! !
注意
本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心、实现以及其他能够贴出来的代码我都会贴出来,并且争取尽所能的回答留言里的每一个问题,感谢大家关注,欢迎交流 :)
系列
正文
一、 写了三篇文章,来一张界面的草图,让大伙心里有个数。
二、 音频接受
音频接受的代码比较简单,服务器端是默认打开的,只要你将拾音器接上板卡接上标有AID 1/2/3/4白色线就可以了。
VC++ Code:
{
MP4_ClientAudioStart(nn1);
MP4_ClientAudioVolume(0xfff0);
}
C# Code:
{
PcHikClient.MP4_ClientAudioStart(cs);
PcHikClient.MP4_ClientAudioVolume(0xffff);
}
注意MP4_ClientAudioVolume设置的音量值范围:(0-0xffff)。
三、 抓图、截图
VC++ Code:
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";
break;
case T_RGB32:
csFile="c:\\rgb.bmp";
break;
default:
return ;
}
MP4_ClientSavePicFile(pBuf,nSize,nWidth,nHeight,nType,csFile.GetBuffer(csFile.GetLength()));
g_bCapPic=FALSE;
}
可以看得出,截图是通过回调来实现了,这里注意了,我们在写对应的回调函数的时候,需要把回调实例成成员变量。
C# Code:
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";
break;
case T_RGB32:
csFile = @"c:\rgb32.bmp";
break;
}
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 : )
结束
截图功能也是在我边写这篇文章的时候边实践的,用原来的API发现能截图并保存,但是图片打开是黑色的,后来修改参数类型才对。当然我也更新了前面的文章的API,希望一直这样比较顺利的完成这系列的文章,不得不夸海康的卡确实做的不错!!