将单声道音频数据传递给 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 [重复]

将数据传递给 viewController

将数据传递给服务 - android?

vue js将数据传递给组件

如何在 Swift(Cocoa 应用程序)中将数据传递给以前的 ViewController

如何通过数组将数据传递给表格视图?