Как записать смесь микрофонного входа и аудиофайла при воспроизведении аудиофайла исключительно на iOS?
Я работаю над приложением iOS для смешивания аудиофайла с голосовым вводом пользователя в новый файл и одновременного воспроизведения содержимого этого аудиофайла. Вы можете просто рассматривать это приложение как проигрыватель караоке, который записывает как голос певца, так и оригинальный саундтрек в файл во время воспроизведения оригинального саундтрека для певца. я использую AUGraph
установить аудиопоток как:
- Один миксер
AudioUnit
(с типомkAudioUnitType_Mixer
и подтипkAudioUnitSubType_MultiChannelMixer
) с 2 входами; - Один ресамплер
AudioUnit
для необходимого преобразования частоты дискретизации (kAudioUnitType_FormatConverter
,kAudioUnitSubType_AUConverter
) от частоты дискретизации аудиофайла до частоты дискретизации микрофона, чтобы согласовать форматы двух шин ввода микшера; - Затем подключите эти узлы: выход 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
как я и думал и конечно без чуда.
Так как же мне реализовать эту функцию?