【海康威视】WPF客户端二次开发:【2】语音对讲


一、前言

开启语音对讲前所需步骤参考参考前一篇文章【海康威视】WPF客户端二次开发:【1】监控视频画面预览(SDK初始化、设备登录、监控画面预览)

本篇重点讲解在进行语音对讲开发时遇到的深坑;

二、开启语音对讲

1、基础流程:

  1. SDK初始化; 2、海康设备登录; 3、设备预览; 4、开启语音对讲功能即可:

2、核心代码:

//语音对讲回调函数封装
VOICEDATACALLBACKV30 VoiceDataCallBackMethod = new(VoiceDataCallBackV30);
//int UserId=-1; 
public MsgReturnedDto StartVoiceCom_V30()
{
    Voice_CommonHandle = CHCNetSDK.NET_DVR_StartVoiceCom_V30(this.UserId, 1, false, VoiceDataCallBackMethod, IntPtr.Zero);
    if (Voice_CommonHandle == HandleInfo.NOT_ON_PATROL)
    {
        uint tmpErrCode = CHCNetSDK.NET_DVR_GetLastError();
        return new MsgReturnedDto(false, $"开启语音对讲失败,错误代码:{tmpErrCode}");
    }

    return new MsgReturnedDto(true, "成功");
}

//语音对讲回调函数
public static void VoiceDataCallBackV30(int lVoiceComHandle, IntPtr pRecvDataBuffer, uint dwBufSize, byte byAudioFlag, IntPtr pUser)
{
    Console.WriteLine("语音对讲回调");
}

3、注意事项:

  1. 注意开启语音对讲时,必须保证当前测试设备的喇叭、麦克风都正常可用,否则报606错误;
  2. 可考虑先用网页登录海康自带后台,然后测试语音通讯,排除环境配备问题;

三、偶遇深坑:

1、问题描述:

设备登录预览什么的都很正常,一加上语音对讲功能就出问题:画面出来了 语音对讲也开起来了 不超过2秒钟程序异常退出;

看不出什么直观的问题,打开控制台,查看系统日志发现若干错误条目:
在这里插入图片描述

Application: HKVS.IPCM.WPF.exe
CoreCLR Version: 5.0.521.16609
.NET Version: 5.0.5
Description: The process was terminated due to an internal error in the .NET Runtime at IP 67D56B5D (67BB0000) with exit code c0000005.

Application: HKVS.IPCM.WPF.exe
CoreCLR Version: 5.0.521.16609
.NET Version: 5.0.5
Description: The process was terminated due to an unhandled exception.
Exception Info: exception code c0000005, exception address 2390FA1C
Stack:

错误应用程序名称: HKVS.IPCM.WPF.exe,版本: 1.0.0.0,时间戳: 0x60513935
错误模块名称: coreclr.dll,版本: 5.0.521.16609,时间戳: 0x60512f81
异常代码: 0x80131623
错误偏移量: 0x002166a6
错误进程 ID: 0x2df4
错误应用程序启动时间: 0x01d7423f6d02b578
错误应用程序路径: \mw_disk_server\productFile\刘永洪\temprelease\net5.0-windows\HKVS.IPCM.WPF.exe
错误模块路径: C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\5.0.5\coreclr.dll
报告 ID: d1b8d3b6-07dc-4eb4-b94f-1f3314d3b939
错误程序包全名:
错误程序包相对应用程序 ID:

错误应用程序名称: HKVS.IPCM.WPF.exe,版本: 1.0.0.0,时间戳: 0x60513935
错误模块名称: unknown,版本: 0.0.0.0,时间戳: 0x00000000
异常代码: 0xc0000005
错误偏移量: 0x2390fa1c
错误进程 ID: 0x27e4
错误应用程序启动时间: 0x01d742410f04c6b4
错误应用程序路径: C:\Users\1\Desktop\net5.0-windows\HKVS.IPCM.WPF.exe
错误模块路径: unknown
报告 ID: 3ba36b56-2fe9-4af3-b1d5-11806172fb0e
错误程序包全名:
错误程序包相对应用程序 ID:

Application: HKVS.IPCM.WPF.exe
CoreCLR Version: 5.0.521.16609
.NET Version: 5.0.5
Description: The application requested process termination through System.Environment.FailFast(string message).
Message: A callback was made on a garbage collected delegate of type ‘HKVS.IPCM.WPF!HKVS.IPCM.WPF.HKCSharpSDK.CHCNetSDK+VOICEDATACALLBACKV30::Invoke’.
Stack:

2、问题分析:

  1. 重点在这一句:提示什么回调委托函数被回收 无法调用

Message: A callback was made on a garbage collected delegate of type ‘HKVS.IPCM.WPF!HKVS.IPCM.WPF.HKCSharpSDK.CHCNetSDK+VOICEDATACALLBACKV30::Invoke’.
Stack:

  1. 坑了整整2天才找到问题原因:

注意代码:Voice_CommonHandle = CHCNetSDK.NET_DVR_StartVoiceCom_V30(this.UserId, 1, false, this.VoiceDataCallBackV30, IntPtr.Zero);

错误原因:this.VoiceDataCallBackV30(xxx) 是按照 CHCNetSDK.cs中声明的回调函数格式定义的 ,也仅仅是格式相同但并未把此方法声明为VOICEDATACALLBACKV30,直接传递此方法所以导致上面各种诡异的错误;

正确方法:将自定义回调函数声明为 VOICEDATACALLBACKV30 类型的回调函数,传入语音对讲函数;
VOICEDATACALLBACKV30 VoiceDataCallBackMethod = new(VoiceDataCallBackV30);

CHCNetSDK.cs中的回调函数定义
public delegate void VOICEDATACALLBACKV30(int lVoiceComHandle, IntPtr pRecvDataBuffer, uint dwBufSize, byte byAudioFlag, System.IntPtr pUser);

//错误写法:
public MsgReturnedDto StartVoiceCom_V30()
{
	//语音对讲回调函数传递有误 *********************************
    Voice_CommonHandle = CHCNetSDK.NET_DVR_StartVoiceCom_V30(this.UserId, 1, false, this.VoiceDataCallBackV30, IntPtr.Zero);
    if (Voice_CommonHandle == HandleInfo.NOT_ON_PATROL)
    {
        uint tmpErrCode = CHCNetSDK.NET_DVR_GetLastError();
        return new MsgReturnedDto(false, $"开启语音对讲失败,错误代码:{tmpErrCode}");
    }

    return new MsgReturnedDto(true, "成功");
}

/// <summary>
/// 语音对讲回调函数
public void VoiceDataCallBackV30(int lVoiceComHandle, IntPtr pRecvDataBuffer, uint dwBufSize, byte byAudioFlag, IntPtr pUser)
{
    Console.WriteLine("语音对讲回调");
}

3、正确姿势:

参考上面2.2核心代码;

四、总结:

还有个诡异的问题就是,之前WPF测试语音对讲时,就是一个单页面 在页面的Grid中内嵌Winform的PictureBox组件,没发现什么大问题,好像不稳定偶尔出现程序异常退出的情况,没太在意;

等到按照实际的界面布局,多层次嵌套的时候问题就来, 要不直接运行不起来,加了容错处理之后,起来2秒程序就死掉了,心理一万头草拟吗在狂奔,各种扪心自问我到底哪里错了;唯一稍微详细的错误就是系统日志,但是又没什么卵用感觉;

照理说按照开发文档走,应该没啥大问题才对,结果偏偏着了道,硬是被坑了2天;网上各种找资料,跟特么人工爬虫一样,不放过一丝一毫的线索,结果当然是没有结果;都想放弃WPF回头使用Winform了 ,但是作为程序员的不甘心,大家都懂的。

还好无意间悟道了人生真谛,算是把这个不是问题的问题解决了,开心的像个沙雕孩子。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值