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
Odpowiedz
@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.
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
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. –
Zarejestruj słuchacza OnBufferingUpdate.
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
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.
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
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
- 1. Jak stwierdzić, kiedy obiekt AudioTrack zakończył odtwarzanie?
- 2. Jak wyciszyć MediaPlayer w android
- 3. Jak stwierdzić, kiedy gniazdo zostało odłączone?
- 4. Usługa MediaPlayer Android
- 5. android ANR w MediaPlayer zresetować
- 6. Wykrywanie, czy VideoVIew buforuje
- 7. Jak stwierdzić, kiedy przycisk Wstecz jest naciśnięty w UINavigationControllerStack
- 8. Jak mogę stwierdzić, kiedy zakończyła się animacja UITableView?
- 9. Jak stwierdzić, kiedy układ sił D3 został zatrzymany?
- 10. Jak stwierdzić, kiedy powtarzane są powtórzenia DOM Elementy stemplowania
- 11. Jak stwierdzić, kiedy przeglądarka jest już zajęta, ładowanie
- 12. Android: mediaplayer odszedł z nieobsłużonymi zdarzeniami
- 13. Odtwarzanie macierzy bajtów w MediaPlayer - Android
- 14. Android SeekBar do sterowania postępem MediaPlayer
- 15. mediacodec vs mediaplayer i mediarecorder
- 16. Jak programowo określić, kiedy wygasło hasło FINGERPRINT_ERROR_LOCKOUT w Android FIngerprintManager?
- 17. przeglądarka buforuje pliki statyczne w kolbie?
- 18. Android mediaPlayer - czy istnieje metoda "isPrepared()" lub "getStatus()"?
- 19. Chrome nie buforuje preflight
- 20. Strumień multimediów w Android MediaPlayer zatrzymuje się po zmianie sieci
- 21. Jak utworzyć klasę, która buforuje obiekty?
- 22. Android http live Streaming URL przy użyciu mediaplayer
- 23. Android SeekBar setProgress powoduje, że mój MediaPlayer pomija numer
- 24. MediaController z MediaPlayer
- 25. MVC buforuje obrazy bazy danych
- 26. Czy Java "buforuje" anonimowe klasy?
- 27. mojolicious morbo server domyślnie buforuje?
- 28. Android MediaPlayer getCurrentPosition() powoduje, że dźwięk się zacina
- 29. Android: Bezstratne odtwarzanie zapętlonego pliku audio w MediaPlayer
- 30. Błąd Android MediaPlayer (-38, 0) "stop wywołany w stanie 0"
Jakieś informacje na ten temat? Próbuję utworzyć odtwarzacz wideo strumieniowego. Wszystkie komentarze mile widziane. – Sen