2010-02-10 15 views
5

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); 
        } 
    } 
} 

Odpowiedz

3

Nie, nie w tym czasie; jest to znane ograniczenie liczby wejść strumieni bajtowych, które nie są obsługiwane. Nadal potrzebujesz źródła wejściowego pliku lub URI.

+0

Więc musiałbym użyć klas Audio jak wyżej i samemu zakodować Audio? –

+0

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). –