Потоковое аудио и получение амплитуды для рисования формы волны одновременно - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь воспроизвести и получить амплитуду для рисования формы волны.Когда я транслирую и комментирую код, чтобы получить амплитуду, он работает нормально.Я предполагаю, что проблема в том, что audioRecord.read () вызывается потоковым методом, а также методом амплитуды отдельно.Однажды он вызывается в методе read (), а следующий - в методе getAmplitude ().Я искал способ, которым и поток, и амплитуда работают вместе.С существующим кодом происходит пропуск потоковой передачи.Ниже приведен код:

public void start() {
  if (isCreated()) {
    init();
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (running && !Thread.interrupted()) {
          DataTaken dataTaken = read();
          if (dataTaken != null) {
            Log.e("amplitude ",getAmplitude()+"");
            amplitude = getAmplitude();
            getMicrophoneData.inputPCMData(dataTaken.getPcmBuffer(), dataTaken.getSize());
          } else {
            running = false;
          }
        }
      }
    }).start();
  } else {
    Log.e(TAG, "Microphone no created, MicrophoneManager not enabled");
  }
} 

  private DataTaken read() {
    int size;
    if (muted) {
      size = audioRecord.read(pcmBufferMuted, 0, pcmBufferMuted.length);
    } else {
      size = audioRecord.read(pcmBuffer, 0, pcmBuffer.length);
    }
    if (size <= 0) {
      return null;
    }
    return new DataTaken(pcmBuffer, size);
}

public double getAmplitude() {
  if(audioRecord != null) {
    short[] buffer = new short[getPcmBufferSize()];
    audioRecord.read(buffer, 0, getPcmBufferSize());
    int max = 0;
    for (short s : buffer) {
      if (Math.abs(s) > max) {
        max = Math.abs(s);
      }
    }
    return max;
  }else{
    return 0;
  }
}

public class DataTaken {

  private byte[] pcmBuffer;
  private int size;

  public DataTaken(byte[] pcmBuffer, int size) {
    this.pcmBuffer = pcmBuffer;
    this.size = size;
  }

  public byte[] getPcmBuffer() {
    return pcmBuffer;
  }

  public void setPcmBuffer(byte[] pcmBuffer) {
    this.pcmBuffer = pcmBuffer;
  }

  public int getSize() {
    return size;
  }

  public void setSize(int size) {
    this.size = size;
  }
}

1 Ответ

0 голосов
/ 08 октября 2018

Проблема в том, что вы звоните AudioRecord.read() дважды.

DataTaken dataTaken = read();

Вы храните pcmBuffer в DataTaken здесь.Так что используйте тот же buffer при вызове getAmplitude().

getAmplitude(dataTaken.getPcmBuffer());

Ваш getAmplitude() метод будет выглядеть так:

public double getAmplitude(short[] buffer){

    int max = 0;
    for (short s : buffer) {
      if (Math.abs(s) > max) {
        max = Math.abs(s);
      }
    }
    return max;
  }else{
    return 0;
  }
}

Кроме того, почему вы звоните getAmplitude() дважды?Измените это следующим образом:

amplitude = getAmplitude();
Log.e("amplitude ",amplitude+"");

Более эффективно, таким образом.

...