Как записать смесь микрофонного входа и аудиофайла при воспроизведении аудиофайла исключительно на iOS?

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

  1. Один миксер AudioUnit (с типом kAudioUnitType_Mixer и подтип kAudioUnitSubType_MultiChannelMixer) с 2 входами;
  2. Один ресамплер AudioUnit для необходимого преобразования частоты дискретизации (kAudioUnitType_FormatConverter, kAudioUnitSubType_AUConverter) от частоты дискретизации аудиофайла до частоты дискретизации микрофона, чтобы согласовать форматы двух шин ввода микшера;
  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 как я и думал и конечно без чуда.

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

0 ответов

Другие вопросы по тегам