【海康威视】WPF客户端二次开发:【2】语音对讲 | 您所在的位置:网站首页 › 手机视频监控语音对讲 › 【海康威视】WPF客户端二次开发:【2】语音对讲 |
文章目录
一、前言二、开启语音对讲1、基础流程:2、核心代码:3、注意事项:
三、偶遇深坑:1、问题描述:2、问题分析:3、正确姿势:
四、总结:
一、前言
开启语音对讲前所需步骤参考参考前一篇文章【海康威视】WPF客户端二次开发:【1】监控视频画面预览(SDK初始化、设备登录、监控画面预览) 本篇重点讲解在进行语音对讲开发时遇到的深坑; 二、开启语音对讲 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、注意事项: 注意开启语音对讲时,必须保证当前测试设备的喇叭、麦克风都正常可用,否则报606错误;可考虑先用网页登录海康自带后台,然后测试语音通讯,排除环境配备问题; 三、偶遇深坑: 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、问题分析: 重点在这一句:提示什么回调委托函数被回收 无法调用Message: A callback was made on a garbage collected delegate of type ‘HKVS.IPCM.WPF!HKVS.IPCM.WPF.HKCSharpSDK.CHCNetSDK+VOICEDATACALLBACKV30::Invoke’. Stack: 坑了整整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, "成功"); } /// /// 语音对讲回调函数 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了 ,但是作为程序员的不甘心,大家都懂的。 还好无意间悟道了人生真谛,算是把这个不是问题的问题解决了,开心的像个沙雕孩子。 |
CopyRight 2018-2019 实验室设备网 版权所有 |