2010-07-08 3 views
10

Supposons que nous ayons le scénario suivant: quelque chose est en train de jouer sur un appareil Android (un exemple mp3 par exemple, mais il pourrait être tout ce qui utilise la partie audio d'un appareil Android). A partir d'une application (application android :)), je voudrais intercepter le flux audio pour l'analyser, l'enregistrer, etc. A partir de cette application (disons "l'analyseur") je ne veux pas démarrer un mp3 ou quelque chose , tout ce que je veux, c'est avoir accès au flux audio d'android.Comment puis-je intercepter le flux audio sur un appareil Android?

Tout conseil est apprécié, il pourrait s'agir d'une solution Java ou C++.

+0

Je suis assez sûr que cela est impossible à moins que le dispositif a été enraciné. Les fermetures que vous pouvez obtenir est d'espérer que le microphone est suffisamment sensible pour capter la sortie, et espérer que l'utilisateur n'a pas d'écouteurs branchés! – Dave

+1

La direction "logique" à regarder serait AudioManager.setRouting - http://developer.android.com/reference/android/media/AudioManager.html#setRouting(int, int, int)). Cela fait ressortir deux problèmes: premièrement, il est déconseillé au profit d'appels de fonctions spécifiques, et deuxièmement, il comporte déjà une liste de sorties prédéfinie et limitée. – MSalters

+0

Ceci n'est pas autorisé sur un périphérique sécurisé (par défaut), de par sa conception, bien que vous puissiez obtenir des FFT de faible qualité et peu fréquentes afin de créer un visualiseur graphique. Pour accéder à l'audio réel d'autres applications, vous devez soit installer votre propre fourche d'Android adaptée à vos objectifs, soit "pirater" une installation existante en "l'enracinant" et en modifiant ou en interceptant les composants du système. –

Répondre

0

http://developer.android.com/reference/android/media/MediaRecorder.html

public class AudioRecorder { 

    final MediaRecorder recorder = new MediaRecorder(); 
    final String path; 

    /** 
    * Creates a new audio recording at the given path (relative to root of SD 
    * card). 
    */ 
    public AudioRecorder(String path) { 
     this.path = sanitizePath(path); 
    } 

    private String sanitizePath(String path) { 
     if (!path.startsWith("/")) { 
      path = "/" + path; 
     } 
     if (!path.contains(".")) { 
      path += ".3gp"; 
     } 
     return Environment.getExternalStorageDirectory().getAbsolutePath() 
       + path; 
    } 

    /** 
    * Starts a new recording. 
    */ 
    public void start() throws IOException { 
     String state = android.os.Environment.getExternalStorageState(); 
     if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) { 
      throw new IOException("SD Card is not mounted. It is " + state 
        + "."); 
     } 

     // make sure the directory we plan to store the recording in exists 
     File directory = new File(path).getParentFile(); 
     if (!directory.exists() && !directory.mkdirs()) { 
      throw new IOException("Path to file could not be created."); 
     } 

     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setOutputFile(path); 
     recorder.prepare(); 
     recorder.start(); 
    } 

    /** 
    * Stops a recording that has been previously started. 
    */ 
    public void stop() throws IOException { 
     recorder.stop(); 
     recorder.release(); 
    } 
} 
+3

Merci beaucoup pour votre réponse, mais avec votre suggestion, je peux seulement accéder à la source audio du microphone. Comment puis-je accéder au flux audio envoyé au haut-parleur ou aux écouteurs lorsqu'une autre application lit un exemple mp3? Ou comment puis-je accéder au flux audio sans limiter mes options au microphone? – user386555

+0

avez-vous essayé d'utiliser MediaRecorder.AudioSource.DEFAULT? – androidworkz

+2

Oui, j'ai essayé MediaRecorder.AudioSource.DEFAULT, mais il me donne seulement le flux audio du microphone. Je – user386555

Questions connexes