In meiner Android App möchte ich etwas Audio vom Mikrofon des Smartphones aufnehmen und es sofort, live, wie ein Mikrofon, ohne Verzögerung abspielen. Ich denke gerade an die Verwendung von AudioRecord
und AudioTrack
Klassen (von dem, was ich gelesen habe), aber ich bin mir nicht sicher, wie es weiter geht.Sofortiger Audio-Eingang und -Ausgang Android
Ich habe einige andere Fragen zu Stack Overflow ausgecheckt, aber sie antworten nicht genau, was ich gerne machen würde. Und die meisten sind von 2012.
Also wie kann ich diese Klassen verwenden, um Audio gleichzeitig einzugeben und auszugeben?
AUCH: hatte ich einen Blick auf den MediaRecorder API
, aber von dem, was ich lese, dass erfordert, dass Sie die Audio-Datei zu speichern, die ich nicht tun will. Kann es angepasst werden, um meine Anforderungen zu erfüllen? Oder verwende ich besser AudioRecord
?
Dank
EDIT:
Hier ist meine aktualisierte Code unten als @Pradip Pramanick vorgeschlagen:
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();
}
}
}
});
Ich bin ein Illegal State Exception | Start failed: -38
bekommen. Aber ich rufe microphone.start
nach microphone.prepare
... Was scheint das Problem zu sein? Ich suchte andere Threads, die sagten, dass es andere Hintergrund-Apps gibt, die das Mikrofon verwenden. Ich habe mein Gerät gesucht: Moto X Play (3. Generation) und keine gefunden. (Ich habe sogar "Ok Google" Spracherkennung ausgeschaltet, aber der Fehler kam immer wieder).
ERROR LOG:
ist die Log-Katze die letzten Fehler zeigt:
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
Der IO-Ausnahme bei player.setDataSource(filename)
zu sein scheint, ist der Dateiname Variable a string: Environment.getExternalStorageDirectory().getAbsolutePath() + "\voice.3gp"
Können Sie sagen, warum Sie das tun möchten? –
@ ste-fu Probier mal was aus. Weißt du wie das geht? – SynerFlow
Sollte nur in der Lage sein, Streams so etwas zu übertragen http://stackoverflow.com/questions/5381969/android-how-to-record-mp3-radio-audio-stream/5384161#5384161. Vielleicht auch mit einem kleinen Puffer. Ich frage mich nur, warum wirklich - und ob Sie Audio-Feedback sehr schlecht leiden würden, wenn Sie es taten. –