Wersja Media3 1.9.0 jest już dostępna. Oprócz zwykłych poprawek błędów i ulepszeń wydajności najnowsza wersja zawiera też 4 nowe lub w dużej mierze przepisane moduły:
media3-inspector– wyodrębnianie metadanych i klatek poza odtwarzaniemmedia3-ui-compose-material3– tworzenie podstawowego interfejsu multimediów w Compose w Material 3 w kilku krokachmedia3-cast– automatyczne przełączanie między przesyłaniem a odtwarzaniem lokalnym;media3-decoder-av1– spójne odtwarzanie AV1 dzięki przepisaniu dekodera rozszerzenia na podstawie biblioteki dav1d.
Wprowadziliśmy też ulepszenia w zakresie buforowania i zarządzania pamięcią w PreloadManager oraz kilka nowych uproszczeń w ExoPlayer, Transformer i MediaSession.
Ta wersja daje też pierwszy eksperymentalny dostęp do CompositionPlayer, dzięki czemu możesz wyświetlać podgląd zmian w mediach.
Aby dowiedzieć się więcej, przeczytaj ten artykuł. Jak zawsze, pełne omówienie zmian w tej wersji znajdziesz w informacjach o wersji.
Wyodrębnianie metadanych i klatek poza odtwarzaniem
W wielu przypadkach możesz chcieć sprawdzić multimedia bez rozpoczynania odtwarzania. Możesz na przykład wykryć, jakie formaty zawiera, jaki jest jego czas trwania lub pobrać miniatury.
Nowy moduł media3-inspector łączy wszystkie narzędzia do sprawdzania multimediów bez odtwarzania w jednym miejscu:
MetadataRetriever, aby odczytywać czas trwania, format i statyczne metadane zMediaItem.FrameExtractor, aby pobrać klatki lub miniatury z produktu.MediaExtractorCompatjako bezpośredni zamiennik klasy MediaExtractor platformy Android, aby uzyskać szczegółowe informacje o próbkach w pliku.
Wartości MetadataRetriever i FrameExtractor są zgodne z prostym wzorcem AutoCloseable. Więcej informacji znajdziesz na naszych nowych stronach z przewodnikami.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}Tworzenie podstawowego interfejsu multimediów Material3 Compose w kilku krokach
W poprzednich wersjach zaczęliśmy udostępniać kod łączący elementy interfejsu Compose z instancją odtwarzacza. W Media3 1.9.0 dodaliśmy nowy moduł media3-ui-compose-material3 z w pełni ostylowanymi przyciskami Material3 i elementami treści. Pozwalają one zbudować interfejs multimedialny w kilku krokach, a jednocześnie zapewniają pełną elastyczność w dostosowywaniu stylu. Jeśli wolisz stworzyć własny styl interfejsu, możesz użyć elementów składowych, które obsługują całą logikę aktualizacji i połączeń. Dzięki temu możesz skupić się tylko na projektowaniu elementu interfejsu. Zapoznaj się z naszymi rozbudowanymi stronami przewodnika dotyczącymi modułów interfejsu Compose.
Pracujemy też nad kolejnymi komponentami Compose, takimi jak gotowy pasek przewijania, kompletny zamiennik elementu PlayerView, a także integracja napisów i reklam.
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}
Prosty interfejs odtwarzacza Compose z gotowymi elementami
Automatyczne przełączanie się między Cast a lokalnym odtwarzaniem
Klasa CastPlayer w module media3-cast została przepisana, aby automatycznie obsługiwać przejścia między odtwarzaniem lokalnym (np. za pomocą ExoPlayer) a odtwarzaniem zdalnym za pomocą Cast.
Podczas konfigurowania MediaSession wystarczy utworzyć CastPlayer wokół ExoPlayer i dodać MediaRouteButton do interfejsu. Gotowe!
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}
Nowa integracja CastPlayer w aplikacji w wersji demonstracyjnej sesji Media3
Spójne odtwarzanie AV1 dzięki przepisanej wtyczce opartej na dav1d
Wersja 1.9.0 zawiera całkowicie przepisany moduł rozszerzenia AV1 oparty na popularnej bibliotece dav1d.
Podobnie jak w przypadku wszystkich modułów dekodera rozszerzeń, pamiętaj, że wymaga to kompilacji ze źródeł , aby prawidłowo połączyć odpowiedni kod natywny. Dołączenie dekodera zapewnia spójność i obsługę formatów na wszystkich urządzeniach, ale ponieważ dekodowanie odbywa się w Twoim procesie, najlepiej nadaje się do treści, którym możesz zaufać.
Zintegruj buforowanie i zarządzanie pamięcią z klasą PreloadManager
Ulepszyliśmy też nasze PreloadManager. Umożliwiało już wstępne wczytywanie multimediów do pamięci poza odtwarzaniem, a następnie płynne przekazywanie ich do odtwarzacza w razie potrzeby. Chociaż jest dość wydajny, trzeba było uważać, aby nie przekroczyć limitów pamięci przez przypadkowe wstępne wczytanie zbyt dużej ilości danych. Dlatego w Media3 w wersji 1.9.0 dodaliśmy 2 funkcje, które znacznie ułatwiają i stabilizują ten proces:
- Obsługa pamięci podręcznej – podczas określania, jak daleko ma sięgać wstępne wczytywanie, możesz teraz wybrać
PreloadStatus.specifiedRangeCached(0, 5000)jako stan docelowy wstępnie wczytanych elementów. Spowoduje to dodanie określonego zakresu do pamięci podręcznej na dysku zamiast wczytywania danych do pamięci. Dzięki temu możesz udostępnić do wstępnego wczytywania znacznie większy zakres produktów, ponieważ te, które są dalej od bieżącego produktu, nie muszą już zajmować pamięci. Pamiętaj, że wymaga to ustawieniaCachewDefaultPreloadManager.Builder. - Automatyczne zarządzanie pamięcią – zaktualizowaliśmy też interfejs
LoadControl, aby lepiej obsługiwał wstępne wczytywanie. Możesz teraz ustawić wyraźny górny limit pamięci dla wszystkich wstępnie wczytanych elementów. Domyślnie wynosi on 144 MB, a limit możesz skonfigurować wDefaultLoadControl.Builder.DefaultPreloadManagerautomatycznie przestanie wstępnie wczytywać strony po osiągnięciu limitu i w razie potrzeby automatycznie zwolni pamięć zajmowaną przez elementy o niższym priorytecie.
Korzystaj z nowych, uproszczonych domyślnych zachowań w ExoPlayerze
Jak zawsze wprowadziliśmy też wiele drobnych ulepszeń w ExoPlayerze. Oto kilka przykładów:
- Wyciszanie i wyłączanie wyciszenia – mieliśmy już metodę
setVolume, ale teraz dodaliśmy wygodne metodymuteiunmute, aby łatwo przywrócić poprzedni poziom głośności bez konieczności samodzielnego śledzenia go. - Wykrywanie zablokowanego odtwarzacza – w rzadkich przypadkach odtwarzacz może się zablokować w stanie buforowania lub odtwarzania bez postępów, np. z powodu problemów z kodekiem lub nieprawidłowej konfiguracji. Użytkownicy będą zirytowani, ale w statystykach nie zobaczysz tych problemów. Aby to ułatwić, odtwarzacz zgłasza teraz błąd
StuckPlayerException, gdy wykryje stan zawieszenia. - Domyślna blokada uśpienia – zarządzanie blokadą uśpienia było wcześniej opcjonalne, co powodowało trudne do znalezienia przypadki brzegowe, w których postęp odtwarzania mógł być znacznie opóźniony podczas działania w tle. Teraz ta funkcja jest opcjonalna, więc nie musisz się nią przejmować. Możesz też usunąć całą ręczną obsługę blokady uśpienia związaną z odtwarzaniem.
- Uproszczone ustawienie logiki przycisku napisów – zmiana
TrackSelectionParametersna „włącz/wyłącz napisy” okazała się zaskakująco trudna, dlatego dodaliśmy prostą opcję logicznąselectTextByDefaultdla tego przypadku użycia.
Uproszczenie ustawień przycisków multimedialnych w MediaSession
Do tej pory określanie preferencji dotyczących przycisków, które mają się wyświetlać w panelu powiadomień o multimediach w Androidzie Auto lub WearOS, wymagało definiowania niestandardowych poleceń i przycisków, nawet jeśli wystarczyło wywołać standardową metodę odtwarzacza.
W Media3 w wersji 1.9.0 wprowadziliśmy nową funkcję, która znacznie upraszcza to zadanie. Możesz teraz określać preferencje dotyczące przycisków multimediów za pomocą standardowego polecenia odtwarzacza, co nie wymaga żadnej niestandardowej obsługi poleceń.
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
Ustawienia przycisków multimedialnych z przyciskiem przewijania do przodu
CompositionPlayer do podglądu w czasie rzeczywistym
Wersja 1.9.0 wprowadza CompositionPlayer z nową adnotacją @ExperimentalApi. Adnotacja wskazuje, że jest ona dostępna do eksperymentowania, ale nadal jest w trakcie opracowywania.
CompositionPlayer to nowy komponent w interfejsach Media3 do edycji, który umożliwia podgląd zmian w mediach w czasie rzeczywistym. Oparta na znanym interfejsie Media3 PlayerCompositionPlayer umożliwia użytkownikom sprawdzenie wprowadzonych zmian przed rozpoczęciem procesu eksportowania. Używa tego samego obiektu Composition, który przekazujesz do funkcji Transformer na potrzeby eksportowania, co upraszcza przepływ pracy związany z edycją, ponieważ ujednolica model danych na potrzeby podglądu i eksportowania.
Zachęcamy do rozpoczęcia korzystania z CompositionPlayer i przesyłania opinii. Więcej szczegółów znajdziesz w przyszłych postach i aktualizacjach dokumentacji.
InAppMuxer jako domyślny multiplekser w Transformerze
Transformer używa teraz InAppMp4Muxer jako domyślnego multipleksera do zapisywania plików kontenerów multimedialnych. Wewnętrznie InAppMp4Muxer zależy od modułu Muxer Media3, co zapewnia spójne działanie we wszystkich wersjach interfejsu API.
Pamiętaj, że chociaż Transformer nie używa już domyślnie MediaMuxer na platformie Android, możesz nadal udostępniać FrameworkMuxer.Factory za pomocą setMuxerFactory, jeśli wymaga tego Twój przypadek użycia.
Nowe interfejsy API do dostosowywania prędkości
Wersja 1.9.0 upraszcza interfejsy API do dostosowywania szybkości w przypadku edycji multimediów. Wprowadziliśmy nowe metody bezpośrednio na stronie EditedMediaItem.Builder, aby umożliwić kontrolę prędkości, dzięki czemu interfejs API jest bardziej intuicyjny. Możesz teraz zmienić szybkość klipu, wywołując setSpeed(SpeedProvider provider) na EditedMediaItem.Builder:
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()To nowe podejście zastępuje poprzednią metodę korzystania z Effects#createExperimentalSpeedChangingEffects(), którą wycofaliśmy i usuniemy w przyszłej wersji.
Przedstawiamy typy ścieżek dla EditedMediaItemSequence
W wersji 1.9.0 EditedMediaItemSequence wymaga określenia typów ścieżek wyjściowych podczas tworzenia sekwencji. Ta zmiana sprawia, że obsługa ścieżek jest bardziej przejrzysta i solidna w całej kompozycji.
Służy do tego nowy konstruktor EditedMediaItemSequence.Builder, który akceptuje zestaw typów ścieżek (np. C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
Aby uprościć tworzenie, dodaliśmy nowe statyczne metody ułatwiające:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
Zachęcamy do przejścia na nowy konstruktor lub metody pomocnicze, aby uzyskać bardziej przejrzyste i niezawodne definicje sekwencji.
Przykład tworzenia sekwencji zawierającej tylko reklamy wideo:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()Jeśli napotkasz błędy lub masz pytania albo prośby o dodanie funkcji, skontaktuj się z nami za pomocą narzędzia do śledzenia problemów z Media3. Czekamy na wiadomość od Ciebie!
-
Wiadomości o usługachZ przyjemnością ogłaszamy stabilną wersję bibliotek AndroidX Security State 1.1.0 i Security State Provider 1.0.0.
Maunik Shah, Alec Garcia, Joseph Yong • Czas czytania: 4 minuty -
Wiadomości o usługachDziś udostępniamy pierwszy zestaw zadań długoterminowych (LHT), czyli bardzo złożonych zadań, których wykonanie zajmuje inżynierowi kilka dni, a nawet tydzień. Wprowadzamy też ocenę agentów, zaczynając od agentów od odpowiednich dostawców modeli.
Matthew McCullough • Czas czytania: 3 minuty -
Wiadomości o usługachDebugowanie bezprzewodowe na Androidzie jest teraz szybsze, bardziej niezawodne i łatwiejsze w konfiguracji niż kiedykolwiek. W przypadku ADB Wi-Fi 2.0 wprowadziliśmy nowy stos serwerów i inteligentniejsze zarządzanie siecią, aby bezpośrednio uwzględnić opinie deweloperów dotyczące luk w zakresie użyteczności.
Steven Jenkins, Sherif Eid, Fabien Sanglard • Czas czytania: 1 minuta
Otrzymuj co tydzień najnowsze informacje o tworzeniu aplikacji na Androida na swoją skrzynkę odbiorczą.