Java: извлечение байтов из аудиофайла - PullRequest
1 голос
/ 04 августа 2011

В чем разница между следующими двумя реализациями при извлечении байтов данных из аудиофайла?

Файл является .wav файлом, и я хочу извлечь только данные, без заголовков или каких-либоДругое дело.

Реализация 1:

public byte[] extractAudioFromFile(String filePath) {
    try {
        // Get an input stream on the byte array
        // containing the data
        File file = new File(filePath);
        final AudioInputStream audioInputStream = AudioSystem
                .getAudioInputStream(file);

        byte[] buffer = new byte[4096];
        int counter;
        while ((counter = audioInputStream.read(buffer, 0, buffer.length)) != -1) {
            if (counter > 0) {
                byteOut.write(buffer, 0, counter);
            }
        }
        audioInputStream.close();
        byteOut.close();
    } catch (Exception e) {
        System.out.println(e);
        System.exit(0);
    }// end catch

    return ((ByteArrayOutputStream) byteOut).toByteArray();
}

Реализация 2:

public byte[] readAudioFileData(String filePath) throws IOException,
        UnsupportedAudioFileException {
    final AudioInputStream audioInputStream = AudioSystem
            .getAudioInputStream(new File(filePath));
    AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, byteOut);
    audioInputStream.close();
    byteOut.close();

    return ((ByteArrayOutputStream) byteOut).toByteArray();
}

Каждая реализация возвращает различный размер байтов.Первый возвращает byte[] с длиной меньше, чем вторая реализация.

Я пытаюсь извлечь байты данных для визуализации спектрограммы файла.

Любое объяснение приветствуется.

Спасибо,

Самер

1 Ответ

9 голосов
/ 04 августа 2011

2-й подразумевает запись полного формата файла WAVE. 2-й буфер 44 байта больше первого?

[править: достаточно любопытно, чтобы попробовать - вышеприведенное верно]

package so_6933920;

import java.io.ByteArrayOutputStream;
import java.io.File;

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;

public class AudioFiles {
    public static void main(String[] args) {
        String file = "clarinet.wav";
        AudioFiles afiles = new AudioFiles();
        byte[] data1 = afiles.readAudioFileData(file);
        byte[] data2 = afiles.readWAVAudioFileData(file);
        System.out.format("data len: %d\n", data1.length);
        System.out.format("data len: %d\n", data2.length);
        System.out.format("diff len: %d\n", data2.length - data1.length);
    }
    public byte[] readAudioFileData(final String filePath) {
        byte[] data = null;
        try {
            final ByteArrayOutputStream baout = new ByteArrayOutputStream();
            final File file = new File(filePath);
            final AudioInputStream audioInputStream = AudioSystem
            .getAudioInputStream(file);

            byte[] buffer = new byte[4096];
            int c;
            while ((c = audioInputStream.read(buffer, 0, buffer.length)) != -1) {
                baout.write(buffer, 0, c);
            }
            audioInputStream.close();
            baout.close();
            data = baout.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return data;
    }
    public byte[] readWAVAudioFileData(final String filePath){
        byte[] data = null;
        try {
            final ByteArrayOutputStream baout = new ByteArrayOutputStream();
            final AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(filePath));

            AudioSystem.write(audioInputStream, AudioFileFormat.Type.WAVE, baout);
            audioInputStream.close();
            baout.close();
            data = baout.toByteArray();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return data;
    }
}

Я пробовал это с этим примером файла WAV .

Результаты:

data len: 489708
data len: 489752
diff len: 44

Примечание: я взял немного свободы с твоим фрагментом, чтобы очистить его.

  1. То, что System.exit(0) - это определенное нет-нет.
  2. if(counter > 0) на самом деле не требуется, поскольку значение счетчика должно быть больше 0, если возвращаемое значение метода чтения не равно -1.
...