Мое приложение записывает и воспроизводит аудио одновременно. 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)