[AVAudioIONodeImpl.mm:1158:SetOutputFormat: (format.sampleRate == hwFormat.s

2023-11-07

在做语音识别功能时,AVAudioInputNode闪退。

问题

2020-11-26 09:55:40.405867+0800 Encompass[444:39363] [avae] AVAEInternal.h:76 required condition is false: [AVAudioIONodeImpl.mm:1158:SetOutputFormat: (format.sampleRate == hwFormat.sampleRate)]

Crashed at installTapOnBus…

// Configure the microphone input.
AVAudioInputNode *inputNode = self.audioEngine.inputNode;
//[inputNode removeTapOnBus:0];
AVAudioFormat *recordingFormat = [inputNode outputFormatForBus:0];
[inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
    if (weakSelf.recognitionRequest) {
        [weakSelf.recognitionRequest appendAudioPCMBuffer:buffer];
    }
}];

原因

有两种情况下会这样:

  1. 当audioEngine.isRunning是YES时,inputNode installTapOnBus:0…
  2. 在inputNode installTapOnBus:0…之前调用了audioEngine stop

audioEngine.isRunning

如果audioEngine.isRunning是YES状态时,再installTapOnBus:0会闪退。

当是audioEngine.isRunning状态时,下面的block回调还是在继续的,并没有停止。

[inputNode installTapOnBus:0 bufferSize:1024 format:recordingFormat block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
    if (weakSelf.recognitionRequest) {
        [weakSelf.recognitionRequest appendAudioPCMBuffer:buffer];
    }
}];

runing状态下再次installTapOnBus:0…导致了这个问题。

audioEngine removeTapOnBus

我出现这个问题的原因是,在调用installTapOnBus:0…前面调用了如下代码:

[self.audioEngine stop];
[self.audioEngine.inputNode removeTapOnBus:0];

在之后installTapOnBus的时候也执行了removeTapOnBus:0

 [inputNode removeTapOnBus:0];
 [inputNode installTapOnBus:0 bufferSize:1024 format:format block:^(AVAudioPCMBuffer * _Nonnull buffer, AVAudioTime * _Nonnull when) {
 ...

将stop注释掉,保留removeTapOnBus,也闪退了。将removeTapOnBus注释掉,留stop,没问题。

解决

  1. stop的时候不removeTapOnBus
[self.audioEngine stop];

我不知道为什么这样做会不闪退。

  1. stop removeTapOnBus nil
[self.audioEngine stop];
[self.audioEngine.inputNode removeTapOnBus:0];
self.audioEngine = nil;

直接将audioEngine对象释放掉,重新创建。可以看看Apple官方提供的Demo。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[AVAudioIONodeImpl.mm:1158:SetOutputFormat: (format.sampleRate == hwFormat.s 的相关文章

  • Vue组件学习之组件自定义事件

    主要介绍组件的自定义事件的概念 使用等 何为组件自定义事件 组件自定义事件是一种组件间的通信方式 方向是 子组件 gt 父组件 使用场景 A是子组件 B是父组件 如果要把B的数据传给A 可以使用props配置项 如果要把A的数据转给B 就要
  • 【Springboot】集成百度地图实现定位打卡功能

    目录 第一章 需求分析 第二章 概要设计 第三章 详细设计 3 1 环境搭建 3 1 1 获取百度地图ak 3 1 2 创建springboot项目 3 2 配置application properties 3 3 配置pox xml 3
  • pyTorch基本数据类型

    pyTorch基本数据类型 文章目录 pyTorch基本数据类型 首先比较一下python和pytorch的数据类型区别 pyhon的特点 pytorch的特点 维度为0的标量 维度为1的向量 维度为2的Tensor 维度为3的Tensor
  • eclipse学习心得

    1运行程序 在后台遇到断点时 进入debug调试状态 作用域 功能 快捷键 全局 单步返回 F7 全局 单步跳过 F6 全局 单步跳入 F5 全局 单步跳入选择 Ctrl F5 全局 调试上次启动 F11 全局 继续 F8 全局 使用过滤器
  • js设置input只保留一位小数

    前言 input中只保留小数点后一位 直接不让他输入 实现方法 这里主要用 input事件来监听 vue中的话用 input input中加上 type text 注意这里有坑 不能用数字类型 谷歌 360可以 火狐会报错 oninput
  • C++的rapidjson库的安装和用法(包括Windows和Linux)

    C 的rapidjson库的安装和用法 包括Windows和Linux 1 RapidJson在Linux下安装 1 确保安装了git以及cmake make 2 在github官网上clone下RapidJson的工程 git clone
  • SpringMVC实现文件上传和下载功能

    实现文件上传和下载功能 一 文件上传功能 目录结构 设立流程 1 数据库表结构 2 dao包 3 po包 4 service包 5 controller包 6 resources包 7 webapp 8 spring的xml配置文件 9 导
  • JSP实现简单用户登录

    使用初级的JSP代码实现用户登录 使用TXT文件存储用户数据 初学JSP与大家分享一些自己的代码 index jsp
  • 最小二乘法圆拟合(附完整代码)

    文章目录 一 2D圆弧拟合 1 不经过给定起点与终点 2 精确经过给定起点与终点 二 3D圆弧拟合 一 2D圆弧拟合 1 不经过给定起点与终点 平面圆的一般方程为 x 2
  • RFID医疗耗材柜管理系统中的解决方案

    1 社会背景 医疗物资管理 传统的管理流程由于周期短 效率高 被各大医院广泛采用 但随之高值耗材种类激增所带来的准入标准弱化 信息追踪困难 管理责任不明确 历史数据统计分析困难等一系列问题日趋严峻 其次医院内部设备 财务和临床科室相互独立兼
  • 【unordered_map和unordered_set的封装】

    文章目录 1 哈希表的基本改造 2 迭代器 2 1 迭代器的大致框架 2 2 运算符重载的实现 2 3 哈希表的完善 3 unordered map和unordered set的封装 3 1 unordered map 3 2 unorde
  • MPC入门与Matlab实现

    本文为B站视频 你还在用PID MPC模型预测控制 从公式到代码 的学习笔记 强烈推荐去看这位大佬的视频 链接放在了最后 别忘了给大佬一键三连哈 MPC入门与Matlab实现 前言 1 模型 2 预测 3 滚动优化 参考轨迹 优化目标 4

随机推荐

  • python使用pymysql总是超时的解决方案

    可以使用如下方法对代码进行包裹 import pymysql import yaml from loguru import logger mysql config db my db host 127 0 0 1 user test user
  • SQLite多线程读写

    多线程读写 SQLite 实质上是将数据写入一个文件 通常情况下 在应用的包名下面都能找到 xxx db 的文件 拥有 root 权限的手机 可以通过 adb shell 看到 data data packagename databases
  • Java程序员该如何突破瓶颈,成长为优秀的架构师

    一 如何定义架构师 Java架构师 首先要是一个Java程序员 熟练掌握使用各种框架 并知道它们实现的原理 Java虚拟机原理 调优 懂得JVM能让你写出性能更好的代码 池技术 什么对象池 怎么解决并发量 连接池 线程池 Java反射技术
  • MATLAB的一些简单命令(1)

    关键字 if A y prctile input linspace disp 注释 本博客讲解了一些matlab常用简单命令的含义 这些命令简单却容易忘记 所以便整合了一下 至于较为复杂的命令 则将会单独写博客记录 为什么代码段设置选项没有
  • 华为OD机试-不爱施肥的小布-2022Q4 A卷-Py/Java/JS

    题目 某农场主管理了一大片果园 fields表示不同果林的面积 单位 m 2 现在要为所有的果林施肥且必须在n天之内完成 否则影响收成 小布是果林的工作人员 他每次选择一片果林进行施肥 且一片果林施肥完后当天不再进行施肥作业 假设施肥机的能
  • uniapp适配支付宝,微信登录模块

    uniapp 微信 支付宝登录 1 获取手机号2 获取个人信息 头像 昵称
  • Scala中的对象

    1 Object 单例对象 定义 类似Java中的 静态对象 即定义在 object中的所有成员变量 和 方法都是静态的 eg 调用的话 类名 方法 或 类名 变量 直接调用 不用实例化类对象 可见 personId 是静态对象 每次会自动
  • 蓝桥杯2014年第五届真题-六角填数

    题目 如图所示六角形中 填入1 12的数字 使得每条直线上的数字之和都相同 图中 已经替你填好了3个数字 请你计算星号位置所代表的数字是多少 请通过浏览器提交答案 不要填写多余的内容 题解 全排列 暴力 当然也可以手算 总共12个数 填好了
  • gTest基本知识

    GoogleTest 1 gTest简介 gTest是google开发团队开发的一款针对C 代码的测试框架 可以帮助我们更快 更好地写出C 测试代码 gTest支持Linux Windows Mac等多个OS平台上运行 gTest不仅仅只支
  • 各大OJ

    著名OJ网址 中文OJ 任青网络在线测评系统RQNOJ http www rqnoj cn 高效信息学评测系统vijos http www vijos cn 2008 7 12复活 英文OJ 北京大学pku http acm pku edu
  • QT中回调函数与槽函数的区别

    1 什么是回调函数 什么是信号槽 回调函数是一个函数指针 即指向函数的指针 保存某个执行函数的地址 当其他人写的代码需要执行自己的程序 而又保证其他人的代码不能别修改 此时就产生了回调函数的概念 信号槽函数本质上也是一个回调函数 用于不同对
  • 转载:eclipse/g++多线程编译问题

    解决方法 https www jianshu com p 08b9634db3d7 tdsourcetag s pctim aiomsg
  • 代码审查:最佳实践

    不能低估代码审查在软件开发中的重要性 适当地进行代码审查不仅可以在早期阶段提高代码质量并识别潜在问题 还有助于培养开发人员的技能 但是 在大多数情况下 代码审查的意思是 只粗略地看一下所做的更改并提供一两个注释 没有多少人做详细和通过审查
  • Matlab遗传算法用于旅行商问题优化TSP

    Matlab遗传算法用于旅行商问题优化 要求 第一步 参数编码和初始群体设定 第二步 计算路径长度的函数设计 第三步 计算选择算子 第四步 计算交叉算子 第五步 计算变异算子 结果及分析 MATLAB总代码 要求 利用遗传算法求旅行商问题的
  • Erlang日期时间相关

    一 erlang now erlang now gt timestamp timestamp MegaSecs Secs MicroSecs MegaSecs Secs MicroSecs integer gt 0 BIF erlang n
  • Linux学习之Linux常用命令整理

    Linux常用命令 练习3遍以上 一 命令基本格式 1 命令格式 root 管理员 localhost 主机名 超级用户提示符 普通用户提示符是 adminis root一级目录用pwd print working directory 打印
  • 对标管理的基础是开放

    开放开阔眼界 从而才能看到对标对象 才能看到不足和差距 进而改进 去追赶对标目标 个人如此 组织如此 国家亦然 中国三十多年 变化翻天覆地 没有开放驱动的变革 断无可能 如果没有开放 或许我们现在还像朝鲜那样 天天还在将改革批判成修正主义
  • 使用iso文件安装双系统linux,Win7下使用EasyBcd安装Ubuntu(iso文件)双系统

    Win7下使用EasyBcd安装Ubuntu iso文件 双系统 一 准备工作 在win7下操作完成 1 从官网www ubuntu com上下载镜像文件 大小接近700M 2 下载并安装easybcd easybcd是一款很优秀的系统引导
  • App消息推送 实现原理

    1 消息推送的实质 实际上 是当服务器有新消息需推送给用户时 先发送给应用App 应用App再发送给用户 2 作用 产品角度 功能需要 如 资讯类产品的新闻推送 工具类产品的公告推送等等 运营角度 活动运营需要 如 电商类产品的促销活动 召
  • [AVAudioIONodeImpl.mm:1158:SetOutputFormat: (format.sampleRate == hwFormat.s

    在做语音识别功能时 AVAudioInputNode闪退 问题 2020 11 26 09 55 40 405867 0800 Encompass 444 39363 avae AVAEInternal h 76 required cond