2017年4月28日 星期五

Android音頻可視化用Visualizer這個API輕鬆實現






Android音頻可視化,可以用Visualizer這個API輕鬆實現,上面影片,啟動6個Thread取得主Class音頻輸出流作動畫Update,
其實簡單方法的不須用Thread,使用監聽方法onWaveFormDataCapture或onFftDataCapture中去update動畫既可

1.宣告實作implements Visualizer.OnDataCaptureListener界面

2.實作OnDataCaptureListener界面的2個method
 @Override
    public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) {
       //取得音頻輸出流,給Canvas作後續處理
        mwaveform=waveform;
    }
 @Override
    public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {

    }

3.設定監聽實作界面的2個method,取得音頻輸出流
        //實例化 Visualizer ,0指Audio output
        audioOutput = new Visualizer(0); 
        //加入傾聽事件,時時監聽實作界面的2個method,便可從實作界面的2個method時時取得音頻輸出流
        audioOutput.setDataCaptureListener(this,Visualizer.getMaxCaptureRate(),true,false);

4.對音頻輸出流作可視化處理,運算完用Canvas在View Class繪出圖形,google一下有運算公式
  
把一些不相干的去掉,代碼簡化,比較看得懂
public class MainActivity extends AppCompatActivity implements Visualizer.OnDataCaptureListener{

    private Visualizer audioOutput = null;
    private byte[] mwaveform=null;
    ...................................................
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //實例化 Visualizer ,0指Audio output
        audioOutput = new Visualizer(0); // get output audio stream
        //第2參數true指onWaveFormDataCapture() run第3參數false指onFftDataCapture no run
        audioOutput.setDataCaptureListener(this,Visualizer.getMaxCaptureRate(),true,false);
        start_Visualizer();
        ..................................................
    }
  

    @Override
    protected void onDestroy() {
        super.onDestroy();
        stop_Visualizer();
        //釋放Visualizer
        audioOutput.release();
    }

    /////////////////////////////////////實作OnDataCaptureListener 1////////////////////////////////////
    @Override
    public void onWaveFormDataCapture(Visualizer visualizer, byte[] waveform, int samplingRate) {
      
        //Log.d("TAG","LENGTH"+waveform.length);
        //print byte waveform[0]=-128~128 waveform[1]=-128~128 ....................
        //可將 waveform[0]... 放入List,再根據List用Canvas畫出來
        //取得音頻輸出流,作後續處理
        mwaveform=waveform;
    }
    ////////////////////////////////////////實作OnDataCaptureListener 2////////////////////////////////////
    @Override
    public void onFftDataCapture(Visualizer visualizer, byte[] fft, int samplingRate) {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //開始Visualizer
    private void star_Visualizert(){
        audioOutput.setEnabled(true);
    }
    //停止Visualizer
    private void stop_Visualizer() { 
        audioOutput.setEnabled(false);
    }
    //CLASS取得音頻輸出流 method,給Class View Canvas作後續處理
    public byte[] get_waveform_value(){
        return mwaveform;
    }

}

1 則留言:

Sun 提到...

Hi,你好,想請教一下,為甚麼我用這個方式做,然後我只要抓到那個值

但怎麼會一開始就會一直抓?因為不是只有系統有聲音才會抓到值嗎?

然後抓到的值一直都是同一個,例如-128這樣

拜託可以幫忙解答嗎><謝謝~