Чтение 24-битного моно PCM на Java - PullRequest
0 голосов
/ 09 мая 2019

Я изо всех сил пытаюсь понять данные формата аудио 24-битного моно PCM и прочитать эти данные на Java.

Я понимаю и могу прочитать заголовок RIFF, но не могу понять, как читать 24-битные образцы PCM.Мне нужно прочитать образцы PCM по одному.

1 Ответ

1 голос
/ 09 мая 2019

Если предположить кодирование с прямым порядком байтов , это должно помочь вам начать:

// constant holding the minimum value of a signed 24bit sample: -2^22.
private static final int MIN_VALUE_24BIT = -2 << 22;

// constant holding the maximum value a signed 24bit sample can have, 2^(22-1).
private static final int MAX_VALUE_24BIT = -MIN_VALUE_24BIT-1;

[...]
// open your AudioInputStream using AudioSystem and read values into a buffer buf
[...]

final byte[] buf = ... ;      // your audio byte buffer
final int bytesPerSample = 3; // because 24 / 8 = 3

// read one sample:
int sample = 0;
for (int byteIndex = 0; byteIndex < bytesPerSample; byteIndex++) {
    final int aByte = buf[byteIndex] & 0xff;
    sample += aByte << 8 * (byteIndex);
}

// now handle the sign / valid range
final int threeByteSample = sample > MAX_VALUE_24BIT
    ? sample + MIN_VALUE_24BIT + MIN_VALUE_24BIT
    : sample;

// do something with your threeByteSample / read the next sample

См. jipes AudioSignalSource для более общей обработки декодирования PCM.

...