我的应用程序同时记录和播放音频。 AVAudioSession
配置为.playAndRecord
类别。模式为default
,选项为.mixWithOthers
和.defaultToSpeaker
。
记录依赖于AudioComponentInstance
,该记录在启动时将缓冲区传递给记录回调。播放是通过普通的AVPlayer
类型类进行的(我使用的是更多自定义内容,但不应该如此)。
现在是问题所在:有时播放的音频中有人在说话,而我的麦克风输入捕获了该声音。我的录音回调进行了一些语音处理,其想法是捕获用户所说的,而不是我的应用所说的。
那么-有没有一种方法可以将麦克风的录音与扬声器的输出隔离开来?还是比这更聪明的东西?显然,如果用户使用耳机,这不是问题。但是,如果不是这样,那就成了问题。
我尝试过的无效的方法:
这违反了基本物理原理,但是如果我使用内置麦克风(顶部)而不是扬声器附近的麦克风(底部),那么我将避免此问题。使用以下代码来设置音频会话:
if let mic = session.availableInputs?.filter({ $0.portType == .builtInMic }).first {
print("using built in mic")
try session.setPreferredInput(mic)
}
惊奇的是,声波仍然像往常一样传播。好吧,尝试其他事情...
我目前正在使用的暴力法:
我宁愿有一些更聪明,更容易实现的东西,但是如果我可以对正在播放的音轨进行相位反转并将其应用于所记录的音轨,那么也许会奏效。 (可能有效的证据:https://stackoverflow.com/a/23758876/3857868)