ios - 在 AVAudioEngine 上初始化 AVAudioSequencer 时 AVAEInternal/coreaudio.avfaudio 错误

标签 ios swift avfoundation core-audio avaudioengine

我正在尝试使用 AVAudioEngineAVAudioUnitSamplerAVAudioSequencer 创建和测试基本音频设置;但是,即使是这个最基本的代码版本也会引发以下错误,从而导致应用程序完全崩溃。

谁能告诉我为什么会发生这种情况吗?原因具体是序列器初始化的行(如果被注释掉,错误就会停止),但我不确定为什么。这是否与步骤顺序有关,或者我在这里错过了什么?

它说了一些关于检索 outputNode 的内容,但我认为 AVAudioEngine 有默认初始化的其中一个。

谢谢。

class TestAudioClass {

    private var audioEngine: AVAudioEngine
    private var sampler: AVAudioUnitSampler
    private var sequencer: AVAudioSequencer

    init() {
        self.audioEngine = AVAudioEngine()
        self.sampler = AVAudioUnitSampler()
        self.sequencer = AVAudioSequencer(audioEngine: audioEngine)
    }
}

Thread 1: signal SIGABRT

[avae] AVAEInternal.h:70:_AVAE_Check: required condition is false: [AVAudioEngineGraph.mm:4474:GetDefaultMusicDevice: (outputNode)]

[avae] AVAEInternal.h:103:_AVAE_CheckNoErr: [AVAudioEngineGraph.mm:4309:SetSequence: (err = MusicSequenceSetAudioGraph(inSequence, _seqGraphImpl)): error -1

*** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'error -1'

最佳答案

所以,经过一番挖掘后,我找到了解决方案:虽然 AVAudioEngine 确实附带了一个开箱即用的 outputNode,但 Apple 却没有足够清楚的是,该输出节点在初始化后并不立即存在。

在上面的代码中,定序器在创建时尝试访问引擎的输出节点,但发现那里什么也没有,从而触发崩溃。

在创建音序器之前,您必须以某种方式访问​​引擎的 outputNode(直接或通过 mainMixerNode 间接访问)。这可以通过调用该属性来实现,但一个好的方法是将任何相关节点连接到它,例如 AVAudioUnitSampler

更正后的代码如下:

class TestAudioClass {

    private var audioEngine: AVAudioEngine
    private var sampler: AVAudioUnitSampler
    private var sequencer: AVAudioSequencer

    init() {
        self.audioEngine = AVAudioEngine()
        self.sampler = AVAudioUnitSampler()
        audioEngine.attach(sampler)
        audioEngine.connect(sampler, to: audioEngine.mainMixerNode, format: nil)
        self.sequencer = AVAudioSequencer(audioEngine: audioEngine)
    }
}

还值得注意的是,如果您首先直接访问 outputNode,则不会导致连接混音器。根据苹果工作人员的说法here :

"...the default output is created for you automatically either with a mixer attached (access mainMixerNode first) or just by itself (access outputNode first)."

注意:在此对象取消初始化期间(例如,在执行展开转场至另一个 ViewController 时),您可能仍会遇到类似的崩溃。有关如何解决此问题的详细信息,请参阅 here .

关于ios - 在 AVAudioEngine 上初始化 AVAudioSequencer 时 AVAEInternal/coreaudio.avfaudio 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57966172/

相关文章:

ios - 撰写推文连接应用程序或授权网络不执行任何操作

ios - Disqus 在 iOS UIWebView 上似乎比平时花费更长的时间

ios - 在 iOS 上插入耳机时内置麦克风的输入声音会降低

ios - ios相机对焦不佳

ios - 在 Storyboard 中创建标题时,将 UITableView 标题 View 粘贴到顶部

ios - 在 UI 交互中同时在后台同步时操作 Core Data Context 的最佳实践

swift - 如何在TableView中按Section和Row进行搜索?

json - 返回已解析 JSON 的全局函数?

ios - 获取视频的当前时间(播放器 - Swift)

ios - 视觉格式自动布局中的灵活大小元素如何决定使用哪个谓词