Android - Posso fazer isso com MediaRecorder / MediaPlayer vez de Audio Record / Track?
-
19-09-2019 - |
Pergunta
Eu uso atualmente AudioRecord para gravar áudio a partir do microfone de um dispositivo Android e, em seguida, tubo que direto para um AudioTrack que joga o fone de ouvido de um dispositivo Android.
Eu estou querendo saber que eu posso fazer o mesmo, mas com as classes MediaPlayer e MediaRecorder vez que eu precisar usar a codificação AMR-NB que está disponível nas classes de mídia e não as classes de áudio.
O meu problema com MediaRecorder e MediaPlayer é que parece que eu tenho que gravar em um arquivo e, em seguida, jogar para esse arquivo?
Este não é o que eu quero fazer, é lá de qualquer maneira para transmitir o som de áudio do microfone para Fone de ouvido com as classes de mídia?
Meu código usando as classes de áudio está abaixo, é possível fazer alguma coisa o mesmo com o MediaPlayer e MediaRecorder?
public class Record extends Thread
{
static final int bufferSize = 200000;
final short[] buffer = new short[bufferSize];
short[] readBuffer = new short[bufferSize];
public void run() {
isRecording = true;
android.os.Process.setThreadPriority
(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
int buffersize = AudioRecord.getMinBufferSize(11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT);
arec = new AudioRecord(MediaRecorder.AudioSource.MIC,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
MediaRecorder.AudioEncoder.AMR_NB,
buffersize);
atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,
11025,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
MediaRecorder.AudioEncoder.AMR_NB,
buffersize,
AudioTrack.MODE_STREAM);
Log.d("AUDIO", "sample rate = : " + arec.getSampleRate());
atrack.setPlaybackRate(11025);
byte[] buffer = new byte[buffersize];
arec.startRecording();
atrack.play();
while(isRecording) {
arec.read(buffer, 0, buffersize);
atrack.write(buffer, 0, buffer.length);
}
}
}
Solução
Não, não neste momento; é uma limitação bem conhecida de MediaPlayer
que as entradas de fluxo de bytes não são suportados. Você ainda precisa de um arquivo ou fonte de entrada URI.