2010-07-08 28 views
10

Supponiamo di avere il seguente scenario: qualcosa sta giocando su un dispositivo Android (un esempio di mp3 par, ma potrebbe essere qualsiasi cosa che usi la parte audio di un dispositivo Android). Da un'applicazione (un'applicazione android :)), vorrei intercettare il flusso audio per analizzarlo, registrarlo, ecc. Da questa applicazione (diciamo "l'analizzatore") non voglio iniziare un mp3 o qualcosa del genere , tutto quello che voglio è avere accesso al flusso audio di Android.Come posso intercettare il flusso audio su un dispositivo Android?

Qualsiasi consiglio è apprezzato, potrebbe essere una soluzione Java o C++.

+0

Sono abbastanza sicuro che questo non è possibile a meno che il dispositivo è stato radicato. Le chiusure che puoi ottenere è sperare che il microfono sia abbastanza sensibile da captare l'uscita, e sperare che l'utente non abbia inserito gli auricolari! – Dave

+1

La direzione "logica" da osservare sarebbe AudioManager.setRouting - http://developer.android.com/reference/android/media/AudioManager.html#setRouting(int, int, int)). Ciò evidenzia due problemi: uno, è deprecato in favore di specifiche chiamate di funzione, e due, aveva già un elenco predefinito limitato di output. – MSalters

+0

Questo non è consentito su un dispositivo sicuro (tipico consumatore), in base alla progettazione, sebbene sia possibile ottenere FFT di scarsa qualità non frequenti ai fini della creazione di un visualizzatore grafico. Per ottenere l'audio effettivo da altre app, è necessario installare il proprio fork di Android adattato ai propri obiettivi, oppure "hackerare" un'installazione esistente "radicandola" e modificando o intercettando i componenti di sistema. –

risposta

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

Grazie mille per la risposta, ma con il tuo suggerimento posso solo accedere alla sorgente audio del microfono. Come posso accedere al flusso audio che viene inviato al microfono o alle cuffie quando un'altra applicazione riproduce un esempio di mp3? O come posso accedere al flusso audio senza limitare le opzioni al microfono? – user386555

+0

hai provato a utilizzare MediaRecorder.AudioSource.DEFAULT? – androidworkz

+2

Sì, ho provato MediaRecorder.AudioSource.DEFAULT, ma mi ha dato solo il flusso audio del microfono. – user386555

Problemi correlati