2010-07-20 15 views
99

Mam następujący kod:Odtwórz plik dźwiękowy z katalogu aktywów

AssetFileDescriptor afd = getAssets().openFd("AudioFile.mp3"); 
player = new MediaPlayer(); 
player.setDataSource(afd.getFileDescriptor()); 
player.prepare(); 
player.start(); 

Problem polega na tym, że po uruchomieniu tego kodu, to rozpocznie odtwarzanie wszystkich plików audio w katalogu aktywów, w porządku alfabetycznym, a nie po prostu odtwarzam żądany plik audio. Co ja robię źle? Czy istnieje lepszy sposób odtwarzania plików audio z katalogu asset?

Późniejsze pytanie: Czy istnieje różnica między zachowaniem plików audio w katalogu zasobów a przechowywaniem ich w katalogu res/raw? Poza tym, że nie otrzymują identyfikatorów, jeśli znajdują się w katalogu aktywów. Jeśli przeniesię pliki audio do folderu res/raw, to mam problem z ponownym użyciem MediaPlayer s, ponieważ nie ma parametru id dla setDataSource(). Nie mogę znaleźć dobrej wskazówki do radzenia sobie z tego rodzaju problemem.

Odpowiedz

205
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength()); 

Twoja wersja będzie działać, jeśli miał tylko jeden plik w aktywach katalogów. Zawartość katalogu zasobów nie jest w rzeczywistości "prawdziwymi plikami" na dysku. Wszystkie są układane jeden po drugim. Tak więc, jeśli nie robisz określić, od czego zacząć i jak wiele bajtów do odczytania, gracz będzie czytać aż do końca (czyli zachowa odtwarzanie wszystkich plików w aktywa katalogu)

+1

Zadziałało. Dzięki. Ale myślę, że moja wersja POWINNA też zadziałać. –

+54

Twoja wersja będzie działać, jeśli w katalogu zasobów znajduje się tylko jeden plik. Zawartość katalogu zasobów nie jest w rzeczywistości "prawdziwymi plikami" na dysku. Wszystkie są układane jeden po drugim. Tak więc, jeśli nie określisz, od czego zacząć i ile bajtów do przeczytania, odtwarzacz będzie czytał do końca (czyli będzie odtwarzał wszystkie pliki w katalogu zasobów). –

+0

Bardzo dobra odpowiedź! – Redax

57

tę funkcję będzie działać poprawnie :)

// MediaPlayer m; /*assume, somewhere in the global scope...*/ 

public void playBeep() { 
    try { 
     if (m.isPlaying()) { 
      m.stop(); 
      m.release(); 
      m = new MediaPlayer(); 
     } 

     AssetFileDescriptor descriptor = getAssets().openFd("beepbeep.mp3"); 
     m.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength()); 
     descriptor.close(); 

     m.prepare(); 
     m.setVolume(1f, 1f); 
     m.setLooping(true); 
     m.start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+2

co to jest m? uruchamiasz m = new MediaPlayer(); po i używał go wcześniej? – Umar

+0

Witam @Umar, mam zmienną Global MediaPlayer m = null; następnie przypisałem funkcję playBeep() –

+0

Należy pamiętać, że 'MediaPlayer m' musi być' static' lub mieć inną ** referencję **. Jeśli masz 'm' w funkcji bez żadnego odniesienia,' GC' "go" zbierze –

Powiązane problemy