Я не совсем правильно знаю, как объяснить, чего именно добиваюсь. Мне нужно отследить интенсивность определенных частот из mp3-файла определенное количество раз на Android (Java) (или, если возможно, на Dart (Flutter)) . Это изображение, объясняющее, что я имею в виду:
Я сделал этот скриншот в Blender, используя Bake Sound to f-Curve Modifier , и это именно то, чего я пытаюсь достичь, но он написан на C ++, поэтому первым делом я попытался получить некоторые подсказки из исходного кода, но мне не удалось ничего найти.
Как вы можете видеть это не в режиме реального времени, но это значение определенной частоты (диапазон частот в данном случае: 80-255 Гц) во времени .
увеличенная версия
Как вы можете видеть, это просто график интенсивности этой частоты во времени.
и «деления» по оси X в этом случае составляют около 180 с / 600 кадров.
Что касается формата файла :
Входные файлы в формате mp3 или wav.
За то, что касается языка :
Моя главная цель - добиться этого в java, но если это возможно, было бы неплохо сделать это во Флаттере (так что Дарт). Я спрашиваю один из двух. Если Flutter невозможен или слишком труден, реализация Java в любом случае хороша, я использую канал платформы в приложении, так что это не большая проблема.
Я посмотрел в Интернете, но единственными учебниками, которые я смог найти, были примеры в реальном времени, в которых использовался FFT.
Лучшее объяснение того, что мне нужно:
У меня есть несколько кадров: скажем, 300.
Мне нужна функция, которая выглядит примерно так:
List<Integer> calculateFrequencies(int number_of_frames, double freq_low,
freq_high, String FilePath){
List<Integer> result = new ArrayList<>();
double length = //Here I need to obtain the length of the song in units as small as possible, for example, milliseconds or nanoseconds
for(int v = 0, v < number_of_frames; v++){
double currFrame = lenght/300 * v;
double intensity = get_intensity(currFrame, freq_low, freq_high) //How Could I do this??
result.add(intensity);
}
return result;
}
Как я мог это сделать?
Это возможно? И если это так, возможно ли и в Android?