Java - преобразование байтового массива аудио в целочисленный массив - PullRequest
3 голосов
/ 25 июня 2009

Мне нужно передать аудиоданные в стороннюю систему в виде «16-битного целочисленного массива» (из имеющейся у меня документации).

Это то, что я пробовал до сих пор (система считывает это из полученного файла bytes.dat).

    AudioInputStream inputStream = AudioSystem.getAudioInputStream(new File("c:\\all.wav"));
    int numBytes = inputStream.available();
    byte[] buffer = new byte[numBytes];
    inputStream.read(buffer, 0, numBytes);

    BufferedWriter fileOut = new BufferedWriter(new FileWriter(new File("c:\\temp\\bytes.dat")));

    ByteBuffer bb = ByteBuffer.wrap(buffer);

    while (bb.remaining() > 1) {
        short current = bb.getShort();
        fileOut.write(String.valueOf(current));
        fileOut.newLine();
    }

Это, похоже, не работает - сторонняя система не распознает его, и я также не могу импортировать файл в Audacity как необработанный звук.

Есть ли что-то очевидное, что я делаю неправильно, или есть лучший способ сделать это?

Дополнительная информация: волновой файл 16 бит, 44100 Гц, моно.

Ответы [ 3 ]

2 голосов
/ 25 июня 2009

Мне только что удалось с этим разобраться.

Мне пришлось добавить эту строку после создания ByteBuffer.

bb.order(ByteOrder.LITTLE_ENDIAN);
2 голосов
/ 25 июня 2009

Редактировать 2: Я редко использую AudioInputStream, но способ записи необработанных данных кажется довольно сложным. Файл - это просто набор последующих байтов, поэтому вы можете записать свой аудио-байтовый массив одним единственным вызовом FileOutputStream.write () Система может использовать формат с прямым порядком байтов, тогда как файл WAV хранится с прямым порядком байтов (?). Тогда ваш звук может воспроизводиться, но очень тихо, например.

Редактировать 3

Удален пример кода.

Есть ли причина, по которой вы записываете аудио-байты как строки в файл с символами новой строки? Я думаю, что система ожидает аудиоданные в двоичном формате, а не в строковом формате.

0 голосов
/ 03 марта 2019
AudioFileFormat audioFileFormat;
try {
    File file = new File("path/to/wav/file");
    audioFileFormat = AudioSystem.getAudioFileFormat(file);
    int intervalMSec = 10; // 20 or 30
    byte[] buffer = new byte[160]; // 320 or 480.
    AudioInputStream audioInputStream = new AudioInputStream(new FileInputStream(file),
            audioFileFormat.getFormat(), (long) audioFileFormat.getFrameLength());
    int off = 0;
    while (audioInputStream.available() > 0) {
        audioInputStream.read(buffer, off, 160);
        off += 160;
        intervalMSec += 10;
        ByteBuffer wrap = ByteBuffer.wrap(buffer);
        int[] array = wrap.asIntBuffer().array();
    }
    audioInputStream.close();
} catch (UnsupportedAudioFileException | IOException e) {
    e.printStackTrace();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...