Воспроизведение и запись звука одновременно - избегайте захвата воспроизводимого звука - PullRequest
0 голосов
/ 15 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...