androidaudiomicrophoneaudiorecordaudiotrack

Immediate Audio Input & Output Android


In my Android App, I would like to take in some audio from the mic of the smartphone and play it immediately, live, like a microphone, with no lag. I am currently thinking of using AudioRecord and AudioTrack classes (from what I have read), but I'm not quite sure how to proceed.

I checked out some other questions on Stack Overflow but they don't exactly answer what I would like to do. And most are from 2012.

So how can I use these classes to input and output audio simultaneously?

ALSO: I had a look at the MediaRecorder API, but from what I read, that requires you to save the audio to a file, which I don't want to do. Can it be tweeked to meet my requirements? Or am I better off just using AudioRecord?

Thanks

EDIT:

Here is my updated code below as @Pradip Pramanick suggested:

final Thread record = new Thread(new Runnable() {
        @Override
        public void run() {
            while (!Thread.interrupted()) {
                MediaRecorder microphone = new MediaRecorder();
                microphone.setAudioSource(MediaRecorder.AudioSource.MIC);
                    microphone.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                microphone.setOutputFile(filename);
                microphone.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                try {
                    microphone.prepare();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                microphone.start();
            }
        }
    });

    final Thread play = new Thread(new Runnable() {
        @Override
        public void run() {
            while (!Thread.interrupted()) {
                player = new MediaPlayer();
                try {
                    player.setDataSource(filename);
                    player.prepare();
                    player.start();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    });

I am getting an Illegal State Exception | Start failed: -38. But I am calling microphone.start after microphone.prepare... What seems to be the problem? I searched other threads which said there might be other background apps using the microphone. I searched my device: Moto X Play (3rd Gen) and found none. (I even turned off "Ok Google" voice recognition, but the error kept coming).

ERROR LOG:

Here is the log-cat showing the most recent errors:

01-31 09:37:21.064 344-3339/? E/MediaPlayerService: offset error
01-31 09:37:21.065 1835-1922/com.synerflow.testapp E/MediaPlayer: Unable to create media player

01-31 09:37:21.065 1835-1922/com.synerflow.testapp I/Player: player.prepare() has failed
01-31 09:37:21.065 1835-1922/com.synerflow.testapp W/System.err: java.io.IOException: setDataSourceFD failed.: status=0x80000000

The IO Exception seems to be at player.setDataSource(filename), the filename variable is a string: Environment.getExternalStorageDirectory().getAbsolutePath() + "\voice.3gp"


Solution

  • You can try Google Oboe.

    Oboe is a C++ library that makes it easy to build high-performance audio apps on Android.

    Oboe has already an example for "Immediate Audio Input & Output Android"

    LiveEffect Sample

    This sample simply loops audio from the input stream to the output stream to demonstrate the usage of the 2 stream interfaces.

    https://github.com/google/oboe/tree/master/samples/LiveEffect