Android AudioRecord class - process live mic audio quickly, set up callback function

前端 未结 4 1993
旧巷少年郎
旧巷少年郎 2020-11-27 09:55

I want to record audio from the mic and access it for possible playback in near real-time. I am unsure of how to use the Android AudioRecord class to record some mic audio a

4条回答
  •  萌比男神i
    2020-11-27 10:06

    private int freq =8000;
    private AudioRecord audioRecord = null;
    private Thread Rthread = null;
    
    private AudioManager audioManager=null;
    private AudioTrack audioTrack=null;
    byte[] buffer = new byte[freq];
    
    //call this method at start button
    
    protected void Start()
    
    {
    
    loopback();
    
    }
    
    protected void loopback() { 
    
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
        final int bufferSize = AudioRecord.getMinBufferSize(freq,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                AudioFormat.ENCODING_PCM_16BIT);
    
    
        audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, freq,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                MediaRecorder.AudioEncoder.AMR_NB, bufferSize);
    
        audioTrack = new AudioTrack(AudioManager.ROUTE_HEADSET, freq,
                AudioFormat.CHANNEL_CONFIGURATION_MONO,
                MediaRecorder.AudioEncoder.AMR_NB, bufferSize,
                AudioTrack.MODE_STREAM);
    
    
    
        audioTrack.setPlaybackRate(freq);
         final byte[] buffer = new byte[bufferSize];
        audioRecord.startRecording();
        Log.i(LOG_TAG, "Audio Recording started");
        audioTrack.play();
        Log.i(LOG_TAG, "Audio Playing started");
        Rthread = new Thread(new Runnable() {
            public void run() {
                while (true) {
                    try {
                        audioRecord.read(buffer, 0, bufferSize);                                    
                        audioTrack.write(buffer, 0, buffer.length);
    
                    } catch (Throwable t) {
                        Log.e("Error", "Read write failed");
                        t.printStackTrace();
                    }
                }
            }
        });
        Rthread.start();
    
    }
    

    It plays the recorded audio less than 100 ms delay.

提交回复
热议问题