Вот у меня есть .3gpp
файл, и я знаю путь к нему в виде String
. Аудио дорожку надо разбить на несколько частей, и получить среднее значение частоты к каждой части. Было бы круто, если был метод на подобии int getFrequency(String path, int milliseconds)
, но точно такого метода я не нашел. Погуглив, я понял, что надо как-то декодировать аудио файл и сделать ряд вычислений, но непонятно каких вычислений и непонятно как декодировать аудио
Делается это так.
Звук в общем (и в частности музыкальный) это сложение разных частот (по научному гармоник) с разной амплитудой. Если грубо представить то это иллюстрируется картинкой типа:
Разбивка на частоты конкретного звука производится преобразованием Фурье - в вычислительном смысле это удобно делать т.н. быстрым преобразованием Фурье
В итоге мы получим табличку типа (*):
частота[i] -> амплитуда[i]
частота[i+1] -> амплитуда[i+1]
....
Далее вычисляем среднюю амплитуду то есть надо проинтегрировать табличку в слышимом диапазоне (от 20 гц. до 20 кгц) примерно так:
сумма((частота[i+1]-частота[i])*амплитуда[i])/(20000-20)
Средняя громкость (пропорциональна логарифму амплитуды звука):
сумма((частота[i+1]-частота[i])*log(амплитуда[i]))/(20000-20)
Средняя частота, это частота на которой интеграл:
сумма((частота[i+1]-частота[i])*log(амплитуда[i]))
равен половине суммы за весь слышимый интервал. Иллюстрирует такая картинка:
В обычном аудио файле/треке данные звука хранятся в виде PCM (pulse code modulation) - то есть это развертка звука по амплитуде и времени.
Вам надо получить эти данные из трека. В обычном Java это можно получить через AudioInputStream
, но в Android он не работает. К счастью есть такая библиотека RingDroid - откуда можно почерпнуть это тайное знание.
Остается дело за малым засунуть за определенный интервал PCM данные в быстрое фурье, получить распределение и вычислить среднюю частоту.
Как то так.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
После maven стал изучать gradle и столкнулся с проблемой, не получается сделать деплой проекта (gradle 43
Как создать PageControl хотя бы подобный тому что на картинке, а вообще надо сделать "ползунком"
Можно ли так писать код? Будет ли утечка памяти и тд