5

J'utilise actuellement AudioRecord pour enregistrer de l'audio depuis le micro d'un appareil Android, puis le rediriger directement vers un AudioTrack qui le joue sur l'écouteur d'un appareil Android. Je me demande si je peux faire la même chose avec les classes MediaPlayer et MediaRecorder, car je dois utiliser l'encodage AMR-NB disponible sur les classes Media et non sur les classes Audio.Android - Puis-je le faire avec MediaRecord/MediaPlayer au lieu de AudioRecord/Track?

Mon problème avec MediaRecorder et MediaPlayer est qu'il me semble que je dois enregistrer dans un fichier, puis jouer pour ce fichier?

Ce n'est pas ce que je veux faire, y at-il de toute façon pour diffuser le son audio de Mic à Earpiece avec les classes de médias?

Mon code utilisant les classes Audio est ci-dessous, est-il possible de faire la même chose avec MediaPlayer et 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); 
        } 
    } 
} 

Répondre

3

Non, pas pour l'instant; c'est une limitation bien connue de MediaPlayer que les entrées de flux d'octets ne sont pas supportées. Vous auriez toujours besoin d'un fichier ou d'une source d'entrée URI.

+0

Donc, je devrais utiliser les classes audio comme ci-dessus et encoder l'audio moi-même? –

+0

Malheureusement oui. Heureusement, vous pouvez probablement trouver un codec open source assez facilement, et vous avez effectivement la possibilité d'utiliser C (NDK) ou Java (Dalvik/SDK) pour l'encodage. –

Questions connexes