Obecnie używam AudioRecord do nagrywania dźwięku z mikrofonu urządzenia z systemem Android, a następnie rura prosto do AudioTrack, który odtwarza go w słuchawce urządzenia z systemem Android.Android - Czy mogę to zrobić za pomocą MediaRecord/MediaPlayer zamiast AudioRecord/Track?
Zastanawiam się, czy mogę zrobić to samo, ale z klasami MediaPlayer i MediaRecorder, ponieważ potrzebuję użyć kodowania AMR-NB dostępnego na klasach Media, a nie Audio.
Mój problem z MediaRecorder i MediaPlayer polega na tym, że wydaje mi się, że muszę nagrać do pliku, a następnie odtworzyć dla tego pliku?
To nie jest to, co chcę zrobić, czy mimo to można przesyłać dźwięk audio z Mic do słuchawki z klasami Media?
Mój kod za pomocą klas Audio jest poniżej, czy można zrobić to samo z MediaPlayer i 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);
}
}
}
Więc musiałbym użyć klas Audio jak wyżej i samemu zakodować Audio? –
Niestety tak. Na szczęście prawdopodobnie można łatwo znaleźć kodek z otwartym kodem źródłowym, a do kodowania można efektywnie używać C (NDK) lub Java (Dalvik/SDK). –