Как мне прочитать мой сохраненный WAV-файл в виде байта или двойного массива? Я использую Java / Android Studio - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь прочитать WAV-файл, преобразовать его в двойной массив и FFT массив.

У меня есть записанный файл .wav в хранилище, но я понятия не имею, как я могу прочитать файл и использовать данные.

Я новичок в разработке приложений, поэтому было бы неплохо, если бы вы могли провести меня шаг за шагом, а также показать пример кода.

Ценю вашу помощь.

1 Ответ

0 голосов
/ 27 февраля 2020

Я не могу дать вам полный код, так как это длинное решение, и у меня есть другие дела. Я могу дать вам подсказки.

Сначала проверьте эту ссылку как ссылку.

Как видите, файл .wav или WAVE содержит не только аудиосэмплы но он также содержит другие метаданные, которые описывают содержимое файла. Чтобы правильно прочитать аудиосэмплы, вам понадобятся значения этих метаданных.

Для этого сначала создайте экземпляр FileInputstream. Для этого вам понадобится объект File, представляющий ваш файл .wav.

Далее вам нужно будет прочитать каждое поле сверху вниз. Как видно из иллюстрации, указано количество байтов для каждого поля. При чтении поля используйте следующий код.

byte[] bytes = new byte[numOfBytes];
fileInputStream.read(bytes, 0, bytes.length);
// The value of current field is now stored in the bytes array

После каждого чтения fileInputStream автоматически будет указывать на следующее поле. Просто повторяйте код выше, пока не дойдете до начала данных сэмплов.

Чтобы интерпретировать полученные значения, вам необходимо внимательно прочитать описание каждого поля.

Чтобы преобразовать поле из байтового массива в ASCII или String, используйте:

String value = new String(bytes);

Чтобы преобразовать поле из байтового массива в число, используйте:

ByteBuffer buffer = ByteBuffer.allocate(numOfBytes);
buffer.order(BIG_ENDIAN); // Check the illustration. If it says little endian, use
// LITTLE_ENDIAN
buffer.put(bytes);
buffer.rewind();

Если поле состоит из двух байтов:

Short value = buffer.getShort();

Если поле состоит из 4 байтов:

Int value = buffer.getInt();

Чтобы прочитать примеры, просто продолжите то, что вы делаете выше. Но вам также необходимо учитывать количество бит на выборку, указанное в поле BitsPerSample. Для 8 битов прочитайте 1 байт. Для 16 бит прочитайте 2 байта, и так далее, и так далее. Просто повторите, чтобы получить каждый образец, пока не дойдете до конца файла. Чтобы проверить конец файла, получите возвращаемое значение из read и проверьте, является ли оно -1:

int read = fileInputSream.read(bytes, 0, bytes.length);
// If read equals -1 then end of file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...