【发布时间】:2016-04-02 01:20:37
【问题描述】:
在我的 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();
}
}
}
});
我收到了Illegal State Exception | Start failed: -38。但我在microphone.prepare 之后打电话给microphone.start... 似乎是什么问题?我搜索了其他线程,这些线程说可能有其他后台应用程序使用麦克风。我搜索了我的设备:Moto X Play(第 3 代),但没有找到。 (我什至关闭了“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),文件名变量是一个字符串:Environment.getExternalStorageDirectory().getAbsolutePath() + "\voice.3gp"
【问题讨论】:
-
应该只能够传输类似stackoverflow.com/questions/5381969/… 的流。也许也有一个小缓冲区。只是想知道为什么真的 - 如果你这样做了,你是否会遭受非常严重的音频反馈。
-
是的,问题是由于播放器和录音机都试图读取和写入同一个文件。使用可以容纳 1ms 音频的小缓冲区。然后使用两个同步线程:记录器线程将数据放入缓冲区并设置一个标志。检查标志的播放器线程开始播放。参考经典的生产者-消费者问题
标签: android audio microphone audiorecord audiotrack