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,希望一直这样比较顺利的完成这系列的文章,不得不夸海康的卡确实做的不错!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2008-02-27 SQL SELECT INTO 语句使用问题