Стереомикрофон с AVAudioEngine? - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь создать график с помощью AVAudioEngine, который принимает входной сигнал с микрофона устройства и поддерживает стереофонический выход.

Прямо сейчас график выглядит так:

[audioEngine.inputNode] --> [Mic input mixer node] --> [Summing mixer node] --> [audioEngine.mainMixerNode]

Поскольку вывод audioEngine.inputNode равен 1 ch, 48000 Hz, Float32, я хотел запустить узел микшера после микрофона, чтобы я мог a) отправить сигнал нескольким аудиоустройствам и b) преобразовать в стереосигнал для более интересной маршрутизации, панорамирования и т. Д. *

Тем не менее, аудиопрохождение работает только в том случае, если я задаю весь график в соответствии с форматом ввода 1 ch, 48000 Hz, Float32, например:

audioEngine.connect(microphoneNode!, to: microphoneInputMixer, format: inputSessionFormat!)
audioEngine.connect(microphoneInputMixer, to: summingMixer, format: inputSessionFormat!)
audioEngine.connect(summingMixer, to: mainMixerNode!, format: inputSessionFormat!)

У меня есть две переменные формата: моно inputSessionFormat и стерео outputSettingFormat, что составляет 2 ch, 44100 Hz, Float32, non-inter.

Как я понял из , документы AVAudioMixerNode должны обрабатывать преобразование формата, но в этом случае он отказывается воспроизводить звук, если все подключения не установлены в одном (моно) формате. Я также проверил этот код с AVAudioConnectionPoint, но безрезультатно.

1 Ответ

0 голосов
/ 29 апреля 2019

Только AVNudioEngine для inputNode и outputNodes имеют фиксированные форматы. Используйте nil при подключении к / от них. Микшеры будут неявно конвертировать между их форматами ввода и вывода. Подключитесь к microphoneInputMixer, используя nil, и к microphoneInputMixer, используя нужный формат. mainMixerNode примет любой формат ввода, и его формат вывода не может быть установлен.

let desiredFormat = AVAudioFormat(standardFormatWithSampleRate: 44100, channels: 2)
audioEngine.connect(microphoneNode!, to: microphoneInputMixer, format:nil)
audioEngine.connect(microphoneInputMixer, to: summingMixer, format: desiredFormat)
audioEngine.connect(summingMixer, to: mainMixerNode!, format: desiredFormat)
...