立即audioinput和输出Android

在我的Android应用程序中,我想从智能手机的麦克风中取出一些audio,立即播放,像麦克风一样直播,没有任何延迟。 我目前正在考虑使用AudioRecordAudioTrack类(从我读过的),但我不太清楚如何继续。

我检查了一些堆栈溢出的其他问题,但他们不完全回答我想要做的。 而大部分是从2012年起。

那么我怎样才能使用这些类来同时input和输出audio呢?

另外:我看了一下MediaRecorder API ,但是从我读到的内容来看,需要将audio保存到一个我不想做的文件中。 它可以被tweeked满足我的要求? 还是我最好只使用AudioRecord

谢谢

编辑:

这是我的更新代码下面@Pradip Pramanickbuild议:

 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(); } } } }); 

我收到一个Illegal State Exception | Start failed: -38 Illegal State Exception | Start failed: -38 。 但是我打电话给microphone.startmicrophone.prepare 。准备…什么似乎是问题? 我search了其他线程,说可能有其他背景应用程序使用麦克风。 我search了我的设备:Moto X Play(第三代),没有find。 (我甚至closures了“Ok Google”语音识别function,但错误不断出现)。

错误日志:

以下是显示最近错误的日志:

 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 

IOexception似乎是在player.setDataSource(filename) ,文件名variables是一个string: Environment.getExternalStorageDirectory().getAbsolutePath() + "\voice.3gp"

Solutions Collecting From Web of "立即audioinput和输出Android"

据我所知,这可以用一个非常简单的方法来完成。 我没有尝试过,但你试试。 我认为这将工作:

创build两个线程来录制另一个播放。 说线程是TRecord和TPlay。

在TRecord的运行方法中做到这一点:

 public void run(){ MediaRecorder mRecorder = null; mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setOutputFile(mFileName); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mRecorder.prepare(); } catch (IOException e) { //todo } mRecorder.start(); } 

而TPlay的运行方法是这样的:

 public void run() { MediaPlayer mPlayer = null; mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(mFileName); mPlayer.prepare(); mPlayer.start(); } catch (IOException e) { //todo } } 

现在主要活动只是创build两个线程。 首先启动TRecord线程,然后启动Tplay。 尝试一下。

这里是文件扩展名的代码:

 mFileName = Environment.getExternalStorageDirectory().getAbsolutePath(); mFileName += "/audiorecordtest.3gp"; 

这在Android上确实非常棘手。 谷歌自己有一个非常好的(但稍长)的video解释这些问题。

他们还有一个页面,解释各种设备的延迟testing方法和基准 。

从本质上讲,股票Android不能做零延迟audio,但没有任何东西阻止硬件合作伙伴添加所需的硬件和平台扩展来做到这一点。

尝试这个。 我没有运行这个。

  recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING, bufferSize * BytesPerElement); recorder.startRecording(); isRecording = true; recordingThread = new Thread(new Runnable() { public void run() { try { int intSize = android.media.AudioTrack.getMinBufferSize(RECORDER_SAMPLERATE,AudioFormat.CHANNEL_OUT_MONO , RECORDER_AUDIO_ENCODING); byte[] sData = new byte[bufferSize]; AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, RECORDER_SAMPLERATE, AudioFormat.CHANNEL_OUT_MONO, RECORDER_AUDIO_ENCODING, intSize, AudioTrack.MODE_STREAM); while(isRecording){ recorder.read(sData, 0, bufferSize); //isRecording = false; onStop button if (at!=null) { at.play(); // Write the byte array to the track at.write(sData, 0, sData.length); at.stop(); at.release(); } } } catch (IOException e) { e.printStackTrace(); } } }, "AudioRecorder Thread"); recordingThread.start();