Передача монофонических аудиоданных в AVAudioEnvironmentNode

Я пытаюсь использовать AVAudioEnvironmentNode для создания трехмерного пространственного звука для игры, над которой я работаю. В документации AVAudioEnvironmentNode говорится: «Важно отметить, что только входы с форматом подключения моноканала к узлу среды пространственно распределяются. Если вход стереофонический, звук передается без пространственного преобразования. В настоящее время входы с форматами подключения более 2 канала не поддерживаются ". Я действительно обнаружил, что это так. Когда я загружаю аудиобуфер с двумя каналами в AudioPlayerNode и подключаю узел к AVAudioEnvironmentNode, выходной звук не распределяется по пространству. У меня вопрос, как я могу отправить монофонические данные на AVAudioEnvironmentNode?

Я пробовал создать моно .wav файл, используя Audacity, а также программно загрузить AVAudioPCMBuffer с данными синусоидальной волны. Я обнаружил, что в любом случае, когда я создаю одноканальный аудиобуфер и пытаюсь загрузить буфер в AudioPlayerNode, моя программа вылетает со следующей ошибкой:

2016-02-17 06: 36: 07.695 Тестовая сцена [1577: 751557] 06: 36: 07.694 ОШИБКА:
[0x1a1691000] AVAudioPlayerNode.mm:423: ScheduleBuffer: обязательное условие - false: _outputFormat.channelCount == buffer. format.channelCount 2016-02-17 06: 36: 07.698 Тестовая сцена [1577: 751557] *** Завершение работы приложения из-за неперехваченного исключения 'com.apple.coreaudio.avfaudio', причина: 'требуемое условие ложно: _outputFormat.channelCount == buffer.format.channelCount '

Проверка выходной шины AVAudioPlayerNode действительно показывает, что она ожидает 2 канала. Мне непонятно, как это можно изменить и нужно ли.

Я оговариваю, что у меня очень мало опыта работы с AVFoundation или аудиоданными в целом. Любая помощь, которую вы можете предоставить, будет принята с благодарностью.


person Erik Heitfield    schedule 17.02.2016    source источник


Ответы (1)


Надеюсь, вы уже решили это, но для всех остальных:

При подключении вашего AVAudioPlayerNode к AVAudioMixerNode или любому другому узлу, к которому он может подключиться, вам необходимо указать там количество каналов:

audioEngine.connect(playerNode, to: audioEngine.mainMixerNode, format: AVAudioFormat.init(standardFormatWithSampleRate: 96000, channels: 1))

Вы можете проверить, составляет ли частота дискретизации 96000 для вашего файла в Audacity или «Получить информацию» в Finder.

person Graham Hayes    schedule 02.11.2016
comment
Я думаю, что входом в узел среды может быть только один канал; если источник вашего ввода имеет больше каналов, чем один, вы можете уменьшить разрешение вывода вашего источника с помощью AVAudioMixerNode (аналогично тому, как вы это делали выше). Поскольку узел микшера AVAudioEngine является концом линии, вы не можете подключить его выход к узлу AVAudioEnvironmentNode. Вместо этого подключите узел проигрывателя к созданному вами узлу микшера, а затем подключите узел микшера к узлу среды. Затем узел среды подключается к главному узлу микшера. - person James Bush; 10.02.2020