Как преобразовать образец аудиоданных .WAV в двойной тип? - PullRequest
5 голосов
/ 05 июня 2009

Я работаю над приложением, которое обрабатывает аудиоданные. Я использую Java (я добавил MP3SPI, Jlayer и Tritonus). Я извлекаю аудиоданные из файла .wav в массив байтов. Образцы аудиоданных, с которыми я работаю, являются 16-битным стерео.

Согласно тому, что я прочитал, формат для одного образца:

AABBCCDD

где AABB представляет левый канал и правый канал CCDD (2 байта для каждого канала). Мне нужно преобразовать этот образец в тип двойного значения. Я читал о формате данных. Java использует Big Endian, файлы .wav используют Little Endian. Я немного смущен. Не могли бы вы помочь мне с процессом конвертации? Спасибо вам всем

Ответы [ 4 ]

5 голосов
/ 06 июня 2009

Предупреждение: целые числа и байты подписаны. Может быть, вам нужно замаскировать младшие байты при упаковке их вместе:

for (int i =0; i < length; i += 4) {
    double left = (double)((bytes [i] & 0xff) | (bytes[i + 1] << 8));
    double right = (double)((bytes [i + 2] & 0xff) | (bytes[i + 3] << 8));

    ... your code here ...

}
4 голосов
/ 27 октября 2009

Когда вы используете ByteBuffer ( java.nio.ByteBuffer ), вы можете использовать порядок методов;

[заказ]

публичный окончательный порядок ByteBuffer (ByteOrder bo)

Modifies this buffer's byte order.

Parameters:
    bo - The new byte order, either BIG_ENDIAN or LITTLE_ENDIAN
Returns:
    This buffer

После этого вы можете получить вышеупомянутые значения с помощью;

GetChar () getShort () GetInt () GetFloat () getDouble ()

Какой замечательный язык - Java ;-)

0 голосов
/ 06 июня 2009

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

  • 8 бит - uint8
  • 16 бит - int16
  • 24 бит - int32
  • 32bit - int32 как float
  • 32bit - float
  • 64 бит - двойной

Если вы хотите поддерживать наиболее распространенные типы волновых файлов, вам понадобится преобразование в порядок байтов для всех этих типов данных.

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

Жаль, что в Java нет классов endianness в классах File IO. Возможность просто открыть файл, чья edianness велика или мала, является гораздо более простым решением этой проблемы.

0 голосов
/ 06 июня 2009

Little Endian означает, что данные имеют форму BBAA и DDCC. Вы бы просто поменяли его.

С начала кадра:

int left = (bytes[i+1] << 8) + bytes[i];
int right = (bytes[i+3] << 8) + bytes[i+2];

где я ваш индекс вашего образца.

...