Odtwarzacz to komponent aplikacji, który umożliwia odtwarzanie multimediów.
Interfejs Media3 Player określa zarys funkcji zwykle obsługiwanych przez odtwarzacz. Obejmuje to:
- wpływ na elementy sterujące odtwarzaniem, takie jak odtwarzanie, wstrzymywanie i przewijanie;
- wykonywanie zapytań o właściwości aktualnie odtwarzanych multimediów, np. o pozycję odtwarzania;
- Zarządzanie playlistą lub kolejką elementów multimedialnych
- konfigurowanie właściwości odtwarzania, takich jak odtwarzanie losowe, powtarzanie, szybkość i głośność;
- Renderowanie filmu na ekranie
Media3 udostępnia też implementację interfejsu Player o nazwie
ExoPlayer.
wspólny interfejs między komponentami,
Kilka komponentów w Media3 implementuje interfejs Player, np.:
| Komponent | Opis i uwagi dotyczące zachowania |
|---|---|
ExoPlayer |
Interfejs API odtwarzacza multimediów i domyślna implementacja interfejsu Player. |
MediaController |
Współpracuje z MediaSession, aby wysyłać polecenia odtwarzania. Jeśli elementy Player i MediaSession znajdują się w Service oddzielonym od Activity lub Fragment, w którym znajduje się interfejs odtwarzacza, możesz przypisać element MediaController jako odtwarzacz dla interfejsu PlayerView. Wywołania odtwarzania i playlisty są wysyłane na urządzenie Player przez urządzenie MediaSession.
|
MediaBrowser |
Oprócz funkcji oferowanych przez
MediaController wchodzi w interakcję z
MediaLibrarySession, aby przeglądać dostępne treści multimedialne.
|
SimpleBasePlayer |
Implementacja Player, która zmniejsza liczbę metod do zaimplementowania do minimum. Przydatne, gdy używasz niestandardowego odtwarzacza, który chcesz połączyć z MediaSession.
|
ForwardingSimpleBasePlayer |
SimpleBasePlayer podklasa zaprojektowana do przekazywania operacji odtwarzania do innego elementu Player, która umożliwia te same spójne dostosowania zachowania co SimpleBasePlayer. Użyj tej klasy, aby pominąć lub zmodyfikować określone operacje odtwarzania.
|
CastPlayer |
Implementacja Player, która komunikuje się z aplikacją odbiornika Cast. Działanie zależy od bazowej sesji Cast.
|
Chociaż MediaSession nie implementuje interfejsu Player, podczas tworzenia MediaSession wymaga Player. Jego celem jest zapewnienie dostępu do Player
z innych procesów lub wątków.
Architektura odtwarzania Media3
Jeśli masz dostęp do Player, wywołuj jego metody bezpośrednio, aby wydawać polecenia odtwarzania. Możesz reklamować odtwarzanie i przyznawać zewnętrznym źródłom kontrolę nad odtwarzaniem, wdrażając MediaSession. Te źródła zewnętrzne implementują MediaController, które ułatwia łączenie się z sesją multimedialną i wysyłanie żądań poleceń odtwarzania.
Podczas odtwarzania multimediów w tle sesja multimedialna i odtwarzacz muszą znajdować się w MediaSessionService lub MediaLibraryService, które działają jako usługa na pierwszym planie. Dzięki temu możesz oddzielić odtwarzacz od aktywności w aplikacji, która zawiera interfejs sterowania odtwarzaniem. Może to wymagać użycia kontrolera multimediów.
Player odgrywa kluczową rolę w architekturze Media3.Stan odtwarzacza
Stan odtwarzacza multimediów implementującego interfejs Player składa się głównie z 4 kategorii informacji:
- Stan odtwarzania
- Odzyskaj za pomocą
getPlaybackState(). - Wartości stanu zdefiniowane przez interfejs to
STATE_IDLE,STATE_BUFFERING,STATE_READYiSTATE_ENDED.
- Odzyskaj za pomocą
- Playlista elementów multimedialnych
- Sekwencja
MediaIteminstancji do odtwarzania. - Odzyskaj za pomocą
getCurrentTimeline() - Instancje
Playermogą udostępniać metody operacji na playlistach, takie jak dodawanie lub usuwanieMediaItem, oraz metody ułatwiające korzystanie, takie jakgetCurrentMediaItem().
- Sekwencja
- właściwości odtwarzania/wstrzymywania, takie jak:
playWhenReady: określa, czy użytkownik chce, aby multimedia były odtwarzane, gdy jest to możliwe, czy mają pozostać wstrzymane.- Przyczyna wstrzymania odtwarzania:
wskazanie przyczyny wstrzymania odtwarzania, jeśli ma to zastosowanie, nawet jeśli
playWhenReadyma wartośćtrue. isPlaying: informacja o tym, czy odtwarzacz aktualnie odtwarza film. Wartośćtruejest ustawiana tylko wtedy, gdy stan odtwarzania toSTATE_READY,playWhenReadytotrue, a odtwarzanie nie jest wstrzymane.
- Pozycja odtwarzania, w tym:
- Indeks bieżącego elementu multimedialnego:
Indeks bieżącego elementu
MediaItemna playliście. isPlayingAd: informacja o tym, czy wstawiona reklama jest odtwarzana.- Bieżąca pozycja odtwarzania:
Bieżąca pozycja odtwarzania w obrębie bieżącego
MediaItemlub wstawionej reklamy.
- Indeks bieżącego elementu multimedialnego:
Indeks bieżącego elementu
Dodatkowo interfejs Player umożliwia dostęp do dostępnych ścieżek, metadanych multimediów, szybkości odtwarzania, głośności i innych właściwości pomocniczych odtwarzania.
Nasłuchiwanie zmian
Użyj Player.Listener, aby monitorować zmiany w Player. Więcej informacji o tworzeniu i używaniu odbiornika znajdziesz w dokumentacji ExoPlayera w sekcji Zdarzenia odtwarzacza.
Pamiętaj, że interfejs odbiornika nie zawiera żadnych wywołań zwrotnych do śledzenia normalnego postępu odtwarzania. Aby stale monitorować postęp odtwarzania, np. skonfigurować interfejs paska postępu, należy w odpowiednich odstępach czasu wysyłać zapytania o bieżącą pozycję.
Kotlin
val handler = Handler(Looper.getMainLooper()) fun checkPlaybackPosition(delayMs: Long): Boolean = handler.postDelayed( { val currentPosition = player.currentPosition // Update UI based on currentPosition checkPlaybackPosition(delayMs) }, delayMs)
Java
Handler handler = new Handler(Looper.getMainLooper()); boolean checkPlaybackPosition(long delayMs) { return handler.postDelayed(() -> { long currentPosition = player.getCurrentPosition(); // Update UI based on currentPosition checkPlaybackPosition(delayMs); }, delayMs); }
Sterowanie odtwarzaniem
Interfejs Player oferuje wiele sposobów manipulowania stanem i sterowania odtwarzaniem:
- Podstawowe elementy sterujące odtwarzaniem, takie jak
play(),pause(),prepare()istop(). - Operacje na playlistach, takie jak
addMediaItem()lubremoveMediaItem(). - Przewijanie, aby zmienić bieżący element lub pozycję.
- Ustaw tryby powtarzania i tryb losowy.
- Zaktualizuj ustawienia wyboru ścieżki.
- Ustaw szybkość odtwarzania.
Implementacje niestandardowe Player
Aby utworzyć odtwarzacz niestandardowy, możesz rozszerzyć klasę
SimpleBasePlayer
zawartą w Media3. Ta klasa zapewnia podstawową implementację interfejsu Player
, aby zminimalizować liczbę metod, które musisz zaimplementować.
Zacznij od zastąpienia metody getState(). Ta metoda powinna wypełniać stan bieżącego gracza po wywołaniu, w tym:
- Zestaw dostępnych poleceń
- Właściwości odtwarzania, np. czy odtwarzacz ma rozpocząć odtwarzanie, gdy stan odtwarzania to
STATE_READY, indeks aktualnie odtwarzanego elementu multimedialnego i pozycja odtwarzania w bieżącym elemencie.
Kotlin
class CustomPlayer : SimpleBasePlayer(looper) { override fun getState(): State { return State.Builder() .setAvailableCommands(...) // Set which playback commands the player can handle // Configure additional playback properties .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST) .setCurrentMediaItemIndex(0) .setContentPositionMs(0) .build() } }
Java
public class CustomPlayer extends SimpleBasePlayer { public CustomPlayer(Looper looper) { super(looper); } @Override protected State getState() { return new State.Builder() .setAvailableCommands(...) // Set which playback commands the player can handle // Configure additional playback properties .setPlayWhenReady(true, PLAY_WHEN_READY_CHANGE_REASON_USER_REQUEST) .setCurrentMediaItemIndex(0) .setContentPositionMs(0) .build(); } }
SimpleBasePlayer wymusi utworzenie elementu State z prawidłową kombinacją wartości stanu. Zajmuje się też odbiorcami i informowaniem ich o zmianach stanu. Jeśli musisz ręcznie wywołać aktualizację stanu, wywołaj funkcję invalidateState().
Oprócz metody getState() musisz wdrożyć tylko te metody, które są używane w przypadku poleceń, które odtwarzacz deklaruje jako dostępne. Znajdź metodę obsługi, którą można zastąpić, odpowiadającą funkcji, którą chcesz zaimplementować. Na przykład możesz zastąpić metodę handleSeek(), aby obsługiwać operacje takie jak COMMAND_SEEK_IN_CURRENT_MEDIA_ITEM i COMMAND_SEEK_TO_NEXT_MEDIA_ITEM.
Modyfikowanie implementacji Player
Zamiast tworzyć całkowicie niestandardowy Player, możesz użyć ForwardingSimpleBasePlayer, aby zmodyfikować stan i zachowanie istniejącego Player. Więcej informacji znajdziesz w przewodniku na stronie dostosowywania.