我正在尝试将 AVAudioEngine 的输出从立体声转换为单声道。我希望能够使用 AVAudioPlayerNode 的 pan 属性将转换后的单声道信号发送到左或右耳机或扬声器。
engine.connect(audioFilePlayer[i], to: timePitchControl[i], format: audioFile[i].processingFormat)
engine.connect(timePitchControl[i], to: engine.mainMixerNode, format: audioFile[i].processingFormat)
有没有办法将引擎的输出(AVAudioEngine -> engine.mainMixerNode)实时转换为单声道信号?
使用矩阵混合器节点是可能的。还有其他方法,但我不知道有更简单的解决方案。矩阵混频器是一种允许将任何输入连接到任何输出的混频器。所以它可以用来将左右输入通道仅连接到一个输出通道。
它的用法有点复杂,所以我有一个gist,让它更方便。无论如何,这里有一些部分。
let matrixUnitDescription = AudioComponentDescription(
componentType: kAudioUnitType_Mixer,
componentSubType: kAudioUnitSubType_MatrixMixer,
componentManufacturer: kAudioUnitManufacturer_Apple,
componentFlags: 0,
componentFlagsMask: 0
)
let matrixMixerNode = try await AVAudioUnit.instantiate(with: matrixUnitDescription)
然后,您可以将播放器节点连接到该混音器节点,并将混音器节点连接到主混音器节点(如果您愿意,也可以连接到之前的另一个节点)。
engine.connect(playerNode, to: matrixMixerNode, format: nil)
engine.connect(matrixMixerNode, to: engine.mainMixerNode, format: nil)
接下来是技巧部分。 发动机启动时,设置总音量、输入音量和输出音量:
// global
AudioUnitSetParameter(
matrixMixerNode.audioUnit,
kMatrixMixerParam_Volume,
kAudioUnitScope_Global,
0xFFFF_FFFF,
1,
0
)
// inputs
for inputChannelIndex in 0..<matrixMixerNode.inputFormat(forBus: 0).channelCount {
AudioUnitSetParameter(
matrixMixerNode.audioUnit,
kMatrixMixerParam_Volume,
kAudioUnitScope_Input,
inputChannelIndex,
1,
0
)
}
// outputs
for outputChannelIndex in 0..<matrixMixerNode.outputFormat(forBus: 0).channelCount {
AudioUnitSetParameter(
matrixMixerNode.audioUnit,
kMatrixMixerParam_Volume,
kAudioUnitScope_Output,
outputChannelIndex,
volume,
0
)
}
最后,您可以设置输入通道和输出通道之间的连接音量。因此,要将立体声信号转换为单声道:
let leftCrossPoint = UInt32((0 << 16) | 0)
AudioUnitSetParameter(
matrixMixerNode.audioUnit,
kMatrixMixerParam_Volume,
kAudioUnitScope_Global,
leftCrossPoint,
1,
0
)
let rightCrossPoint = UInt32((1 << 16) | 0)
AudioUnitSetParameter(
matrixMixerNode.audioUnit,
kMatrixMixerParam_Volume,
kAudioUnitScope_Global,
rightCrossPoint,
1,
0
)
这是很多样板,这里的音量始终为 1,但也可以调整。这就是为什么如果您需要更多详细信息,要点可能会有所帮助。
无论如何,这里是我用来了解如何使用此音频单元的链接: