2012-07-29 10 views
13

Przesyłam strumieniowo dźwięk za pomocą MediaPlayer na Androida.Strumień multimediów w Android MediaPlayer zatrzymuje się po zmianie sieci

Gdy urządzenie przechodzi z Wi-Fi do sieci komórkowej lub odwrotnie, MediaPlayer zatrzymuje odtwarzanie.

Zazwyczaj w buforze jest kilka sekund audio, więc odtwarzanie nie ustaje natychmiast.

Idealnie chciałbym odebrać strumień dla nieprzerwanego odtwarzania, ale nie widzę, jak to zrobić.

Pracuję zarówno z plikami mp3 przechowywanymi na serwerze, jak i z transmisją na żywo.

+0

Jakiś kod, aby podzielić się z nami? – Erol

+0

Jest wiele przykładów na pasku bocznym, jeśli potrzebujesz pomocy z MediaPlayer, ale to jest naprawdę prosta: 'MediaPlayer mMediaPlayer = MediaPlayer.create (kontekst, Uri.parse (URL));' 'mMediaPlayer.prepare (); ' ' mMediaPlayer.start(); ' rozpocznie grę. Jeśli jesteś podłączony do sieci Wi-Fi i masz zasięg 3G, wyłącz Wi-Fi podczas przesyłania strumieniowego, a odtwarzanie zatrzyma się. – lightversusdark

+2

Tak, wiem, jak korzystać z odtwarzacza multimedialnego. Właśnie pytałem, czy spróbowałeś czegoś w tym imieniu i chcesz podzielić się swoimi postępami, abyśmy mogli to poprawić. – Erol

Odpowiedz

0

Nie wiem, dlaczego twój odtwarzacz multimedialny się zatrzymuje, ale może mógłbyś dodać metodę onReceive i wstawić "mp.start()" w metodzie, aby wznowić odtwarzanie.
Android, How to handle change in network (from GPRS to Wi-fi and vice-versa) while polling for data

Być może trzeba zrobić osobną klasę, ale które powinny wyjaśnić jak stworzyć metodę, która jest wywoływana podczas przełączania sieci, w którym momencie można nazwać „mp.start()”, aby wznowić odtwarzanie (zakładając, że MP jest twoim MediaPlayer).
To zakłada, że ​​twój MediaPlayer jest tylko zatrzymany, gdy przełączasz sieci, nie zatrzymany.

14

Z punktu widzenia serwerów zmiana trybu sieciowego z WiFi na 3G (na odwrót) będzie wyglądać jak zupełnie nowe połączenie z oddzielnego adresu IP (klienta).

Jeśli serwer, z którego pobierasz dane, nie obsługuje śledzenia strumienia (np. Liczba sekund, kolejność, bajt) (w przeciwieństwie do serwerów multimedialnych), będzie musiał ponownie rozpocząć podawanie pliku mp3 od 0 bajtów.

Jeśli adres URL wskazuje plik MP3 znajdujący się na standardowym serwerze HTTP, sytuacja będzie taka, jakiej należy się spodziewać. Powinieneś zajrzeć do serwera strumieniowania mediów, abyś mógł wznowić pobieranie/przesyłanie strumieniowe według własnego wyboru. Kiedy otrzymasz informację, że połączenie zostało utracone/wznowione, możesz skierować swój mediaplayer na nowy adres URL z pozycją pliku w adresie URL (np. Seconds = 19, bytes = 57365).

Nie jestem pewien, czy to ci pomaga, ale wyjaśnia nieco, co dzieje się "za kulisami".

1

Spróbuj ustawić swoje setOnCompletionListener i setOnErrorListener. Po włączeniu transmisji na żywo możesz ponownie zadzwonić pod numer prepareAsync(), co spowoduje ponowne uruchomienie strumienia. Nie ma na to zgrabnego sposobu, chyba że napiszesz własne ramy medialne.

Możesz także słuchać w sobie onError() dla MEDIA_ERROR_SERVER_DIED możesz ponownie odpalić prepareAsync().

Przekonasz się, że MediaPlayer będzie albo Błąd, albo Zakończono. Jeśli obsłużysz oba te wywołania zwrotne, to co najmniej możesz zrobić, to zrestartować strumień przy zmianie sieci, jak dla płynnego odtwarzania. To wymagałoby niestandardowego ramek multimedialnych, ponieważ android jest dość tandetny.

0

Jak mówi Vidar, ponowne ustanowienie połączenia będzie traktowane przez serwer jako nowe połączenie.

Wygląda na to, że muszę podwójnie buforować odtwarzanie dźwięku, co oznacza tworzenie niestandardowego odtwarzacza multimedialnego. Może to zapewnić ciągły dźwięk, ale nadal będzie pomijany podczas słuchania transmisji na żywo.

Plik MP3 jest nieco łatwiejszy, ponieważ mogę poznać położenie odtwarzania. Nie w przypadku transmisji na żywo.

Zgodnie z tym, co mówi gmaster, potrzebuję odbiornika, aby ustanowić nowe połączenie, gdy zmieni się sieć. Bufor audio z poprzedniego połączenia sieciowego powinien kontynuować odtwarzanie, podczas gdy nowy bufor audio jest wypełniany przez nowe połączenie.

Gdy nowy bufor jest wystarczająco pełny, aby rozpocząć odtwarzanie, mogę przełączyć na niego odtwarzanie. Jeśli przesyłam plik strumieniowo, z obsługą serwera i odrobiną pracy, mogę zapewnić, że bieżące dane pozycji odtwarzania znajdują się w obu buforach i przełączają się płynnie.

Ponieważ bufory strumieniowe na żywo nie mogą być zsynchronizowane, nieuchronnie wystąpi usterka podczas przełączania.

Większy bufor pozwoli uniknąć odrzucenia dźwięku, jeśli nawiązanie połączenia trwa chwilę, ale opóźnia pierwsze uruchomienie odtwarzania. Plik MP3 można pobrać i wypełnić bufor szybciej niż w czasie rzeczywistym, ale strumień na żywo będzie buforował w czasie rzeczywistym.

Chris.Jenkins wspomina o niektórych metodach MediaPlayer, które mogą pomóc, ale wskazuje na to, że wymaga to niestandardowej architektury. Będzie musiał zająć się warunkami, które wymienia, i innymi.

Jeśli mogę sprawić, że będzie ładnie, opublikuję go tutaj. Mam pytanie otwarte.