Capturing Sound for Analysis and Visualizing Frequencies in Android

后端 未结 3 1128
自闭症患者
自闭症患者 2020-12-02 10:33

I\'m new in Android and I\'m trying to make a program which captures an audio sound and then displays the frequencies that exist within it. I found an example that draws t

相关标签:
3条回答
  • 2020-12-02 11:21

    Here is the working code. I tried it myself. It works fine.

    package com.example.frequencytest;
    
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.media.AudioFormat;
    import android.media.AudioRecord;
    import android.media.MediaRecorder;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    import ca.uol.aig.fftpack.RealDoubleFFT;
    
    public class MainActivity extends Activity implements OnClickListener {
    
        int frequency = 8000;
        int channelConfiguration = AudioFormat.CHANNEL_CONFIGURATION_MONO;
        int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
        private RealDoubleFFT transformer;
        int blockSize = 256;
    
        Button startStopButton;
        boolean started = false;
    
        RecordAudio recordTask;
    
        ImageView imageView;
        Bitmap bitmap;
        Canvas canvas;
        Paint paint;
    
        //AudioRecord audioRecord;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            startStopButton = (Button) this.findViewById(R.id.start_stop_btn);
            startStopButton.setOnClickListener(this);
    
            transformer = new RealDoubleFFT(blockSize);
    
            imageView = (ImageView) this.findViewById(R.id.imageView1);
            bitmap = Bitmap.createBitmap((int) 256, (int) 100,
                    Bitmap.Config.ARGB_8888);
            canvas = new Canvas(bitmap);
            paint = new Paint();
            paint.setColor(Color.GREEN);
            imageView.setImageBitmap(bitmap);
    
        }
    
        public class RecordAudio extends AsyncTask<Void, double[], Void> {
    
            @Override
            protected Void doInBackground(Void... arg0) {
    
                try {
                    // int bufferSize = AudioRecord.getMinBufferSize(frequency,
                    // AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
                    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();
    
                    // started = true; hopes this should true before calling
                    // following while loop
    
                    while (started) {
                        int bufferReadResult = audioRecord.read(buffer, 0,
                                blockSize);
    
                        for (int i = 0; i < blockSize && i < bufferReadResult; i++) {
                            toTransform[i] = (double) buffer[i] / 32768.0; // signed
                                                                            // 16
                        }                                       // bit
                            transformer.ft(toTransform);
                            publishProgress(toTransform);
    
    
    
                    }
    
                    audioRecord.stop();
    
                } catch (Throwable t) {
                    t.printStackTrace();
                    Log.e("AudioRecord", "Recording Failed");
                }
                return null;
            }
    
            @Override
            protected void onProgressUpdate(double[]... toTransform) {
    
                canvas.drawColor(Color.BLACK);
    
                for (int i = 0; i < toTransform[0].length; i++) {
                    int x = i;
                    int downy = (int) (100 - (toTransform[0][i] * 10));
                    int upy = 100;
    
                    canvas.drawLine(x, downy, x, upy, paint);
                }
    
                imageView.invalidate();
    
                // TODO Auto-generated method stub
                // super.onProgressUpdate(values);
            }
    
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            if (started) {
                started = false;
                startStopButton.setText("Start");
                recordTask.cancel(true);
            } else {
                started = true;
                startStopButton.setText("Stop");
                recordTask = new RecordAudio();
                recordTask.execute();
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-02 11:31

    Yes, I also had this project and i had the same error as you but after adding the permission below all is okay now. Most probably you didn't add it in the correct place in the androidmanifest.xml.It should be outside the application tag.

      <uses-permission android:name="android.permission.RECORD_AUDIO">
         </uses-permission>
    
    0 讨论(0)
  • 2020-12-02 11:31

    onProgressUpdate method should belong to RecordAudio where as in your code it is belonging to AudioProcessing. Check the braces, it should work based on above correction

    0 讨论(0)
提交回复
热议问题