Поскольку я недавно проходил через эту самую проблему и имел какое-то значение, я написал подробный пост о трех опциях, которые вы имеете при ручном микшировании / суммировании звука в обратном вызове рендеринга:
Микширование звука без отсечения в iOS:
Ограничители и другие методы
По сути, первый метод описан в сообщениях блога, на которые вы ссылались. Однако, как указано в посте A Tasty Pixel, этот метод «усреднения» вносит гармоническое искажение. Однако, по-видимому, это не заметно в некоторых приложениях, например, когда источником являются полные дорожки или перкуссия на основе шума (например, малые барабаны). Согласно A Tasty Pixel, Loopy app , профессиональный аудио инструмент калибра, успешно использует эту технику.
Второй вариант, который, возможно, лучше, если у вас есть естественные звуки и / или высокая полифония, - это просто уменьшить громкость звука, предварительно умножив аудиоданные на 0 Sound Wand , имеет сэмплы, нормализованные до полной шкалы, и максимальную полифонию 20, и я использую значение предварительной шкалы только около 1/3 (не 1/20). Верхняя сторона - это очень хороший динамический диапазон в вашем инструменте - то есть мягкие ноты тихие, а жесткие или много их вместе гораздо громче. Это часто считается одним из признаков качественного инструмента. Недостатком является то, что время от времени на встроенном динамике iPhone / iPad немного тихо, а динамический диапазон может быть слишком большим для дешевых внешних усилителей.
Третий вариант - ограничитель кирпичной стены, но в этом нет ничего простого. Обычный ограничитель кирпичной стены НЕ предотвратит отсечение. Вам нужен ограничитель lookahead brickwall, и код для этого не всегда доступен. Причина, по которой вам нужно смотреть в будущее, заключается в том, что ограничителю нужно время, чтобы плавно уменьшить громкость до момента, когда впервые произойдет отсечение. Недостаточно «немедленно уменьшить громкость», когда осциллограмма начинает обрезаться, потому что уменьшение громкости, чтобы вернуть ее к 1,0, - это точный то же самое, что отсечение делает для вас! В результате ограничители, не обращающие внимания, будут удалять только половину клипа (и , что только из-за времени выпуска).
(ограничение Brickwall без «упреждения» срабатывает слишком поздно и предотвращает только половину клипа)
Есть и недостатки с ограничителями прогнозирования. Они вносят туда свои собственные гармонические искажения, хотя и намного меньше, чем ограничение. Хуже того, они увеличивают задержку , время между действием пользователя и звуковым результатом, на время ожидания. Это означает менее отзывчивое приложение. Как вы могли догадаться, более длительный прогноз означает более прозрачный результат (меньше искажений), поэтому существует компромисс. Я все еще верю, что это жизнеспособный метод, и немного обрисую его в нижней части поста .
И последнее замечание, касающееся использования микшера AU по сравнению с микшированием вручную в remoteIO: я, как правило, был бы более склонен использовать AU, если мои каналы похожи на «дорожки» аудио, и я хочу, чтобы обычная громкость / панорамирование управлялись пользователем или если у вас есть игра с несколькими каналами, возможно, для фона / переднего плана / и т.д. Если у вас много звуков, например, заметок на клавиатуре, или если вы хотите индивидуально управлять суммированием (например, различные законы панорамирования, специальные правила, касающиеся включения / выключения звуков и т. Д.), Лучше сделать это вручную. Если вы просто суммируете пару звуковых дорожек, то на самом деле подойдет любой из этих вариантов. Если вы перейдете к варианту 2, описанному выше, то выполнение его вручную фактически займет всего несколько строк кода, как только вы освоите функции vDSP Accelerate Framework .