Java создает сигнал с образцами

Я загрузил звуковой файл в bytearray. Я смущен тем, что мне нужно делать дальше, чтобы получить информацию для построения точек для формы волны. Из того, что я нашел в Интернете, мне нужно создать еще один массив? Может кто-нибудь объяснить мне, как это будет работать, поскольку я не совсем понимаю, как будут собираться образцы.


person OasisTea    schedule 08.11.2012    source источник
comment
В каком формате ваш звуковой файл? Это необработанный формат wav?   -  person HashtagMarkus    schedule 08.11.2012
comment
В настоящее время я использую .au, хотя планирую попробовать файлы .wav.   -  person OasisTea    schedule 08.11.2012
comment
Я не совсем понимаю, как будут собираться образцы. Это зависит от AudioFormat. НАПРИМЕР. Моно, 8-битный формат будет иметь 1 байт на кадр. Каждый байт будет представлять амплитуду сигнала.   -  person Andrew Thompson    schedule 08.11.2012
comment
Я загрузил звуковой файл в байтовый массив. Как загрузил? Используя входной поток или звуковой API Java?   -  person Raedwald    schedule 08.11.2012
comment
Я использовал AudioInputStream.   -  person OasisTea    schedule 08.11.2012


Ответы (1)


Образцы собраны в соответствии с форматом файла. Скажем так, ваш аудиоформат представляет собой 8-битный одноканальный аудиофайл.

Это самый простой случай. Вы можете просто перебрать свой байт [] и нарисовать сохраненные значения как амплитуду.

Когда ваш файл представляет собой 16-битный аудиофайл, каждый образец состоит из 2 байтов, поэтому вам придется взглянуть на два байта для каждого образца. Вы можете сделать это, вызвав следующий метод:

private int getSixteenBitSample(int high, int low) {
    return (high << 8) + (low & 0x00ff);
}

Он объединит первый и второй байт вашего массива байтов для каждого образца. Таким образом, ваш цикл будет выглядеть примерно так:

int sampleArray[] = new int[numSamples];

for(int i = 0, j=0;i < bytearray.length;)
{
    int iLow = bytearray[i];
    i++;
    int iHigh = bytearray[i];
    i++;

    sampleArray[j] = getSixteenBitSample(iHigh, iLow);
    j++;
}

Третий случай может заключаться в том, что ваш файл представляет собой 16-битный стереофонический аудиофайл. В этом случае каждый образец имеет два байта, и после каждого байта меняется канал.

Например:

First read sample 1 from byte 0 and byte 1. -> First sample of channel 1
Second read sample 2 from byte 2 and byte 3 -> First sample of channel 2
Third read sample 3 from byte 4 and byte 5 -> Second sample of channel 1
Forth read sample 4 from byte 6 and byte 7 -> Second sample of channel 2

Более подробное описание см. на этой странице.

person HashtagMarkus    schedule 08.11.2012