Я прочитал два поста об извлечении семплов из AudioInputStream и преобразовании их в дБ.
{ ссылка }
{ ссылка }
Насколько я понимаю, byte[] bytes;
имеет такую структуру:
Index 0: Sample 0 (Left Channel)
Index 1: Sample 0 (Right Channel)
Index 2: Sample 1 (Left Channel)
Index 3: Sample 1 (Right Channel)
Index 4: Sample 2 (Left Channel)
Index 5: Sample 2 (Right Channel)
В первой статье показано, как получить сэмплы из одного канала (моно).
Итак, моя проблема в том, что я хочу получить выборки отдельно для правого канала и отдельно для левого канала, чтобы рассчитать дБ для правого и левого каналов.
Вот код. Как это можно изменить, чтобы получить правый и левый каналы отдельно? Я не могу понять, как меняется индекс i
...
final byte[] buffer = new byte[2048];
float[] samples = new float[buffer.length / 2];
for (int n = 0; n != -1; n = in.read(buffer, 0, buffer.length)) {
line.write(buffer, 0, n);
for (int i = 0, sampleIndex = 0; i < n; ) {
int sample = 0;
sample |= buffer[i++] & 0xFF; // (reverse these two lines
sample |= buffer[i++] << 8; // if the format is big endian)
// normalize to range of +/-1.0f
samples[sampleIndex++] = sample / 32768f;
}
float rms = 0f;
for (float sample : samples) {
rms += sample * sample;
}
rms = (float) Math.sqrt(rms / samples.length);
Надеюсь, вы могли бы мне помочь. Заранее спасибо.