Как преобразовать образец аудиоданных .wav в двойной тип?

StackOverflow https://stackoverflow.com/questions/957850

Вопрос

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

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

Aabbccdd

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

Это было полезно?

Решение

ПРЕДУПРЕЖДЕНИЕ: Целые числа и байты подписаны. Может быть, вам нужно замаскировать низкие байты при их упаковке:

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 ...

}

Другие советы

Когда вы используете Bytebuffer (java.nio.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 ;-)

Маленький Эндиан означает, что данные находятся в форме BBAA и DDCC. Вы бы просто поменяли это.

С самого начала кадра:

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top