您的位置:首页 > 移动开发 > Android开发

Android 实现可视化动态音频柱状图

2015-11-23 15:21 585 查看
原文地址:http://www.jb51.net/article/32887.htm


先看一下效果图


 
复制代码 代码如下:

public class FFTActivity extends Activity implements OnClickListener{

private Button button;

private ImageView imageView;

private int frequency = 8000;

private int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;

private int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;

private RealDoubleFFT transformer;

private int blockSize = 256;

private boolean started = false;

private Canvas canvas;

private Paint paint;

private Bitmap bitmap;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.fft);

button = (Button) findViewById(R.id.fft_button);

button.setOnClickListener(this);

imageView = (ImageView) findViewById(R.id.fft_imageView);

transformer = new RealDoubleFFT(blockSize);

bitmap = Bitmap.createBitmap(256, 100, Bitmap.Config.ARGB_8888);

canvas = new Canvas(bitmap);

paint = new Paint();

paint.setColor(Color.GREEN);

imageView.setImageBitmap(bitmap);

}

private class RecordAudio extends AsyncTask<Void, double[], Void> {

@Override

protected Void doInBackground(Void... params) {

int bufferSize = AudioRecord.getMinBufferSize(frequency,

channelConfiguration, audioEncoding);

AudioRecord audioRecord = new AudioRecord(

MediaRecorder.AudioSource.MIC, frequency,

channelConfiguration, audioEncoding, bufferSize);

short[] buffer = new short[blockSize];

double[] toTransform = new double[blockSize];

audioRecord.startRecording();

while (started) {

//将record的数据 读到buffer中,但是我认为叫做write可能会比较合适些。

int bufferResult = audioRecord.read(buffer, 0, blockSize);

for (int i = 0; i < bufferResult; i++) {

toTransform<i> = (double) buffer<i> / Short.MAX_VALUE;

}

transformer.ft(toTransform);

publishProgress(toTransform);

}

audioRecord.stop();

return null;

}

@Override

protected void onProgressUpdate(double[]... values) {

super.onProgressUpdate(values);

canvas.drawColor(Color.BLACK);

for (int i = 0; i < values[0].length; i++) {

int x=i;

int downy=(int)(100-(values[0]<i>)*10);

int upy=100;

canvas.drawLine(x, downy, x, upy, paint);

}

imageView.invalidate();

}

}

@Override

public void onClick(View v) {

started=true;

new RecordAudio().execute();

}

}

android音频可视化的原理是使用离散傅里叶变换,但是数学不好的同学不要担心,有开源的java离散傅里叶变换的代码!!直接到www.netlib.org/fftpack/jfftpack.tgz,直接将里面javasource目录拖动到(ca目录)src即可!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: