我正在尝试使用AVAudioEnvironmentNode
为我正在开发的游戏产生3D空间声音。 AVAudioEnvironmentNode
文档指出:“需要注意的是,只有与环境节点具有单声道连接格式的输入才是空间化的。如果输入是立体声,则音频将不经过空间化而通过。目前,输入格式的连接数大于不支持2个频道。”我确实发现确实如此。当我将具有两个通道的音频缓冲区加载到AudioPlayerNode
并将节点连接到AVAudioEnvironmentNode
时,输出声音不会进行空间化。我的问题是,如何将单声道数据发送到AVAudioEnvironmentNode
?
我尝试使用.wav
创建一个单声道Audacity
文件,以及以编程方式加载正弦波数据的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测试
Scene [1577:751557] ***由于未捕获的异常而终止应用程序
'com.apple.coreaudio.avfaudio',原因:'所需条件为假:
_outputFormat.channelCount == buffer.format.channelCount'
检查AVAudioPlayerNode
输出总线确实确实表明它需要2个通道。我不清楚如何更改,甚至应该更改。
我规定我一般没有处理AVFoundation
或音频数据的经验。您能提供的任何帮助将不胜感激。
最佳答案
希望您已经解决了此问题,但对于其他任何人:
将AVAudioPlayerNode连接到AVAudioMixerNode或它可以连接的任何其他节点时,您需要在此处指定通道数:
audioEngine.connect(playerNode, to: audioEngine.mainMixerNode, format: AVAudioFormat.init(standardFormatWithSampleRate: 96000, channels: 1))
您可以在Audacity中检查文件的采样率是96000,还是在Finder中检查“获取信息”。