我正在尝试录制音频并应用实时音调转换并将输出写入
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
。
边播放边录音可能不是一个敏感的解决方案;但是,在 IOS 中,您可以使用 AudioUnit(kAudioUnitSubType_VoiceProcessingIO) 来拆分扬声器和麦克风