AVAudioEngine录音崩溃, reason: ‘format.sampleRate == hwFormat.sampleRate

AVAudioEngine录音崩溃, reason: ‘format.sampleRate == hwFormat.sampleRateAVAudioEngine录音频时偶发崩溃报错信息大致如下:2021-12-1520:12:38.429028+0800*[1659:708511]NSURLConnectionfinishedwitherror-code-1002″AudioRecorder创建Audio缓存文件夹成功/var/mobile/Containers/Data/Application//Library/Caches/Audio”2021-12-1520:13:30.762736+0800***

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

AVAudioEngine录音频时偶发崩溃
报错信息大致如下:
2021-12-15 20:12:38.429028+0800 *[1659:708511] NSURLConnection finished with error – code -1002
“AudioRecorder 创建Audio缓存文件夹成功 /var/mobile/Containers/Data/Application/
/Library/Caches/Audio”
2021-12-15 20:13:30.762736+0800 ***[1659:708411] [avae] AVAEInternal.h:76 required condition is false: [AVAudioIONodeImpl.mm:1158:SetOutputFormat: (format.sampleRate == hwFormat.sampleRate)]
2021-12-15 20:13:30.764037+0800 ***[1659:708411] *** Terminating app due to uncaught exception ‘com.apple.coreaudio.avfaudio’, reason: ‘required condition is false: format.sampleRate == hwFormat.sampleRate’
*** First throw call stack:
(0x1989799d8 0x1accffb54 0x19888850c 0x1a88e2984 0x1a898c998 0x1a8923038 0x1a892945c 0x1a89a4f4c 0x1a899f414 0x10626bad4 0x10626b130 0x10627f8bc 0x10480ecc0 0x10480e8f4 0x10621e100 0x10621b720 0x10621dcf8 0x10480e8a0 0x10480ed20 0x19b1eaf38 0x19ab80184 0x19ab804c8 0x19ab7ee00 0x19ad65350 0x19ad634e0 0x19b2274cc 0x19b202b0c 0x19b285078 0x19b289818 0x19b280afc 0x1988f9bf0 0x1988f9af0 0x1988f8e38 0x1988f33e0 0x1988f2ba0 0x1af65b598 0x19b1e42f4 0x19b1e9874 0x1ac073b54 0x104a54194 0x104a5410c 0x104a5425c 0x1985d1568)
libc++abi.dylib: terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception ‘com.apple.coreaudio.avfaudio’, reason: ‘required condition is false: format.sampleRate == hwFormat.sampleRate’
terminating with uncaught exception of type NSException
*** Terminating app due to uncaught exception ‘com.apple.coreaudio.avfaudio’, reason: ‘required condition is false: format.sampleRate == hwFormat.sampleRate’
terminating with uncaught exception of type NSException

排查发现是inputNode和mainMixerNode的format不一致
(lldb) po inputFormat
<AVAudioFormat ***: 1 ch, 48000 Hz, Float32>

(lldb) po outputFormat
<AVAudioFormat 0x282b95a40: 2 ch, 44100 Hz, Float32, non-inter>

原代码:

 let audioEngine = AVAudioEngine()
 let filePlayer = AVAudioPlayerNode()
 let rateEffect = AVAudioUnitTimePitch()

 audioEngine.attach(filePlayer)
 audioEngine.attach(rateEffect)

 let outputFormat = audioEngine.mainMixerNode.outputFormat(forBus: 0)
        
 //崩溃在这行代码
 audioEngine.connect(audioEngine.inputNode, to: audioEngine.mainMixerNode, fromBus: 0, toBus: 0, format: outputFormat)
        
        audioEngine.mainMixerNode.installTap(onBus: 0, bufferSize: 4096, format: outputFormat) { 
    [weak self] pcmBuffer, when in
        ...
        }

解决办法:将format都改成48000
参考:https://gist.github.com/tad-iizuka/1ca07ca2045a8c6d11e22d15812f7e15
在这里插入图片描述

修改后代码

        let audioEngine = AVAudioEngine()
        let filePlayer = AVAudioPlayerNode()
        let rateEffect = AVAudioUnitTimePitch()

        audioEngine.attach(filePlayer)
        audioEngine.attach(rateEffect)
        
        let inputFormat = audioEngine.inputNode.inputFormat(forBus: 0)
        let outputFormat = audioEngine.mainMixerNode.outputFormat(forBus: 0)
        
        //修改format为inputNode的format,防止录音崩溃
        audioEngine.connect(audioEngine.inputNode, to: audioEngine.mainMixerNode, fromBus: 0, toBus: 0, format: inputFormat)
        
        audioEngine.mainMixerNode.installTap(onBus: 0, bufferSize: 4096, format: outputFormat) { 
    [weak self] pcmBuffer, when in
        ...
        }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181074.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • QQ的孤独

    QQ的孤独

    2021年11月21日
  • Java内存管理-一文掌握虚拟机创建对象的秘密(九)

    勿在流沙筑高台,出来混迟早要还的。做一个积极的人编码、改bug、提升自己我有一个乐园,面向编程,春暖花开!回顾一下:本文是接着上一篇内容:Java内存管理-愚人节new一个对象送给你(八),继续整理!主要内容讲解HotSpot虚拟机在Java堆中对象是如何创建、内存分配布局和访问方式。本文地图:一、给你创建一个对象如果你是一直从第一季看过来的,那一定知道前面有个地方讲过类的整…

    2022年2月28日
  • MySQL 添加索引,删除索引及其用法[通俗易懂]

    MySQL 添加索引,删除索引及其用法[通俗易懂]原文:https://www.cnblogs.com/zz-tt/p/6609828.html一.索引的作用一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响…

    2022年6月2日
  • 网络-访问控制

    网络-访问控制1.访问控制访问控制就是限制访问主体对访问客体的访问权限控制,决定主体对客体能做什么和做到什么程度访问主体(主动):用户,进程,服务访问客体(被动):数据库,资源,文件2.访问控制的两个过程认证:先由认证来检验主体(用户)的合法身份,在访问控制之前授权:由管理员决定和限制主体(用户)对资源的访问级别!!注意:审计也在主体对客体访问的过程中,但是,审计是访问过程中,对访问情况的记录和审查,他只是产生一些log,用来分析安全事故产生的原因,和访问控制无关,就是个辅助用的,可要可不要。3.访问控制

    2022年7月23日
  • 新公司工作

    新公司工作

    2021年8月27日
  • 域名系统DNS用来解析_网页域名解析错误怎么办

    域名系统DNS用来解析_网页域名解析错误怎么办1、DNSDNS(DomainNameSystem)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,用于TCP/IP网络。2、域名系统DNS的作用通常我们有两种方式识别主机:通过主机名或者IP地址。人们喜欢便于记忆的主机名表示,而路由器则喜欢定长的、有着层次结构的IP地址。为了满足这些不同的偏好,我们就需要一种能够进行主机名到IP地址转换的目录服务,域名系统作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。因此,即使不使用域名

    2022年10月15日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号