Poradniki

Media3 1.11 – nowości

Czas czytania: 3 minuty
Wyświetl profil Toni Heidenreich
Toni Heidenreich Inżynier oprogramowania, Android

Udostępniliśmy Media3 1.11. Ta wersja, która obsługuje zdecydowaną większość najlepszych aplikacji multimedialnych na Androida, wprowadza nowe funkcje, poprawki błędów i ulepszenia w zakresie odtwarzania, edycji i komponentów interfejsu. Rozszerzamy nasze moduły interfejsu Jetpack Compose o konfigurowalne Player miejsca i łatwe w użyciu ustawienia domyślne, interaktywne gesty, obserwatory stanu i wstępne wczytywanie krótkich filmów za pomocą PlayerPool. Zmodernizowaliśmy też integrację Media3 Cast, dodając obsługę przełącznika wyjścia SystemUI, wprowadziliśmy nowe rozszerzenie sieciowe klienta HTTP Ktor i dodaliśmy nowe narzędzia do multipleksowania plików Ogg i WAV.

Przeczytaj najważniejsze informacje i zapoznaj się z pełną listą zmian w informacjach o wersji.

Interfejs odtwarzania i Compose

Android staje się platformą, na której Compose jest najważniejszy, dlatego nadal rozwijamy moduły media3-ui-compose i media3-ui-compose-material3. Ta aktualizacja wprowadza bardziej szczegółową kontrolę nad układem odtwarzacza, bogatsze wzorce interakcji i głębszą integrację z Material3.

Konfigurowalny układ odtwarzacza

Element Composable Material 3 Player obsługuje teraz dedykowane miejsca na treści dla topControls, centerControls, bottomControls i errorOverlay. Możesz wstawić własne elementy Composable lub użyć gotowych ustawień domyślnych opublikowanych w PlayerDefaults:

Player(
  player = player,
  topControls = { PlayerDefaults.TopControls(player) },
  centerControls = { PlayerDefaults.CenterControls(player) },
  bottomControls = { PlayerDefaults.BottomControls(player) },
)

Element Composable Player integruje też obsługę FocusRequester, co umożliwia płynną nawigację za pomocą pada kierunkowego i klawiatury na Androidzie TV, urządzeniach składanych i komputerach. 

player_video.png
Przykład elementu Composable Player ze spersonalizowanymi elementami sterującymi

Gesty i sterowanie szybkością odtwarzania

PlaybackSpeedState udostępnia teraz interfejs API do szybkiego przewijania do przodu i odtwarzania w zwolnionym tempie. demo-compose app pokazuje to za pomocą gestu długiego naciśnięcia, który umożliwia szybkie przewijanie do przodu, oraz wyszukiwania za pomocą dwukrotnego kliknięcia. W połączeniu z elementem ProgressSlider wprowadzonym w wersji 1.10 interfejs odtwarzacza Compose oferuje teraz bogate interakcje dotykowe i gesty.

Wstępne wczytywanie krótkich filmów za pomocą PlayerPool

W przypadku aplikacji z przesuwającymi się oknami treści multimedialnych (np. krótkich filmów w pionie) częstym problemem jest efektywne zarządzanie wieloma instancjami ExoPlayer. Media3 1.11 wprowadza PlayerPool (w common-ktx) i rememberPooledPlayer (w ui-compose), aby automatycznie obsługiwać ponowne użycie odtwarzacza i wstępne wczytywanie.

Nowy element ShortFormPlayerScreen w demo-compose pokazuje to w działaniu – jest to przewijana w pionie lista, na której odtwarzacze są grupowane, wstępnie wczytywane i płynnie ponownie używane podczas przewijania przez użytkownika.

MiniController

Nowy element Composable MiniController w media3-ui-compose-material3 zapewnia kompaktowy pasek odtwarzania, który wyświetla tytuł, wykonawcę, okładkę i postęp bieżącego elementu oraz elementy sterujące odtwarzaniem i wstrzymywaniem. Podobnie jak wszystkie nasze domyślne elementy Composable w media3-ui-compose-material3, element MiniController obsługuje integrację z dynamicznymi kolorami Material3, dzięki czemu może automatycznie dostosowywać się do motywu tapety użytkownika.Jest to idealne rozwiązanie w przypadku trwałych arkuszy dolnych lub miniodtwarzaczy, na przykład gdy użytkownik przegląda treści lub podczas aktywnych sesji Cast.

mini_player.png
MiniController Media3 wyświetlający okładkę albumu, metadane multimediów i podstawowe elementy sterujące

Rozszerzone kontenery stanu metadanych i błędów

Do media3-ui-compose dodaliśmy kilka nowych reaktywnych kontenerów stanu:

  • rememberCurrentMediaItemState – obserwowanie metadanych dotyczących aktualnie odtwarzanego elementu
  • rememberPlaylistState – obserwowanie pełnej listy odtwarzania i aktywnych indeksów
  • rememberErrorState – śledzenie błędów odtwarzania, z pasującym elementem Composable ErrorText i domyślnym elementem ErrorOverlay w Material3

W kolejnych wersjach będziemy dodawać nowe funkcje i opcje dostosowywania. Podziel się swoją opinią w problem trackerze projektu.

Zmodernizowana integracja Cast

Media3 1.11 aktualizuje rozszerzenie Cast o opcje konfiguracji programowej i obsługę routingu na poziomie systemu operacyjnego.

CastParams i przełącznik wyjścia SystemUI

Możesz teraz skonfigurować rozszerzenie Cast za pomocą CastParams:

val castParams = CastParams.Builder()
  .setShowSystemOutputSwitcherOnCastButtonClick(true)
  .build()


Cast.getSingletonInstance(context).initialize(castParams)

Ustawienie setShowSystemOutputSwitcherOnCastIconClick(true) konfiguruje MediaRouteButton tak, aby otwierał natywny przełącznik wyjścia SystemUI na obsługiwanych wersjach platformy, zapewniając ujednolicone środowisko wyboru wyjścia.

Reaktywny stan MediaRouteButton w Compose

Aplikacje korzystające z Jetpack Compose mogą teraz łatwo dodać przycisk routingu multimediów (znany też jako przycisk Cast), który automatycznie obserwuje stan okna i odpowiednio go aktualizuje. W połączeniu z CastPlayer Media3 nie jest potrzebna żadna dodatkowa logika.

@Composable
fun TopAppBarWithCast() {
  Row {
    Text(text = "App Title")
    MediaRouteButton()
  }
}
cast_button_2.png
Przycisk routingu multimediów Media3 w aplikacji uruchamiającej domyślne okno przełącznika wyjścia

Ulepszenia podstawowego odtwarzania i sesji

Eclipsa Video – dynamiczne metadane HDR HAGC (API 37+)

Eclipsa Video zapewnia bardziej spójne wrażenia HDR na różnych urządzeniach dzięki spójnej podstawowej bieli HDR, adaptacyjnemu zakresowi dynamicznemu w zależności od ekranu i otoczenia, co pozwala zachować intencje twórcze na wszystkich urządzeniach.

ExoPlayer obsługuje teraz odtwarzanie niezbędnych metadanych czasowych HAGC (ST 2094-50) w przypadku multimediów progresywnych (MP4, Matroska). Odtwarzacz automatycznie łączy ścieżki metadanych HAGC z powiązaną ścieżką wideo i dostarcza metadane poza pasmem do dekodera na urządzeniach z API 37+. Na starszych urządzeniach ExoPlayer płynnie przełącza się na standardowe odtwarzanie HDR bez korekt.  

eclipsa.png
Ilustracja przedstawiająca korzyści z HDR Eclipsa Video, takie jak bardziej spójny kontrast kolorów

Nowe rozszerzenie klienta HTTP Ktor

Nowy moduł rozszerzenia media3-datasource-ktor udostępnia KtorDataSource oparty na stosie HTTP Ktor. Jest to alternatywa dla istniejących modułów źródła danych Cronet i OkHttp, która jest przyjazna dla współprogramów i oparta na Kotlinie.

Asynchroniczne połączenia MediaSession

MediaSession.Callback zawiera teraz onConnectAsync(), który umożliwia asynchroniczne przetwarzanie prób połączenia kontrolera – na przykład w celu sprawdzenia autoryzacji przed zaakceptowaniem połączenia. Możesz zwrócić natychmiastowy FutureFutures.immediateFuture(ConnectionResult), aby uzyskać takie samo działanie jak w przypadku istniejącego onConnect

override fun onConnectAsync(
  session: MediaSession,
  controller: MediaSession.ControllerInfo
): ListenableFuture<MediaSession.ConnectionResult> {
  return authenticateControllerAsync(controller)
}

Bezpieczniejsze ustawienia domyślne MediaSession

W przypadku aplikacji, które nie zastępują onConnect ani onConnectAsyncMediaSession.Callback, biblioteka domyślnie używa teraz bezpieczniejszej konfiguracji. Dane sesji nie są domyślnie udostępniane niezaufanym kontrolerom, co oznacza, że aplikacje innych firm lub aplikacje spoza systemu, które nie mają dostępu do powiadomień, nie mogą uzyskiwać dostępu do danych sesji, chyba że wyraźnie zaimplementujesz te metody wywołania zwrotnego, aby autoryzować połączenie.

Nowe implementacje Muxera i analizowanie kontenerów

OggMuxer i WavMuxer

Dodaliśmy 2 nowe dedykowane multipleksery: OggMuxer do multipleksowania strumieni OPUS i VORBIS do standardowych plików .ogg oraz WavMuxer do generowania nieskompresowanych plików audio PCM .wav z reprezentacją zmiennoprzecinkową.

Analizowanie kontenerów i odniesienia do ścieżek

  • Odniesienia do ścieżek MP4 (tref): Mp4Muxer.addTrackReference umożliwia łączenie zależnych metadanych lub ścieżek pomocniczych z głównymi strumieniami wideo.
  • Wyodrębnianie rozdziałów: rozdziały QuickTime i Nero z plików MP4 (.m4a, .m4b) oraz rozdziały Matroska są teraz wyodrębniane jako wpisy metadanych Chapter do nawigacji po audiobookach i podcastach.

Jeśli masz pytania, prośby o dodanie funkcji lub chcesz zgłosić błąd, użyj problem trackera. Czekamy na wiadomość od Ciebie!

Czytaj dalej