在我的 Android 应用程序中,我想从智能手机的麦克风中获取一些音频并立即播放,就像麦克风一样,没有延迟。我目前正在考虑使用 AudioRecord
和 AudioTrack
类(根据我的阅读),但我不太确定如何继续。
我在 Stack Overflow 上查看了其他一些问题,但它们并没有完全回答我想做的事情。大多数是 2012 年的。
那么如何使用这些类同时输入和输出音频呢?
还:我查看了 MediaRecorder API
,但根据我阅读的内容,这需要您将音频保存到文件中,而我没有想要做。可以tweeked 来满足我的要求吗?还是我最好只使用 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();
}
}
}
});
我收到 非法状态异常 |启动失败:-38
。但是我在 microphone.prepare
之后调用 microphone.start
... 似乎是什么问题?我搜索了其他线程,这些线程说可能有其他后台应用程序使用麦克风。我搜索了我的设备:Moto X Play(第 3 代),但没有找到。 (我什至关闭了“Ok Google”语音识别,但错误不断出现)。
错误日志:
这是显示最近错误的日志猫:
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 异常似乎在 player.setDataSource(filename)
,filename 变量是一个字符串:Environment.getExternalStorageDirectory().getAbsolutePath() + "\voice.3gp"
最佳答案
据我所知,它可以通过一种非常简单的方式完成。我没试过,你试试。我认为它会起作用:
创建两个线程,一个用于录制另一个用于播放。 假设线程是 TRecord 和 TPlay。
在 TRecord 的 run 方法中这样做:
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 的 run 方法会这样做:
public void run() {
MediaPlayer mPlayer = null;
mPlayer = new MediaPlayer();
try {
mPlayer.setDataSource(mFileName);
mPlayer.prepare();
mPlayer.start();
} catch (IOException e) {
//todo
}
}
现在在 mainactivity 上简单地创建两个线程。首先启动 TRecord 线程,然后启动 Tplay 。试试看。
这是文件扩展名的代码:
mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();
mFileName += "/audiorecordtest.3gp";
关于android - 即时音频输入和输出 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34489339/