Потерпите меня, так как я новичок в работе со звуком, и я несколько дней искал в Google решение, но не нашел его.
Итак, я получаю байтовый массив файла .wav с помощью этого (источник: Конвертировать файл WAV в массив байтов в java)
ByteArrayOutputStream out = new ByteArrayOutputStream();
BufferedInputStream in = new BufferedInputStream(new FileInputStream(WAV_FILE));
int read;
byte[] buff = new byte[1024];
while ((read = in.read(buff)) > 0)
{
out.write(buff, 0, read);
}
out.flush();
byte[] audioBytes = out.toByteArray();
Затем я конвертирую массив байтов в массив с плавающей запятой и нормализую его от -1,0 до 1,0. (источник: Преобразование массива байтов аудиоформата wav в формат с плавающей запятой а>)
ShortBuffer sbuf =
ByteBuffer.wrap(audioBytes).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer();
short[] audioShorts = new short[sbuf.capacity()];
sbuf.get(audioShorts);
float[] audioFloats = new float[audioShorts.length];
for (int i = 0; i < audioShorts.length; i++) {
audioFloats[i] = ((float)audioShorts[i])/0x8000;
}
return audioFloats;
Позже я преобразовываю это в линейные рисунки, которые выводят форму волны с помощью java.swing.
class Panel2 extends JPanel {
float[] audioFloats;
Dimension d;
public Panel2(Dimension d, float[] audioFloats) {
// set a preferred size for the custom panel.
this.d = d;
setPreferredSize(d);
this.audioFloats = audioFloats;
}
@Override
public void paint(Graphics g) {
//super.paintComponent(g);
super.paint(g);
//shift by 45 because first 44 bytes used for header
for (int i = 45; i<audioFloats.length; i++){
Graphics2D g2 = (Graphics2D) g;
float inc = (i-45)*((float)d.width)/((float)(audioFloats.length-45-1));
Line2D lin = new Line2D.Float(inc, d.height/2, inc, (audioFloats[i]*d.height+d.height/2));
g2.draw(lin);
}
}
}
Форма волны выглядит подходящей только для 16-битных файлов WAV (я проверил перекрестную проверку с помощью goldwave, и моя форма волны и их форма выглядят одинаково для 16-битных файлов).
Как это сделать для 8-битных файлов .wav?
Поскольку это домашнее задание, мое единственное ограничение - побайтно читать wav-файл.
Я также знаю, что файлы wav закодированы в формате PCM, и первые 44 байта зарезервированы в качестве заголовка.