Как преобразовать образец аудиоданных .wav в двойной тип?
-
12-09-2019 - |
Вопрос
Я работаю над приложением, которое обрабатывает аудиоданные. Я использую 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 большой или маленький - гораздо более проще решения этой проблемы.