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 則留言:
Hi,你好,想請教一下,為甚麼我用這個方式做,然後我只要抓到那個值
但怎麼會一開始就會一直抓?因為不是只有系統有聲音才會抓到值嗎?
然後抓到的值一直都是同一個,例如-128這樣
拜託可以幫忙解答嗎><謝謝~
張貼留言