Swift:如何将 AVAudioEngine 的立体声输出转换为单声道

问题描述 投票:0回答:1

我正在尝试将 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)实时转换为单声道信号?

swift avaudioengine avaudioplayernode
1个回答
0
投票

使用矩阵混合器节点是可能的。还有其他方法,但我不知道有更简单的解决方案。矩阵混频器是一种允许将任何输入连接到任何输出的混频器。所以它可以用来将左右输入通道仅连接到一个输出通道。

它的用法有点复杂,所以我有一个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,但也可以调整。这就是为什么如果您需要更多详细信息,要点可能会有所帮助。

链接

无论如何,这里是我用来了解如何使用此音频单元的链接:

© www.soinside.com 2019 - 2024. All rights reserved.