Я работаю над приложением iOS для смешивания аудиофайла с голосовым вводом пользователя в новый файл и одновременного воспроизведения содержимого этого аудиофайла.Вы можете просто рассматривать это приложение как проигрыватель караоке, который записывает как голос певца, так и оригинальный саундтрек в файл во время воспроизведения оригинального саундтрека для певца.Я использую AUGraph
, чтобы установить поток аудио процесса как:
- Один микшер
AudioUnit
(с типом kAudioUnitType_Mixer
и подтипом kAudioUnitSubType_MultiChannelMixer
) с 2 входами; - Одинресэмплер
AudioUnit
для преобразования необходимой частоты дискретизации (kAudioUnitType_FormatConverter
, kAudioUnitSubType_AUConverter
) из частоты дискретизации аудиофайла в частоту микрофонного входа для согласования форматов 2 входных шин микшера; - Затем подключите эти узлы: выход Mic (выходной элемент области ввода узла IO) -> вход микшера 0, вход ресемплера -> вход микшера 1, выход микшера -> вход динамика (элемент ввода области вывода узла IO);
- Установить обратный вызов рендеринга для ресэмплера с помощью
AUGraphSetNodeInputCallback()
.Эта функция обратного вызова просто копирует требуемое количество кадров аудиоданных из потока исходного аудиофайла в место назначения AudioBufferList
; - Установите обратный вызов уведомления рендеринга для микшера с помощью
AudioUnitAddRenderNotify()
.Функция обратного вызова извлекает смешанные аудиоданные и записывает их в файл назначения.
Этот процесс хорошо работает, но только с одной ошибкой: он воспроизводит звук, смешанный с микрофонным входом, в динамик,что не желательно.Мне нужно только воспроизвести звук из исходных аудиофайлов в динамик без смешанного голоса певца.Смешанный звук предназначен только для записи, а не для воспроизведения.
Я пробовал несколько модификаций вышеупомянутого AUGraph
, но никто не работает.Инстинктивная мысль состоит в том, чтобы использовать аудиоустройство «сплиттер» для дублирования выходных аудиоданных ресэмплера в 2 потока, один из которых подключен к входу микшера, а другой - к компоненту ввода выходной области узла ввода-вывода (т. Е. Входной шине динамика).Однако, как Apple упомянула в AUComponent.h
, «За исключением AUConverter
, который доступен как на настольном компьютере, так и на iPhone, эти аудиоустройства доступны только на настольном компьютере». Этоозначает, что мы не можем использовать AudioUnit с подтипом kAudioUnitSubType_Splitter
или kAudioUnitSubType_MultiSplitter
на iOS. На самом деле я попытался добавить AudioUnit
с подтипом kAudioUnitSubType_MultiSplitter и конструирование AUGraph
, как я думал, и, конечно, без чуда.
Так как мне реализовать эту функцию?