Вот у меня есть .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 данные в быстрое фурье, получить распределение и вычислить среднюю частоту.
Как то так.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
После maven стал изучать gradle и столкнулся с проблемой, не получается сделать деплой проекта (gradle 43
Как создать PageControl хотя бы подобный тому что на картинке, а вообще надо сделать "ползунком"
Можно ли так писать код? Будет ли утечка памяти и тд