Преобразование массива с выборками в байтовый массив - PullRequest
0 голосов
/ 11 сентября 2011

У меня есть двумерный массив целых чисел. Первый индекс указывает количество каналов. Второй указывает номер сэмпла в канале. Как я могу сохранить этот массив в аудиофайл? Я знаю, мне нужно преобразовать его в байтовый массив, но я понятия не имею, как это сделать.

// редактировать

Подробнее. У меня уже есть класс для рисования формы волны. Это здесь:

http://javafaq.nu/java-example-code-716.html

Теперь я хочу вырезать часть этой волны и сохранить ее в новом файле. Поэтому мне нужно вырезать часть int [] [] samplesContainer, преобразовать его в байтовый массив (я не знаю, как), а затем сохранить его в файл того же формата, что и audioInputStream.

// редактировать

OK. Таким образом, самая большая проблема заключается в написании инвертированной функции для этой:

protected int[][] getSampleArray(byte[] eightBitByteArray) {
int[][] toReturn = new int[getNumberOfChannels()][eightBitByteArray.length / (2 * getNumberOfChannels())];
int index = 0;
    //loop through the byte[]
    for (int t = 0; t < eightBitByteArray.length;) {
        //for each iteration, loop through the channels
        for (int a = 0; a < getNumberOfChannels(); a++) {
            //do the byte to sample conversion
            //see AmplitudeEditor for more info
            int low = (int) eightBitByteArray[t];
            t++;
            int high = (int) eightBitByteArray[t];
            t++;
            int sample = (high << 8) + (low & 0x00ff);

            if (sample < sampleMin) {
                sampleMin = sample;
            } else if (sample > sampleMax) {
                sampleMax = sample;
            }
            //set the value.
        toReturn[a][index] = sample;
        }
        index++;
        }
    return toReturn;
}

Я не понимаю, почему происходит второе увеличение t после высокого. Я также понятия не имею, как я могу получить высокие и низкие от образца.

1 Ответ

1 голос
/ 14 сентября 2011

Код, который вы опубликовали, считывает поток примеров, побайтный, в массив примеров.Код предполагает, что в потоке каждые два 8-битных байта образуют 16-битную выборку и что для каждого из каналов NumOfChannels существует одна выборка.

Итак, для данного массива выборок, таких какодин, возвращенный этим кодом,

   int[][] samples; 

и байтовый массив для потоковой передачи,

   byte[] stream;

, вы можете построить обратный поток байтов таким образом

  for (int i=0; i<NumOfSamples; i++) {
    for (int j=0; j<NumOfChannels; j++) {
      int sample=samples[i][j];
      byte low = (byte) (sample & 0xff) ;
              byte high = (byte) ((sample & 0xff00 ) >> 8);
              stream[((i*NumOfChannels)+j)*2] = low;    
              stream[(((i*NumOfChannels)+j)*2)+1] = high;         
    }
  }
...