Я пытаюсь создать приложение, которое получает любой сохраненный аудио / видео файл на ваше устройство и вводит максимальную амплитуду этого аудио / видео файла для каждой десятичной секунды. Например, если у меня есть аудиофайл длиной 4,9 секунды, я получу 49 значений, которые показывают пиковую амплитуду в диапазонах 0,0-0,1, 0,1-0,2 .... 4,8-4,9. Аудио / видео файл может быть любым: mp3, wav или даже mp4. Для начала я получаю URI файла и преобразую его в массив bytes[]
, используя код
byte[] convertToBytes() throws IOException {
InputStream inputStream = getContentResolver().openInputStream(uriToUse);
byte[] bytes = IOUtils.toByteArray(inputStream);
return bytes;
}
. После этого я делю байты на выборки, которые соответствуют диапазону 0-0.1,0.1. -0.2 et c с использованием кода
double chunksToUse = bytesArray.length/(Double.valueOf(durationOfFileInMS)/100); //this gives me approximate "bytes" of data that I can use for each sample.
int chunksToUseInLoop = (int) chunksToUse; //I convert those approximate bytes to an integer value to be used in a loop
Затем я использую циклы для вычисления среднеквадратичного значения каждого куска и вывода его в виде амплитуды.
while (true){
double rms = -0;
boolean sentinel = true;
for (int i = offset/*first value=0*/; i < offset+chunksToUseInLoop; i++) {
double sample = (arrayToUse[i] / 128.0) //normalize it;
rms += sample*sample ;
if (i==arrayToUse.length-1){
//reached end of bytes array, sentinel value to exit while loop
sentinel = false;
break;
}
}
rms /= chunksToUseInLoop;
rms = Math.sqrt(rms);
offset+=chunksToUseInLoop;
aplitudeValues.put(String.valueOf(counter),String.valueOf(rms));
counter++;
if (!sentinel)
break;
}
Однако я получаю неправильный ответ, и среднеквадратичные значения не соответствуют амплитуде / громкости звука. Я понимаю, что я могу сделать больше, чем 1 вещь неправильно здесь. Любая помощь приветствуется, спасибо