Я не могу дать вам полный код, так как это длинное решение, и у меня есть другие дела. Я могу дать вам подсказки.
Сначала проверьте эту ссылку как ссылку.
Как видите, файл .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