Получить громкость / амплитуду звуковых байтов в предварительно записанном Android аудио файле - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь создать приложение, которое получает любой сохраненный аудио / видео файл на ваше устройство и вводит максимальную амплитуду этого аудио / видео файла для каждой десятичной секунды. Например, если у меня есть аудиофайл длиной 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 вещь неправильно здесь. Любая помощь приветствуется, спасибо

...