将单声道音频数据传递给 AVAudioEnvironmentNode
Posted
技术标签:
【中文标题】将单声道音频数据传递给 AVAudioEnvironmentNode【英文标题】:Passing mono audio data to AVAudioEnvironmentNode 【发布时间】:2016-02-17 12:11:58 【问题描述】:我正在尝试使用AVAudioEnvironmentNode
为我正在开发的游戏制作 3D 空间化声音。 AVAudioEnvironmentNode
文档指出,“重要的是要注意,只有与环境节点具有单声道连接格式的输入才会被空间化。如果输入是立体声,则音频会通过而不被空间化。目前连接格式为不支持超过 2 个频道。”我确实发现情况确实如此。当我将具有两个通道的音频缓冲区加载到AudioPlayerNode
并将节点连接到AVAudioEnvironmentNode
时,输出声音不是空间化的。我的问题是,如何将单声道数据发送到AVAudioEnvironmentNode
?
我尝试使用Audacity
创建一个单声道.wav
文件,并以编程方式加载一个带有正弦波数据的AVAudioPCMBuffer
。我发现无论哪种方式,当我创建一个单通道音频缓冲区并尝试将缓冲区加载到 AudioPlayerNode
时,我的程序崩溃并出现以下错误:
2016-02-17 06:36:07.695 测试场景[1577:751557] 06:36:07.694 错误: [0x1a1691000] AVAudioPlayerNode.mm:423: ScheduleBuffer: 必需 条件为假:_outputFormat.channelCount == buffer.format.channelCount 2016-02-17 06:36:07.698 测试 场景[1577:751557] *** 由于未捕获的异常而终止应用程序 'com.apple.coreaudio.avfaudio',原因:'所需条件为假: _outputFormat.channelCount == buffer.format.channelCount'
检查AVAudioPlayerNode
输出总线确实表明它需要2 个通道。我不清楚如何改变它,或者即使它应该改变。
我规定我在处理AVFoundation
或一般音频数据方面经验很少。您能提供的任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:我希望你已经解决了这个问题,但是对于其他人来说:
当您将 AVAudioPlayerNode 连接到 AVAudioMixerNode 或它可以连接的任何其他节点时,您需要指定那里的通道数:
audioEngine.connect(playerNode, to: audioEngine.mainMixerNode, format: AVAudioFormat.init(standardFormatWithSampleRate: 96000, channels: 1))
您可以在 Audacity 中检查文件的采样率是否为 96000,或在 Finder 中“获取信息”。
【讨论】:
我认为环境节点的输入只能是一个通道;如果输入源的通道多于一个,则可以使用 AVAudioMixerNode 对源的输出进行下采样(类似于您上面所做的方式)。由于 AVAudioEngine 混音器节点位于行尾,因此您无法将其输出连接到 AVAudioEnvironmentNode。而是将播放器节点连接到您创建的混合器节点,然后将混合器节点连接到环境节点。然后环境节点连接到主混合器节点。以上是关于将单声道音频数据传递给 AVAudioEnvironmentNode的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据传递给BottomSheetDialogFragment [重复]