2010-07-08 26 views
10

Załóżmy, że mamy następujący scenariusz: coś gra na urządzeniu z Androidem (na przykład mp3), ale może to być wszystko, co używa części audio urządzenia z Androidem. Z aplikacji (aplikacja Android :)) chciałbym przechwycić strumień audio, aby go przeanalizować, nagrać itp. Z tej aplikacji (powiedzmy "analizator") nie chcę zaczynać mp3 ani czegoś , wszystko, czego chcę, to mieć dostęp do strumienia audio Androida.Jak mogę przechwycić strumień audio na urządzeniu z Androidem?

Każda rada jest doceniana, może to być rozwiązanie w języku Java lub C++.

+0

Jestem całkiem pewien, że to nie jest możliwe, chyba że urządzenie zostało zakorzenione. Zamknięcia, które można uzyskać, to mieć nadzieję, że mikrofon jest wystarczająco czuły, aby odebrać wyjście i mieć nadzieję, że użytkownik nie ma podłączonych słuchawek! – Dave

+1

"Logiczny" kierunek, w którym należy spojrzeć, to AudioManager.setRouting - http://developer.android.com/reference/android/media/AudioManager.html#setRouting (int, int)). Wskazuje to na dwa problemy: jeden, jest przestarzały na rzecz określonych wywołań funkcji, a drugi ma już zdefiniowaną, ograniczoną listę wyników. – MSalters

+0

To jest niedozwolone na zabezpieczonym (typowym dla konsumenta) urządzeniu, zgodnie z projektem, chociaż można uzyskać rzadkie, niskiej jakości sygnały FFT w celu zbudowania wizualizatora graficznego. Aby uzyskać rzeczywisty dźwięk z innych aplikacji, musisz zainstalować własny widżet Androida dostosowany do swoich celów lub "zhakować" istniejącą instalację przez "rootowanie" i zmianę lub przechwytywanie komponentów systemu. –

Odpowiedz

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

Dziękuję bardzo za odpowiedź, ale z twoją sugestią mogę uzyskać dostęp tylko do źródła dźwięku mikrofonu. Jak uzyskać dostęp do strumienia audio wysyłanego do głośnika lub słuchawek, gdy inna aplikacja odtwarza przykład mp3? Albo w jaki sposób mogę uzyskać dostęp do strumienia audio bez ograniczania moich opcji do mikrofonu? – user386555

+0

Czy próbowałeś używać MediaRecorder.AudioSource.DEFAULT? – androidworkz

+2

Tak, próbowałem MediaRecorder.AudioSource.DEFAULT, ale to tylko daje mi strumień audio mikrofonu. – user386555

Powiązane problemy