2010-12-16 17 views
29

Muszę tu pominąć coś oczywistego, ale nie mogę znaleźć niczego, co pozwoli mi określić, kiedy MediaPlayer buforuje dźwięk. Przesyłam strumieniowo dźwięk internetowy i chcę wyświetlić wskaźnik buforowania, ale nic, co wypróbowałem, nie pozwala mi wiedzieć, kiedy MediaPlayer przerywa dźwięk w buforze, więc nie mogę poprawnie wyświetlić wskaźnika buforowania. Jakieś wskazówki?Android - Jak stwierdzić, kiedy MediaPlayer buforuje

+0

Jakieś informacje na ten temat? Próbuję utworzyć odtwarzacz wideo strumieniowego. Wszystkie komentarze mile widziane. – Sen

Odpowiedz

6

@Daniel, za komentarz na temat odpowiedzi @ JRL, prawdopodobnie można uzyskać to działa, obracając wątek i czekając na timeout.

Coś takiego jak DetectBufferTimeout.java (untested) byłoby ładnie.

Zgadzam się jednak, że kręcenie tego osobnego wątku jest trochę hackerem. Być może OnBufferingUpdateListener może zagwarantować, jak często wywołuje onBufferingUpdate(), niezależnie od tego, czy nastąpiła zmiana w postępie buforowania, abyśmy mogli wykryć, czy otrzymujemy taką samą wartość w kółko.

+1

Dzięki, Matt. Problemem, który mam, jest to, że nie ma powiadomienia o tym, kiedy MediaPlayer faktycznie wstrzymuje ścieżkę do bufora. Ale twoja sugestia jest nadal dobra. Myślę, że ta sama technika miałaby zastosowanie ... zamiast sprawdzania postępu buforowania, powinienem sprawdzić postęp gry. Jeśli nie został zaktualizowany i nie został zatrzymany lub zatrzymany z mojego końca, to instancja MediaPlayer musiała go wstrzymać, aby buforować więcej danych dźwiękowych. Dzięki! – Daniel

+0

Ach tak, nie zdawałem sobie sprawy, że chciałeś się dowiedzieć, kiedy utwór został wstrzymany, szczególnie, ponieważ skończył się przez bufor. –

1

Zarejestruj słuchacza OnBufferingUpdate.

+2

Dzięki. Zrobiłem to, ale to tylko wydaje mi się procentowy udział ścieżki audio, która została zbuforowana. Próbowałem porównać z bieżącym czasem odtwarzania utworu. Pomyślałem, że mógłbym sprawdzić, czy aktualny procent bufora wynosi <= do bieżącego procentu czasu gry. Ale to nie działa, ponieważ MediaPlayer wydaje się mieć upakowany kod buforujący, więc buforuje się, zanim bufor zostanie całkowicie wyczerpany. Wciąż nie mam sposobu, aby powiedzieć (lub kontrolować), kiedy ścieżka buforuje. Mam nadzieję, że czegoś brakuje? – Daniel

10

OK, teraz czuję się trochę usatysfakcjonowany. Sprawdziłem aplikację Pandora i nie wyświetla ona wskaźnika buforowania. Kiedy muzyka jest przerywana do buforowania, po prostu siedzi tam, jakby nic się nie stało, a interfejs wygląda, jakby nadal grał. Tak więc doszedłem do wniosku, że jeśli używasz MediaPlayer, po prostu nie można ustalić, czy utwór jest chwilowo wstrzymany na buforowanie.

Zauważyłem jednak, że istnieje kilka stałych MediaPlayer, które mogą być przydatne: MEDIA_INFO_BUFFERING_START i MEDIA_INFO_BUFFERING_END. Ale są one dostępne tylko na poziomie API 9+, a dokumenty nic o nich nie mówią. Zakładam, że mogą być używane z OnInfoListener.

Jestem rozczarowany, ale przynajmniej mogę przestać obracać moje koła i przejść do czegoś innego.

47

jak poniżej (poziom API ≥ 9):

mp.setOnInfoListener(new OnInfoListener() { 

    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 
     switch (what) { 
      case MediaPlayer.MEDIA_INFO_BUFFERING_START: 
       loadingDialog.setVisibility(View.VISIBLE); 
       break; 
      case MediaPlayer.MEDIA_INFO_BUFFERING_END: 
       loadingDialog.setVisibility(View.GONE); 
       break; 
     } 
     return false; 
    } 
}); 

UWAGA: Jest to znany błąd w Androidzie. Podczas odtwarzania strumienia HLS po prostu nigdy nie wywołuje OnInfoListener lub OnBuffering. sprawdź ten link OnInfoListener bug

+0

to działa idealnie! dzięki –

+5

Czy fakt, że 'mediaPlayer' rozpoczął buforowanie gwarantuje, że zatrzymał odtwarzanie? Nie jestem tego pewien. – shujj

+0

Jestem ci winien milion;) – ZimaXXX

0

Możesz użyć wątku, który sprawdza bieżącą pozycję MediaPlayer. Jeśli pozycja się nie zmienia, możesz wywnioskować, że media są w stanie buforowania. Oto kompletny samouczek, który napisałem: http://www.ottodroid.net/?p=260

Powiązane problemy