【海康威视】WPF客户端二次开发:【2】语音对讲 您所在的位置:网站首页 手机视频监控语音对讲 【海康威视】WPF客户端二次开发:【2】语音对讲

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

2024-05-24 20:08| 来源: 网络整理| 查看: 265

文章目录 一、前言二、开启语音对讲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 实验室设备网 版权所有