使用AUAudioUnit录制音频时禁用扬声器的声音

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

我尝试使用AUAudioUnit录制音频。我成功获取了音频缓冲区,但在录音时也可以通过扬声器听到录音。问题是如何使缓冲器不将声音传递给扬声器?

func startRecording() {
    setupAudioSessionForRecording()

    do {
        let audioComponentDescription = AudioComponentDescription(
            componentType: kAudioUnitType_Output,
            componentSubType: kAudioUnitSubType_RemoteIO,
            componentManufacturer: kAudioUnitManufacturer_Apple,
            componentFlags: 0,
            componentFlagsMask: 0 )

        try auAudioUnit = AUAudioUnit(componentDescription: audioComponentDescription)
        let audioFormat = AVAudioFormat(commonFormat: .pcmFormatInt16,
                                        sampleRate: sampleRate,
                                        interleaved: true,
                                        channelLayout: AVAudioChannelLayout(layoutTag: kAudioChannelLayoutTag_Mono)!)

        try auAudioUnit.inputBusses[0].setFormat(audioFormat)
        try auAudioUnit.outputBusses[1].setFormat(audioFormat)
    } catch {
        print(error)
    }

    auAudioUnit.isInputEnabled  = true

    auAudioUnit.outputProvider = {(actionFlags, timestamp, frameCount, inputBusNumber, inputData) -> AUAudioUnitStatus in
        let err : OSStatus = self.auAudioUnit.renderBlock(actionFlags,
                                                          timestamp,
                                                          frameCount,
                                                          1,
                                                          inputData,
                                                          .none)
        if err == noErr {
            self.processMicrophoneBuffer(inputDataList:  inputData,
                                         frameCount: UInt32(frameCount) )
        } else {
            print(err)
        }
        return err
    }

    do {
        try auAudioUnit.allocateRenderResources()
        try auAudioUnit.startHardware()
    } catch {
        print(error)
    }
}
ios avfoundation core-audio audiounit audiotoolbox
1个回答
0
投票

使RemoteIO输出静音的一种方法是,在处理(复制)每个缓冲区后,将记录的输入数据中音频缓冲区的内容(frameCount样本)清零。

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