Android: Audio Recording with voice level visualization

后端 未结 4 1565
再見小時候
再見小時候 2021-02-01 08:32

I need to create a android application which is for recording voice while showing the voice(sound) level visualization.

I already created an audio recording application

4条回答
  •  南旧
    南旧 (楼主)
    2021-02-01 09:08

    Create a xml activity_recording.xml like this.

    
    
    
        
    
        
    
    
    

    Create a custom visualizerView as given below.

    package ali.visualiser;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;
    
    public class VisualizerView extends View {
        private static final int LINE_WIDTH = 1; // width of visualizer lines
        private static final int LINE_SCALE = 75; // scales visualizer lines
        private List amplitudes; // amplitudes for line lengths
        private int width; // width of this View
        private int height; // height of this View
        private Paint linePaint; // specifies line drawing characteristics
    
        // constructor
        public VisualizerView(Context context, AttributeSet attrs) {
            super(context, attrs); // call superclass constructor
            linePaint = new Paint(); // create Paint for lines
            linePaint.setColor(Color.GREEN); // set color to green
            linePaint.setStrokeWidth(LINE_WIDTH); // set stroke width
        } 
    
        // called when the dimensions of the View change
        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
            width = w; // new width of this View
            height = h; // new height of this View
            amplitudes = new ArrayList(width / LINE_WIDTH);
        } 
    
        // clear all amplitudes to prepare for a new visualization
        public void clear() {
            amplitudes.clear();
        } 
    
        // add the given amplitude to the amplitudes ArrayList
        public void addAmplitude(float amplitude) {
            amplitudes.add(amplitude); // add newest to the amplitudes ArrayList
    
            // if the power lines completely fill the VisualizerView
            if (amplitudes.size() * LINE_WIDTH >= width) {
                amplitudes.remove(0); // remove oldest power value
            } 
        } 
    
        // draw the visualizer with scaled lines representing the amplitudes
        @Override
        public void onDraw(Canvas canvas) {
            int middle = height / 2; // get the middle of the View
            float curX = 0; // start curX at zero
    
            // for each item in the amplitudes ArrayList
            for (float power : amplitudes) {
                float scaledHeight = power / LINE_SCALE; // scale the power
                curX += LINE_WIDTH; // increase X by LINE_WIDTH
    
                // draw a line representing this item in the amplitudes ArrayList
                canvas.drawLine(curX, middle + scaledHeight / 2, curX, middle
                        - scaledHeight / 2, linePaint);
            } 
        } 
    
    }
    

    Create RecordingActivity class as given below.

    package ali.visualiser;

    import java.io.File;
    import java.io.IOException;
    
    import android.app.Activity;
    import android.media.MediaRecorder;
    import android.media.MediaRecorder.OnErrorListener;
    import android.media.MediaRecorder.OnInfoListener;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.Handler;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.TextView;
    
    
    
    public class RecordingActivity extends Activity {
        public static final String DIRECTORY_NAME_TEMP = "AudioTemp";
        public static final int REPEAT_INTERVAL = 40;
        private TextView txtRecord;
    
        VisualizerView visualizerView;
    
        private MediaRecorder recorder = null;
    
        File audioDirTemp;
    private boolean isRecording = false;
    
    
        private Handler handler; // Handler for updating the visualizer
        // private boolean recording; // are we currently recording?
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_recording);
    
            visualizerView = (VisualizerView) findViewById(R.id.visualizer);
    
            txtRecord = (TextView) findViewById(R.id.txtRecord);
            txtRecord.setOnClickListener(recordClick);
    
            audioDirTemp = new File(Environment.getExternalStorageDirectory(),
                    DIRECTORY_NAME_TEMP);
            if (audioDirTemp.exists()) {
                deleteFilesInDir(audioDirTemp);
            } else {
                audioDirTemp.mkdirs();
            }
    
            // create the Handler for visualizer update
            handler = new Handler();
        }   
    
        OnClickListener recordClick = new OnClickListener() {
    
            @Override
            public void onClick(View v) {
    
                if (!isRecording) {
                    // isRecording = true;
    
                    txtRecord.setText("Stop Recording");
    
                    recorder = new MediaRecorder();
    
                    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    recorder.setOutputFile(audioDirTemp + "/audio_file"
                            + ".mp3");
    
                    OnErrorListener errorListener = null;
                    recorder.setOnErrorListener(errorListener);
                    OnInfoListener infoListener = null;
                    recorder.setOnInfoListener(infoListener);
    
                    try {
                        recorder.prepare();
                        recorder.start();
                        isRecording = true; // we are currently recording
                    } catch (IllegalStateException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    handler.post(updateVisualizer);
    
                } else {
    
                    txtRecord.setText("Start Recording");
    
                    releaseRecorder();
                }
    
            }
        };
    
        private void releaseRecorder() {
            if (recorder != null) {
                isRecording = false; // stop recording
                handler.removeCallbacks(updateVisualizer);
                visualizerView.clear();
                recorder.stop();
                recorder.reset();
                recorder.release();
                recorder = null;
            }
        }   
    
        public static boolean deleteFilesInDir(File path) {
    
            if( path.exists() ) {
                File[] files = path.listFiles();
                if (files == null) {
                    return true;
                }
                for(int i=0; i

    Result

    This is how it looks: https://www.youtube.com/watch?v=BoFG6S02GH0

    When it reaches the end, the animation continues as expected: erasing the beginning of the graph.

提交回复
热议问题