在我的Android应用程序中,我想从智能手机的麦克风中获取一些音频并立即播放,像麦克风一样直播,没有延迟.我目前正在考虑使用AudioRecord
和AudioTrack
类(从我读过的内容),但我不太确定如何继续.
我查看了Stack Overflow上的其他一些问题,但他们并没有完全回答我想做的事情.大多数是2012年.
那么如何使用这些类同时输入和输出音频呢?
另外:我看了一下MediaRecorder API
,但是根据我的阅读,需要你将音频保存到文件中,我不想这样做.可以通过tweek来满足我的要求吗?或者我最好只使用AudioRecord
?
谢谢
编辑:
以下是我在@Pradip Pramanick建议的更新代码:
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
.但是我microphone.start
之后打电话microphone.prepare
......似乎是什么问题?我搜索了其他线程,说可能有其他后台应用程序使用麦克风.我搜索了我的设备:Moto X Play(第三代)并没有找到.(我甚至关闭了"Ok Google"语音识别,但错误不断出现).
错误日志:
这是显示最新错误的log-cat:
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
IO Exception似乎是player.setDataSource(filename)
,filename变量是一个字符串:Environment.getExternalStorageDirectory().getAbsolutePath() + "\voice.3gp"