2010-02-10 11 views
5

Actualmente uso AudioRecord para grabar audio desde el micrófono de un dispositivo Android y luego conectarlo directamente a un AudioTrack que lo reproduce en el Auricular de un dispositivo Android.Android - ¿Puedo hacer esto con MediaRecord/MediaPlayer en lugar de AudioRecord/Track?

Me pregunto si puedo hacer lo mismo, pero con las clases MediaPlayer y MediaRecorder, ya que necesito usar la codificación AMR-NB que está disponible en las clases de Medios y no en las de Audio.

Mi problema con MediaRecorder y MediaPlayer es que parece que tengo que grabar en un archivo y luego jugar para ese archivo?

Esto no es lo que quiero hacer, ¿hay alguna manera de transmitir el sonido de audio desde el micrófono al auricular con las clases de medios?

Mi código usando las clases de audio está abajo, ¿es posible hacer algo igual con MediaPlayer y 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); 
        } 
    } 
} 

Respuesta

3

No, no en este momento; es una limitación bien conocida de MediaPlayer que las entradas de flujo de bytes no son compatibles. Todavía necesitarías un archivo o una fuente de entrada URI.

+0

Entonces, ¿tendría que usar las clases de Audio como las anteriores y codificar el Audio yo mismo? –

+0

Desafortunadamente sí. Afortunadamente, probablemente pueda encontrar un códec de fuente abierta con bastante facilidad, y efectivamente tiene la opción de usar C (NDK) o Java (Dalvik/SDK) para la codificación. –

Cuestiones relacionadas