Nella mia app per Android, mi piacerebbe prendere un po 'di audio dal microfono dello smartphone e riprodurlo immediatamente, dal vivo, come un microfono, senza ritardi. Attualmente sto pensando di utilizzare le classi AudioRecord
e AudioTrack
(da quello che ho letto), ma non sono abbastanza sicuro su come procedere.Ingresso e uscita audio immediato Android
Ho controllato alcune altre domande su Stack Overflow ma non rispondono esattamente a ciò che vorrei fare. E la maggior parte sono del 2012.
Quindi, come posso utilizzare queste classi per l'input e l'output audio simultaneamente?
ANCHE: ho dato un'occhiata al MediaRecorder API
, ma da quello che ho letto, che richiede di salvare l'audio in un file, che io non voglio fare. Può essere tweeked per soddisfare le mie esigenze? O sto meglio usando solo AudioRecord
?
Grazie
EDIT:
Ecco il mio codice aggiornato seguito come @Pradip Pramanick suggerito:
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();
}
}
}
});
sto ottenendo un Illegal State Exception | Start failed: -38
. Ma sto chiamando microphone.start
dopo il microphone.prepare
... Quale sembra essere il problema? Ho cercato altri thread che dicevano che ci potrebbero essere altre app in background usando il microfono. Ho cercato il mio dispositivo: Moto X Play (terza generazione) e non ne ho trovato nessuno. (Ho persino disattivato il riconoscimento vocale "Ok Google", ma l'errore continuava a venire).
ERRORE LOG:
Ecco il log-gatto che mostra gli errori più recenti:
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
L'eccezione IO sembra essere al player.setDataSource(filename)
, la variabile nome del file è una stringa: Environment.getExternalStorageDirectory().getAbsolutePath() + "\voice.3gp"
Puoi dire perché vuoi farlo? –
@ ste-fu Sto solo provando qualcosa. Sai come farlo? – SynerFlow
Dovrebbe essere in grado di trasferire flussi come questo http://stackoverflow.com/questions/5381969/android-how-to-record-mp3-radio-audio-stream/5384161#5384161. Forse con un piccolo buffer anche. Mi chiedo solo perché davvero - e se dovessi subire un discreto feedback audio se lo facessi. –