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, takie jak pozycja 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 metod odtwarzania i playlist 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_READY
iSTATE_ENDED
.
- Odzyskaj za pomocą
- Playlista elementów multimedialnych
- Sekwencja
MediaItem
instancji do odtwarzania. - Odzyskaj za pomocą
getCurrentTimeline()
- Instancje
Player
mogą 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 wstrzymane.- Przyczyna wstrzymania odtwarzania:
wskazanie przyczyny wstrzymania odtwarzania, jeśli ma to zastosowanie, nawet jeśli wartość parametru
playWhenReady
totrue
. isPlaying
: informacja o tym, czy odtwarzacz aktualnie odtwarza film. Wartośćtrue
jest ustawiana tylko wtedy, gdy stan odtwarzania toSTATE_READY
,playWhenReady
totrue
, a odtwarzanie nie jest wstrzymane.
- Pozycja odtwarzania, w tym:
- Indeks bieżącego elementu multimedialnego:
Indeks bieżącego elementu
MediaItem
na playliście. isPlayingAd
: Wskazuje, czy wstawiona reklama jest odtwarzana.- Bieżąca pozycja odtwarzania:
Bieżąca pozycja odtwarzania w obrębie bieżącego
MediaItem
lub 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 nasłuchiwać zmian w Player
. Więcej informacji o tym, jak utworzyć i używać 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 odtwarzacza 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.