【问题标题】:AudioUnitRender Error -50 meaningAudioUnitRender Error -50 含义
【发布时间】:2019-01-21 00:54:07
【问题描述】:

我在 AudioUnitRender 调用中收到错误 -50。我的音频单元只是一个从麦克风获取样本的 RemoteIO 单元。错误-50是什么意思?

  let status = AudioUnitRender(controller.audioUnit!, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, listPtr)

if noErr != status {
    print("Error \(status)");
    fatalError("Render status \(status)")
  // return status;
}

【问题讨论】:

    标签: ios avfoundation avaudiosession audiounit remoteio


    【解决方案1】:

    -50 (kAudio_ParamError) 表示你传递的参数之一错误。

    AudioUnitRender 的一个常见错误是传递 AudioBufferListmNumberBuffers 编号错误(您可能正在录制非交错立体声),或者 AudioBuffers 本身的大小可能错误或有频道数错误。

    每当我忘记模拟器和设备远程音频单元具有不同的默认流格式并且没有通过显式设置它们时,我都会遇到这个问题

    AudioUnitSetProperty(audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &streamFormatIActuallyWant, UInt32(MemoryLayout<AudioStreamBasicDescription>.size))
    

    认为模拟器默认为交错整数,设备默认为非交错浮点,尽管这可能只是我的配置。

    来自AudioUnitRender 头文件:

    调用者必须提供一个有效的 ioData AudioBufferList 匹配 给定总线的当前音频格式的预期拓扑。缓冲区 列表可以有两种变体:
    (1) 如果 mData 指针不为空,那么音频单元将渲染它的 输出到这些缓冲区。这些缓冲区应该对齐到 16 字节 边界(这通常是 malloc 将返回的)。
    (2) 如果 mData 指针为空,则音频单元可以提供指针 到自己的缓冲区。在这种情况下,音频单元需要保留这些 在调用线程的 I/O 周期内有效的缓冲区

    通过传递 null mData(第 (2) 点)可以为您节省不必要的副本,但您仍然需要知道“拓扑”的格式,即 mNumberBuffers(可能是 1 或 2)。

    【讨论】:

    • 如何通过 nil mData 传递 AudioBufferList,我尝试但它再次给出 -50 错误。
    • 我的配置很复杂。我也有 AVCaptureSession。我重现-50错误如下。在初始化 AVCaptureSession 之前启动应用程序并退出它。我在后台看到所有设置。现在,当我将应用程序带到前台时,我开始收到 -50 错误。不知道如何调试它。
    • 你在github上有项目可以分享吗?
    • 我看到当 inNumberFrames 参数为奇数长度(1115 而不是 1114)时会出现问题。我不知道 inNumberFrames 在中断后如何从 1024 变为 1114 或 1115。有什么想法会影响这个参数?
    • 您可以使用osstatus.com 或grep 头文件。这不是很好。另外我认为 -50 在 mac 上的参数错误已经有很长一段时间了,比如 25 年以上。
    【解决方案2】:

    确保您传递的 AudioBufferList 具有足够的mDataByteSize,它应该大于 inNumberFrames * 通道。

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 2012-05-04
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 2014-10-02
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多