MUZLOOMUZLOO

Блог · Android / Audio

Как работает эквалайзер MUZLOO: Android AudioEffects API изнутри

Android / Audio7 мин чтения

Каждый раз, когда пользователь жалуется в поддержку «эквалайзер не работает на моём Xiaomi», мы объясняем по сотой за неделю, почему это не наш баг и как это чинить. Решили положить весь технический бэкграунд в одну статью - для тех, кому любопытно, как звук в MUZLOO устроен на уровне фреймворка Android.

Мы не пишем DSP с нуля - и правильно делаем

MUZLOO не обрабатывает звук своими алгоритмами. Мы используем три класса из пакета android.media.audiofx: Equalizer, BassBoost и PresetReverb. Всё, что крутит пользователь в интерфейсе - это тонкая обёртка над системными эффектами Android. Почему так?

  • Системные эффекты работают на уровне аудиомикшера ОС - производительнее и стабильнее любого самописного DSP.
  • Автоматически применяются ко всем аудиопотокам в приложении, включая стриминг из VK CDN и локальные скачанные файлы.
  • Уважают общесистемные настройки звука (Bluetooth-кодек, громкость, фокус).
  • Легальны с точки зрения патентов на обработку звука - Google уже разобрался с лицензиями.

5 полос эквалайзера - но частоты плавают от устройства к устройству

Мы просим Android создать эквалайзер на 5 полос:
Equalizer eq = new Equalizer(priority, audioSessionId);
Дальше мы узнаём центральные частоты черезeq.getCenterFreq(band). На большинстве устройств это 60 Hz / 230 Hz / 910 Hz / 3.6 kHz / 14 kHz - но на некоторых прошивках производители отклоняются на ±50-100 Hz. Поэтому на UI мы рисуем частоты, которые реально вернул твой телефон, а не хардкод.

Диапазон усиления тоже определяется системой:eq.getBandLevelRange() обычно отдаёт -1500...+1500 миллибел (это ±15 дБ). Слайдеры в MUZLOO мапятся на этот диапазон - так что «0» на нашем ползунке соответствует нейтральному уровню системного эквалайзера.

BassBoost - отдельный эффект, не первая полоса EQ

Это частый вопрос: зачем ручка BASS, если у эквалайзера уже есть полоса 60 Hz? Отвечаем:

  • Первая полоса EQ - это точечное усиление в узкой полосе вокруг 60 Hz (обычно Q≈1.4). Добавляет суб-бас, но делает это хирургически.
  • BassBoost - этоbroadband-эффект, усиливает весь диапазон 60-200 Hz целиком с мягким падением АЧХ. Результат: звук «мясистее», без провала между суб-басом и mid-bass.

На практике BassBoost работает лучше для хип-хопа и электроники, первая полоса EQ - для вокала и акустики, где нужен аккуратный низ. В MUZLOO их можно комбинировать, они не конфликтуют.

«3D» - это реверберация, а не настоящий spatial audio

Честное признание: режим 3D в MUZLOO - этоPresetReverb с параметромPRESET_LARGEHALL. По-научному это не 3D, это эффект концертного зала - звук «разваливается» в стороны и кажется объёмнее. На наушниках работает хорошо, на колонке - почти незаметно (у колонок своя акустика помещения).

Настоящий spatial audio (который у Apple Music и Dolby Atmos) требует многоканального исходника и аппаратной поддержки. VK отдаёт стереофонию, так что максимум, что мы можем сделать честно - это пространственная реверберация. Называется «3D» по устоявшейся традиции в приложениях типа Poweramp и Neutron.

Почему эквалайзер молчит на Xiaomi, Samsung, Huawei

Самая частая жалоба. Дело не в нас, дело в фирменных аудио-эффектах производителя:

  • Samsung Dolby Atmos - перехватывает системный аудиомикшер, ставит себя в цепочку эффектов последней. Любой сторонний EQ работает до Dolby, а тот его «сглаживает».
  • Xiaomi Sound (на MIUI) - делает то же самое плюс применяет свой «Hi-Fi режим», который блокирует AudioEffects полностью.
  • Huawei Histen - аналогично: свой аудиопайплайн, сторонние эффекты в молоко.

Единственное универсальное лечение - отключить фирменные звуковые эффекты в системных настройках телефона. После этого MUZLOO снова получает контроль над миксером. На некоторых прошивках (особенно китайских «лайт»-версий Android) AudioEffects не реализованы вовсе - и там мы не можем сделать ничего, только дописать это в FAQ.

Bluetooth-наушники: отдельная история

Bluetooth-кодеки SBC, AAC, aptX, LDAC часто вырезают эффекты при кодировании. Звук обрабатывается в ОС, но до наушников доходит уже сжатый стрим - и на стороне наушников DSP-чип может глушить низкоуровневые эффекты. Выход - либо проводные наушники для точной настройки, либо переключить Bluetooth-кодек в настройках разработчика Android (Developer options → Bluetooth Audio Codec).

Что дальше

В планах - добавить визуализатор спектра реального времени (черезVisualizer из того же пакета audiofx) и расширить количество полос до 10 на устройствах, которые это поддерживают. Следи за релизами в roadmap-секции FAQ.

Скачать на Android