Как записать смесь микрофонного входа и аудиофайла при воспроизведении аудиофайла исключительно на iOS? - PullRequest
0 голосов
/ 29 апреля 2019

Я работаю над приложением iOS для смешивания аудиофайла с голосовым вводом пользователя в новый файл и одновременного воспроизведения содержимого этого аудиофайла.Вы можете просто рассматривать это приложение как проигрыватель караоке, который записывает как голос певца, так и оригинальный саундтрек в файл во время воспроизведения оригинального саундтрека для певца.Я использую AUGraph, чтобы установить поток аудио процесса как:

  1. Один микшер AudioUnit (с типом kAudioUnitType_Mixer и подтипом kAudioUnitSubType_MultiChannelMixer) с 2 входами;
  2. Одинресэмплер AudioUnit для преобразования необходимой частоты дискретизации (kAudioUnitType_FormatConverter, kAudioUnitSubType_AUConverter) из частоты дискретизации аудиофайла в частоту микрофонного входа для согласования форматов 2 входных шин микшера;
  3. Затем подключите эти узлы: выход Mic (выходной элемент области ввода узла IO) -> вход микшера 0, вход ресемплера -> вход микшера 1, выход микшера -> вход динамика (элемент ввода области вывода узла IO);
  4. Установить обратный вызов рендеринга для ресэмплера с помощью AUGraphSetNodeInputCallback().Эта функция обратного вызова просто копирует требуемое количество кадров аудиоданных из потока исходного аудиофайла в место назначения AudioBufferList;
  5. Установите обратный вызов уведомления рендеринга для микшера с помощью AudioUnitAddRenderNotify().Функция обратного вызова извлекает смешанные аудиоданные и записывает их в файл назначения.

Этот процесс хорошо работает, но только с одной ошибкой: он воспроизводит звук, смешанный с микрофонным входом, в динамик,что не желательно.Мне нужно только воспроизвести звук из исходных аудиофайлов в динамик без смешанного голоса певца.Смешанный звук предназначен только для записи, а не для воспроизведения.

Я пробовал несколько модификаций вышеупомянутого AUGraph, но никто не работает.Инстинктивная мысль состоит в том, чтобы использовать аудиоустройство «сплиттер» для дублирования выходных аудиоданных ресэмплера в 2 потока, один из которых подключен к входу микшера, а другой - к компоненту ввода выходной области узла ввода-вывода (т. Е. Входной шине динамика).Однако, как Apple упомянула в AUComponent.h, «За исключением AUConverter, который доступен как на настольном компьютере, так и на iPhone, эти аудиоустройства доступны только на настольном компьютере». Этоозначает, что мы не можем использовать AudioUnit с подтипом kAudioUnitSubType_Splitter или kAudioUnitSubType_MultiSplitter на iOS. На самом деле я попытался добавить AudioUnit с подтипом kAudioUnitSubType_MultiSplitter и конструирование AUGraph, как я думал, и, конечно, без чуда.

Так как мне реализовать эту функцию?

...