如何在播放音频文件的同时使用AudioKit录制音频?

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

我正在尝试录制音频并应用实时音调转换并将输出写入

AVAudioFile
,所有这些都使用
AudioKit
。同时,我想在录音期间播放音频文件,使用
AVPlayer

问题是,如果我在录音过程中播放音频文件,就会有一个非常高音调的反馈循环,回声非常响亮!另一方面,如果我仅使用

AVAudioRecorder
进行录音,则反馈循环为零。

以下是我如何使用

AudioKit
引擎上的点击来录制已处理和未处理的音频; (您会注意到我设置了
AVAudioSession
AudioKit
Settings
类别。)

class PitchCorrectionAudioKitService {
    private let engine = AudioEngine()
    private var pitchShiftEffect: PitchShifter!
    
    private var unprocessedAudioFile: AVAudioFile?
    private var processedAudioFile: AVAudioFile?

    // ------------------
    
    @Injected private var pitchDetectionService: PitchDetectionRepository
    
    // ------------------
    
    init() {
        guard let input = engine.input else { return }
        
        pitchShiftEffect = PitchShifter(input)
        engine.output = pitchShiftEffect
    }
    
    func start(baseNote: Note) {
        handleAudioSessionCategory()
        
        pitchDetectionService.start { data in
            self.autoCorrectPitch(data, baseNote: baseNote)
        }

        try! engine.start()
        
        engine.input?.avAudioNode.installTap(onBus: 0, bufferSize: 4096, format: nil) { buffer, time in
            try! self.unprocessedAudioFile?.write(from: buffer)
        }

        engine.output?.avAudioNode.installTap(onBus: 0, bufferSize: 4096, format: nil) { buffer, time in
            try! self.processedAudioFile?.write(from: buffer)
        }
    }
    
    private func handleAudioSessionCategory() {
        if UIDevice.primaryAudioDevice == .defaultSpeakers {
            try! AVAudioSession.sharedInstance().setCategory(.playAndRecord, options: [.defaultToSpeaker, .allowBluetooth])
            try! Settings.setSession(category: .playAndRecord, with: [.defaultToSpeaker, .allowBluetooth])
        } else {
            try! AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .videoRecording)
            try! Settings.setSession(category: .playAndRecord)
        }
        
        try! AVAudioSession.sharedInstance().setActive(true)
    }
}

开始录音的那一刻,我还播放音乐曲目;

private var musicTrackPlayer: AVPlayer?

musicTrackPlayer?.pause()
musicTrackPlayer?.volume = areHeadphonesConnected ? 0.4 : 0.01
musicTrackPlayer?.play()

有什么想法吗?

编辑;我正在使用版本

5.6.1

swift audio avaudiosession audiokit
1个回答
0
投票

边播放边录音可能不是一个敏感的解决方案;但是,在 IOS 中,您可以使用 AudioUnit(kAudioUnitSubType_VoiceProcessingIO) 来拆分扬声器和麦克风

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