【问题标题】:Attaching a callback to the output element of the Remote IO将回调附加到远程 IO 的输出元素
【发布时间】:2012-11-29 05:59:56
【问题描述】:

我想从 iOS 设备的麦克风捕获音频并将其写入 .caf 文件。

我能够将远程 IO 音频单元连接到多通道混音器单元 (MCMU),并将回调附加到 MCMU 的输入。在该回调中,我可以使用 ExtAudioFileAsyncWrite() 成功地将麦克风中的音频数据写入文件。

我想简化一些事情并从图片中删除 MCMU。我的想法是我可以简单地将回调附加到远程 IO 输入范围的输出总线,并在该回调调用 ExtAudioFileAsyncWrite() 内。

但是,当我尝试这个 ExtAudioFileAsyncWrite() 返回 -50 (paramError)。

Remote IO的输入元素的输出总线不能附加回调吗?

【问题讨论】:

    标签: core-audio


    【解决方案1】:

    这是可能的。您需要使用AudioUnitSetProperty 来设置kAudioOutputUnitProperty_SetInputCallback 属性。此回调的功能与渲染回调很相似,但只要 RemoteIO / mic 为您提供一些新数据(而不是作为来自您的程序的数据请求),就会调用此回调。

    例子:

    AURenderCallbackStruct callbackInfo = {YourInputCallback, NULL};
    AudioUnitSetProperty(remoteIO,
                         kAudioOutputUnitProperty_SetInputCallback,
                         kAudioUnitScope_Global,
                         0,
                         &callbackInfo,
                         sizeof(callbackInfo));
    

    这将使 RemoteIO / mic 调用 YourInputCallback 每当它有新的一批样本时。您可以像以前一样使用此回调调用ExtAudioFileWriteAsync。请注意,您还必须在 RemoteIO 上调用 AudioUnitRender,才能从中获取新样本。

    关于 -50 错误,这不是一个非常有用的错误诊断。它基本上只是说“您的一个参数有错误”。很可能您的 ExtAudioFile 为 NULL 或设置不正确(在这种情况下,您之前在其上使用的 ExtAudioFile* 函数之一会返回更有用的错误代码,您可以使用它来诊断它)。

    【讨论】:

    • 谢谢。我在上面打错了:当我在回调函数中调用 AudioUnitRender() 时返回 -50 错误。 AudioUnitSetProperty() 中的 AudioUnitElement 参数不应该是 1,而不是 0?
    • 对于全局参数,它始终为 0(因为全局范围甚至没有“元素”)。我知道这很奇怪,因为它实际上会影响 RemoteIO 的输入,但就核心音频而言,kAudioOutputUnitProperty_SetInputCallback 是全局范围参数,而不是输入/输出范围参数。
    • 另外,AudioUnitRender 中的paramErr 几乎可以肯定意味着您的 RemoteIO 为 NULL/未初始化/设置不正确,或者您的 ioData AudioBufferList 格式错误。在“未正确设置”的情况下,较早的 Core Audio 功能之一可能会返回 OSStatus 告诉您更多信息。如果它是 NULL,那么它就是 NULL,它不应该是(但你知道 :))。
    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多