Android 音频流和获取振幅以同时绘制波形

Android 音频流和获取振幅以同时绘制波形,android,audio-streaming,visualizer,Android,Audio Streaming,Visualizer,我正在尝试流和获得振幅来绘制波形。当我对代码进行流式处理和注释以获得其良好的工作效果时。我想问题是audioRecord.read()被流媒体和振幅方法分别调用。一旦在read()方法中调用,然后在getAmplication()方法中调用。我在寻找一种流和振幅共同工作的方式。对于已有的代码,在流式处理中存在跳过。代码如下: public void start() { if (isCreated()) { init(); new Thread(new Runnable() {

我正在尝试流和获得振幅来绘制波形。当我对代码进行流式处理和注释以获得其良好的工作效果时。我想问题是audioRecord.read()被流媒体和振幅方法分别调用。一旦在read()方法中调用,然后在getAmplication()方法中调用。我在寻找一种流和振幅共同工作的方式。对于已有的代码,在流式处理中存在跳过。代码如下:

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;
  }
}
public void start(){
如果(isCreated()){
init();
新线程(newrunnable()){
@凌驾
公开募捐{
while(运行&!Thread.interrupted()){
datatake=read();
if(数据采集!=null){
Log.e(“振幅”,get振幅()+);
振幅=GetAmplication();
getMicrophoneData.inputPCMData(datatake.getPcmBuffer(),datatake.getSize());
}否则{
运行=错误;
}
}
}
}).start();
}否则{
Log.e(标记“麦克风未创建,麦克风管理器未启用”);
}
} 
私有数据读取(){
整数大小;
如果(静音){
大小=录音读取(pcmBufferMuted,0,pcmBufferMuted.length);
}否则{
大小=录音读取(pcmBuffer,0,pcmBuffer.length);
}
如果(最大尺寸){
最大值=数学绝对值;
}
}
返回最大值;
}否则{
返回0;
}
}
已获取公共类数据{
专用字节[]pcmBuffer;
私有整数大小;
获取公共数据(字节[]pcmBuffer,整数大小){
this.pcmBuffer=pcmBuffer;
这个。大小=大小;
}
公共字节[]getPcmBuffer(){
返回pcmBuffer;
}
公共无效设置pcmBuffer(字节[]pcmBuffer){
this.pcmBuffer=pcmBuffer;
}
公共int getSize(){
返回大小;
}
公共无效设置大小(整型大小){
这个。大小=大小;
}
}

问题是您正在调用
AudioRecord.read()
两次

DataTaken dataTaken = read();
您正在此处将
pcmBuffer
存储在
datatake
中。因此,在调用
getAmplium()
时使用相同的
缓冲区

您的
getAmplium()
方法如下所示:

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;
  }
}
还有,为什么要调用两次
getAmplium()
?更改如下:

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

这样更有效。

您需要为其设置处理程序以获取多个时间振幅。并调试代码,检查GetAmplium()方法调用的次数?处理程序已处于活动状态,间隔3秒,从此处更新振幅。请检查振幅的起始和结束位置?您获得和分配的波振幅的输入是什么。谢谢@Nupadhaya GetAmpliance(datatake.getPcmBuffer());。我已经试过了。它总是给出相同的振幅,比如128。你能在课堂上发布你的数据吗
amplitude = getAmplitude();
Log.e("amplitude ",amplitude+"");