Media3
| Najnowsza aktualizacja | Wersja stabilna | Wersja kandydująca do publikacji | Wersja beta | Wersja alfa |
|---|---|---|---|---|
| 10 marca 2026 r. | 1.10.0-rc01 | - | - | 1.10.0-alpha01 |
Deklarowanie zależności
Aby dodać zależność od Media3, musisz dodać do projektu repozytorium Maven Google. Więcej informacji znajdziesz w artykule Repozytorium Maven Google.
Dodaj zależności dotyczące potrzebnych artefaktów w pliku build.gradle aplikacji lub modułu:
Odlotowe
dependencies { def media3_version = "1.9.2" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs using Jetpack Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs using Jetpack Compose with Material Design 3 implementation "androidx.media3:media3-ui-compose-material3:$media3_version" // For building media playback UIs using Views implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For inspecting media files implementation "androidx.media3:media3-inspector:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.9.2" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs using Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs using Views implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs using Jetpack Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
Więcej informacji o zależnościach znajdziesz w artykule Dodawanie zależności kompilacji.
Opinia
Twoja opinia pomoże nam ulepszyć Jetpacka. Aby znaleźć odpowiedzi na pytania, poznać znane problemy i prośby o dodanie funkcji oraz zgłosić nowe problemy, możesz skorzystać z narzędzia do śledzenia problemów w Media3.
Wersja 1.10.0
1.10.0-rc01
10 marca 2026 r.
Wersja 1.10.0-rc01 zawiera te zmiany.
- Sesja:
- Poprawiono skalowanie ikony grafiki powiadomienia na Androidzie Q (#3084).
- UI:
- Ukryj pozycję odtwarzania przed usługą ułatwień dostępu, aby zapobiec ciągłemu aktualizowaniu komunikatów, gdy widoczny jest element
PlayerControlView.
- Ukryj pozycję odtwarzania przed usługą ułatwień dostępu, aby zapobiec ciągłemu aktualizowaniu komunikatów, gdy widoczny jest element
1.10.0-beta01
25 lutego 2026 r.
Wersja 1.10.0-beta01 zawiera te zatwierdzenia.
- Biblioteka wspólna:
- Dodaj
Format.primaryTrackGroupId, aby zidentyfikować główną grupę osadzonychFormatinstancji (#294).
- Dodaj
- ExoPlayer:
- Rozwiązaliśmy problem polegający na tym, że ExoPlayer nie żądał opóźnionej aktywności audio, gdy odtwarzanie było wymagane podczas połączeń telefonicznych.
- Naprawiono błąd, w którym przejścia z treści na żądanie do treści na żywo mogły powodować ponowne buforowanie na końcu treści na żądanie (#3052).
- Dodano obsługę profilu Dolby Vision 10 (#2830).
- Wybór ścieżki:
- Zmień sygnaturę funkcji
DefaultTrackSelector.selectAllTracks, aby zawierała tablicę wyjściową jako parametr wstępnie wypełniony zastąpieniami ścieżek. - Rozwiązanie problemu polegającego na tym, że osadzone ścieżki metadanych są wybierane niezależnie od tego, czy odpowiednia ścieżka podstawowa jest wybrana (#294).
- Stabilizuj opcje
TrackSelectionParametersdlapreferredVideoLanguages,preferredVideoLabels,preferredAudioLabels,preferredTextLabelsiselectTextByDefault.
- Zmień sygnaturę funkcji
- Ekstraktory:
- MP4: obsługa plików z dużymi polami
uuidprzed innymi polami, np.moov(#3046). - MP4: dodaliśmy obsługę ścieżek Versatile Video Coding (VVC) w kontenerach MP4.
- MP4: obsługa plików z dużymi polami
- Dźwięk:
- Ulepszono logikę ponawiania inicjowania
AudioOutputwDefaultAudioSink(#2905). - Próba dopasowania układu wyjściowego głośników (lub przestrzennego, jeśli ma to zastosowanie) podczas dekodowania IAMF, zarówno z rozszerzeniem IAMF, jak i dekoderami kodeków multimedialnych, obsługiwanych przez nowe pola i logikę w klasach AudioCapabilities i AudioCapabilitiesReceiver.
- Ulepszono logikę ponawiania inicjowania
- Metadane:
- Zwiększ domyślną liczbę modułów renderujących metadane do czterech, aby uwzględnić wszystkie potencjalne ścieżki metadanych opublikowane przez warianty i wersje HLS (#3043).
- Sesja:
- Rozwiązaliśmy problem polegający na tym, że obejście dotyczące umiejscowienia przycisku interfejsu systemu negatywnie wpływało na inne elementy interfejsu, takie jak Android Auto, lub na producentów, którzy nie potrzebowali tego obejścia (#3041).
- Rozwiązaliśmy problem, który powodował, że dostęp do subskrypcji nie był synchronizowany (#3056).
- UI:
- Dodaj element
PlayerComposable do elementumedia3-ui-compose-material3, który łączy elementContentFramez dostosowywanymi elementami sterującymi ułożonymi u góry, na środku i u dołu.
- Dodaj element
- Rozszerzenie HLS:
- Udostępnianie ścieżki metadanych ID3 (EMSG) w wersjach audio (#3043).
- Zezwól na powrót do lokalizacji w przypadku wystąpienia błędów ładowania, jeśli dostępne są nadmiarowe strumienie z różnych lokalizacji (#1988).
- Poprawiono działanie X-SNAP w przypadku reklam pełnoekranowych HLS, aby prawidłowo obliczać pozycję rozpoczęcia i wznowienia (#3013).
- Rozszerzenie DASH:
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Dodanie obsługi menedżera interfejsu MPEG-H do rozszerzenia dekodera MPEG-H (#3066).
- Usuń symbole, które nie są już używane:
- Usuń
androidx.media3.extractor.metadata.flac.VorbisComment. Zamiast niej używaj zasadyandroidx.media3.extractor.metadata.vorbis.VorbisComment. - Usuń
MediaSource.prepareSource(MediaSourceCaller, TransferListener). Zamiast niej używaj zasadyMediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId).
- Usuń
1.10.0-alpha01
6 lutego 2026 r.
Wersja 1.10.0-alpha01 zawiera te zatwierdzenia.
- Biblioteka wspólna:
- Promuj wersje
Player.mute()iPlayer.unmute()zUnstableApido stabilnej. - Promuj wersje
Format.pcmEncodingiC.PcmEncodingzUnstableApido stabilnej.
- Promuj wersje
- ExoPlayer:
- Dodaj funkcję wycinania do
AdsMediaSource. - Dodaliśmy obsługę dynamicznego planowania w
MediaCodecVideoRenderer, aby lepiej dopasowywać planowanie pracy i cykle wybudzania procesora do momentów, w których można przetwarzać klatki wideo. Możesz włączyć tę funkcję za pomocąexperimentalSetEnableMediaCodecVideoRendererDurationToProgressUs()wDefaultRenderersFactory. - Zezwalaj na ustawianie niestandardowego
DataSource.FactorywDefaultPreloadManager.Builder. - Zezwól na wyśmiewanie
ExoPlayerbez Robolectric, przenosząc niektóre stałe domyślne doExoPlayer.Builder. Mockowanie tego złożonego interfejsu nie jest zwykle zalecane – tylko wtedy, gdy jego użycie jest minimalne, proste lub przypadkowe (#2985).- Wymagało to przeniesienia
DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MSzExoPlayerdoExoPlayer.Builder(bez wycofywania).
- Wymagało to przeniesienia
- Naprawiliśmy błąd, który powodował, że
ProgressiveMediaSourceprzekazywał do odtwarzacza nieaktualne informacje o osi czasu, a okresy w kolejce były nieoczekiwanie usuwane (#3016).
- Dodaj funkcję wycinania do
- CompositionPlayer:
- Dodaliśmy obsługę
EditedMediaItem.removeVideo.
- Dodaliśmy obsługę
- Transformer:
EditedMediaItem.Builder.setFrameRate()może teraz ustawić maksymalną liczbę klatek wyjściowych dla filmu, co jest szczególnie przydatne podczas zwiększania szybkości multimediów za pomocą parametrusetSpeed().
- Inspektor:
- Zmiana powodująca niezgodność: usuń
FrameExtractor. Użytkownicy powinni teraz korzystać z nowego modułu:media3-inspector-framei zaktualizować importy doandroidx.media3.inspector.frame.FrameExtractor. - Wprowadź nowy moduł do wyodrębniania i przetwarzania zdekodowanych klatek wideo.
- Zmiana powodująca niezgodność: usuń
- Dźwięk:
- Zmieniono podstawową bibliotekę dekodowania rozszerzenia dekodera IAMF z
libiamfnaiamf_tools. - Dekodowanie IAMF obsługuje wyjście binauralne za pomocą dekodera (w przypadku korzystania z rozszerzenia dekodera IAMF) lub za pomocą przestrzennego dźwięku Androida.
- Prawidłowe usuwanie obsługi
AC4Profile22i innych starszych profili podczas oceny obsługi dekodera AC-4 w scenariuszach motoryzacyjnych (#2609). - Ulepszono logikę ponawiania inicjowania
AudioOutputwDefaultAudioSink(#2905).
- Zmieniono podstawową bibliotekę dekodowania rozszerzenia dekodera IAMF z
- Tekst:
- VobSub: używaj poleceń sterujących SPU
STARTiSTOP, aby określać czas trwania wskazówki, zamiast zawsze ustawiać domyślnie 5 sekund (#2935).
- VobSub: używaj poleceń sterujących SPU
- Skutek:
- Przenieś
LottieOverlaydo nowego modułu:media3-effect-lottie(co wiązało się też ze zmianą nazwy zandroidx.media3.effect.LottieOverlaynaandroidx.media3.effect.lottie.LottieOverlay).
- Przenieś
- Efekt Lottie:
- Wprowadzamy nowy moduł
:media3-effect-lottie, który umożliwia stosowanie efektów Lottie do klatek wideo.
- Wprowadzamy nowy moduł
- Rozszerzenie IMA:
- Zaktualizuj pakiet IMA SDK do wersji 3.39.0, aby mieć dostęp do najnowszego interfejsu Ad media info API.
- Naprawiliśmy błąd polegający na tym, że typ MIME reklamy nie pasował do typu MIME podanego w zdarzeniu IMA LOADED. Poprawka mapuje teraz typ MIME reklamy za pomocą informacji o mediach reklamy podanych przez pakiet IMA.
- Dodaj
setEnableCustomTabsdoImaAdsLoaderiImaServerSideAdInsertionMediaSource, aby umożliwić użytkownikom kontrolowanie, czy adresy URL kliknięć reklam są otwierane za pomocą kart niestandardowych. - Dodaj
ImaAdTagUriBuilder, czyli klasę, która oferuje alternatywny sposób tworzeniaadTagUri. Zawiera interfejs APIsetPreferredLinearOrientation. Jest to interfejs API w fazie testów alfa, który umożliwia ustawienie preferowanej orientacji reklam wideo. Jeśli chcesz dołączyć do grupy testów alfa, skontaktuj się z partnerem ds. kont.
- Sesja:
- Naprawiliśmy błąd, który powodował, że duże tablice w
MediaMetadata.artworkDatamogły powodować awarię aplikacji. - Użyj typu int dla argumentu
@Player.Commandw interfejsieActionFactory(#2933). - Uczyń
MediaSessionServiceiMediaLibraryServiceLifecycleService, co umożliwi dołączanie operacji uwzględniających cykl życia do cyklu życia usługi (#187). - Przestaniemy obsługiwać polecenia zmiany głośności urządzenia z
MediaControlleriMediaBrowserw przypadku odtwarzania lokalnego. Aplikacje nie powinny zmieniać głośności urządzenia lokalnego. W razie potrzeby mogą w tym celu używać interfejsów APIAudioManager. - wykrywać nieaktywne instancje
Intent, które uruchomiły usługę jako usługę na pierwszym planie; Zapobiega to zgłaszaniu przez system wyjątkuForegroundServiceDidNotStartInTimeException. Jest to zmiana powodująca niezgodność wsteczną w niestabilnym interfejsie API w przypadku aplikacji implementujących niestandardowyMediaNotification.Provider, ponieważ wymagana jest nowa metoda. - Dodano konstruktory instancji
PendingIntentdo użycia z widżetami ekranu głównego (#2933). - Dodano metody statyczne do tworzenia instancji
Intentw przypadku widżetów ekranu głównego opartych na Compose (#2933). - Naprawiono błąd, który powodował, że przejście elementu multimedialnego nie było zgłaszane do kontrolerów, gdy odtwarzanie przechodziło z danego indeksu elementu multimedialnego do innego z tym samym elementem multimedialnym z powodu przerwy „AUTO” i „SEEK” (#2997).
- Naprawiliśmy błąd, który powodował, że duże tablice w
- UI:
- Dodaj element
PlaybackSpeedControlComposable domedia3-ui-compose, aby wyświetlać i modyfikować szybkość odtwarzania. - Dodaj element
PlaybackSpeedToggleButtonComposable domedia3-ui-compose-material3, aby sterować szybkością odtwarzania. - Dodano element
ProgressSliderComposable domedia3-ui-compose-material3, aby wyświetlać postępy graczy i wykonywać przewijanie za pomocą przeciągania i kliknięć (#2288). - Unikaj dużego bufora poza ekranem podczas animowania elementu PlayerControlView.
- Dodaj element
- Rozszerzenie HLS:
- Rozszerzenie Cast:
- Dodano metodę
RemoteCastPlayer.Builder#setTrackSelector, która umożliwia implementację wyboru ścieżki w przypadku odtwarzania za pomocą Cast.
- Dodano metodę
- Usuń symbole, które nie są już używane:
- Usuń
ExperimentalFrameExtractor. Zamiast niej używaj zasadyandroidx.media3.inspector.frame.FrameExtractor. - Usuń
ChannelMixingMatrix.create(). Zamiast niej używaj zasadyChannelMixingMatrix.createForConstantGain().
- Usuń
Wersja 1.9.0
1.9.2
6 lutego 2026 r.
Wersja 1.9.2 zawiera te zatwierdzenia.
- ExoPlayer:
- Naprawiono błąd, który powodował, że
ProgressiveMediaSourceprzekazywał do odtwarzacza nieaktualne informacje o osi czasu, a okresy w kolejce były nieoczekiwanie usuwane (#3016).
- Naprawiono błąd, który powodował, że
- Sesja:
- Rozwiązaliśmy problem polegający na tym, że obejście dotyczące umiejscowienia przycisku interfejsu systemu negatywnie wpływało na inne elementy interfejsu, takie jak Android Auto, lub na producentów, którzy nie potrzebowali tego obejścia (#3041).
- Rozszerzenie Cast:
- Usunięto błąd, który powodował, że przenoszenie odtwarzania z Cast na odtwarzanie lokalne nie działało.
1.9.1
26 stycznia 2026 r.
Wersja 1.9.1 zawiera te zatwierdzenia.
- Biblioteka wspólna:
- Obsługa ciągów znaków daty i godziny z samymi godzinami w przesunięciu strefy czasowej (#2929).
- ExoPlayer:
- Zezwalaj na dynamiczne planowanie, aby spowolnić interwał
doSomeWorkdopiero po rozpoczęciu odtwarzania dźwięku, aby zapewnić płynniejszą synchronizację audio-wideo na początku odtwarzania. - Naprawiono błąd w
DefaultLoadErrorHandlingPolicy, w którymFileNotFoundExceptioni podobne typy wyjątków były ponawiane wielokrotnie. - Naprawiono błąd dynamicznego harmonogramowania, w którym obliczony czas następnego
doSomeWorkbył błędnie skracany o czas trwania bieżącej iteracjidoSomeWork. Mamy nadzieję, że dzięki temu wydłuży się czas bezczynności procesora i zmniejszy zużycie energii. - Rozwiązaliśmy problem, który powodował, że niektóre odtwarzania plików Dolby Vision kończyły się niepowodzeniem podczas próby użycia kodeka zastępczego AVC lub HEVC.
- Naprawiono błąd, w wyniku którego po zakończeniu odtwarzania wciąż trwało wczytywanie, gdy usuwano aktualnie odtwarzany element z playlisty (#2873).
- Unikaj wycieków
MediaIteminstancji podczas wielokrotnego używaniaExoPlayer.replaceMediaItemna tym samym elemencie (#2993). - Zapobieganie potencjalnym błędom ANR spowodowanym przez zwalnianie blokad uśpienia w sytuacjach awaryjnych (#2979).
- Zezwalaj na dynamiczne planowanie, aby spowolnić interwał
- Ekstraktory:
- MP3: Parse LAME ReplayGain data (#2840).
- Dźwięk:
- Prawidłowe usuwanie obsługi
AC4Profile22i innych starszych profili podczas oceny obsługi dekodera AC-4 w scenariuszach motoryzacyjnych (#2609).
- Prawidłowe usuwanie obsługi
- Film:
- Odrzucanie kodeków wideo na urządzeniach z interfejsem API w wersji starszej niż 30, gdy zmienia się liczba klatek na sekundę, aby uniknąć zacinania się odtwarzania (#2941).
- Tekst:
- VobSub: naprawiono brakujące napisy przez prawidłowe obsługiwanie jednostek SPU, które zawierają tylko jedną sekwencję sterującą lub mają krytyczne informacje podzielone na kilka sekwencji sterujących (#2935).
- Rozszerzenie IMA:
- Poprawka: rozwiązaliśmy problem polegający na tym, że typ MIME reklamy nie pasował do typu MIME podanego w zdarzeniu IMA LOADED. Poprawka mapuje teraz typ MIME reklamy za pomocą indeksu bloku reklamowego i pozycji reklamy.
- Przed uzyskaniem dostępu do wyniku
getAdsManager()iAdEvent.getAd()dodaj sprawdzanie wartości null.
- Sesja:
- Naprawiliśmy błąd, który powodował awarię aplikacji, gdy zatrzymywano sesję
MediaControllerpołączoną z platformą, jeśli zatrzymanie następowało podczas odtwarzania reklamy (#2948). - Dodaj dodatkowe weryfikacje instancji
extrasBundlew różnych klasach, aby chronić się przed nieprawidłowo sformułowanymi instancjamiBundlewysyłanymi z innych procesów. - Rozwiązanie problemu polegającego na tym, że brakujące polecenia dla
COMMAND_SEEK_NEXTlubCOMMAND_SEEK_BACKmogą powodować luki w powiadomieniu systemowym o multimediach (#2976). - Przeniesienie skalowania mapy bitowej dla ikony powiadomienia z głównego wątku (#2829).
- Rozwiązanie problemu polegającego na tym, że autor, pisarz i kompozytor nie byli używani jako rezerwa podczas konwersji ze starszych formatów
MediaMetadataCompatiMediaDescriptionCompat(#3018).
- Naprawiliśmy błąd, który powodował awarię aplikacji, gdy zatrzymywano sesję
- Pobrane:
- Naprawianie potencjalnych nieskończonych pętli, gdy
PriorityTooLowExceptionjest obsługiwany przezSegmentDownloader(w przypadku DASH, HLS i SmoothStreaming). Niestandardowe zastąpieniaSegmentDownloaderza pomocą chronionej metodyexecutemuszą zawierać zadanie wSupplier, aby można było je odtworzyć (#2931).
- Naprawianie potencjalnych nieskończonych pętli, gdy
- Rozszerzenie HLS:
- Przekaż dokument JSON z listą nieprzetworzonych plików do wywołania zwrotnego
Listener.onAssetListLoadCompleted. Jest to zmiana powodująca niezgodność wsteczną w niestabilnym interfejsie API, która wymaga, aby aplikacje implementujące to wywołanie zwrotne dodały dodatkowy argument typuJSONObject(#2950).
- Przekaż dokument JSON z listą nieprzetworzonych plików do wywołania zwrotnego
- Rozszerzenie RTSP:
- Prawidłowa obsługa pakietów RTP z sygnaturami czasowymi, które się zawijają (#2930).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Naprawiono potencjalne
NullPointerException, które mogły wystąpić podczas przewijania przed przetworzeniem pierwszej klatki filmu (#2965).
- Naprawiono potencjalne
- Rozszerzenie Cast:
- Naprawiliśmy błąd, który uniemożliwiał prawidłowe aktualizowanie osi czasu
RemoteCastPlayerpodczas zastępowania playlisty.
- Naprawiliśmy błąd, który uniemożliwiał prawidłowe aktualizowanie osi czasu
1.9.0
17 grudnia 2025 r.
- Biblioteka wspólna:
- Zaktualizuj
minSdkdo23zgodnie z innymi bibliotekami AndroidX. - Dodaj
PlayerTransferState, który ułatwia przenoszenie stanu odtwarzania między instancjamiPlayer. - Dodaj do klasy Player metody
void mute()ivoid unmute(), które zachowują, a następnie przywracają głośność odtwarzacza przed i po ustawieniu jej na zero. - Opublikowano klasy narzędziowe
WakeLockManager,WifiLockManager,AudioFocusManager,AudioBecomingNoisyManageriStuckPlayerDetector, które były wcześniej używane wewnętrznie przezExoPlayer, aby umożliwić ponowne wykorzystanie przez innych graczy (#1893). - Poprawiono obsługę
ForwardingPlayerdetektorów, gdy podstawowy odtwarzacz delegowany używa porównania referencyjnego do porównywania instancji detektorów (#2675). - Dodaj w bibliotece
media3-common-ktxfunkcję zawieszania rozszerzeniaPlayer.listenTo, która określa konkretnyPlayer.Events, na którym ma zostać wykonana akcja. - Naprawiono awarię w
BasePlayer.getBufferedPercentagespowodowaną przepełnieniem liczby całkowitej, gdy zgłoszona pozycja buforowana jest nieprawdopodobnie większa niż zgłoszony czas trwania (#2750). - Naprawiono automatyczne wykrywanie
TrackGrouptypu ścieżki przez nieignorowanie niestandardowego typu MIME próbki i powracanie do używania potencjalnie nieprawidłowego typu ścieżki z typu MIME kontenera (#2860).
- Zaktualizuj
- ExoPlayer:
- Dodaj wykrywanie zablokowanego odtwarzacza, które w przypadku zablokowania odtwarzacza wywołuje
StuckPlayerExceptionbłąd odtwarzacza. Dzieje się tak w tych przypadkach, przy czym każdy domyślny limit czasu można w razie potrzeby skonfigurować wExoPlayer.Builder:- Po 10 minutach
STATE_BUFFERINGpodczas próby odtwarzania i bez postępu buforowania. - Po 10 sekundach
STATE_READYpodczas próby odtwarzania i braku postępu odtwarzania. - Po minucie
STATE_READYod zadeklarowanego czasu trwania bez osiągnięcia końca elementu. - Po 10 minutach z powodem wstrzymania odtwarzania podczas próby odtworzenia.
- Po 10 minutach
- Domyślnie włącz obsługę blokady uśpienia, aby rozwiązać problemy z buforowaniem podczas odtwarzania w tle. Jest to odpowiednik ustawienia wartości
ExoPlayer.Builder.setWakeModenaC.WAKE_MODE_LOCAL. - Dodaj logikę nasłuchiwania, aby automatycznie aktualizować identyfikator urządzenia wirtualnego, gdy zmiana zostanie zgłoszona do
Contextpierwotnie przekazanego doExoPlayer.Builder. - Dodaj
ExoPlayer.setVirtualDeviceId, aby ręcznie zaktualizować identyfikator urządzenia wirtualnego uzyskany zContextprzekazanego doExoPlayer.Builder. - Upewnij się, że mechanizmy renderowania nie pobierają danych z następnego elementu na liście odtwarzania więcej niż 10 sekund przed końcem bieżącego elementu.
- Dodaj
setSeekBackIncrementMs,setSeekForwardIncrementMsisetMaxSeekToPreviousPositionMsdoExoPlayer, aby zaktualizować te ustawienia po utworzeniu (#2736). - Dodano funkcję wstępnego buforowania w
DefaultPreloadManager. Aplikacje mogą teraz zwracać wartośćDefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)lubDefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)za pomocąTargetPreloadStatusControl.getTargetPreloadStatus(T rankingData), aby wskazać, że element multimedialny musi zostać wstępnie zapisany w pamięci podręcznej. - Użyj funkcji wstępnego buforowania
DefaultPreloadManagerw aplikacji w wersji demonstracyjnej krótkich filmów. - Dodaj ustawienia
DefaultLoadControl.Builderdla odtwarzania lokalnego i dostosuj wartości domyślneDefaultLoadControl, aby dobrze współpracowały z szeroką gamą plików lokalnych. - Naprawiono błąd, w którym ustawienie pustej playlisty może pozostawić odtwarzacz w stanie
STATE_READYlubSTATE_BUFFERING. - Ulepsz interfejsy API menedżera wstępnego wczytywania:
- Dodaj
addMediaItems(List<MediaItem>, List<T>)iaddMediaSources(List<MediaSource>, List<T>), które dodają elementy multimedialne lub źródła multimediów w partiach, a następnie automatycznie wywołująinvalidate(). - Dodaj funkcje
removeMediaItems((List<MediaItem>)iremoveMediaSources(List<MediaSource>), które usuwają elementy multimedialne lub źródła multimediów w partiach, i upewnij się, że menedżer wstępnego wczytywania nie rozpoczyna ani nie kontynuuje wstępnego wczytywania żadnego z nich po usunięciu. - Zezwól na automatyczne unieważnianie
DefaultPreloadManager.setCurrentPlayingIndex(int). Po zaktualizowaniu bieżącego indeksu odtwarzania aplikacje nie muszą już jawnie wywoływaćinvalidate().
- Dodaj
- Dodanie możliwości pomijania resetowania klatki kluczowej w przypadku przewijania do przodu w ramach tej samej grupy zdjęć w trybie przewijania.
- Dodaj
DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)w przypadku aplikacji, aby ustawić wartość docelowych bajtów bufora dla odtwarzacza z określonymplayerName.DefaultLoadControlmoże teraz podejmować decyzje dotyczące każdego gracza osobno na podstawie przydzielonych mu bajtów i docelowych bajtów bufora. - Dodaj
SkipInfodoAdPlaybackState.AdGroup, aby przekazywać informacje o możliwości pominięcia reklamy w przypadku każdej reklamy w grupie reklam. - Rozwiązaliśmy problem, który powodował awarię podczas wywoływania funkcji
removeMediaItems(List)w trakcie odtwarzania reklamy po filmie (#2746). - Naprawiono problem z przeskokami podczas odtwarzania playlisty, gdy ramki były błędnie ustawiane jako ostatnia próbka i renderowane.
- Włączanie ścieżki ponawiania, jeśli odtwarzacz nie może wygenerować identyfikatora sesji audio (#2382, #2678).
- Dodano obsługę sterowania łączną liczbą bajtów bufora dla źródeł w
DefaultPreloadManager, aby uniknąć dowolnego zwiększania łącznej liczby bajtów bufora na potrzeby wstępnego wczytywania. Aby użyć domyślnej logiki sterowania, aplikacje mogą ustawić docelową liczbę bajtów bufora do wstępnego wczytywania za pomocąDefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)dlaplayerNameo wartościPlayerId.Preload.name(„preload”) i wstrzyknąć utworzonyDefaultLoadControlza pomocąDefaultPreloadManager.Builder.setLoadControl(LoadControl). - Dodano
cloneAndSet(int, int)doShuffleOrderz domyślną implementacją (#2834). - Dołączanie przesunięcia wznowienia treści podczas pomijania odtwarzania reklamy po dostosowaniu wyszukiwania lub automatycznym przejściu (#2484).
- Dodanie interfejsu API do ustawiania i obserwowania parametrów kodeka dla ścieżek audio i wideo.
Ta funkcja jest zaimplementowana w przypadku modułów renderujących opartych na
MediaCodeci wymaga interfejsu API w wersji 29 lub nowszej.- Aby zastosować parametry, użyj właściwości
ExoPlayer.setAudioCodecParameters()iExoPlayer.setVideoCodecParameters(). - Użyj właściwości
ExoPlayer.addAudioCodecParametersChangeListener()iExoPlayer.addVideoCodecParametersChangeListener(), aby nasłuchiwać zmian. Obserwowanie kluczy konkretnych dostawców wymaga interfejsu API w wersji 31 lub nowszej.
- Aby zastosować parametry, użyj właściwości
- Naprawiono błąd
IllegalStateExceptionspowodowany ustawieniem pustego źródła multimediów po przesunięciu do pozycji innej niż zero, a następnie przygotowaniem odtwarzacza z niepustym źródłem multimediów. - Naprawiliśmy błąd, który powodował, że podczas przewijania w trybie przewijania przechodzenie do innych elementów multimedialnych mogło powodować
IllegalStateException. - Rozwiązano potencjalny problem
NullPointerExceptionwDefaultPlaybackSessionManager(#2885). - Włącz ulepszenia w zakresie skuteczności przewijania w przypadku kwalifikujących się filmów.
- Ponowne włączenie używania asynchronicznego odszyfrowywania w MediaCodec na API 36 lub nowszym, gdzie rozwiązano problemy z limitem czasu w tym interfejsie API platformy (#1641).
- Zmień domyślną wartość parametru
MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUsna 15 ms i włącz bardziej efektywne pomijanie klatek wideo przed dekodowaniem w przypadku kwalifikujących się filmów. - Dodaj maksymalny limit pamięci do automatycznego obliczania pamięci w
DefaultLoadControl. Powinno to mieć miejsce tylko wtedy, gdy zostanie wybrana zbyt duża liczba ścieżek (#2860). - Naprawiono błąd, który powodował, że podczas odtwarzania w trybie playlisty lub powtarzania przewijanie w trybie przesuwania w pobliżu końca mogło spowodować przejście do następnego elementu multimedialnego.
- Dodaj wykrywanie zablokowanego odtwarzacza, które w przypadku zablokowania odtwarzacza wywołuje
- CompositionPlayer:
- Opublikuj
CompositionPlayerpod nową adnotacją@ExperimentalApi, aby wskazać, że jest ona dostępna do eksperymentowania, ale nadal jest w trakcie opracowywania. Niektóre interfejsy API prawdopodobnie ulegną znacznym zmianom w przyszłych wersjach. W przypadku niektórych zastosowań występują znane problemy i ograniczenia (niektóre nie są udokumentowane). - Dodaliśmy obsługę właściwości
COMMAND_SET_AUDIO_ATTRIBUTESi zarządzania aktywnością audio wCompositionPlayer. - Dodaliśmy obsługę zmiany prędkości w sekwencjach dodatkowych w
CompositionPlayer. - Dodaliśmy obsługę
EditedMediaItem.removeVideo.
- Opublikuj
- Transformer:
- Używaj
InAppMp4Muxerjako domyślnego multipleksera. - Dodano
EditedMediaItem.Builder#setSpeed()i wycofanoEffects#createExperimentalSpeedChangingEffects(). - Zastąp
forceAudioTrackiforceVideoTrackznakiemtrackTypeswEditedMediaItemSequence.
- Używaj
- Wybór ścieżki:
- Dodaj
TrackSelectionParameters.selectTextByDefault, aby preferować wybór dowolnej ścieżki tekstowej bez określania innych, bardziej szczegółowych preferencji. - Dodaj
preferredVideoLabels,preferredAudioLabelsipreferredTextLabelswTrackSelectionParameters, aby określić preferencje dotyczące ścieżek z konkretną etykietą, np. odczytanych z tagów HLS NAME (#1666).
- Dodaj
- Ekstraktory:
- FLAC: poprawiliśmy wykrywanie nagłówków, aby zmniejszyć prawdopodobieństwo znalezienia fałszywych nagłówków w zakodowanych danych FLAC, co powodowało błędy dekodowania (#558).
- MP3: zezwalaj na przerwy między tagami ID3 (i przed nimi) na początku plików MP3 (#811, #5718).
- MP3: zwiększ limit sprawdzania do 128 KB, aby był zgodny z dotychczasowym limitem wyszukiwania bajtu synchronizacji (#2713).
- MP3: zmiana
FLAG_ENABLE_INDEX_SEEKINGna preferowanie wyszukiwania informacji z nagłówków metadanych (takich jak Xing i VBRI), gdy są dostępne, z powrotem do wyszukiwania na podstawie indeksu, jeśli nie ma innych informacji o wyszukiwaniu. Poprawia to wydajność w przypadku plików z metadanymi wyszukiwania (#2839). - MP3: zmiana
Mp3Extractorna domyślne założenie stałej szybkości transmisji (CBR), gdy nie znaleziono metadanych wyszukiwania (np. Xing, VBRI), nawet jeśli ustawionoFLAG_ENABLE_INDEX_SEEKING. Wynika to z historii specyfikacji MP3, w której CBR był standardem, a VBR wymagał jawnych nagłówków. Zwiększa to możliwość natychmiastowego wyszukiwania plików bez metadanych kosztem potencjalnej dokładności w przypadku plików VBR bez nagłówków. Wyszukiwanie indeksu jest teraz używane jako opcja awaryjna, jeśli założenie CBR nie jest możliwe do wyszukania (np. w przypadku strumieni o nieznanej długości) (#2848). - MP4: rozróżniaj typy MIME
audio/mpeg(MP3),audio/mpeg-L1iaudio/mpeg-L2, sprawdzając wartość warstwy pierwszej próbki przed wyemitowaniem formatu ścieżki z ekstraktora (#2683). - MP4: zwiększono skuteczność wykrywania bardzo dużych plików przez założenie, że pole
stblwiększe niż 1 MB oznacza, że plik nie może być podzielony na fragmenty (#2650). - MP4: dodano obsługę metadanych
©mvn(nazwa części) i©mvi(indeks części), które są teraz emitowane jako obiektyTextInformationFramewFormat.metadataz identyfikatoramiMVNMiMVINodpowiednio (#2754). - MP4: ignoruj ścieżki, w których brakuje pola
stsd(zamiast nie analizować całego pliku). - Matroska: dodano obsługę wykrywania DTS-HD (#6225).
- Rozwiązaliśmy problem w
MatroskaExtractor, który powodował, że w przypadku plików z wieloma ścieżkami przewijanie mogło być niedokładne. Punkty sygnałowe są teraz prawidłowo powiązane z odpowiednimi ścieżkami, co zapewnia precyzyjne przewijanie. - MPEG-TS: naprawiono
IllegalArgumentExceptionzReorderingBufferQueuespowodowane przez pakiety PES bez sygnatury czasowej (#2764). - Dodano obsługę wyodrębniania zdjęć Live Photo w formacie HEIC.
HeifExtractormoże teraz analizować pliki HEIC zawierające osadzone ścieżki wideo i audio.
- Inspektor:
- Wprowadziliśmy nowy moduł
:media3-inspector, który będzie służyć jako dedykowane miejsce dla narzędzi do sprawdzania multimediów. Ten moduł zawiera teraz nowy interfejsandroidx.media3.inspector.MetadataRetriever, który będzie udostępniać ujednolicony interfejs API do wyodrębniania metadanych i klatek. Dotychczasowa wersjaandroidx.media3.exoplayer.MetadataRetrieverzostała wycofana na rzecz tej nowej wersji. - Wprowadzono
androidx.media3.inspector.FrameExtractor, nowy publiczny interfejs API do wyodrębniania klatek. Ta klasaAutoCloseableumożliwia wyodrębnianie klatek z obsługą filmów HDR, efektów wideo i wyboru niestandardowego dekodera. Należy ją utworzyć za pomocąBuilderdla konkretnegoMediaItem. - FrameExtractor: dodano
getThumbnail(), aby wyodrębniać reprezentatywną klatkę miniatury z pliku multimedialnego bez konieczności podawania konkretnego znacznika czasu. - Dodaj
androidx.media3.inspector.MediaExtractorCompat, czyli zamiennikandroid.media.MediaExtractorna platformie, który umożliwia wyodrębnianie z pliku multimedialnego nieprzetworzonych, zakodowanych próbek multimediów. Istniejąca klasaandroidx.media3.exoplayer.MediaExtractorCompatzostała wycofana na rzecz tej nowej klasy.
- Wprowadziliśmy nowy moduł
- Dźwięk:
- Spraw, aby instancje
AudioProcessorwiedziały o przewijaniu. - Zezwalaj na wstawianie nowego interfejsu
AudioOutputProviderdoDefaultAudioSink.Builder, aby obsługiwać niestandardowe ścieżki wyjścia audio. Wartość domyślna toAudioTrackAudioOutputProvider. - Obsługuje przewijanie w
GainProcessor. - Sprawdź, czy format ścieżki obsługuje profil i poziom dekodera AC-4 (#2580).
- Unikaj potencjalnych opóźnień spowodowanych obsługą wywołań zwrotnych zmiany routingu na początku odtwarzania (#2646).
- Zezwalaj na ponowne użycie kodeka w przypadku formatów EAC3, EAC3-JOC i AC-4 (#1346).
- Dodaliśmy obsługę próbek PCM zmiennoprzecinkowych w
Sonic. - Dodano obsługę 16-bitowych próbek PCM w
ToFloatPcmAudioProcessor.
- Spraw, aby instancje
- Film:
- Wyłącz ponowne użycie kodeka w przypadku treści Dolby Vision z różnymi profilami.
- Ponowne włączenie obejścia problemu z nieprawidłowo raportowanymi punktami wydajności w przypadku bezpiecznych kodeków (#2856).
- Tekst:
- Poprawiono analizowanie napisów CEA-6/708 w treściach Dolby Vision (#2775).
- Obraz:
- Rozwiązanie problemu z trybem przewijania, w którym odtwarzacz zawieszał się podczas przewijania ścieżki miniatur DASH (#2815).
- DRM:
- Zmieniono typ zwracany metod
MediaDrmCallbackzbyte[]na nowy typMediaDrmCallback.Response, aby umożliwić zwracanie dodatkowych informacji opcjonalnych. Jest to zmiana powodująca niezgodność na poziomie źródła, ale niezgodności można łatwo rozwiązać, opakowując poprzednią wartość zwracanąbyte[]za pomocąnew Responseprzed zwróceniem. - Dodaj do
AnalyticsListener.onDrmKeysLoaded(#1001) informacje o żądaniu klucza, takie jak adres URL i opóźnienie. - Przenieś dane żądania obsługi administracyjnej z parametru adresu URL do treści żądania POST.
- Zmieniono typ zwracany metod
- Skutek:
- Dodaj
Presentation.copyWithUnsetSideRoundedTo, aby zaokrąglić nieustawioną stronę wyjściową, gdyPresentationjest tworzony z jedną długością boku.
- Dodaj
- Muxers:
- Dodaj
MediaMuxerCompat, zamiennik frameworkaMediaMuxer. - Dodaj
MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo(), aby zezwolić na tworzenie zdjęć w ruchu. - Dodaj
WebmMuxer, aby umożliwić multipleksowanie strumieni multimediówOPUS,VORBIS,VP8iVP9do formatu plikuwebm.
- Dodaj
- Rozszerzenie IMA:
- Usunięcie niestandardowych reguł ProGuard, aby aplikacje mogły zamiast nich używać reguł opublikowanych w archiwum IMA na Androida.
- Dodano
ImaServerSideAdInsertionUriBuilder.setNetworkCode, nowy interfejs API do ustawiania kodu sieci Google Ad Managera, aby pakiet IMA SDK obsługiwał identyfikatory reklam zgodnie z ustawieniami Google Ad Managera. Kody sieci są opcjonalne, ale zalecane w przypadku żądań strumienia pełnej usługi. Aby znaleźć kod sieci, zapoznaj się z tym artykułem. - Zwiększono zależność IMA do wersji 3.37.0, co wymaga włączenia desugaryzacji biblioteki podstawowej. Musi być też włączona w zależnych aplikacjach. Zapoznaj się z uwagami dotyczącymi konfiguracji IMA. * Obsługa niestandardowych opcji interfejsu IMA DAI w narzędziu do tworzenia identyfikatorów URI SSAI. Opcje niestandardowego interfejsu wstawiania reklam po stronie serwera obejmują obsługę renderowania reklam z możliwością pominięcia i funkcji „O tej reklamie”. Ta funkcja jest obecnie dostępna dla wybranych wydawców, którzy znajdują się na liście dozwolonych. Ta zmiana powoduje też uaktualnienie pakietu IMA SDK do wersji 3.38.0 (informacje o wersji), aby uzyskać dostęp do interfejsu API opcji niestandardowego interfejsu.
- Rozwiązaliśmy problem, który powodował błędne zgłaszanie błędu przygotowania treści po reklamie jako błędu odtwarzania reklamy (#2656).
- Sesja:
- Dodaj nowy parametr do
MediaSession.Callback.onPlaybackResumption, aby wskazać, czy wywołanie służy tylko do zbierania informacji, czy do rozpoczęcia odtwarzania (#1764). - Zaktualizuj
MediaSession.ControllerInfo.isTrusted, aby deklarować kontrolery z własnej aplikacji jako zaufane (#2542). - Dodano
MediaSessionService.triggerNotificationUpdate, aby ręcznie wywoływać aktualizację powiadomienia (#1833). - Dodaj
ProgressListenerdo metod poleceń niestandardowych. - Zmień domyślną wartość parametru
MediaLibrarySession.Builder.setLibraryErrorReplicationModena non fatal. - Dodaj parametr
ContextdoMediaButtonReceiver.onForegroundServiceStartNotAllowedException(#2625). - Odczytuj identyfikator kontroli głośności z platformy
PlaybackInfozamiast pobierać go za pomocą bindera. Dzięki temu typ odtwarzania i identyfikator sterowania głośnością są odczytywane niepodzielnie i pasują do siebie. - Naprawiono błąd, w którym
ACTION_UPkluczowe zdarzenia były odfiltrowywane przed przekazaniem ich do wywołania zwrotnego w celu niestandardowej obsługi. Dzięki temu zachowamy spójność z tym, co robił element media1 i co robi platforma (#2637). - Usunęliśmy błąd, który powodował, że funkcja
getCurrentTimeline()była wywoływana przez funkcjęPlayerWrappernawet wtedy, gdy polecenie nie było dostępne (#2665). - Naprawiliśmy błąd, który powodował pozostawienie wiadomości w kolejce wiadomości głównego loopera, co po zakończeniu działania usługi powodowało wyciek pamięci (#2692).
- Po połączeniu ze starszą aplikacją sesji z symbolem
MediaBrowserpolecenia niestandardowe są wysyłane do sesji tylko wtedy, gdy działanie niestandardowe jest reklamowane jako działanie niestandardowe wPlaybackStateCompatstarszej sesji. Wszystkie inne działania niestandardowe są wysyłane do usługi. - Wdrożono metodę
onAudioSessionIdChanged, aby powiadamiać kontrolery multimediów, gdy identyfikator sesji audio jest ustawiany przez sesję (#244). - Rozwiązanie problemu polegającego na tym, że
KEYCODE_HEADSETHOOKnie uruchamiało odtwarzacza po nadejściu zdarzenia klucza multimedialnegoIntentwonStartCommand(). Problem ten został rozwiązany przez obsługę kodu „KEYCODE_HEADSETHOOK” tak samo jakKEYCODE_MEDIA_PLAY_PAUSE(#2816). - Usunięto błąd, w którym rozmiar urządzenia nie był przekazywany między sesją a kontrolerem, co powodowało brak możliwości zastosowania efektów wideo w sesji demonstracyjnej. Jeśli używasz kontrolera, może to być zmiana powodująca błędy, jeśli odtwarzacz nie obsługuje wywołania
setVideoSurfaceHolder. - Naprawiono propagację wartości metadanych innych niż
StringCharSequence, takich jak ciągi w stylu span (#2853). - Dodaj
CommandButton.executeAction, aby kontrolery mogły łatwiej wywoływać zamierzone działanie. Umożliwia też określanie parametrów niektórych poleceń odtwarzacza i sesji, aby zdefiniować, które działanie ma zostać wywołane. - Dodano zgodność wsteczną w przypadku instancji
CommandButton, które używają elementuPlayer.Commandlub niestandardowego elementuSessionCommanddo określania działania. Są one teraz prawidłowo reprezentowane w sesjach multimedialnych platformy, np. w interfejsie systemu lub Androidzie Auto. - Rozwiązanie problemu polegającego na tym, że ten sam
Bitmapjest kompresowany wielokrotnie podczas łączeniaMediaControllerz sesją multimedialną platformy.
- Dodaj nowy parametr do
- UI:
- Dodaj klasę
ProgressStateWithTickIntervali odpowiedni komponentrememberProgressStateWithTickIntervaldo modułumedia3-ui-compose. Ten obiekt stanu jest używany wdemo-composedo wyświetlania bieżącej pozycji i czasu trwania w formie tekstowej. - Dodaj do
ui-composeelementMuteButtonState, który obsługuje wyciszaniePlayer. Ten obiekt stanu jest używany wdemo-composedo wyświetlania przycisku przełączania wyciszenia/wyłączenia wyciszenia. - Dodaj klasy
ProgressStateWithTickCounti odpowiadający im komponentrememberProgressStateWithTickCountdo modułumedia3-ui-compose. Ten obiekt stanu jest używany wdemo-composedo wyświetlania postępu w postaci poziomego paska postępu tylko do odczytu. - Dodaj element
ContentFrameComposable do elementumedia3-ui-compose, który łączyPlayerSurfacezarządzanie ze zmianą rozmiaru proporcji i zasłanianiem za pomocą migawki. - Obejście znanego błędu platformy API 34, który powoduje rozciąganie lub przycinanie filmów podczas używania
SurfaceVieww funkcjiAndroidViewCompose, a tym samym wpływa na funkcjeContentFrameiPlayerSurfacezSURFACE_TYPE_SURFACE_VIEW(#1237, #2811). - Utwórz nowy
media3-ui-compose-material3moduł i dodaj do niego komponenty z motywem Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton). - Dodaj funkcję
TimeTextdo funkcjimedia3-ui-compose-material3, aby wyświetlać postępy gracza w formie tekstowej. Można go skonfigurować tak, aby wyświetlał bieżącą pozycję, czas trwania lub pozostały czas. - Dodaliśmy obsługę umieszczania przycisku trasy multimediów w
PlayerView. - Użyj znaku
BidiFormatter, aby prawidłowo wyświetlać interpunkcję w napisach w językach zapisywanych od prawej do lewej (#11214).
- Dodaj klasę
- Rozszerzenie HLS:
- Analizowanie atrybutów pomijania reklam pełnoekranowych HLS.
- Mapuj atrybuty sterowania pomijaniem z listy odtwarzania HLS i listy zasobów do
AdPlaybackStatew celu uzyskania dostępu publicznego. - Rozwiązaliśmy problem polegający na tym, że czas rozpoczęcia playlisty był pomijany, gdy z playlisty usuwano tag EXT-X-PROGRAM-START-DATE określający czas rozpoczęcia (#2760).
- Używanie wyszukiwania binarnego do znajdowania indeksu segmentu w danej pozycji na liście odtwarzania (#2826).
- Dodaj
HlsInterstitialsAdsLoader.skipCurrentAd()iskipCurrentAdGroup()oraz odpowiednie metody, aby pomijać reklamy i grupy reklam według indeksu. - Dodaj
HlsInterstitialsAdsLoader.Listener.onAdStarted, aby zgłosić początek okresu wyświetlania reklamy (#2859). - Akceptuj spację jako separator daty i godziny w ciągach daty i godziny w formacie ISO 8601.
- Prawidłowe pobieranie następnego fragmentu w przypadku elementu
HlsMediaPlaylistbez segmentów (#2821). - Używaj domyślnej pozycji początkowej w przypadku reklam przed filmem w transmisjach na żywo.
- Rozszerzenie DASH:
- Naprawiono
UnsupportedOperationExceptionpodczas odtwarzania strumieni DASH z niehierarchicznym plikiem manifestu URIdata:(#2688). - Zresetuj
LiveConfigurationdo wartości podanej przezMediaItemDashMediaSourcew momencie publikacji i aktualizacji elementu multimedialnego przez użytkownika (#2606). - Zapobieganie awariom spowodowanym przez nieprawidłowe aktualizacje pliku manifestu, które nie zostały zgłoszone jako błędy odtwarzacza (#2805).
- Naprawiono
- Rozszerzenie RTSP:
- Obsługa błędu braku pakietów RTP podczas przetwarzania podzielonych jednostek NAL dla H264 i H265 (#2613).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Rozszerzenie AV1: dekoder oprogramowania AV1 korzysta teraz z biblioteki
dav1do wysokiej wydajności, która zastępuje poprzednią implementacjęlibgav1, co zwiększa szybkość dekodowania. - Rozszerzenie FFmpeg: rozwiązaliśmy problem, który uniemożliwiał odtwarzanie niektórych plików FLAC. Zapewniliśmy prawidłowe parsowanie bloku
STREAMINFOi przekazywanie go do dekodera (#2887).
- Rozszerzenie AV1: dekoder oprogramowania AV1 korzysta teraz z biblioteki
- Rozszerzenie Cast:
- Dodaj
CastPlayer.Builder, co umożliwiCastPlayerodtwarzanie lokalne i przesyłanie. Aby zachować stare zachowanieCastPlayer, które obsługuje tylko odtwarzanie na urządzeniu Cast, możesz użyćRemoteCastPlayer. Wcześniej istniejące konstruktoryCastPlayerzachowują swoje stare działanie, ale są wycofywane na rzecz konstruktorówCastPlayerlubRemoteCastPlayer. - Przestań wymuszać typ MIME inny niż null w przypadku
DefaultMediaItemConverter. - Użyj
MediaItem.mediaMetadata.mediaType, aby wywnioskować typ multimediów Cast MEDIA_TYPE do użycia wDefaultCastOptionsProvider#toMediaQueueItem, jeśli jest dostępny. - Włącz przesyłanie z urządzenia zdalnego na lokalne w
DefaultCastOptionsProvider. - Dodaj obsługę Cast w wersji demonstracyjnej sesji.
- Dodano obsługę wyświetlania przycisku trasy multimediów w interfejsie Composable.
- Dodano obsługę wyświetlania przycisku trasy multimediów w menu paska działań.
- Dodaliśmy obsługę wyświetlania przycisku trasy multimediów jako interfejsu View.
- Dodaj
- Narzędzia testowe:
- Dodaj maksymalną różnicę czasu dla automatycznego przełączania w
FakeClock. Domyślnie wynosi 1 sekundę, ale można ją skonfigurować za pomocą parametruFakeClock.Builder. - Dodaj maksymalną różnicę czasu między wiadomościami dla
RobolectricUtil.runMainLooperUntil(irunLooperUntil). Domyślnie wynosi ona 1 sekundę, ale można ją skonfigurować za pomocą nowych przeciążeń tych metod. - Przenieś
CapturingRenderersFactoryz kampaniitest-utilsdo kampaniitest-utils-robolectric.
- Dodaj maksymalną różnicę czasu dla automatycznego przełączania w
- Usuń symbole, które nie są już używane:
- Usuń wycofany konstruktor
DefaultPreloadManager. Zamiast niej używaj zasadyDefaultPreloadManager.Builder. - Usunięto wycofane konstruktory
EditedMediaItemSequence. Zamiast niej używaj zasadyEditedMediaItemSequence.Builder. - Usuń
BitmapFactoryImageDecoder.BitmapDecoder. Zamiast niej używaj zasadyExternallyLoadedImageDecoder. - Usuń wycofane
ShadowMediaCodecConfig.forAllSupportedMimeTypes(). Zamiast niej używaj zasadyShadowMediaCodecConfig.withAllDefaultSupportedCodecs(). - Usuń wycofane
ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes(). Zamiast niej używaj zasadyShadowMediaCodecConfig.withNoDefaultSupportedCodecs().
- Usuń wycofany konstruktor
1.9.0-rc01
1 grudnia 2025 r.
Używaj stabilnej wersji 1.9.0.
1.9.0-beta01
20 listopada 2025 r.
Używaj stabilnej wersji 1.9.0.
1.9.0-alpha01
22 października 2025 r.
Używaj stabilnej wersji 1.9.0.
Wersja 1.8.0
Wersja 1.8.0
30 lipca 2025 r.
Wersja 1.8.0 zawiera te zatwierdzenia.
- Biblioteka wspólna:
- Dodaliśmy obsługę zastępowania odtwarzacza w elemencie
ForwardingSimpleBasePlayer.
- Dodaliśmy obsługę zastępowania odtwarzacza w elemencie
- ExoPlayer:
- Dodanie funkcji pobierającej tryb odtwarzania losowego do interfejsu
ExoPlayer(#2522). - Wyraźniejsze zgłaszanie wyjątku, jeśli do
DefaultAudioSinkuzyskuje się dostęp z wielu wątków. Jeśli dzieje się tak z powodu wywołaniaRendererCapabilities.getFormatSupportpoza odtwarzaczem, wywołaj tę metodę w tym samym wątku co wątek odtwarzania ExoPlayera lub użyj innej instancji niż ta, która jest używana do odtwarzania (#1191). - Usunięto błąd, który powodował, że formaty dźwięku inne niż stereo na telewizorach mogły być oznaczane przez
DefaultTrackSelectorjako nieobsługiwane. - Sprawdź, czy ostatnia klatka jest prawidłowo renderowana podczas korzystania z flagi
DECODE_ONLYMediaCodec (która jest domyślnie włączona w trybie przewijania). - Dodano obsługę używania identyfikatora urządzenia wirtualnego z
Contextprzekazywanego doExoPlayer.Builder. - Domyślnie włącz dynamiczne planowanie w trybie przewijania.
- Unikaj niepotrzebnego ponownego wczytywania źródła podczas przewijania do końca elementu.
- Domyślnie używaj
MediaCodec.BUFFER_FLAG_DECODE_ONLYw trybie przewijania. - Wywołaj wyjątek
IllegalStateException, gdyPreloadMediaSourcejest odtwarzany przezExoPlayerz wątkiem odtwarzania innym niż wątek wstępnego wczytywania (#2495). - Dodano
cloneAndMovedoShuffleModez domyślnym wdrożeniem (#2226). - Zmień domyślne działanie funkcji
Renderer.getMinDurationToProgressUs, aby zwracała większą wartość, jeśli nie jest wymagane wywołanie funkcjirender. - Usunięto błąd polegający na tym, że wewnętrzne planowanie opóźniało ostatnią klatkę podczas przewijania do końca w trybie wstrzymania. Obecnie poprawka błędu działa tylko wtedy, gdy włączona jest zasada
ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled. - Dodaj metodę
ExoPlayer.setScrubbingModeEnabled(boolean). Optymalizuje to odtwarzacz pod kątem wielu częstych przewijań (np. gdy użytkownik przeciąga pasek przewijania). Działanie trybu przewijania można dostosować za pomocąsetScrubbingModeParameters(..)naExoPlayeriExoPlayer.Builder. - Zezwalaj na dostosowywanie tolerancji ułamkowego przewijania w trybie przewijania.
- Zwiększ szybkość działania kodeka w trybie przewijania.
- Naprawiono błąd, w którym błędy przygotowania w treści elementu
AdsMediaSourcemogły nigdy nie być zgłaszane (#2337). - Naprawiono wyciek pamięci w
MergingMediaSource, np. podczas wczytywania napisów z zewnętrznego źródła (#2338). - Zezwól
CmcdConfiguration.Factoryna zwracanienull, aby wyłączyć rejestrowanie CMCD w przypadku określonych elementów multimedialnych (#2386). - Zwiększ domyślny rozmiar bufora obrazu ze 128 KB (błąd kopiowania i wklejania ze ścieżek tekstowych) do 26 MB, co wystarczy na obrazy Ultra HDR o rozdzielczości 50 MP (#2417).
- Dodaj
PreCacheHelper, które umożliwia aplikacjom wstępne buforowanie pojedynczego pliku multimedialnego z określonym położeniem początkowym i czasem trwania. - Dodano obsługę wstępnego wczytywania od określonej pozycji w
DefaultPreloadManager.
- Dodanie funkcji pobierającej tryb odtwarzania losowego do interfejsu
- Transformer:
- Dodaj
CodecDbLite, które umożliwia optymalizację ustawień kodowania wideo pod kątem konkretnego chipsetu. - Dodaj flagę
setEnableCodecDbLitedoDefaultEncoderFactory, aby włączyć optymalizację ustawień CodecDB Lite. Domyślnie ta flaga jest ustawiona na false. - Wypełnienie początkowej luki (dodanej za pomocą
addGap()) cichym dźwiękiem wymaga teraz wyraźnego ustawieniaexperimentalSetForceAudioTrack(true)wEditedMediaItemSequence.Builder. Jeśli przerwa występuje w środku sekwencji, ten flag nie jest wymagany. - Przenieś interfejs
Muxerzmedia3-transformerdomedia3-muxer. - Ustawienie
MediaItem.Builder().setImageDuration(long)musi być obowiązkowe, aby zaimportować element multimedialny jako obraz. - Dodaj
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean)zawierający listę edycji MP4 podczas przycinania, aby poinstruować odtwarzacze, aby ignorowały próbki między klatką kluczową przed punktem rozpoczęcia przycinania a punktem rozpoczęcia przycinania. - Zaktualizuj aplikację w wersji demonstracyjnej Composition, aby używała języka Kotlin i biblioteki Jetpack Compose, oraz dodaj niestandardowy element
VideoCompositorSettingsdo rozmieszczania sekwencji w układzie 2x2 lub PIP.
- Dodaj
- Ekstraktory:
- Analizowanie metadanych z fragmentowanych plików MP4 (#2084).
- JPEG: obsługa zdjęć ruchomych, które nie mają segmentu Exif na początku (#2552).
- Dodaliśmy obsługę przewijania w przypadku podzielonych plików MP4 z wieloma atomami
sidx. Możesz włączyć to zachowanie za pomocą flagiFLAG_MERGE_FRAGMENTED_SIDXwFragmentedMp4Extractor(#9373). - Ignorowanie pustych tabel wyszukiwania w plikach FLAC (w tym tych, które zawierają tylko zastępcze punkty wyszukiwania) i przechodzenie do wyszukiwania binarnego, jeśli znany jest czas trwania pliku (#2327).
- Poprawiono analizowanie jednostek SEI H.265, aby w pełni pomijać nierozpoznane typy SEI (#2456).
- Zaktualizuj
WavExtractor, aby podczas analizowania pliku typuWAVE_FORMAT_EXTENSIBLEużywać danych SubFormat z rozszerzenia nagłówka w przypadku formatu audio. - MP4: dodano obsługę pól
ipcmifpcmdefiniujących ścieżki audio PCM w formacie surowym (64-bitowy PCM zmiennoprzecinkowy nie jest obsługiwany). - MP4: obsługa części obrotowej
tkhdmacierzy przekształceń, które obracają i odbijają film. Dzięki temu odbite filmy nagrane przednim aparatem iPhone’a są wyświetlane w prawidłowej orientacji, ale nieprawidłowo odbite w osi Y (#2012). - MP3: używaj czasu trwania i rozmiaru danych z nieprzeszukiwalnych metadanych Xing, VBRI i podobnych metadanych o zmiennej szybkości transmisji, gdy wracasz do wyszukiwania ze stałą szybkością transmisji z powodu
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)(#2194).
- Dźwięk:
- Rozwiązanie problemu polegającego na tym, że funkcja
AnalyticsListener.onAudioPositionAdvancingnie była wywoływana, gdy odtwarzanie dźwięku rozpoczynało się bardzo blisko końca multimediów. - Dodanie obsługi wszystkich formatów próbek linear PCM w
ChannelMappingAudioProcessoriTrimmingAudioProcessor. - Dodaliśmy obsługę przerw w dźwięku w elemencie
CompositionPlayer. - Usuń fałszywe połączenie do:
BaseAudioProcessor#flush()od:BaseAudioProcessor#reset(). - Zezwalaj na miksowanie w górę i w dół ze stałą mocą w DefaultAudioMixer.
- Udostępnij
ChannelMappingAudioProcessor,TrimmingAudioProcessoriToFloatPcmAudioProcessorjako publiczne (#2339). - Użyj
AudioTrack#getUnderrunCount()wAudioTrackPositionTracker, aby wykrywać niedobory wDefaultAudioSinkzamiast szacowania opartego na najlepszych dostępnych danych. - Poprawia wygładzanie sygnatur czasowych dźwięku w przypadku nieoczekiwanego dryfowania pozycji z urządzenia wyjściowego audio.
- Naprawiono błąd, w wyniku którego synchronizacja audio-wideo była przerywana przez pierwsze 10 sekund po wznowieniu odtwarzania po wstrzymaniu, gdy urządzenie było połączone z urządzeniami Bluetooth.
- Rozwiązanie problemu polegającego na tym, że funkcja
AnalyticsListener.onAudioPositionAdvancingnie raportowała czasu rozpoczęcia odtwarzania dźwięku, ale czas pierwszego pomiaru. - Poprawiono przywracanie dźwięku wielokanałowego po przełączeniu na dźwięk stereo na niektórych urządzeniach (#2258).
- Rozwiązanie problemu polegającego na tym, że funkcja
- Film:
- Rozszerzenie obejścia problemu z odłączonym urządzeniem Surface na urządzenia „lenovo” i „motorola” (#2059).
- Poprawiono płynne zwalnianie klatek wideo podczas uruchamiania, gdy próbki audio nie zaczynają się dokładnie w żądanej pozycji.
- Rozszerzenie obejścia problemu z odłączoną powierzchnią na urządzenia „realme” (#2059).
- Dodano eksperymentalny interfejs API
ExoPlayer, aby uwzględnić flagęMediaCodec.BUFFER_FLAG_DECODE_ONLYpodczas kolejkowania buforów wejściowych tylko do dekodowania. Ten sygnał informuje dekoder, aby pominął bufory tylko do dekodowania, co przyspiesza wyszukiwanie. Włącz ją za pomocąDefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Ulepszanie sprawdzania wydajności kodeków wideo w przypadku kodeków programowych. Może to spowodować, że niektóre ścieżki zostaną oznaczone jakoEXCEEDS_CAPABILITIES. - Rozwiązanie problemów z odtwarzaniem VP9 Widevine na niektórych urządzeniach (#2408).
- Tekst:
- Dodanie obsługi ścieżek VobSub w plikach MP4 (#2510).
- Naprawiono problem z zacinaniem się odtwarzania, gdy segment napisów początkowo nie wczytuje się, a później wczytuje się prawidłowo, po czym następuje kilka pustych segmentów napisów (#2517).
- Poprawiono SSA i SubRip, aby wyświetlać sygnał o trwającym procesie włączania napisów (#2309).
- Rozwiązano problem z zawieszaniem się odtwarzania podczas przełączania ze strumienia z błędem napisów na transmisję na żywo z pustą ścieżką napisów (#2328).
- Naprawiono zniekształcone napisy CEA-608 podczas odtwarzania strumieni H.262 zawierających klatki B (#2372).
- Dodaliśmy obsługę napisów SSA z
CodecId = S_TEXT/SSAw plikach Matroska. WcześniejMatroskaExtractorobsługiwał tylkoCodecId = S_TEXT/ASS, który reprezentuje „zaawansowaną” (v4+) odmianę napisów SubStation Alpha (ale logika parsowania ExoPlayera jest taka sama w przypadku obu odmian) (#2384). - Dodano obsługę właściwości
layerw plikach napisów SubStation Alpha (SSA), która służy do określania kolejności wyświetlania napisów, gdy na ekranie pojawia się więcej niż jeden napis jednocześnie (#2124).
- Metadane:
- Dodano obsługę pobierania czasu trwania multimediów i
TimelinedoMetadataRetrieveroraz przeniesiono ją do interfejsu API opartego na instancjachAutoCloseable. Użyj nowego znakuBuilder, aby utworzyć instancję dlaMediaItem, a następnie wywołajretrieveTrackGroups(),retrieveTimeline()iretrieveDurationUs(), aby uzyskaćListenableFuturedla metadanych. Poprzednie metody statyczne zostały wycofane (#2462).
- Dodano obsługę pobierania czasu trwania multimediów i
- Obraz:
- Ogranicz dekodowane mapy bitowe do rozmiaru wyświetlacza w
BitmapFactoryImageDecoder, aby uniknąć awarii aplikacji zCanvas: trying to draw too large bitmap.zPlayerViewpodczas próby wyświetlenia bardzo dużych obrazów (np. 50 MP). - Zmień sygnaturę funkcji
DefaultRenderersFactory.getImageDecoderFactory(), aby przyjmowała parametrContext. - Dopasuj maksymalny rozmiar wyjściowy mapy bitowej używany w
CompositionPlayerdo rozmiaru używanego już wTransformer(co oznacza, żeCompositionPlayernie uwzględnia rozmiaru wyświetlacza podczas dekodowania map bitowych, w przeciwieństwie doExoPlayer).
- Ogranicz dekodowane mapy bitowe do rozmiaru wyświetlacza w
- DRM:
- Dodaj nowe przeciążenie funkcji
OfflineLicenseHelper.newWidevineInstanceakceptująceMediaItem.DrmConfiguration, aby nagłówki żądań HTTP mogły być prawidłowo stosowane (#2169).
- Dodaj nowe przeciążenie funkcji
- Skutek:
- Dodaj
Presentation.createForShortSide(int), który tworzyPresentation, aby krótszy bok zawsze pasował do podanej wartości, niezależnie od orientacji danych wejściowych.
- Dodaj
- Muxers:
- Usunęliśmy błąd, który powodował, że w przypadku próbek audio w sfragmentowanym formacie MP4 nie były ustawiane prawidłowe flagi próbek.
writeSampleData()Interfejs API używa teraz klasyBufferInfospecyficznej dla multipleksera zamiast klasyMediaCodec.BufferInfo.- Dodaj atrybut
Muxer.Factory#supportsWritingNegativeTimestampsInEditList, który domyślnie ma wartość „false”.
- Rozszerzenie IMA:
- Naprawiliśmy błąd, który powodował, że błąd ładowania w jednej reklamie mógł przypadkowo unieważnić inną grupę reklam.
- Naprawiliśmy błąd, który powodował, że grupy reklam po zakończeniu okna VOD wstrzymywały odtwarzanie.
Grupy reklam z czasem rozpoczęcia po upływie okresu nie są już umieszczane w kolejce
MediaPeriodQueue(#2215).
- Sesja:
- Naprawiono błąd, który powodował ignorowanie połączeń z kontrolerów Media3 innych firm bez uprawnień.
- Usuń sprawdzanie dostępnych poleceń podczas wysyłania poleceń niestandardowych do starszego urządzenia
MediaBrowserServiceCompat. Jest to zgodne z działaniem starszych kontrolerów i przeglądarek połączonych ze starszą aplikacją. - Naprawiliśmy błąd, który powodował nieprawidłowe traktowanie pierwszego błędu odtwarzania jako trwałego wyjątku niestandardowego. Uniemożliwia to przywrócenie aplikacji.
- Naprawiliśmy błąd, w którym niektóre zmiany kontrolera, które nie są obsługiwane przez sesję, mogą powodować
IllegalStateExceptions. - Naprawiono błąd, w którym działania kontrolera nieobsługiwane przez sesję mogły pozostawiać kontroler w nieprawidłowym stanie.
- Naprawiono ostrzeżenie o naruszeniu bezpieczeństwa podczas uruchamiania w trybie StrictMode (#2330).
- Naprawiliśmy błąd, który powodował, że wywoływanie funkcji
setSessionExtrasz wątku głównego podczas uruchamiania odtwarzacza z innego wątku aplikacji niż wątek główny powodowało błądIllegalStateException(#2265). - Nie wyświetlaj automatycznie powiadomienia, jeśli odtwarzacz jest skonfigurowany z elementami multimedialnymi bez ich przygotowywania lub odtwarzania (#2423 https://github.com/androidx/media/issues/2423). To zachowanie można skonfigurować za pomocą
MediaSessionService.setShowNotificationForIdlePlayer. - Dodaj niestandardowe
PlaybackExceptiondla wszystkich lub wybranych kontrolerów. - Naprawiono błąd, w wyniku którego przewijanie transmisji na żywo na urządzeniu
MediaControllermogło powodowaćIllegalArgumentException. - W przypadku transmisji na żywo przestań publikować pozycję odtwarzania i możliwość przewijania bieżącego elementu w przypadku kontrolerów multimediów na platformie, aby uniknąć artefaktów pozycji w interfejsie Androida Auto (i innych kontrolerów korzystających z tych informacji z sesji multimediów na platformie) (#1758).
- Naprawiliśmy błąd, który powodował, że przekazanie wartości null do parametru
getLibraryRootw przypadku elementuMediaBrowserpołączonego ze starszym elementemMediaBrowserServiceCompatpowodowało zwrócenie wartościNullPointerException. - Naprawiono błąd, który powodował, że wysyłanie działań niestandardowych, wyników wyszukiwania lub żądania getItem powodowało awarię starszej aplikacji sesji z błędem
ClassNotFoundException. - Naprawiliśmy błąd, który powodował, że
MediaItem.LocalConfiguration.uribyło udostępniane wMediaMetadatasesji platformy. Aby celowo udostępnić identyfikator URI, aby umożliwić kontrolerom ponowne żądanie multimediów, ustaw wartośćMediaItem.RequestMetadata.mediaUri.
- UI:
- Rozwiązaliśmy błąd, który powodował, że element
PlayerSurfacew komponentach wielokrotnego użytku, takich jakLazyColumn, nie działał prawidłowo (#2493). - Naprawiono błąd w Compose, który powodował lukę między ustawieniem początkowych stanów przycisków a obserwowaniem zmiany stanu (np. kształtów ikon lub włączenia). Wszystkie zmiany wprowadzone w odtwarzaczu poza okresem obserwacji są teraz uwzględniane (#2313).
- Dodaj do modułu
media3-ui-composeelementy przechowujące stan i funkcje kompozycyjne dlaSeekBackButtonStateiSeekForwardButtonState. - Dodaj do elementu
PlayerControlViewobsługę trybu przewijania ExoPlayera. Gdy ta opcja jest włączona, odtwarzacz przechodzi w tryb przewijania, gdy użytkownik zaczyna przeciągać pasek przewijania. W przypadku każdego ruchu wysyła wywołanieplayer.seekTo, a następnie wychodzi z trybu przewijania, gdy użytkownik odsunie palec od ekranu. Tę integrację można włączyć za pomocą elementutime_bar_scrubbing_enabled = truew XML lub metodysetTimeBarScrubbingEnabled(boolean)w kodzie Java/Kotlin. - Spraw, aby funkcja
PlayerSurfaceakceptowała argument z wartością nullPlayer.
- Rozwiązaliśmy błąd, który powodował, że element
- Pobrane:
- Dodaliśmy obsługę częściowego pobierania w przypadku strumieni progresywnych. Aplikacje mogą przygotować strumień progresywny za pomocą
DownloadHelperi poprosić oDownloadRequestz pomocniczego interfejsu API, określając czasowe pozycje początkowe i końcowe multimediów, które mają być objęte pobieraniem. Zwrócony obiektDownloadRequestzawiera rozwiązany zakres bajtów, za pomocą którego można utworzyć obiektProgressiveDownloaderi pobrać odpowiednie treści. - Dodaj
DownloadHelper.Factory, którym zastąpione zostaną metody statyczneDownloadHelper.forMediaItem(). - Dodaj
Factoryw przypadku implementacjiSegmentDownloader. - Dodano obsługę częściowego pobierania w przypadku strumieni adaptacyjnych. Aplikacje mogą przygotować strumień adaptacyjny z
DownloadHelperi poprosić oDownloadRequestz pomocnika, określając czasowe pozycje początkowe i końcowe multimediów, które mają być objęte pobieraniem. Zwrócony elementDownloadRequestzawiera rozwiązany zakres czasu, na podstawie którego można utworzyć konkretny elementSegmentDownloaderi pobrać odpowiednie treści.
- Dodaliśmy obsługę częściowego pobierania w przypadku strumieni progresywnych. Aplikacje mogą przygotować strumień progresywny za pomocą
- Rozszerzenie Cronet:
- Dodanie automatycznej obsługi plików cookie (#5975).
- Rozszerzenie HLS:
- Naprawiono błąd, w którym
HlsSampleStreamWrapperpróbuje wyszukać w buforze, gdy nie ma w nim dostępnych fragmentów #2598. - Naprawiono błąd, w wyniku którego wybór ścieżki zmieniał się po załadowaniu części o niskim opóźnieniu, a wskazówki dotyczące wstępnego wczytywania mogły powodować zawieszanie się odtwarzania (#2299).
- Zapobieganie nadmiernemu ponownemu ładowaniu przez oczekiwanie przez połowę docelowego czasu trwania, gdy serwer nie uwzględnia parametru
CAN-BLOCK-RELOAD=YES(#2317). - Naprawiliśmy błąd, który powodował zatrzymanie odtwarzania podczas uruchamiania strumienia reklam pełnoekranowych przed reklamą w trakcie filmu, a rozdzielczość listy komponentów była próbowana w przypadku nieprawidłowej reklamy (#2558).
- Poprawiono analizowanie playlisty, aby akceptować znak
\f(form feed) w wartościach atrybutów w cudzysłowie (#2420). - Obsługa aktualizowania reklam pełnoekranowych o tym samym identyfikatorze (#2427).
- Naprawiono błąd, który powodował, że błędy ładowania playlisty czasami nie były propagowane, gdy transmisja na żywo wyczerpała segmenty do załadowania (#2401https://github.com/androidx/media/issues/2401).
- Grupuj wersje napisów według tagu NAME, podobnie jak wersje audio (#1666).
- Obsługa list X-ASSET-LIST i transmisji na żywo z parametrem
HlsInterstitialsAdsLoader.
- Naprawiono błąd, w którym
- Rozszerzenie DASH:
- Rozwiązanie problemu polegającego na tym, że zestaw adaptacyjny trick-play jest łączony z głównym zestawem adaptacyjnym, tworząc nieprawidłowy
TrackGroup(#2148). - Naprawiono błąd, który powodował, że skrócenie czasu trwania okresu DASH mogło wywołać wyjątek, gdy próbki wykraczające poza nowy czas trwania zostały już odczytane przez potok renderowania (#2440).
- Rozwiązaliśmy błąd, który powodował, że przekierowanie nie było wykonywane podczas używania parametrów zapytania CMCD (#2475).
- Rozwiązanie problemu polegającego na tym, że zestaw adaptacyjny trick-play jest łączony z głównym zestawem adaptacyjnym, tworząc nieprawidłowy
- Rozszerzenie RTSP:
- Dodano obsługę pakietu agregacji RTP dla H265 zgodnie z RFC 7798#4.4.2 (#2413).
- Poprawka
RtspClient, aby podczas przetwarzania odpowiedzi HTTP 302 używać identyfikatora URI lokalizacji podanego w odpowiedzi (#2398). - Dodano obsługę analizowania opisów sesji zawierających wiersze z białymi znakami na końcu (#2357).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Naprawiono błąd, w wyniku którego
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChangenie działało w przypadku rozszerzeń dekodera audio (#2258).
- Naprawiono błąd, w wyniku którego
- Rozszerzenie Cast:
- Narzędzia testowe:
- Dodaj
advance(player).untilPositionAtLeastiuntilMediaItemIndexdoTestPlayerRunHelper, aby przesunąć gracza do określonej pozycji. W większości przypadków te metody są bardziej niezawodne niż dotychczasowe metodyuntilPositioniuntilStartOfMediaItem. - Przenieś
FakeDownloaderdo modułutest-utils-robolectric, aby można było go ponownie użyć w innych testach. - Usunięto:
transformer.TestUtil.addAudioDecoders(String...),transformer.TestUtil.addAudioEncoders(String...)itransformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...). Zamiast tego skonfiguruj enkodery i dekodery cieni za pomocąShadowMediaCodecConfig. - W nazwach kodeków zgłaszanych przez
ShadowMediaCodecConfigzastąpiliśmy prefiks „exotest” prefiksem „media3”.
- Dodaj
- Usuń symbole, które nie są już używane:
- Usunięto konstruktor
SegmentDownloaderSegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor), który został wycofany, oraz odpowiednie konstruktory w jego podklasachDashDownloader,HlsDownloaderiSsDownloader. - Usunięto wycofane
Player.hasNext(),Player.hasNextWindow(). Zamiast niej używaj zasadyPlayer.hasNextMediaItem(). - Usunięto wycofaną funkcję
Player.next(). Zamiast niej użyj zasadyPlayer.seekToNextMediaItem(). - Usunięto wycofaną funkcję
Player.seekToPreviousWindow(). Zamiast niej używaj zasadyPlayer.seekToPreviousMediaItem(). - Usunięto wycofaną funkcję
Player.seekToNextWindow(). Zamiast niej używaj zasadyPlayer.seekToNextMediaItem(). - Usunięto wycofany moduł
BaseAudioProcessorw moduleexoplayer. Użyj opcjiBaseAudioProcessorw modulecommon. - Usuń wycofany konstruktor
MediaCodecVideoRendererMediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider).
- Usunięto konstruktor
Wersja 1.8.0-rc02
24 lipca 2025 r.
Używaj stabilnej wersji 1.8.0.
Wersja 1.8.0-rc01
16 lipca 2025 r.
Używaj stabilnej wersji 1.8.0.
Wersja 1.8.0-beta01
2 lipca 2025 r.
Używaj stabilnej wersji 1.8.0.
Wersja 1.8.0-alpha01
19 maja 2025 r.
Używaj stabilnej wersji 1.8.0.
Wersja 1.7.0
Wersja 1.7.1
16 maja 2025 r.
Ta wersja ma ten sam kod co wersja 1.6.1 i została opublikowana, aby była wyświetlana jako „nowsza” niż wersja 1.7.0, która była wersją alfa przypadkowo oznaczoną jako stabilna (patrz poniżej).
Wersja 1.7.0
16 maja 2025 r.
Ta wersja powinna mieć oznaczenie 1.7.0-alpha01, ale na maven.google.com została omyłkowo oznaczona jako 1.7.0 (czyli stabilna). Nie używaj jej. Pozostań przy wersji 1.6.1 lub uaktualnij ją do wersji 1.7.1 (która ma taki sam kod jak wersja 1.6.1).
Wersja 1.6.0
1.6.1
14 kwietnia 2025 r.
Publikacja androidx.media3:media3-*:1.6.1 Wersja 1.6.1 zawiera te zmiany.
- Biblioteka wspólna:
- Dodano metodę
PlaybackParameters.withPitch(float), która umożliwia łatwe kopiowanie elementu aPlaybackParametersz nową wartościąpitch(#2257).
- Dodano metodę
- ExoPlayer:
- Rozwiązanie problemu polegającego na tym, że przejście do elementu multimedialnego kończyło się niepowodzeniem z powodu błędu mechanizmu renderowania, który można było naprawić, podczas inicjowania następnego elementu multimedialnego (#2229).
- Rozwiązanie problemu polegającego na tym, że funkcja
ProgressiveMediaPeriodzgłaszała błądIllegalStateException, gdy funkcjaPreloadMediaSourcepróbowała wywołać funkcjęgetBufferedDurationUs()przed jej przygotowaniem (#2315). - Naprawiono wysyłanie
CmcdDataw żądaniach manifestu w przypadku DASH, HLS i SmoothStreaming (#2253). - Upewnij się, że po usunięciu grup reklam możesz nadal używać
AdPlaybackState.withAdDurationsUs(long[][]). Użytkownik nadal musi przekazać tablicę czasów trwania usuniętych grup reklam, która może być pusta lub mieć wartość null (#2267).
- Ekstraktory:
- MP4: przeanalizuj
alternate_groupz polatkhdi udostępnij go jako wpisMp4AlternateGroupDatawFormat.metadatakażdego ścieżki (#2242).
- MP4: przeanalizuj
- Dźwięk:
- Naprawiono problem z odciążeniem, w którym pozycja mogła się zablokować podczas odtwarzania playlisty z krótkimi treściami (#1920).
- Sesja:
- Zmniejsz limit czasu oczekiwania na wywołania zwrotne platformy
MediaSessionz 500 ms do 100 ms i dodaj eksperymentalny setter, aby umożliwić aplikacjom konfigurowanie tej wartości. - Rozwiązaliśmy problem, który powodował, że powiadomienia pojawiały się ponownie po ich zamknięciu przez użytkownika (#2302).
- Naprawiliśmy błąd polegający na tym, że sesja zwracała oś czasu z 1 elementem, gdy opakowany odtwarzacz był pusty. Dzieje się tak, gdy odtwarzacz opakowany nie ma dostępnej funkcji
COMMAND_GET_TIMELINE, a funkcjaCOMMAND_GET_CURRENT_MEDIA_ITEMjest dostępna i odtwarzacz opakowany jest pusty (#2320). - Rozwiązanie problemu polegającego na tym, że wywołanie funkcji
MediaSessionService.setMediaNotificationProviderjest ignorowane po innych interakcjach z usługą, takich jaksetForegroundServiceTimeoutMs(#2305).
- Zmniejsz limit czasu oczekiwania na wywołania zwrotne platformy
- UI:
- Włącz
PlayerSurface, aby korzystać zExoPlayer.setVideoEffectsiCompositionPlayer. - Naprawiono błąd, który uniemożliwiał ponowne utworzenie
PlayerSurfaceza pomocą nowegoPlayer.
- Włącz
- Rozszerzenie HLS:
- Rozwiązanie problemu polegającego na tym, że czas trwania fragmentu nie był ustawiony w
CmcdDataw przypadku multimediów HLS, co powodowało błąd asercji podczas przetwarzania zaszyfrowanych segmentów multimediów (#2312).
- Rozwiązanie problemu polegającego na tym, że czas trwania fragmentu nie był ustawiony w
- Rozszerzenie RTSP:
- Dodano obsługę identyfikatora URI ze schematem RTSPT jako sposobu konfigurowania sesji RTSP do korzystania z TCP (#1484).
- Rozszerzenie Cast:
- Dodano obsługę metadanych playlisty (#2235).
1.6.0
26 marca 2025 r.
Publikacja androidx.media3:media3-*:1.6.0 Wersja 1.6.0 zawiera te zatwierdzenia.
- Biblioteka wspólna:
- Dodaj
AudioManagerCompatiAudioFocusRequestCompat, aby zastąpić równoważne klasy wandroidx.media. - Uaktualnij język Kotlin z wersji 1.9.20 do 2.0.20 i użyj wtyczki Gradle do kompilatora Compose. Uaktualniliśmy bibliotekę KotlinX Coroutines z wersji 1.8.1 do 1.9.0.
- Usuń metodę
Format.toBundle(boolean excludeMetadata)i użyj metodyFormat.toBundle(). - Usunęliśmy błąd w
SimpleBasePlayer, który powodował, że ustawienie nowegocurrentMediaItemIndexwStateposetPlaylistznullMediaMetadatanie powodowało ponownej oceny metadanych (#1940). - Zmiana dostępu do
SimpleBasePlayer.Statez chronionego na publiczny, aby ułatwić obsługę aktualizacji w innych klasach (#2128).
- Dodaj
- ExoPlayer:
- Dodaj
MediaExtractorCompat, nową klasę, która zapewnia funkcje równoważne z platformąMediaExtractor. - Dodano eksperymentalną obsługę wstępnego rozgrzewania „ExoPlayera” do odtwarzania za pomocą
MediaCodecVideoRenderer. Możesz skonfigurowaćDefaultRenderersFactoryza pomocąexperimentalSetEnableMediaCodecVideoRendererPrewarming, aby zapewnić dodatkowyMediaCodecVideoRendererdlaExoPlayer. Jeśli ta opcja jest włączona,ExoPlayerwstępnie przetwarza film z kolejnych elementów multimedialnych podczas odtwarzania, aby zmniejszyć opóźnienie przejścia między elementami multimedialnymi. - Zmniejsz wartości domyślne parametrów
bufferForPlaybackMsibufferForPlaybackAfterRebufferMswDefaultLoadControldo odpowiednio 1000 ms i 2000 ms. - Asynchroniczne inicjowanie
DeviceInfoi głośności urządzenia (jeśli jest włączone za pomocąsetDeviceVolumeControlEnabled). Te wartości nie są dostępne od razu po wywołaniuExoPlayer.Builder.build(), aPlayer.Listenerpowiadamia o zmianach za pomocąonDeviceInfoChangedionDeviceVolumeChanged. - Początkowy identyfikator sesji audio nie jest już dostępny od razu po utworzeniu odtwarzacza. W razie potrzeby możesz odsłuchać początkową aktualizację, klikając
AnalyticsListener.onAudioSessionIdChanged. - Podczas wybierania ścieżki wideo weź pod uwagę język. Domyślnie wybieramy „główną” ścieżkę wideo, która pasuje do języka wybranej ścieżki audio, jeśli jest dostępna. Preferencje dotyczące języka filmu można wyrazić za pomocą parametru
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s). - Dodaj parametr
selectedAudioLanguagedo metodyDefaultTrackSelector.selectVideoTrack(). - Dodaj parametr
retryCountdo metodMediaSourceEventListener.onLoadStartedi odpowiednich metodMediaSourceEventListener.EventDispatcher. - Rozwiązaliśmy problem polegający na tym, że elementy playlisty lub okresy w strumieniach DASH z wieloma okresami, których czas trwania nie odpowiadał rzeczywistej treści, mogły powodować zamrożenie klatek na końcu elementu (#1698).
- Przenieś
BasePreloadManager.Listenerna najwyższy poziomPreloadManagerListener. RenderersFactory.createSecondaryRenderermożna wdrożyć, aby zapewnić dodatkowe mechanizmy renderowania do wstępnego rozgrzewania. Wstępne wczytywanie umożliwia szybsze przechodzenie między elementami multimedialnymi podczas odtwarzania.- Włącz wysyłanie
CmcdDataw przypadku żądań pliku manifestu w adaptacyjnym strumieniowym przesyłaniu danych w formatach DASH, HLS i SmoothStreaming (#1951). - Podaj
MediaCodecInfokodeka, który zostanie zainicjowany wMediaCodecRenderer.onReadyToInitializeCodec(#1963). - Zmień
AdsMediaSource, aby umożliwićAdPlaybackStatespowiększanie się przez dodawanie grup reklam. Wykryte nieprawidłowe modyfikacje powodują zgłoszenie wyjątku. - Rozwiązaliśmy problem polegający na tym, że po reklamie w trakcie filmu podczas przechodzenia do treści multimedialnych w szybkiej sekwencji mogą być wyświetlane dodatkowe ramki tylko do dekodowania.
- Spraw, aby
DefaultRenderersFactorydodawało 2 instancjeMetadataRenderer, aby aplikacje domyślnie otrzymywały 2 różne schematy metadanych. - Ponownie oceń, czy trwające wczytywanie fragmentu powinno zostać anulowane, gdy odtwarzanie jest wstrzymane (#1785).
- Dodanie opcji
ClippingMediaSource, która umożliwia wycinanie fragmentów z mediów, których nie można przewijać. - Naprawiliśmy błąd, który powodował, że przewijanie z wstępnym buforowaniem mogło blokować przejście do następnego elementu multimedialnego.
- Usunęliśmy błąd, w którym stan
ExoPlayer.isLoading()pozostawałtrue, mimo że zmienił się naSTATE_IDLElubSTATE_ENDED(#2133). - Dodano
lastRebufferRealtimeMsdoLoadControl.Parameter(#2113).
- Dodaj
- Transformer:
- Dodaliśmy obsługę transkodowania do alternatywnych formatów zgodnych wstecznie.
- Dodano obsługę transkodowania i transmuksowania formatu Dolby Vision (profil 8).
- Zaktualizuj parametry
VideoFrameProcessor.registerInputStreamiVideoFrameProcessor.Listener.onInputStreamRegistered, aby korzystały zFormat. - Generuj statyczne metadane HDR podczas korzystania z
DefaultEncoderFactory. - Włącz obsługę diagnostyki platformy Android za pomocą
MediaMetricsManager. Moduł Transformer przekazuje do platformy zdarzenia edycji i dane o skuteczności, co pomaga dostarczać na urządzeniu informacje na potrzeby debugowania i wydajności systemu. Te dane mogą być też gromadzone przez Google, jeśli użytkownik urządzenia włączy udostępnianie danych o użytkowaniu i diagnostyce. Aplikacje mogą zrezygnować z przesyłania danych diagnostycznych platformy do Transformer za pomocą parametruTransformer.Builder.setUsePlatformDiagnostics(false). - Podziel
InAppMuxernaInAppMp4MuxeriInAppFragmentedMp4Muxer.InAppMp4Muxersłuży do tworzenia niesfragmentowanego pliku MP4, aInAppFragmentedMp4Muxerdo tworzenia sfragmentowanego pliku MP4. - Przenieś interfejs
Muxerzmedia3-muxerdomedia3-transformer. - Dodaj
MediaProjectionAssetLoader, który udostępnia multimedia zMediaProjectiondo nagrywania ekranu, i dodaj obsługę nagrywania ekranu do aplikacji w wersji demonstracyjnej Transformer. - Dodaj
#getInputFormat()do interfejsuCodec. - Przekaż odpowiedzialność za zwolnienie
GlObjectsProviderna dzwoniącego wDefaultVideoFrameProcessoriDefaultVideoCompositor, gdy jest to możliwe.
- Ekstraktory:
- AVI: poprawiono obsługę plików ze skompresowanym dźwiękiem o stałej szybkości transmisji, w których nagłówek strumienia przechowuje liczbę bajtów zamiast liczby fragmentów.
- Poprawiono obsługę jednostek NAL o długości wyrażonej w 1 lub 2 bajtach (zamiast 4).
- Naprawiono błąd
ArrayIndexOutOfBoundsExceptionna listach edycji MP4, gdy lista edycji zaczyna się od klatki niesynchronizowanej bez poprzedzającej klatki synchronizowanej (#2062). - Rozwiązanie problemu polegającego na tym, że strumienie TS mogą się zawieszać na niektórych urządzeniach (#2069).
- FLAC: dodaliśmy obsługę 32-bitowych plików FLAC. Wcześniej nie można było ich odtworzyć w
IllegalStateException: Playback stuck buffering and not loading(#2197).
- Dźwięk:
- Poprawiono wywoływanie funkcji
onAudioPositionAdvancingpo wznowieniu odtwarzania (wcześniej była wywoływana po wstrzymaniu odtwarzania). - Nie pomijaj
SonicAudioProcessor, gdySpeedChangingAudioProcessorjest skonfigurowany z parametrami domyślnymi. - Naprawiono niedobór w
Sonic#getOutputSize(), który mógł powodować zatrzymanieDefaultAudioSink. - Popraw
MediaCodecAudioRenderer.getDurationToProgressUs()iDecoderAudioRenderer.getDurationToProgressUs(), aby wyszukiwanie prawidłowo resetowało podane czasy trwania. - Ustawić numer
androidx.media3.common.audio.SonicAudioProcessorjako stały? - Dodaliśmy obsługę formatu float PCM do elementów
ChannelMappingAudioProcessoriTrimmingAudioProcessor.
- Poprawiono wywoływanie funkcji
- Film:
- Zmień
MediaCodecVideoRenderer.shouldUsePlaceholderSurfacena protected, aby aplikacje mogły zastępować blokowanie użycia powierzchni zastępczych (#1905). - Dodano eksperymentalną analizę zależności próbki AV1
ExoPlayer, aby przyspieszyć wyszukiwanie. Włącz go za pomocą nowego interfejsu APIDefaultRenderersFactory.experimentalSetParseAv1SampleDependencies. - Dodano eksperymentalny interfejs API
ExoPlayer, który umożliwia odrzucanie buforów wejściowych dekoderaMediaCodecVideoRenderero dużym opóźnieniu, od których nie zależą inne elementy. Włącz ją za pomocąDefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * Rozwiązanie problemu polegającego na tym, że odtwarzacz bez powierzchni był od razu gotowy i bardzo wolno dekodował oczekujące klatki (#1973). - Wykluczanie urządzeń Xiaomi i OPPO z trybu odłączonej powierzchni, aby uniknąć migotania ekranu (#2059).
- Zmień
- Tekst:
- Dodano obsługę napisów VobSub (#8260).
- Zaprzestanie wczytywania z wyprzedzeniem wszystkich plików z napisami skonfigurowanych za pomocą
MediaItem.Builder.setSubtitleConfigurationsi wczytywanie tylko jednego, jeśli zostanie on wybrany przez funkcję wyboru ścieżki (#1721). - TTML: dodano obsługę odwołań do
tts:originitts:extentza pomocąstyle(#2953). - Ogranicz znaczniki czasu WebVTT i SubRip do dokładnie 3 miejsc po przecinku. Wcześniej nieprawidłowo analizowaliśmy dowolną liczbę miejsc po przecinku, ale zawsze zakładaliśmy, że wartość jest podana w milisekundach, co prowadziło do nieprawidłowych sygnatur czasowych (#1997).
- Naprawiono zawieszanie się odtwarzania, gdy playlista zawierała przycięte elementy z napisami CEA-608 lub CEA-708.
- Naprawiono
IllegalStateException, gdy plik SSA zawierał wskazówkę o zerowym czasie trwania (czas rozpoczęcia i zakończenia były takie same) (#2052). - Tłumienie (i rejestrowanie) błędów analizowania napisów, gdy są one multipleksowane w tym samym kontenerze co audio i wideo (#2052).
- Poprawiono obsługę wielobajtowych znaków UTF-8 w plikach WebVTT z zakończeniami wierszy CR (#2167).
- DRM:
- Naprawiono błąd
MediaCodec$CryptoException: Operation not supported in this configurationpodczas odtwarzania treści ClearKey na urządzeniach z interfejsem API w wersji starszej niż 27 (#1732).
- Naprawiono błąd
- Skutek:
- Przeniesiono funkcję
OverlaySettingsdoStaticOverlaySettings.OverlaySettingsmożna podzielić na klasy podrzędne, aby umożliwić dynamiczne ustawienia nakładki.
- Przeniesiono funkcję
- Muxers:
- Przeniesiono
MuxerExceptionz interfejsuMuxer, aby uniknąć bardzo długiej, pełnej i jednoznacznej nazwy. - Zmieniono nazwę metody
setSampleCopyEnabled()nasetSampleCopyingEnabled()w przypadkuMp4Muxer.BuilderiFragmentedMp4Muxer.Builder. Mp4Muxer.addTrack()iFragmentedMp4Muxer.addTrack()zwracają teraz identyfikator ścieżkiintzamiastTrackToken.- Metody
Mp4MuxeriFragmentedMp4Muxernie implementują już interfejsuMuxer. - Domyślnie wyłącz próbkowanie i kopiowanie
Mp4Muxer. - Naprawiliśmy błąd w
FragmentedMp4Muxer, który powodował tworzenie wielu fragmentów, gdy zapisywana była tylko ścieżka audio.
- Przeniesiono
- Sesja:
- Utrzymuj stan usługi na pierwszym planie przez dodatkowe 10 minut, gdy odtwarzanie zostanie wstrzymane, zatrzymane lub zakończy się niepowodzeniem. Dzięki temu użytkownicy mogą wznowić odtwarzanie w tym czasie bez ryzyka ograniczeń dotyczących usług na pierwszym planie na różnych urządzeniach. Pamiętaj, że wywołanie
player.pause()nie może już być używane do zatrzymania usługi na pierwszym planie przedstopSelf()podczas zastępowaniaonTaskRemoved. Zamiast tego użyjMediaSessionService.pauseAllPlayersAndStopSelf(). - Zachowaj widoczność powiadomienia, gdy odtwarzanie przejdzie w stan błędu lub zatrzymania. Powiadomienie zostanie usunięte tylko wtedy, gdy playlista zostanie wyczyszczona lub odtwarzacz zostanie zwolniony.
- Ulepszono obsługę działań ACTION_PLAY i ACTION_PAUSE w MediaSession na platformie Android, aby ustawiać tylko jedno z nich zgodnie z dostępnymi poleceniami, a także akceptować sytuację, w której ustawione jest tylko jedno z nich.
- Dodaj
Contextjako parametr doMediaButtonReceiver.shouldStartForegroundService(#1887). - Naprawiono błąd, który powodował, że wywołanie metody
Playerna połączonymMediaControllerz sesją starszego typu powodowało utratę zmian z oczekującej aktualizacji. - Umożliwienie funkcji
MediaSession.setSessionActivity(PendingIntent)akceptowania wartości null (#2109). - Usunęliśmy błąd, który powodował, że po wyczyszczeniu playlisty nadal wyświetlało się nieaktualne powiadomienie (#2211).
- Utrzymuj stan usługi na pierwszym planie przez dodatkowe 10 minut, gdy odtwarzanie zostanie wstrzymane, zatrzymane lub zakończy się niepowodzeniem. Dzięki temu użytkownicy mogą wznowić odtwarzanie w tym czasie bez ryzyka ograniczeń dotyczących usług na pierwszym planie na różnych urządzeniach. Pamiętaj, że wywołanie
- UI:
- Dodaj do modułu
media3-ui-composeelementy przechowujące stan i funkcje kompozycyjne dlaPlayerSurface,PresentationState,PlayPauseButtonState,NextButtonState,PreviousButtonState,RepeatButtonState,ShuffleButtonStateiPlaybackSpeedState.
- Dodaj do modułu
- Pobrane:
- Naprawiono błąd w
CacheWriter, który powodował, że źródła danych pozostawały otwarte, a obszary pamięci podręcznej były zablokowane, jeśli źródło danych zgłaszało błądExceptioninny niżIOException(#9760).
- Naprawiono błąd w
- Rozszerzenie HLS:
- Dodaj pierwszą wersję
HlsInterstitialsAdsLoader. Moduł wczytywania reklam odczytuje reklamy pełnoekranowe HLS z playlisty multimediów HLS i mapuje je naAdPlaybackState, które jest przekazywane doAdsMediaSource. Ta początkowa wersja obsługuje tylko strumienie VOD HLS z atrybutamiX-ASSET-URI. - Dodaj
HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Aplikacje mogą go używać do tworzenia instancjiAdsMediaSource, które w wygodny i bezpieczny sposób korzystają zHlsInterstitialsAdsLoader. - Analizowanie tagu
SUPPLEMENTAL-CODECSz playlisty HLS w celu wykrywania formatów Dolby Vision (#1785). - Złagodzenie warunku wyszukiwania pozycji do synchronizacji w strumieniu HLS (#2209).
- Dodaj pierwszą wersję
- Rozszerzenie DASH:
- Dodanie obsługi formatu AC-4 Level-4 w przypadku DASH (#1898).
- Rozwiązano problem z obliczaniem interwału aktualizacji wstawiania reklam w transmisjach na żywo z wieloma okresami (#1698).
- Analizowanie atrybutu
scte214:supplementalCodecsz pliku manifestu DASH w celu wykrywania formatów Dolby Vision (#1785). - Poprawiono obsługę przejść między okresami w transmisjach na żywo, w których okres zawiera próbki multimediów wykraczające poza zadeklarowany czas trwania okresu (#1698).
- Rozwiązanie problemu, w którym zestawy adaptacyjne oznaczone symbolem
adaptation-set-switching, ale w różnych językach lub z różnymi flagami ról są łączone ze sobą (#2222).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Dodano moduł dekodera MPEG-H, który używa wbudowanego dekodera MPEG-H do dekodowania dźwięku MPEG-H (#1826).
- Rozszerzenie MIDI:
- Przekazywanie niestandardowych instancji
AudioSinkiAudioRendererEventListenerdoMidiRenderer.
- Przekazywanie niestandardowych instancji
- Rozszerzenie Cast:
- Zaktualizowano zależność
play-services-cast-frameworkdo wersji 21.5.0, aby naprawićFLAG_MUTABLEawarię w aplikacjach kierowanych na interfejs API 34 lub nowszy na urządzeniach z zainstalowanymi, ale wyłączonymi usługami Google Play (#2178).
- Zaktualizowano zależność
- Aplikacja w wersji demonstracyjnej:
- Rozszerz możliwości
demo-composeo dodatkowe przyciski i ulepsz integracjęPlayerSurfacedzięki obsłudze skalowania i migawki.
- Rozszerz możliwości
- Usuń symbole, które nie są już używane:
- Usuń wycofaną metodę
AudioMixer.create(). Zamiast niej używaj zasadyDefaultAudioMixer.Factory().create(). - Usuń te wycofane metody
Transformer.Builder:setTransformationRequest()używaj zamiast niej zasadsetAudioMimeType(),setVideoMimeType()isetHdrMode().setAudioProcessors(), ustaw procesor dźwięku wEditedMediaItem.Builder.setEffects()i przekaż go doTransformer.start().setVideoEffects(), ustaw efekt wideo wEditedMediaItem.Builder.setEffects()i przekaż go doTransformer.start().setRemoveAudio(), użyjEditedMediaItem.Builder.setRemoveAudio(), aby usunąć dźwięk zEditedMediaItemprzekazywanego doTransformer.start().setRemoveVideo(), użyjEditedMediaItem.Builder.setRemoveVideo(), aby usunąć film z obiektuEditedMediaItemprzekazanego doTransformer.start().setFlattenForSlowMotion(), użyjEditedMediaItem.Builder.setFlattenForSlowMotion(), aby spłaszczyćEditedMediaItemprzekazane doTransformer.start().setListener(), użyjaddListener(),removeListener()lubremoveAllListeners().
- Usuń te wycofane metody
Transformer.Listener:onTransformationCompleted(MediaItem), użyjonCompleted(Composition, ExportResult).onTransformationCompleted(MediaItem, TransformationResult), użyjonCompleted(Composition, ExportResult).onTransformationError(MediaItem, Exception), użyjonError(Composition, ExportResult, ExportException).onTransformationError(MediaItem, TransformationException), użyjonError(Composition, ExportResult, ExportException).onTransformationError(MediaItem, TransformationResult, TransformationException), użyjonError(Composition, ExportResult, ExportException).onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), użyjonFallbackApplied(Composition, TransformationRequest, TransformationRequest).
- Usuń wycofaną klasę
TransformationResult. Zamiast niej użyj zasadyExportResult. - Usuń wycofaną klasę
TransformationException. Zamiast niej użyj zasadyExportException. - Usuń wycofane
Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Zamiast niej używaj zasadyTransformer.PROGRESS_STATE_NOT_STARTED. - Usuń wycofane
Transformer.setListener(). Zamiast niej używaj kolumnTransformer.addListener(),Transformer.removeListener()lubTransformer.removeAllListeners(). - Usuń wycofane
Transformer.startTransformation(). Zamiast niej używaj zasadyTransformer.start(MediaItem, String). - Usuń wycofane
SingleFrameGlShaderProgram. Zamiast niej używaj zasadyBaseGlShaderProgram. - Usuń
Transformer.flattenForSlowMotion. Zamiast niej używaj zasadyEditedMediaItem.flattenForSlowMotion. - Usunięto:
ExoPlayer.VideoComponent,ExoPlayer.AudioComponent,ExoPlayer.TextComponentiExoPlayer.DeviceComponent. - Użytkownik
androidx.media3.exoplayer.audio.SonicAudioProcessorzostał usunięty. - Usunęliśmy te wycofane metody
DownloadHelper:- Konstruktor
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), użyjDownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList). getRendererCapabilities(RenderersFactory), równoważną funkcję można uzyskać, tworzącDefaultRendererCapabilitiesListzRenderersFactoryi wywołującDefaultRendererCapabilitiesList.getRendererCapabilities().- Usunięto metodę
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat). Użyj funkcjiPlayerNotificationManager.setMediaSessionToken(MediaSession.Token)i przekaż wartość(MediaSession.Token) compatToken.getToken().
- Konstruktor
- Usuń wycofaną metodę
1.6.0-rc02
19 marca 2025 r.
Używaj stabilnej wersji 1.6.0.
1.6.0-rc01
12 marca 2025 r.
Używaj stabilnej wersji 1.6.0.
1.6.0-beta01
26 lutego 2025 r.
Używaj stabilnej wersji 1.6.0.
Wersja 1.6.0-alpha03
6 lutego 2025 r.
Używaj stabilnej wersji 1.6.0.
Wersja 1.6.0-alpha02
30 stycznia 2025 r.
Używaj stabilnej wersji 1.6.0.
Wersja 1.6.0-alpha01
20 grudnia 2024 r.
Używaj stabilnej wersji 1.6.0.
Wersja 1.5
Wersja 1.5.1
19 grudnia 2024 r.
Publikacja androidx.media3:media3-*:1.5.1 Wersja 1.5.1 zawiera te zmiany.
- ExoPlayer:
- Wyłącz używanie asynchronicznego odszyfrowywania w MediaCodec, aby uniknąć zgłaszanych problemów z przekroczeniem limitu czasu kodeka w tym interfejsie API platformy (#1641).
- Ekstraktory:
- MP3: nie przerywaj odtwarzania przedwcześnie, gdy
VBRItabela treści ramkiVBRInie obejmuje wszystkich danych MP3 w pliku (#1904).
- MP3: nie przerywaj odtwarzania przedwcześnie, gdy
- Film:
- Cofnięcie używania podanych wartości współczynnika proporcji piksela
MediaCodecAdapterpodczas przetwarzaniaonOutputFormatChanged(#1371).
- Cofnięcie używania podanych wartości współczynnika proporcji piksela
- Tekst:
- Naprawiliśmy błąd w
ReplacingCuesResolver.discardCuesBeforeTimeUs, który powodował, że wskazówka aktywna wtimeUs(rozpoczęta wcześniej, ale jeszcze nie zakończona) była nieprawidłowo odrzucana (#1939).
- Naprawiliśmy błąd w
- Metadane:
- Wyodrębnianie numerów dysków/ścieżek i gatunku z komentarzy Vorbis do
MediaMetadata(#1958).
- Wyodrębnianie numerów dysków/ścieżek i gatunku z komentarzy Vorbis do
Wersja 1.5.0
27 listopada 2024 r.
Publikacja androidx.media3:media3-*:1.5.0 Wersja 1.5.0 zawiera te zmiany.
- Biblioteka wspólna:
- Dodaj
ForwardingSimpleBasePlayer, który umożliwia przekazywanie do innego odtwarzacza z niewielkimi korektami, przy jednoczesnym zapewnieniu pełnej spójności i obsługi słuchaczy (#1183). - Zastąp
SimpleBasePlayer.State.playlistmetodągetPlaylist(). - Dodaj zastąpienie dla
SimpleBasePlayer.State.Builder.setPlaylist(), aby bezpośrednio określićTimelinei bieżąceTracksorazMetadatazamiast tworzyć strukturę playlisty. - Zwiększ
minSdkdo 21 (Android Lollipop). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX. - Dodaj artefakt
androidx.media3:media3-common-ktx, który zapewnia funkcje specyficzne dla języka Kotlin oparte na bibliotece Common. - Dodaj do biblioteki
media3-common-ktxfunkcję rozszerzenia zawieszającegoPlayer.listen, aby uruchomić współprogram, który będzie nasłuchiwaćPlayer.Events. - Usuń adnotacje
@DoNotInlinez ręcznie wyodrębnionych klas wewnętrznych, które mają zapobiegać błędom weryfikacji klas w czasie działania. Najnowsze wersje R8 automatycznie przenoszą takie wywołania do osobnych funkcji, aby uniknąć błędów w czasie działania (ręczne przenoszenie nie jest już wymagane). Wszyscy użytkownicy Gradle korzystający z tej biblioteki muszą już używać wersji wtyczki Androida do obsługi Gradle, która korzysta z wersji R8, która to robi, z powoducompileSdk = 35. Użytkownicy biblioteki z systemami kompilacji innymi niż Gradle będą musieli zadbać o to, aby ich odpowiednik R8 wykonujący krok zmniejszania/zaciemniania kodu przeprowadzał podobny automatyczny proces wyodrębniania, aby uniknąć błędów weryfikacji klas w czasie działania. Ta zmiana została już wprowadzona w innych bibliotekach AndroidX.
- Dodaj
- ExoPlayer:
MediaCodecRenderer.onProcessedStreamChange()można teraz wywołać w przypadku każdego elementu multimedialnego. Wcześniej nie było to wymagane w przypadku pierwszego połączenia. Aby to zrobić, użyjMediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart().- Dodano element
PreloadMediaSource.PreloadControl.onPreloadError, aby umożliwić implementacjomPreloadMediaSource.PreloadControlpodejmowanie działań w przypadku wystąpienia błędu. - Dodaj
BasePreloadManager.Listener, aby przekazywać zdarzenia wstępnego wczytywania do aplikacji. - Zezwalaj na zmianę czasu oczekiwania klienta SNTP i ponawianie prób połączenia z alternatywnymi adresami po przekroczeniu czasu oczekiwania (#1540).
- Usuń wartość
MediaCodecAdapter.Configuration.flags, ponieważ pole zawsze miało wartość zero. - Zezwalaj użytkownikowi na wybieranie wbudowanego głośnika do odtwarzania na urządzeniach z Wear OS z API w wersji 35 lub nowszej (jeśli urządzenie deklaruje obsługę tej funkcji).
- Odłóż blokowanie połączenia do
Context.getSystemService(Context.AUDIO_SERVICE), aż zostanie włączona obsługaContext.getSystemService(Context.AUDIO_SERVICE). Dzięki temu połączenie blokujące nie zostanie wykonane, jeśli obsługa fokusu audio nie jest włączona (#1616). - Zezwalaj na odtwarzanie niezależnie od czasu buforowania, gdy ładowanie się nie powiedzie (#1571).
- Dodaj
AnalyticsListener.onRendererReadyChanged(), aby sygnalizować, kiedy poszczególne renderery zezwalają na odtwarzanie. - Naprawiono błąd, który powodował, że
MediaCodec.CryptoExceptionbył czasami zgłaszany jako „nieoczekiwany błąd podczas działania”, gdyMediaCodecdziałał w trybie asynchronicznym (domyślne zachowanie w przypadku interfejsu API w wersji 31 lub nowszej). - Przekaż
bufferedDurationUszamiastbufferedPositionUsza pomocąPreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Zmienia teżDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MSnaDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS. Aplikacje muszą następnie przekazywać wartość reprezentującą określony czas od domyślnej pozycji początkowej, dla której odpowiednie źródło multimediów musi być wstępnie wczytane za pomocą tego IntDef, zamiast pozycji. - Dodaj implementację
ForwardingRenderer, która przekazuje wszystkie wywołania metod do innego renderera (1703). - Dodaj wstępne wczytywanie playlisty dla następnego elementu na playliście. Aplikacje mogą włączyć wstępne wczytywanie, wywołując odpowiednio funkcję
ExoPlayer.setPreloadConfiguration(PreloadConfiguration). Wstępne wczytywanie jest domyślnie wyłączone. Jeśli użytkownik wyrazi na to zgodę, aby nie zakłócać odtwarzania,DefaultLoadContrologranicza wstępne wczytywanie do momentu, gdy odtwarzacz nie wczytuje treści do odtworzenia. Aplikacje mogą zmienić to zachowanie, implementując odpowiednioLoadControl.shouldContinuePreloading()(np. podczas zastępowania tej metody wDefaultLoadControl). Domyślna implementacjaLoadControlwyłącza wstępne wczytywanie, jeśli aplikacja używa niestandardowej implementacjiLoadControl. - Dodaj metodę
MediaSourceEventListener.EventDispatcher.dispatchEvent(), aby umożliwić wywoływanie zdarzeń detektorów podklasy (1736). - Dodaj
DefaultPreloadManager.Builder, które tworzy instancjeDefaultPreloadManageriExoPlayerze spójnymi, udostępnionymi konfiguracjami. - Usuń parametr
Renderer[]z funkcjiLoadControl.onTracksSelected(), ponieważ implementacjaDefaultLoadControlmoże pobierać typy strumieni z funkcjiExoTrackSelection[]. - Metoda
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])została oznaczona jako przestarzała i ostateczna, aby zapobiec jej zastąpieniu. Zamiast niej należy używać nowej zasadyDefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]). - Raportuj zdarzenia
MediaSourceEventListenerz dodatkowych źródeł wMergingMediaSource. Spowoduje to zgłaszanie zdarzeń loadstart/error/cancelled/completed dla napisów zainstalowanych z nieoficjalnego źródła (dodanych za pomocąMediaItem.LocalConfiguration.subtitleConfigurations), które mogą pojawiać się jako zduplikowane zdarzenia wczytywania emitowane zAnalyticsListener. - Zapobiegaj całkowitemu zatrzymaniu odtwarzania z powodu błędów w napisach i metadanych.
Problemowy utwór jest wyłączany, a odtwarzanie pozostałych utworów jest kontynuowane (#1722).
- W przypadku nowej obsługi napisów (podczas wyodrębniania) powiązane błędy analizowania (np. nieprawidłowe dane napisów) i ładowania (np. HTTP 404) są emitowane za pomocą wywołań zwrotnych
onLoadError. - W przypadku starszego sposobu obsługi napisów (podczas renderowania) za pomocą wywołań zwrotnych
onLoadErrorsą emitowane tylko powiązane błędy wczytywania, a błędy analizowania są cicho ignorowane (jest to dotychczasowe zachowanie).
- W przypadku nowej obsługi napisów (podczas wyodrębniania) powiązane błędy analizowania (np. nieprawidłowe dane napisów) i ładowania (np. HTTP 404) są emitowane za pomocą wywołań zwrotnych
- Rozwiązaliśmy problem polegający na tym, że elementy playlisty lub okresy w strumieniach DASH z wieloma okresami, których czas trwania nie odpowiadał rzeczywistej treści, mogły powodować zamrożenie klatek na końcu elementu (#1698).
- Dodano funkcję ustawiającą do interfejsu
SntpClient, która umożliwia określenie maksymalnego czasu, jaki może upłynąć od ostatniej aktualizacji, po którym klient jest ponownie inicjowany (#1794).
- Transformer:
- Dodaj
SurfaceAssetLoader, który obsługuje kolejkowanie danych wideo do transformatora za pomocąSurface. ImageAssetLoaderzgłasza nieobsługiwane dane wejściowe za pomocąAssetLoader.onErrorzamiast zgłaszaćIllegalStateException.- Wymagaj ustawienia czasu trwania obrazu za pomocą parametru
MediaItem.Builder.setImageDurationMspodczas eksportowania obrazu. - Dodano obsługę eksportowania przerw w sekwencjach obiektów EditedMediaItem.
- Dodaj
- Wybór ścieżki:
DefaultTrackSelector: w przypadku podobnych warunków preferuj dźwięk obiektowy od dźwięku opartego na kanałach.
- Ekstraktory:
- Zezwalaj na identyfikowanie przez opcje
Mp4ExtractoriFragmentedMp4Extractorpróbek H264, które nie są używane jako odniesienie przez kolejne próbki. - Dodanie opcji włączania wyszukiwania na podstawie indeksu w
AmrExtractor. - Traktuj pliki MP3 z ponad 128 kB między prawidłowymi ramkami jako obcięte (zamiast nieprawidłowych). Oznacza to, że pliki z danymi innymi niż MP3 na końcu, bez innych metadanych wskazujących długość bajtów MP3, przestają odtwarzać się na końcu danych MP3, zamiast kończyć się błędem
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}(#1563). - Poprawiono obsługę próbek przed reklamą w przypadku pozycji początkowych multimediów innych niż klatki kluczowe podczas przetwarzania list edycji w plikach MP4 (#1659).
- Ulepszono obliczanie liczby klatek na sekundę przez użycie czasu trwania multimediów z pola
mdhdwMp4ExtractoriFragmentedMp4Extractor(#1531). - Poprawiono nieprawidłowe skalowanie
media_timena listach edycji MP4. Wartośćsegment_durationbyła już prawidłowo skalowana przy użyciu skali czasu filmu, a wartośćmedia_timejest teraz prawidłowo skalowana przy użyciu skali czasu ścieżki, zgodnie ze standardem formatu MP4 (#1792). - Obsługa klatek w nieprawidłowej kolejności w obliczeniach
endIndicesw przypadku plików MP4 z listą edycji (#1797). - Poprawiono analizowanie czasu trwania multimediów w
mdhdbox w plikach MP4, aby obsługiwać wartości-1(#1819). - Dodano obsługę identyfikowania pola
h263w plikach MP4 dla wideo H.263 (#1821). - Dodano obsługę formatu pliku multimedialnego ISO AC-4 Level-4 (#1265).
- Zezwalaj na identyfikowanie przez opcje
- DataSource:
- Aktualizacja
HttpEngineDataSource, aby umożliwić korzystanie z niej od wersji S extension 7 zamiast od poziomu 34 interfejsu API (#1262). DataSourceContractTest: Sprawdź, czy funkcjaDataSource.getUri()zwraca rozwiązany identyfikator URI (zgodnie z dokumentacją). Jeśli różni się od żądanego adresu URI, testy mogą to wskazywać za pomocą nowej metodyDataSourceContractTest.TestResource.Builder.setResolvedUri().DataSourceContractTest: sprawdź, czy funkcjeDataSource.getUri()igetResponseHeaders()zwracają wartość „open” po nieudanym wywołaniu funkcjiopen()(z powodu zasobu „nie znaleziono”) i przed kolejnym wywołaniem funkcjiclose().- Zastąpienie
DataSourceContractTest.getNotFoundResources()umożliwia podklasom testów dostarczanie wielu zasobów „nie znaleziono” oraz dostarczanie dowolnych oczekiwanych nagłówków. Pozwala to odróżnić błąd HTTP 404 (z nagłówkami) od błędu „nie znaleziono serwera” (bez nagłówków).
- Zastąpienie
- Aktualizacja
- Dźwięk:
- automatycznie konfigurować metadane głośności CTA-2075 w kodeku, jeśli są one obecne w multimediach;
- Zapewnij płynne zmniejszanie głośności podczas przewijania.
- Naprawiono trzaski, które mogą występować podczas przewijania.
- Naprawiono błąd kumulacji obcinania w algorytmie rozciągania czasu/zmiany wysokości dźwięku Sonic.
- Naprawiono błąd w
SpeedChangingAudioProcessor, który powodował utratę klatek wyjściowych.
- Film:
MediaCodecVideoRenderernie dekoduje próbek, które nie są renderowane ani używane jako odniesienie przez inne próbki.- W przypadku interfejsu API w wersji 35 i nowszych funkcja
MediaCodecAdaptermoże teraz otrzymywać wartośćnullSurfacew parametrzeconfigureoraz wywoływać nową metodędetachOutputSurfacew celu usunięcia wcześniej ustawionej wartościSurface, jeśli kodek to obsługuje (MediaCodecInfo.detachedSurfaceSupported). - Podczas przetwarzania
onOutputFormatChangedużywaj podanych wartości współczynnika proporcji piksela, jeśli są dostępneMediaCodecAdapter(#1371). - Dodano obejście problemu z urządzeniem Galaxy Tab S7 FE, który powoduje, że bezpieczne strumienie H264 o częstotliwości 60 kl./s są oznaczane jako nieobsługiwane (#1619).
- Dodaj obejście problemu z kodekami, które po ostatniej próbce nie zwracają sygnału końca strumienia.
- Tekst:
- Dodaj niestandardowy tag
VoiceSpani wypełnij go dla zakresów głosowych WebVTT (#1632). - Upewnij się, że napisy WebVTT w HLS z bardzo dużymi sygnaturami czasowymi (które przekraczają 64-bitową wartość
long, gdy są reprezentowane jako mikrosekundy i pomnożone przez90,000podstawę czasu MPEG) są wyświetlane (#1763). - Obsługa napisów CEA-608 w treściach Dolby Vision (#1820).
- Naprawiono zawieszanie się odtwarzania strumieni DASH z wieloma okresami, gdy włączone są napisy CEA-608 (#1863).
- Dodaj niestandardowy tag
- Metadane:
- Przypisz typ
C.TRACK_TYPE_METADATAdo ścieżek zawierających treści w formacie icy lub vnd.dvb.ait.
- Przypisz typ
- Obraz:
- Dodaj
ExternallyLoadedImageDecoder, aby uprościć integrację z zewnętrznymi bibliotekami wczytywania obrazów, takimi jak Glide czy Coil.
- Dodaj
- DataSource:
- Dodano
FileDescriptorDataSource, nowyDataSource, który może służyć do odczytywania danych zFileDescriptor(#3757).
- Dodano
- Skutek:
- Dodano obejście
DefaultVideoFrameProcessorw przypadku niewielkiego skalowaniaSurfaceTexture.SurfaceTexturemoże obejmować niewielkie skalowanie, które odcina 1-tekselową ramkę wokół krawędzi przyciętego bufora. Teraz jest to obsługiwane w taki sposób, aby dane wyjściowe były bliższe oczekiwanym. - Przyspiesz
DefaultVideoFrameProcessor.queueInputBitmap(). Dzięki temu eksportowanie obrazów do filmów za pomocąTransformerjest szybsze.
- Dodano obejście
- Rozszerzenie IMA:
- Naprawiono błąd, który powodował, że wyczyszczenie playlisty mogło spowodować wystąpienie znaku
ArrayIndexOutOfBoundsExceptionwImaServerSideAdInsertionMediaSource. - Naprawiono błąd, w którym strumienie DAI wstawiane po stronie serwera bez reklamy przed filmem mogły powodować błąd
ArrayIndexOutOfBoundsExceptionpodczas odtwarzania po ostatniej reklamie w trakcie filmu (#1741).
- Naprawiono błąd, który powodował, że wyczyszczenie playlisty mogło spowodować wystąpienie znaku
- Sesja:
- Dodaj
MediaButtonReceiver.shouldStartForegroundService(Intent), aby umożliwić aplikacjom pomijanie polecenia odtwarzania przychodzącego w celu wznowienia odtwarzania przez zastąpienie tej metody. Domyślnie usługa jest zawsze uruchomiona i nie można przerwać odtwarzania bez spowodowania awarii usługi przez system z błędemForegroundServiceDidNotStartInTimeException(#1528). - Naprawiliśmy błąd, który powodował, że niestandardowe polecenia wysyłane z
MediaBrowserbyły przekazywane doMediaSessionCompat.Callbackzamiast do wariantuMediaBrowserServiceCompatmetody po połączeniu z usługą starszego typu. Uniemożliwiało to otrzymanie przezMediaBrowserrzeczywistej wartości zwrotnej wysłanej przez starszą usługę (#1474). - Obsługa wyjątku
IllegalArgumentExceptionzgłaszanego przez urządzenia niektórych producentów podczas ustawiania odbiornika transmisji dla intencji przycisków multimedialnych (#1730). - Dodaj przyciski poleceń do elementów multimedialnych. Spowoduje to dodanie interfejsu Media3 API dla tego, co było znane jako
Custom browse actions, z biblioteką starszego typu zMediaBrowserCompat. Pamiętaj, że w przypadku Media3 przyciski poleceń elementów multimedialnych są dostępne zarówno w przypadkuMediaBrowser, jak iMediaController. Zobacz Implementowanie niestandardowych działań związanych z przeglądaniem. * Naprawiono błąd, który powodował, że kontroler Media3 czasami nie mógł zezwolić aplikacji sesji na uruchomienie usługi działającej na pierwszym planie po wysłaniu żądaniaplay(). - Ogranicz
CommandButton.Builder.setIconUri, aby akceptować tylko identyfikatory URI treści. - Przekazywanie wskazówek dotyczących połączenia z przeglądarki Media3 do początkowego
MediaBrowserCompatpodczas łączenia się ze starszymMediaBrowserCompat. Usługa może odbierać wskazówki dotyczące połączenia przekazywane jako wskazówki główne przy pierwszym wywołaniu funkcjionGetRoot(). - Rozwiązanie problemu polegającego na tym, że serwer
MediaBrowserpołączony z usługą starszej wersji przeglądarki nie otrzymywał błędu wysłanego przez tę usługę po zasubskrybowaniu przez przeglądarkę serweraparentid. - Poprawiliśmy działanie interoperacyjności, aby przeglądarka Media3 połączona ze starszym interfejsem
MediaBrowserServicenie wysyłała 2 razy prośby o elementy podrzędne interfejsuMediaBrowserServicepodczas subskrybowania elementu nadrzędnego.parentId
- Dodaj
- UI:
- Wprowadź obejście problemu z rozciągniętym lub przyciętym filmem w
PlayerView-in-Compose-AndroidViewjako opcjonalne, ze względu na problemy z przejściami udostępnionymi opartymi na XML. Aplikacje korzystające zPlayerViewwewnątrzAndroidViewmuszą wywoływaćPlayerView.setEnableComposeSurfaceSyncWorkaround, aby wyrazić zgodę na udział w programie (#1237,#1594). - Dodaj
setFullscreenButtonStatedoPlayerView, aby umożliwić aktualizowanie ikony przycisku pełnoekranowego na żądanie, tj. poza pasmem i nie w reakcji na kliknięcie (#1590, #184). - Naprawiono błąd polegający na tym, że opcja „Brak” w wyborze tekstu nie działała, jeśli istniały zdefiniowane przez aplikację preferencje wyboru ścieżki tekstowej.
- Wprowadź obejście problemu z rozciągniętym lub przyciętym filmem w
- Rozszerzenie DASH:
- Dodano obsługę okresów rozpoczynających się w środku segmentu (#1440).
- Rozszerzenie Smooth Streaming:
- Naprawiono błąd
Bad magic number for Bundlepodczas odtwarzania strumieni SmoothStreaming ze ścieżkami tekstowymi (#1779).
- Naprawiono błąd
- Rozszerzenie RTSP:
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Dodaj moduł dekodera IAMF, który zapewnia obsługę odtwarzania plików MP4 zawierających ścieżki IAMF za pomocą biblioteki natywnej libiamf do syntezy dźwięku.
- Odtwarzanie jest włączone w układzie stereo oraz 5.1 z przestrzennym dźwiękiem i opcjonalnym śledzeniem ruchów głowy, ale odtwarzanie binauralne nie jest obecnie dostępne.
- Dodanie obsługi stron 16 KB w przypadku rozszerzeń dekodera na Androidzie 15 (#1685).
- Dodaj moduł dekodera IAMF, który zapewnia obsługę odtwarzania plików MP4 zawierających ścieżki IAMF za pomocą biblioteki natywnej libiamf do syntezy dźwięku.
- Rozszerzenie Cast:
- Zatrzymuje czyszczenie osi czasu po rozłączeniu CastSession, co umożliwia aplikacji wysyłającej wznowienie odtwarzania lokalnego po rozłączeniu.
- Wypełnij pole
DeviceInfow CastPlayer, gdy podano wartośćContext. Umożliwia to połączenieMediaSessionzRoutingSession, co jest niezbędne do zintegrowania przełącznika wyjścia (#1056).
- Narzędzia testowe:
DataSourceContractTestobejmuje teraz testy weryfikujące:- Strumień wejściowy
read positionzostał zaktualizowany. - Bufor wyjściowy
offsetjest stosowany prawidłowo.
- Strumień wejściowy
- Aplikacja w wersji demonstracyjnej
- Rozwiązanie problemu wycieków pamięci w krótkiej aplikacji demonstracyjnej (#1839).
- Usuń symbole, które nie są już używane:
- Usuń wycofane
Player.hasPrevious,Player.hasPreviousWindow(). Zamiast niej używaj zasadyPlayer.hasPreviousMediaItem(). - Usuń wycofaną metodę
Player.previous(). Zamiast niej używaj zasadyPlayer.seekToPreviousMediaItem(). - Usuń wycofaną metodę
DrmSessionEventListener.onDrmSessionAcquired. - Usuń wycofane konstruktory
DefaultEncoderFactory. Zamiast niej używaj zasadyDefaultEncoderFactory.Builder.
- Usuń wycofane
Wersja 1.5.0-rc02
19 listopada 2024 r.
Używaj stabilnej wersji 1.5.0.
Wersja 1.5.0-rc01
13 listopada 2024 r.
Używaj stabilnej wersji 1.5.0.
Wersja 1.5.0-beta01
30 października 2024 r.
Używaj stabilnej wersji 1.5.0.
Wersja 1.5.0-alpha01
10 września 2024 r.
Używaj stabilnej wersji 1.5.0.
Wersja 1.4.0
Wersja 1.4.1
27 sierpnia 2024 r.
Publikacja androidx.media3:media3-*:1.4.1 Wersja 1.4.1 zawiera te zmiany.
- ExoPlayer:
- Ekstraktory:
- MP3: naprawiono
Searched too many bytesbłąd polegający na prawidłowym ignorowaniu końcowych danych innych niż MP3 na podstawie pola długości w ramceInfo(#1480).
- MP3: naprawiono
- Tekst:
- TTML: poprawiono obsługę wartości procentowych
tts:fontSize, aby zapewnić ich prawidłowe dziedziczenie z węzłów nadrzędnych z wartościami procentowymitts:fontSize. - Naprawiono błąd
IndexOutOfBoundsExceptionwLegacySubtitleUtilspowodowany nieprawidłową obsługą przypadku, w którym żądana godzina rozpoczęcia danych wyjściowych jest większa lub równa końcowej godzinie zdarzenia wSubtitle(#1516).
- TTML: poprawiono obsługę wartości procentowych
- DRM:
- Naprawiono błąd
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLEna urządzeniach z API w wersji 31 lub nowszej, na których odtwarzane są treści Widevine L1. Ten błąd jest spowodowany niepełną implementacją metodyMediaDrm.requiresSecureDecoderw ramach platformy (#1603).
- Naprawiono błąd
- Skutek:
- Dodaj metodę
release()doGlObjectsProvider.
- Dodaj metodę
- Sesja:
- Rozszerzenie RTSP:
- Pomiń nieprawidłowe opisy multimediów podczas analizowania SDP (#1087).
Wersja 1.4.0
25 lipca 2024 r.
Publikacja androidx.media3:media3-*:1.4.0 Wersja 1.4.0 zawiera te zmiany.
- Biblioteka wspólna:
- Przekazywanie domniemanych wywołań funkcji seek bez operacji do chronionych metod
BasePlayer.seekTo()iSimpleBasePlayer.handleSeek()zamiast ich ignorowania. Jeśli implementujesz te metody w odtwarzaczu niestandardowym, może być konieczne obsłużenie tych dodatkowych wywołań za pomocąmediaItemIndex == C.INDEX_UNSET. - Usunięcie zależności kompilacji od ulepszonego odcukrzania kodu Java 8 (#1312).
- Upewnij się, że czas trwania przekazany do
MediaItem.Builder.setImageDurationMs()jest ignorowany w przypadku elementuMediaIteminnego niż obraz (zgodnie z dokumentacją). - Dodaj
Format.customData, aby przechowywać dostarczone przez aplikację niestandardowe informacje o instancjachFormat.
- Przekazywanie domniemanych wywołań funkcji seek bez operacji do chronionych metod
- ExoPlayer:
- Dodaj
BasePreloadManager, które koordynują wstępne wczytywanie wielu źródeł na podstawie priorytetów określonych przez ichrankingData. Dostosowywanie jest możliwe przez rozszerzenie tej klasy. DodajDefaultPreloadManager, które używaPreloadMediaSourcedo wstępnego wczytywania do pamięci próbek multimediów ze źródeł i używa liczby całkowitejrankingData, która wskazuje indeks elementu w interfejsie. - Dodaj
PlayerIddo większości metodLoadControl, aby umożliwić implementacjomLoadControlobsługę wielu graczy. - Usuń
Buffer.isDecodeOnly()iC.BUFFER_FLAG_DECODE_ONLY. Nie trzeba ustawiać tej flagi, ponieważ renderery i dekodery będą pomijać bufory na podstawie sygnatury czasowej. Niestandardowe implementacjeRendererpowinny sprawdzać, czy czas buforowania wynosi co najmniejBaseRenderer.getLastResetPositionUs(), aby określić, czy należy wyświetlić próbkę. Niestandardowe implementacjeSimpleDecodermogą w razie potrzeby sprawdzaćisAtLeastOutputStartTimeUs()inne bufory lub oznaczać je symbolemDecoderOutputBuffer.shouldBeSkipped, aby je pominąć. - Zezwól na zwracanie wartości null przez
TargetPreloadStatusControl.getTargetPreloadStatus(T), aby wskazać, że nie należy wstępnie wczytywać elementuMediaSourcez podanym elementemrankingData. - Dodano
remove(MediaSource)doBasePreloadManager. - Dodaj
reset()doBasePreloadManager, aby zwolnić wszystkie źródła wstrzymania, zachowując instancję menedżera wstępnego wczytywania. - Dodaj
ExoPlayer.setPriority()(iBuilder.setPriority()), aby zdefiniować wartość priorytetu używaną wPriorityTaskManageri w przypadku ważności MediaCodec od interfejsu API 35. - Rozwiązaliśmy problem z aktualizacją czasu ostatniego ponownego buforowania, który powodował nieprawidłowy klucz
bs(brak bufora) w CMCD (#1124). - Dodaj znak
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource), aby wskazać, że źródło zostało wczytane do końca. Umożliwia to implementacjomDefaultPreloadManageri niestandardowymPreloadMediaSource.PreloadControlwstępne wczytanie następnego źródła lub podjęcie innych działań. - Naprawiono błąd, który powodował, że pomijanie ciszy na końcu elementów mogło wywoływać wyjątek odtwarzania.
- Dodaj
cleardoPreloadMediaSource, aby odrzucić okres wstępnego wczytywania. - Dodaj nowy kod błędu
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, który jest używany w przypadku odzyskiwania zasobów kodeka na potrzeby zadań o wyższym priorytecie. - Zezwól na wczytywanie reklam przed filmem przed zakończeniem przygotowywania początkowych treści multimedialnych (#1358).
AdsMediaSource - Naprawiliśmy błąd polegający na tym, że odtwarzanie przenosiło się do
STATE_ENDEDpodczas ponownego przygotowywania transmisji na żywo DASH z wieloma okresami po usunięciu z pliku manifestu pierwotnego okresu. - Zmień nazwę
onTimelineRefreshed()naonSourcePrepared()ionPrepared()naonTracksSelected()wPreloadMediaSource.PreloadControl. Zmień też odpowiednio nazwy IntDefs wDefaultPreloadManager.Stage. - Dodano eksperymentalną obsługę dynamicznego planowania, aby lepiej dopasować pracę do cykli wybudzania procesora i opóźnić wybudzanie do momentu, w którym renderery mogą kontynuować działanie.
Możesz włączyć tę funkcję, używając
experimentalSetDynamicSchedulingEnabled()podczas konfigurowania instancji ExoPlayera. - Dodaj
Renderer.getDurationToProgressUs().Renderermoże zaimplementować tę metodę, aby zwrócić do ExoPlayera czas, o który odtwarzanie musi się przesunąć, aby renderowanie mogło się odbywać. JeśliExoPlayerjest ustawiony naexperimentalSetDynamicSchedulingEnabled(),ExoPlayerwywoła tę metodę podczas obliczania czasu zaplanowania zadania. - Dodaj
MediaCodecAdapter#OnBufferAvailableListener, aby otrzymywać alerty, gdy bufory wejściowe i wyjściowe są dostępne do użycia przezMediaCodecRenderer.MediaCodecRendererbędzie sygnalizowaćExoPlayer, gdy otrzyma te wywołania zwrotne, a jeśliExoPlayerjest ustawiony zexperimentalSetDynamicSchedulingEnabled(),ExoPlayerzaplanuje pętlę roboczą, ponieważ renderery mogą robić postępy. - Zamiast poszczególnych parametrów używaj klasy danych dla metod
LoadControl. - Dodaj
ExoPlayer.isReleased(), aby sprawdzić, czy wywołano funkcjęExoplayer.release(). - Dodaj
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs(), aby skonfigurować maksymalną pozycję, do którejseekToPrevious()szuka poprzedniego elementu (#1425). - Naprawiono niektóre niespójności związane z aktywnością audio, np. brak zgłaszania pełnej lub tymczasowej utraty aktywności audio, gdy odtwarzacz jest wstrzymany (#1436).
- Naprawiono potencjalne
IndexOutOfBoundsExceptionspowodowane przez ekstraktory zgłaszające dodatkowe ścieżki po początkowym etapie przygotowania (#1476). EffectswExoPlayer.setVideoEffect()otrzyma sygnatury czasowe z usuniętym przesunięciem renderowania (#1098).- Naprawiliśmy potencjalny problem z
IllegalArgumentExceptionpodczas obsługi błędu odtwarzacza, który wystąpił podczas odczytywania kolejnego elementu na playliście (#1483).
- Dodaj
- Transformer:
- Dodaj znaki
audioConversionProcessivideoConversionProcessdoExportResult, aby wskazać, jak powstała odpowiednia ścieżka w pliku wyjściowym. - Zrelaksuj sprawdzanie poziomu optymalizacji przycinania H.264.
- Dodaj obsługę przełączania między nośnikami wejściowymi SDR i HDR w sekwencji.
- Dodanie obsługi efektów audio na poziomie kompozycji.
- Dodaj obsługę transkodowania obrazów Ultra HDR na filmy HDR.
- Rozwiązaliśmy problem, który powodował, że po zresetowaniu i ponownym użyciu
DefaultAudioMixernie podawał prawidłowej liczby bajtów. - Obejście błędu dekodera, w którym liczba kanałów audio była ograniczona do stereo podczas obsługi danych wejściowych PCM.
- Podczas wybierania ścieżek w
ExoPlayerAssetLoaderzignoruj ograniczenia dotyczące liczby kanałów audio, ponieważ mają one zastosowanie tylko w przypadku odtwarzania. - Zastąp interfejs
androidx.media3.transformer.Muxerinterfejsemandroidx.media3.muxer.Muxeri usuńandroidx.media3.transformer.Muxer. - Naprawiono wczytywanie obrazów HEIC ze schematów identyfikatorów URI treści. (#1373).
- Dostosuj czas trwania ścieżki audio w
AudioGraphInput, aby poprawić synchronizację dźwięku i obrazu. - Usuń pole
ExportResult.processedInputs. Jeśli używasz tego pola do podawania szczegółów kodeka, użyj polaDefaultDecoderFactory.listener. W przypadku wyjątku kodeka szczegóły kodeka będą dostępne wExportException.codecInfo.
- Dodaj znaki
- Ekstraktory:
- MPEG-TS: wprowadź zmianę, upewniając się, że ostatnia klatka jest renderowana przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wprowadzono poprawki rozwiązujące problemy, które pojawiły się w strumieniach HLS zawierających tylko klatki I(#1150) i strumieniach HLS w formacie H.262 (#1126).
- MP3: preferuj rozmiar danych z ramki
Infozamiast rozmiaru podanego przez strumień bazowy (np. rozmiar pliku lub nagłówek HTTPContent-Length). Pomaga to wykluczyć dane z nieodtwarzalnych zwiastunów (np. okładki albumów) z obliczeń dotyczących wyszukiwania ze stałą szybkością transmisji, co zwiększa dokładność wyszukiwania (#1376). - MP3: używaj liczby klatek i innych danych z klatki
Info(jeśli występuje) do obliczania średniej szybkości transmisji bitów w przypadku wyszukiwania przy stałej szybkości transmisji bitów, zamiast ekstrapolować na podstawie szybkości transmisji bitów klatki po klatceInfo, która może być sztucznie mała, np. klatkaPCUT(#1376). - Poprawiono wyodrębnianie formatu audio PCM w kontenerach AVI.
- Dźwięk:
- Naprawiono atrybuty kodowania DTS:X Profile 2 w przypadku odtwarzania passthrough (#1299).
- W przypadku odtwarzania przeniesionego zresetuj pole śledzenia zakończenia strumienia w
DefaultAudioSinkprzed wywołaniemAudioTrack.stop(), abyAudioTrack.StreamEventCallback#onPresentationEndedprawidłowo określał, kiedy wszystkie oczekujące dane zostały odtworzone. - Rozwiązaliśmy błąd w
SilenceSkippingAudioProcessor, w którym przejścia między różnymi formatami audio (np. stereo na mono) mogą powodować zgłaszanie wyjątku przez procesor (#1352). - Zaimplementuj
MediaCodecAudioRenderer.getDurationToProgressUs(), aby odtwarzacz ExoPlayer dynamicznie planował główną pętlę roboczą na czas, w którym komponent MediaCodecAudioRenderer może kontynuować działanie.
- Film:
- Rozwiązanie problemu polegającego na tym, że
Listener.onRenderedFirstFrame()pojawia się zbyt wcześnie podczas przełączania urządzeń w trakcie odtwarzania. - Poprawiono logikę rezerwową dekodera Dolby Vision, aby w razie potrzeby używać zgodnego dekodera AV1 (#1389).
- Rozwiązanie problemu z wyjątkiem kodeka, który może być spowodowany włączeniem renderowania wideo w trakcie odtwarzania.
- Rozwiązanie problemu polegającego na tym, że
- Tekst:
- Rozwiązaliśmy problem, który powodował pomijanie napisów rozpoczynających się przed pozycją wyszukiwania. Ten problem pojawił się dopiero w Media3 w wersji 1.4.0-alpha01.
- Zmień domyślne działanie analizowania napisów, aby odbywało się podczas wyodrębniania, a nie podczas renderowania (różnicę między wyodrębnianiem a renderowaniem znajdziesz na diagramie architektury ExoPlayera).
- Tę zmianę można zastąpić, wywołując obie funkcje:
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)TextRenderer.experimentalSetLegacyDecodingEnabled(true). Informacje o tym, jak zintegrować te komponenty z instancjąExoPlayer, znajdziesz w dokumentacji dotyczącej dostosowywania. Te metody (i cała obsługa starszego dekodowania napisów) zostaną usunięte w przyszłej wersji. - Aplikacje z niestandardowymi implementacjami
SubtitleDecodermuszą je zaktualizować, aby zamiast nich implementowaćSubtitleParser(aSubtitleParser.FactoryzamiastSubtitleDecoderFactory).
- Tę zmianę można zastąpić, wywołując obie funkcje:
- PGS: poprawiono dekodowanie długości serii, aby rozwiązać problem z
0jako indeksem koloru zamiast dosłownej wartości koloru (#1367). - CEA-708: ignoruj wartość
rowLock. Specyfikacja CEA-708-E S-2023 mówi, że zarównorowLock, jak icolumnLockpowinny być uznawane za prawdziwe, niezależnie od wartości w strumieniu (obsługacolumnLocknie jest zaimplementowana, więc w praktyce zawsze przyjmuje się wartość fałsz).- Ta informacja była pierwotnie zawarta w informacjach o wersji
1.3.0-alpha01, ale zmiana została przypadkowo cofnięta przed wydaniem wersji1.3.0-rc01. Problem został już rozwiązany, więc zmiana jest ponownie widoczna.
- Ta informacja była pierwotnie zawarta w informacjach o wersji
- CEA-708: unikaj dodawania duplikatów znaków nowego wiersza przez naiwne przetwarzanie polecenia „set pen location” w ExoPlayerze (#1315).
- Naprawiono błąd
IllegalArgumentExceptionzLegacySubtitleUtil, gdy przykładowy plik napisów WebVTT nie zawierał wskazówek, np. w ramach strumienia DASH (#1516).
- Metadane:
- Popraw mapowanie MP4 na tagi sortowania ID3. Wcześniej tagi MP4 „album sort” (
soal), „artist sort” (soar) i „album artist sort” (soaa) były nieprawidłowo mapowane na tagi ID3TSO2,TSOAiTSOP(#1302). - Poprawiono odczyt tagów numerycznych
gnre(gatunek) itmpo(tempo) w plikach MP4 (/iTunes), gdy wartość ma więcej niż 1 bajt. - Przekazywanie ramki ID3
TCONdoMediaMetadata.genre(#1305).
- Popraw mapowanie MP4 na tagi sortowania ID3. Wcześniej tagi MP4 „album sort” (
- Obraz:
- Dodano obsługę nieskwadratowych siatek miniatur DASH (#1300).
- Dodanie obsługi formatu AVIF w przypadku interfejsu API w wersji 34 lub nowszej.
- Zezwól na
nulljako parametr dlaExoPlayer.setImageOutput(), aby wyczyścić wcześniej ustawioną wartośćImageOutput.
- DataSource:
- Zaimplementuj obsługę identyfikatorów URI zasobów niezdefiniowanych
android.resource://package/id, gdziepackagejest inny niż pakiet bieżącej aplikacji. Nie było to wcześniej udokumentowane, ale jest to bardziej wydajny sposób uzyskiwania dostępu do zasobów w innym pakiecie niż za pomocą nazwy. - Sprawdź, czy
urlnie ma wartości null w konstruktorachDataSpec. Ten parametr został już oznaczony jako niepusty. - Umożliwia
ByteArrayDataSourceprzekształcanie identyfikatora URI w tablicę bajtów podczasopen()zamiast zakodowania na stałe w konstrukcji (#1405).
- Zaimplementuj obsługę identyfikatorów URI zasobów niezdefiniowanych
- DRM:
- Zezwalaj na ustawienie
LoadErrorHandlingPolicywDefaultDrmSessionManagerProvider(#1271).
- Zezwalaj na ustawienie
- Skutek:
- Obsługa wielu zmian szybkości w ramach tego samego
EditedMediaItemlubCompositionwSpeedChangeEffect. - Obsługa danych wyjściowych HLG i PQ z wejściowych map bitowych ultra HDR.
- Dodaliśmy obsługę EGL_GL_COLORSPACE_BT2020_HLG_EXT, co poprawia dane wyjściowe HLG w przypadku powierzchni w funkcjach ExoPlayer.setVideoEffect i Transformer.Debug SurfaceView.
- Zaktualizuj implementację macierzy nakładki, aby była zgodna z dokumentacją, zamieniając wartości x i y zastosowane w
setOverlayFrameAnchor(). Jeśli używaszOverlaySettings.Builder.setOverlayFrameAnchor(), zamień wartości x i y, mnożąc je przez-1. - Naprawiono błąd, w którym
TimestampWrapperulegał awarii podczas używania zExoPlayer#setVideoEffects(#821). - Zmień domyślną przestrzeń roboczą kolorów SDR z kolorów liniowych na elektryczne wideo SDR BT.709. Podaj też trzecią opcję, aby zachować oryginalną przestrzeń kolorów.
- Zezwól na definiowanie nieokreślonej kolejności osi Z w przypadku EditedMediaItemSequences (#1055).
- Zachowaj spójny zakres luminancji w różnych treściach HDR (korzysta z zakresu HLG).
- Dodaj obsługę nakładek Ultra HDR (bitmap) na treści HDR.
- Zezwalaj na używanie efektów
SeparableConvolutionprzed API 26. - Usuń nieużywane
OverlaySettings.useHdr, ponieważ zakres dynamiczny nakładki i ramki musi być zgodny. - Dodaliśmy obsługę HDR w przypadku
TextOverlay. Jasność nakładki tekstowej można dostosować za pomocą parametruOverlaySettings.Builder.setHdrLuminanceMultiplier().
- Obsługa wielu zmian szybkości w ramach tego samego
- Rozszerzenie IMA:
- Promowanie interfejsu API wymaganego do odtwarzania w aplikacjach strumieni reklam DAI do wersji stabilnej.
- Dodaj
replaceAdTagParameters(Map <String, String>)doImaServerSideAdInsertionMediaSource.AdLoader, co umożliwia zastępowanie parametrów tagu reklamy w czasie działania. - Naprawiono błąd polegający na tym, że funkcja
VideoAdPlayer.VideoAdPlayerCallback.onError()nie była wywoływana, gdy podczas odtwarzania reklamy wystąpił błąd odtwarzacza (#1334). - Zaktualizowano pakiet IMA SDK do wersji 3.33.0, aby naprawić
NullPointerExceptionpodczas korzystania zdata://adresów URI tagów reklam(#700).
- Sesja:
- Zmień domyślną wartość
CommandButton.enablednatruei upewnij się, że wartość może pozostać fałszywa w przypadku kontrolerów, nawet jeśli powiązane polecenie jest dostępne. - Dodaj stałe wartości ikon dla
CommandButton, które mają być używane zamiast niestandardowych zasobów ikon. - Dodaj
MediaSessionService.isPlaybackOngoing(), aby umożliwić aplikacjom sprawdzanie, czy usługa musi zostać zatrzymana wonTaskRemoved()(#1219). - Dodaj
MediaSessionService.pauseAllPlayersAndStopSelf(), który wygodnie umożliwia wstrzymanie odtwarzania wszystkich sesji i wywołaniestopSelf()w celu zakończenia cyklu życiaMediaSessionService. - Zastąp
MediaSessionService.onTaskRemoved(Intent), aby zapewnić bezpieczną domyślną implementację, która utrzymuje usługę działającą na pierwszym planie, jeśli odtwarzanie jest w toku, lub zatrzymuje usługę w innych przypadkach. - Ukrywanie paska przewijania w powiadomieniu o multimediach w przypadku transmisji na żywo przez nieustawianie czasu trwania w metadanych sesji platformy (#1256).
- Dopasuj konwersję
MediaMetadatadoMediaDescriptionCompat, aby używać tej samej preferowanej kolejności i logiki podczas wybierania właściwości metadanych co w przypadku media1. - Dodano
MediaSession.sendError(), który umożliwia wysyłanie błędów niekrytycznych do kontrolera Media3. Gdy używasz kontrolera powiadomień (patrzMediaSession.getMediaNotificationControllerInfo()), błąd niestandardowy służy do aktualizowania wartościPlaybackStatesesji platformy do stanu błędu z podanymi informacjami o błędzie (#543). - Dodaj
MediaSession.Callback.onPlayerInteractionFinished(), aby informować sesje, gdy zakończy się seria interakcji gracza z określonym kontrolerem. - Dodaj
SessionErrori użyj go wSessionResultiLibraryResultzamiast kodu błędu, aby przekazać więcej informacji o błędzie i sposobie jego rozwiązania, jeśli to możliwe. - Opublikuj kod aplikacji testowej kontrolera Media3, której można używać do testowania interakcji z aplikacjami publikującymi sesję multimedialną.
- Przekazywanie dodatkowych informacji przekazywanych do
MediaSession[Builder].setSessionExtras()Media3 doPlaybackStateCompat.getExtras()kontrolera Media1. - Mapuj błędy krytyczne i niekrytyczne na sesję platformy i z niej. A
PlaybackExceptionjest mapowany na stan błędu krytycznegoPlaybackStateCompat. WartośćSessionErrorwysłana do kontrolera powiadomień o multimediach z wartościąMediaSession.sendError(ControllerInfo, SessionError)jest mapowana na błąd niekrytyczny wPlaybackStateCompat, co oznacza, że kod błędu i komunikat są ustawione, ale stan sesji platformy pozostaje inny niżSTATE_ERROR. - Zezwól na ustawianie aktywności sesji dla każdego kontrolera, aby zastąpić globalną aktywność sesji. Aktywność sesji można zdefiniować dla kontrolera w momencie połączenia, tworząc obiekt
ConnectionResultz parametremAcceptedResultBuilder.setSessionActivivty(PendingIntent). Po nawiązaniu połączenia aktywność sesji można aktualizować za pomocąMediaSession.setSessionActivity(ControllerInfo, PendingIntent). - Ulepszono replikację błędów wywołań funkcji
MediaLibrarySession.Callback. Replikację błędów można teraz skonfigurować za pomocą znakuMediaLibrarySession.Builder.setLibraryErrorReplicationMode(), aby wybrać typ błędu lub zrezygnować z replikacji błędów, która jest domyślnie włączona.
- Zmień domyślną wartość
- UI:
- Dodanie obsługi wyświetlania obrazów w
PlayerViewpo podłączeniu doExoPlayer(#1144). - Dodanie możliwości dostosowywania różnych ikon w
PlayerControlViewza pomocą atrybutów XML, aby umożliwić stosowanie różnych elementów rysowalnych w każdym wystąpieniuPlayerView, zamiast globalnych zastąpień (#1200). - Obejście błędu platformy powodującego rozciągnięcie lub przycięcie filmu podczas używania elementu
SurfaceVieww komponowanym elemencieAndroidViewna API 34 (#1237).
- Dodanie obsługi wyświetlania obrazów w
- Pobrane:
- Upewnij się, że
DownloadHelpernie powoduje wycieku nieopublikowanych instancjiRenderer, co może ostatecznie doprowadzić do awarii aplikacji z błędemIllegalStateException: Too many receivers, total of 1000, registered for pid(#1224).
- Upewnij się, że
- Rozszerzenie Cronet:
- Rozwiąż problem
SocketTimeoutExceptionw usłudzeCronetDataSource. W niektórych wersjach Croneta żądanie przekazywane przez wywołanie zwrotne nie zawsze jest takie samo. Powoduje to, że wywołanie zwrotne nie jest wykonywane, a żądanie przekracza limit czasu (https://issuetracker.google.com/328442628).
- Rozwiąż problem
- Rozszerzenie HLS:
- Naprawiliśmy błąd, który powodował, że oczekujące próbki EMSG czekające na przerwę były delegowane w
HlsSampleStreamWrapperz nieprawidłowym przesunięciem, co powodowało błądIndexOutOfBoundsExceptionlubIllegalArgumentException(#1002). - Usunięto błąd, który powodował, że playlisty inne niż główne były ciągle przeładowywane w przypadku strumieni LL-HLS (#1240).
- Rozwiązanie problemu polegającego na tym, że włączenie CMCD w przypadku HLS z segmentami inicjującymi powodowało błędy
Source ErroriIllegalArgumentException. - Usunięto błąd, który powodował, że playlisty niebędące głównymi nie były odświeżane podczas odtwarzania na żywo (#1240).
- Naprawiono błąd, w którym włączenie CMCD w przypadku transmisji na żywo HLS powodowało
ArrayIndexOutOfBoundsException(#1395).
- Naprawiliśmy błąd, który powodował, że oczekujące próbki EMSG czekające na przerwę były delegowane w
- Rozszerzenie DASH:
- Rozszerzenie Cast:
- Naprawiono błąd, który powodował, że tytuł albumu
MediaQueueItembył konwertowany na nazwę wykonawcy w elemencie multimedialnym Media3 (#1255).
- Naprawiono błąd, który powodował, że tytuł albumu
- Narzędzia testowe:
- Zaimplementuj funkcje
onInit()ionRelease()w usłudzeFakeRenderer. - Zmień metody
TestPlayerRunHelper.runUntil()/playUntil(), aby w przypadku błędów niekrytycznych (np. zgłaszanych doAnalyticsListener.onVideoCodecError()) zwracały błąd. Aby wyłączyć to działanie, użyj nowego łańcucha metodTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX().
- Zaimplementuj funkcje
- Aplikacja w wersji demonstracyjnej:
- Użyj
DefaultPreloadManagerw aplikacji w wersji demonstracyjnej z krótkimi formami. - Umożliwia ustawienie trybu powtarzania za pomocą argumentów
Intentz wiersza poleceń (#1266). - Używać
HttpEngineDataSourcejakoHttpDataSource, jeśli jest to obsługiwane przez urządzenie.
- Użyj
- Usuń symbole, które nie są już używane:
- Usuń
CronetDataSourceFactory. Zamiast niej użyj zasadyCronetDataSource.Factory. - Usuń niektóre konstruktory
DataSpec. Zamiast niej używaj zasadyDataSpec.Builder. - Usuń formę płatności
setContentTypePredicate(Predicate)z usługDefaultHttpDataSource,OkHttpDataSourceiCronetDataSource. Zamiast tego użyj odpowiedniej metody na każdej platformieXXXDataSource.Factory. - Usuń konstruktory
OkHttpDataSourceiOkHttpDataSourceFactory. Zamiast niej używaj zasadyOkHttpDataSource.Factory. - Usuń
PlayerMessage.setHandler(Handler). Zamiast niej użyj zasadysetLooper(Looper). - Usuń pole
Timeline.Window.isLive. Zamiast tego użyj metodyisLive(). - Usuń konstruktory
DefaultHttpDataSource. Zamiast niej używaj zasadyDefaultHttpDataSource.Factory. - Usuń
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Zamiast niej używaj zasadyDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS. - Usuń
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Zamiast niej używaj zasadyMediaCodecInfo.canReuseCodec(Format, Format). - Usuń metodę
DrmSessionManager.DUMMYigetDummyDrmSessionManager(). Zamiast niej używaj zasadyDrmSessionManager.DRM_UNSUPPORTED. - Usuń:
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format),AnalyticsListener.onVideoInputFormatChanged(EventTime, Format),AudioRendererEventListener.onAudioInputFormatChanged(Format),VideoRendererEventListener.onVideoInputFormatChanged(Format). Zamiast tego użyj przeciążeń, które przyjmują argumentDecoderReuseEvaluation. - Usuń stałe
RendererSupport.FormatSupportIntDef iFORMAT_HANDLED,FORMAT_EXCEEDS_CAPABILITIES,FORMAT_UNSUPPORTED_DRM,FORMAT_UNSUPPORTED_SUBTYPE,FORMAT_UNSUPPORTED_TYPE. Zamiast niego używaj odpowiedniego IntDef i stałych wandroidx.media3.common.C(np.C.FORMAT_HANDLED). - Usuń interfejs
Bundleable. Obejmuje to usunięcie wszystkich pól stałychBundleable.Creator<Foo> CREATOR. Zamiast tego wywołujący powinni używać metodBundle toBundle()istatic Foo fromBundle(Bundle)w przypadku każdego typu.
- Usuń
Wersja 1.4.0-rc01
10 lipca 2024 r.
Używaj stabilnej wersji 1.4.0.
Wersja 1.4.0-beta01
26 czerwca 2024 r.
Używaj stabilnej wersji 1.4.0.
Wersja 1.4.0-alpha02
7 czerwca 2024 r.
Używaj stabilnej wersji 1.4.0.
Wersja 1.4.0-alpha01
17 kwietnia 2024 r.
Używaj stabilnej wersji 1.4.0.
Wersja 1.3.0
Wersja 1.3.1
11 kwietnia 2024 r.
Publikacja androidx.media3:media3-*:1.3.1 Wersja 1.3.1 zawiera te zmiany.
- Biblioteka wspólna:
- Dodaj
Format.labels, aby zezwolić na zlokalizowane lub inne alternatywne etykiety.
- Dodaj
- ExoPlayer:
- Rozwiązaliśmy problem polegający na tym, że
PreloadMediaPeriodnie może zachować strumieni, gdy jest ponownie wstępnie wczytywany. - Zastosuj odpowiedni atrybut
TrackSelectionResultdo okresu odtwarzania podczas ponownego wyboru ścieżki. - Rozpoczynanie renderowania z wyprzedzeniem dopiero po przesunięciu okresu odtwarzania podczas przechodzenia między elementami multimedialnymi (#1017).
- Dodanie brakującego typu zwracanego do reguły ProGuard
-keepclasseswithmembersdlaDefaultVideoFrameProcessor.Factory.Builder.build()(#1187).
- Rozwiązaliśmy problem polegający na tym, że
- Transformer:
- Dodano obejście wyjątku zgłaszanego z powodu braku obsługi
MediaMuxerujemnych sygnatur czasowych prezentacji przed API 30.
- Dodano obejście wyjątku zgłaszanego z powodu braku obsługi
- Wybór ścieżki:
DefaultTrackSelector: preferuj ścieżki wideo z „rozsądną” liczbą klatek na sekundę (≥10 klatek na sekundę) od tych z niższą lub nieustawioną liczbą klatek na sekundę. Dzięki temu odtwarzacz wybierze „prawdziwą” ścieżkę wideo w plikach MP4 wyodrębnionych z ruchomych zdjęć, które mogą zawierać 2 ścieżki HEVC, z których jedna ma wyższą rozdzielczość, ale bardzo małą liczbę klatek (#1051).
- Ekstraktory:
- Rozwiązaliśmy problem polegający na tym, że podczas odczytywania nieparzystych fragmentów z plików WAV nie pomijano dopełnienia (#1117).
- MP3: wypełnij
Format.averageBitratena podstawie ramek metadanych, takich jakXINGiVBRI. - MPEG-TS: wycofanie zmiany, która miała zapewnić renderowanie ostatniej klatki przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wynika to ze zmiany, która powoduje nowe problemy ze strumieniami HLS zawierającymi tylko klatki I (#1150) i strumieniami HLS H.262 (#1126).
- Dźwięk:
- Zezwól na przywrócenie mechanizmu renderowania przez wyłączenie odciążania, jeśli nie uda się zainicjować ścieżki audio w trybie odciążania.
- Film:
- Dodano obejście problemu z urządzeniami Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie H265 o częstotliwości 60 klatek na sekundę są oznaczane jako nieobsługiwane.
- Dodano obejście, które zapewnia, że pierwsza klatka jest zawsze renderowana podczas tunelowania, nawet jeśli urządzenie nie robi tego automatycznie, jak wymaga tego interfejs API (#1169). (#966).
- Rozwiązano problem z obsługą informacji o kolorach HDR, która powodowała nieprawidłowe działanie kodeka i uniemożliwiała adaptacyjne przełączanie formatów w przypadku ścieżek wideo SDR (#1158).
- Tekst:
- WebVTT: zapobieganie tworzeniu fałszywych dodatkowych instancji
CuesWithTimingzWebvttParser.parseprzez bezpośrednio następujące po sobie wskazówki (#1177).
- WebVTT: zapobieganie tworzeniu fałszywych dodatkowych instancji
- DRM:
- Obejście problemu z błędem
NoSuchMethodError, który może być zgłaszany przezMediaDrmframework zamiastResourceBusyExceptionlubNotProvisionedExceptionna niektórych urządzeniach z Androidem 14 (#1145).
- Obejście problemu z błędem
- Skutek:
- Ulepszone mapowanie tonów PQ na SDR dzięki konwersji przestrzeni kolorów.
- Sesja:
- UI:
- W przypadku, gdy
Localenie może zidentyfikować nazwy wyświetlanej (#988), użyj nazwy języka ścieżki audio.
- W przypadku, gdy
- Rozszerzenie DASH:
- Wypełnij wszystkie elementy
Labelz pliku manifestu wFormat.labels(#1054).
- Wypełnij wszystkie elementy
- Rozszerzenie RTSP:
- Pomijanie pustych wartości informacji o sesji (i-tagów) podczas analizowania SDP (#1087).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Domyślnie wyłącz rozszerzenie MIDI jako zależność lokalną, ponieważ wymaga ono skonfigurowania dodatkowego repozytorium Maven. Użytkownicy, którzy potrzebują tego modułu z lokalnej zależności, mogą go ponownie włączyć.
Wersja 1.3.0
6 marca 2024 roku
Publikacja androidx.media3:media3-*:1.3.0 Wersja 1.3.0 zawiera te zmiany.
- Biblioteka wspólna:
- Wprowadź obsługę identyfikatorów URI surowych zasobów
android.resource://package/[type/]name, w którychpackageróżni się od pakietu bieżącej aplikacji. Zawsze było to udokumentowane jako działające, ale do tej pory nie było prawidłowo zaimplementowane. - Normalizuj typy MIME ustawione przez kod aplikacji lub odczytane z multimediów, aby były w całości zapisane małymi literami.
- Określaj reklamy za pomocą pełnego adresu
MediaItemzamiast pojedynczego adresuUriw poluAdPlaybackState. - Zwiększ wartość
minSdkdo 19 (Android KitKat). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX i jest wymagane, abyśmy mogli uaktualnić nasze zależności AndroidX do najnowszych wersji. - Wypełnij zarówno pole
artworkUri, jak iartworkDataw elemencieMediaMetadata.Builder.populate(MediaMetadata), jeśli co najmniej jedno z nich nie ma wartości null (#964).
- Wprowadź obsługę identyfikatorów URI surowych zasobów
- ExoPlayer:
- Dodaj
PreloadMediaSourceiPreloadMediaPeriod, które umożliwiają aplikacjom wstępne wczytywanie źródła treści multimedialnych w określonej pozycji początkowej przed odtwarzaniem.PreloadMediaSourceprzygotowuje źródło multimediów do otrzymaniaTimeline, przygotowuje i buforuje okres w podanej pozycji początkowej, wybiera ścieżki i wczytuje dane multimedialne dla tego okresu. Aplikacje kontrolują postęp wstępnego wczytywania, implementującPreloadMediaSource.PreloadControl, i ustawiają wstępnie wczytane źródło w odtwarzaczu do odtwarzania. - Dodaj
ExoPlayer.setImageOutput, które umożliwia aplikacjom ustawianieImageRenderer.ImageOutput. DefaultRenderersFactorydomyślnie udostępniaImageRenderergraczowi z wartościami nullImageOutputiImageDecoder.Factory.DEFAULT.- Emituj zdarzenie
Player.Listener.onPositionDiscontinuity, gdy pominięto ciszę (#765). - Dodano eksperymentalną obsługę analizowania napisów podczas wyodrębniania. Możesz włączyć tę funkcję za pomocą
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(). - Obsługa adaptacyjnych źródeł multimediów za pomocą
PreloadMediaSource. - Zaimplementuj
HttpEngineDataSource, czyliHttpDataSource, korzystając z interfejsu HttpEngine API. - Zapobiegaj tworzeniu podklas
CompositeSequenceableLoader. Ten komponent był wcześniej rozszerzalny, ale nigdy nie został w bibliotece podzielony na podklasy. Dostosowywanie można przeprowadzić, opakowując instancję za pomocą wzorca dekoratora i wdrażając niestandardowyCompositeSequenceableLoaderFactory. - Rozwiązaliśmy problem polegający na tym, że powtórzenie tego samego czasu powodowało wyczyszczenie metadanych tego elementu (#1007).
- Zmiana nazwy metod
experimentalSetSubtitleParserFactorynaBundledChunkExtractor.FactoryiDefaultHlsExtractorFactorynasetSubtitleParserFactoryoraz zablokowanie przekazywanianull. Użyj nowych metodexperimentalParseSubtitlesDuringExtraction(boolean), aby kontrolować zachowanie analizowania. - Dodano obsługę dostosowywania znaku
SubtitleParser.Factoryużywanego podczas wyodrębniania. Można to osiągnąć za pomocąMediaSource.Factory.setSubtitleParserFactory(). - Dodaj prefiks źródła do wszystkich pól
Format.idwygenerowanych zMergingMediaSource. Pomaga to określić, które źródło wygenerowałoFormat(#883). - Poprawiono wyrażenie regularne używane do weryfikacji niestandardowych nazw kluczy danych klienta Common Media Client Data (CMCD) poprzez zmodyfikowanie go tak, aby sprawdzało tylko łącznik (#1028).
- Zapobiegaj podwójnemu kodowaniu parametrów zapytania CMCD (#1075).
- Dodaj
- Transformer:
- Dodano obsługę spłaszczania filmów w zwolnionym tempie w formacie H.265/HEVC SEF.
- Zwiększenie szybkości transkodowania, zwłaszcza w przypadku zmian typu „usuń film”.
- Dodaj interfejs API, aby mieć pewność, że plik wyjściowy zaczyna się od klatki wideo. Może to zwiększyć zgodność wyników operacji przycinania z implementacjami odtwarzaczy, które nie wyświetlają pierwszej klatki filmu, dopóki nie zostanie osiągnięta sygnatura czasowa prezentacji (#829).
- Dodano obsługę optymalizacji operacji przycinania pojedynczych zasobów MP4.
- Dodaliśmy obsługę, aby zapewnić, że klatka wideo ma pierwszą sygnaturę czasową w pliku wyjściowym. Poprawiono pliki wyjściowe zaczynające się od czarnej ramki na odtwarzaczach opartych na iOS (#829).
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.selectImageTrack, aby włączyć wybieranie ścieżki obrazu. - Dodaj
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled, aby określić, czy wybrać ścieżkę obrazu, jeśli dostępne są zarówno ścieżka obrazu, jak i ścieżka wideo. Wartością domyślną jestfalse, co oznacza, że priorytetem jest wybór ścieżki wideo.
- Dodaj
- Ekstraktory:
- Dodano do ekstraktora MP4 dodatkowe parsowanie AV1C, aby pobierać wartości
ColorInfo.colorSpace,ColorInfo.colorTransferiColorInfo.colorRange(#692). - MP3: używaj wyszukiwania ze stałą szybkością transmisji (CBR) w przypadku plików z nagłówkiem
Info(odpowiednik nagłówkaXingw przypadku CBR). Wcześniej używaliśmy tabeli seek z nagłówkaInfo, ale powoduje to mniej precyzyjne przewijanie niż w przypadku, gdy ją ignorujemy i zakładamy, że plik jest CBR. - MPEG2-TS: dodano obsługę DTS, DTS-LBR i DTS:X Profile2 (#275).
- Wyodrębnianie typów audio z deskryptorów TS i mapowanie ich na flagi ról, co pozwala użytkownikom podejmować bardziej świadome decyzje dotyczące wyboru ścieżki audio (#973).
- Dodano do ekstraktora MP4 dodatkowe parsowanie AV1C, aby pobierać wartości
- Dźwięk:
- Film:
- Zmień konstruktor
MediaCodecVideoRenderer, który przyjmuje argumentVideoFrameProcessor.Factory, i zastąp go konstruktorem, który przyjmuje argumentVideoSinkProvider. Aplikacje, które chcą wstrzyknąć niestandardowy elementVideoFrameProcessor.Factory, mogą utworzyć instancję elementuCompositingVideoSinkProvider, który używa niestandardowego elementuVideoFrameProcessor.Factory, i przekazać dostawcę ujścia wideo do elementuMediaCodecVideoRenderer.
- Zmień konstruktor
- Tekst:
- Naprawiono serializację wskazówek bitmapowych, aby rozwiązać błąd
Tried to marshall a Parcel that contained Binder objectspodczas korzystania zDefaultExtractorsFactory.setTextTrackTranscodingEnabled(#836). - CEA-708: ignoruj wartość
rowLock. Specyfikacja CEA-708-E S-2023 mówi, że zarównorowLock, jak icolumnLockpowinny być uznawane za prawdziwe, niezależnie od wartości w strumieniu (obsługacolumnLocknie jest zaimplementowana, więc w praktyce zawsze przyjmuje się wartość fałsz).
- Naprawiono serializację wskazówek bitmapowych, aby rozwiązać błąd
- Obraz:
- Dodaliśmy obsługę miniatur DASH. Obrazy w siatce są przycinane, a poszczególne miniatury są udostępniane
ImageOutputw pobliżu czasu ich wyświetlania.
- Dodaliśmy obsługę miniatur DASH. Obrazy w siatce są przycinane, a poszczególne miniatury są udostępniane
- DRM:
- Odtwarzaj od razu niezaszyfrowane próbki „clear lead” w treściach z DRM, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to prowadzić do zatrzymania odtwarzania w trakcie, jeśli klucze nie będą jeszcze gotowe, gdy pozycja odtwarzania osiągnie zaszyfrowane próbki (ale wcześniej odtwarzanie w tym momencie w ogóle by się nie rozpoczęło). To zachowanie można wyłączyć za pomocą polecenia
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKeylubDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.- Rozszerzenie IMA:
- Rozwiązanie problemu polegającego na tym, że nie można odtwarzać reklam DASH i HLS bez odpowiedniego rozszerzenia pliku.
- Odtwarzaj od razu niezaszyfrowane próbki „clear lead” w treściach z DRM, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to prowadzić do zatrzymania odtwarzania w trakcie, jeśli klucze nie będą jeszcze gotowe, gdy pozycja odtwarzania osiągnie zaszyfrowane próbki (ale wcześniej odtwarzanie w tym momencie w ogóle by się nie rozpoczęło). To zachowanie można wyłączyć za pomocą polecenia
- Sesja:
- Wyłącz wykrywanie dwukrotnego kliknięcia w aplikacjach na telewizory (#962).
- Rozwiązaliśmy problem polegający na tym, że
MediaItem.RequestMetadataz niepustymi dodatkami nie jest przesyłany między kontrolerami multimediów a sesjami. - Dodaj konstruktor do
MediaLibrarySession.Builder, który przyjmuje tylko argumentContextzamiastMediaLibraryService.
- Rozszerzenie HLS:
- Zmniejsz widoczność
HlsMediaPerioddo poziomu widoczności prywatnej w pakiecie. Ten typ nie powinien być bezpośrednio zależny od elementów spoza pakietu HLS. - Rozwiązanie problemu z efektywniejszym wyszukiwaniem początku segmentu (#1031).
- Zmniejsz widoczność
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Dekoder MIDI: ignoruj komunikaty zdarzeń SysEx (#710).
- Narzędzia testowe:
- Nie wstrzymuj odtwarzania w
TestPlayerRunHelper.playUntilPosition. Test utrzymuje odtwarzanie w stanie odtwarzania, ale wstrzymuje postęp, dopóki nie będzie w stanie dodać asercji i dalszych działań.
- Nie wstrzymuj odtwarzania w
- Aplikacja w wersji demonstracyjnej:
- Dodaj moduł demonstracyjny krótkich form, aby zademonstrować użycie elementu
PreloadMediaSourcew przypadku krótkich treści.
- Dodaj moduł demonstracyjny krótkich form, aby zademonstrować użycie elementu
Wersja 1.3.0-rc01
22 lutego 2024 r.
Używaj stabilnej wersji 1.3.0.
Wersja 1.3.0-beta01
7 lutego 2024 r.
Używaj stabilnej wersji 1.3.0.
Wersja 1.3.0-alpha01
15 stycznia 2024 r.
Użyj stabilnej wersji 1.3.0.
Wersja 1.2.0
Wersja 1.2.1
9 stycznia 2024 r.
- ExoPlayer:
- Rozwiązaliśmy problem, który powodował, że ręczne przewijanie poza zakresem
LiveConfiguration.min/maxOffsetstale dostosowywało przesunięcie z powrotem domin/maxOffset. - Naprawiono problem z nieprawidłowym układem kanałów OPUS i VORBIS w przypadku 3, 5, 6, 7 i 8 kanałów (#8396).
- Rozwiązaliśmy problem polegający na tym, że po przewinięciu transmisji na żywo do początku wybór ścieżki powodował nieprawidłowe rozpoczęcie transmisji w domyślnej pozycji (#9347).
- Rozwiązaliśmy problem, w którym nowe instancje
CmcdData.Factoryotrzymywały ujemne wartościbufferedDurationUsze źródeł fragmentów, co powodowało błądIllegalArgumentException(#888).
- Rozwiązaliśmy problem, który powodował, że ręczne przewijanie poza zakresem
- Transformer:
- Rozwiązaliśmy problem, który powodował, że koder zgłaszał błąd podczas konfiguracji z powodu ustawienia wysokiej szybkości działania.
- Ekstraktory:
- Oznacz dodatkowe (nieodtwarzalne) ścieżki HEVC w zdjęciach w ruchu JPEG jako
ROLE_FLAG_ALTERNATE, aby zapobiec ich automatycznemu wybieraniu do odtwarzania ze względu na wyższą rozdzielczość. - Poprawiono nieprawidłowe wykrywanie klatek kluczowych w strumieniach TS H264 (#864).
- Poprawiono szacowanie czasu trwania strumieni TS dłuższych niż 47721 sekund (#855).
- Oznacz dodatkowe (nieodtwarzalne) ścieżki HEVC w zdjęciach w ruchu JPEG jako
- Dźwięk:
- Poprawiono obsługę EOS w przypadku wywoływania
SilenceSkippingAudioProcessorwiele razy (#712).
- Poprawiono obsługę EOS w przypadku wywoływania
- Film:
- Dodano obejście problemu z urządzeniami Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC o częstotliwości 60 kl./s są oznaczane jako nieobsługiwane (#693).
- Metadane:
- Naprawiono błąd, w którym pole
MediaMetadatabyło wypełniane tylko na podstawie komentarzy Vorbis z kluczami pisanymi wielkimi literami (#876). - Poprawka
OutOfMemoryErrorpodczas analizowania bardzo dużych ramek ID3, co oznacza, że odtwarzanie może być kontynuowane bez informacji o tagu, zamiast całkowicie się nie powieść.
- Naprawiono błąd, w którym pole
- DRM:
- Rozszerzyliśmy obejście problemu z fałszywym adresem URL licencji ClearKey
https://default.urlna interfejs API w wersji 33 lub nowszej (wcześniej obejście dotyczyło tylko interfejsu API w wersji 33) (#837). - Naprawiono
ERROR_DRM_SESSION_NOT_OPENEDpodczas przełączania z zaszyfrowanych na niezabezpieczone treści bez powierzchni dołączonej do odtwarzacza. Błąd wystąpił z powodu nieprawidłowego użycia bezpiecznego dekodera do odtwarzania treści w formie niezaszyfrowanej.
- Rozszerzyliśmy obejście problemu z fałszywym adresem URL licencji ClearKey
- Sesja:
- Umieść klucze i wartości niestandardowe w
MediaMetadataCompattoMediaMetadata.extrasiMediaMetadata.extrastoMediaMetadataCompat(#756, #802). - Poprawiono rozgłaszanie
notifyChildrenChangedw przypadku starszych kontrolerów (#644). - Naprawiliśmy błąd, który powodował awarię na niektórych urządzeniach, gdy dla wyłączonego timera
setWhenpowiadomienia ustawiono ujemny czas (#903). - Naprawiono błąd
IllegalStateException, który występował, gdy kontroler powiadomień o multimediach nie zakończył łączenia, a użytkownik poprosił o pierwszą aktualizację powiadomienia (#917).
- Umieść klucze i wartości niestandardowe w
- UI:
- Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu i do tyłu nie były widoczne, gdy były używane z Material Design w elemencie BottomSheetDialogFragment (#511).
- Rozwiązaliśmy problem z nieprawidłowym wyrównaniem liczb na przycisku przewijania do przodu w
PlayerControlView(#547).
- Rozszerzenie DASH:
- Parsowanie „f800” jako liczby kanałów 5 w przypadku Dolby w pliku manifestu DASH (#688).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Rozszerzenie Cast:
- Poprawiono tworzenie
Timeline, aby aplikacja nie ulegała awarii, gdy ładowanie multimediów na urządzeniu do przesyłania nie powiedzie się (#708).
- Poprawiono tworzenie
Wersja 1.2.0
15 listopada 2023 r.
- Biblioteka wspólna:
- Dodaj parametr
@Nullable Throwabledo metod w interfejsieLog.Logger. Parametrmessagew tych metodach nie zawiera już żadnych informacji o parametrzeThrowableprzekazywanym do metodLog.{d,i,w,e}(), więc w razie potrzeby implementacje będą musiały ręcznie dołączać te informacje (być może za pomocą parametruLogger.appendThrowableString(String, Throwable)). - Rozwiązanie problemu ze zgodnością z Kotlinem, który powodował, że parametry typu ogólnego dopuszczające wartość null i typy elementów tablicy dopuszczające wartość null nie były wykrywane jako dopuszczające wartość null. Przykładami są parametry metod
TrackSelectorResultiSimpleDecoder(#6792). - Zmień domyślne działanie interfejsu i powiadomień w
Util.shouldShowPlayButton, aby wyświetlać przycisk „Odtwórz”, gdy odtwarzanie jest tymczasowo wstrzymane (np. z powodu chwilowej utraty aktywności audio). Poprzednie działanie można zachować, używającPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)lubMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)(#11213). - Uaktualnij
androidx.annotation:annotation-experimentaldo1.3.1, aby rozwiązać problem opisany na stronie https://issuetracker.google.com/251172715. - Przenieś
ExoPlayer.setAudioAttributesdo interfejsuPlayer.
- Dodaj parametr
- ExoPlayer:
- Rozwiązaliśmy problem z przewijaniem strumieni AC4 spowodowany nieprawidłowym identyfikowaniem próbek przeznaczonych tylko do dekodowania (#11000).
- Dodano wyłączanie odtwarzania na nieodpowiednich urządzeniach wyjściowych audio (np. wbudowanym głośniku na urządzeniach z Wear OS), gdy ta funkcja jest włączona w
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Przyczyna wstrzymania odtwarzania zostanie zaktualizowana do wartościPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT, jeśli odtwarzanie zostanie podjęte, gdy nie są dostępne odpowiednie wyjścia audio, lub jeśli wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania. Gdy podłączysz odpowiednie wyjście, przyczyna wyciszenia zostanie usunięta. - Dodaj znaki
MediaSource.canUpdateMediaItemiMediaSource.updateMediaItem, aby zaakceptować aktualizacjeMediaItempo utworzeniu za pomocąPlayer.replaceMediaItem(s). - Zezwól na aktualizacje
MediaItemdla wszystkich klasMediaSourceudostępnianych przez bibliotekę za pomocąPlayer.replaceMediaItem(s)(#33, #9978). - Zmień nazwę
MimeTypes.TEXT_EXOPLAYER_CUESnaMimeTypes.APPLICATION_MEDIA3_CUES. - Dodaj
PngExtractor, które wysyła i odczytuje cały plik PNG doTrackOutputjako jedną próbkę. - Ulepsz metodę
SequenceableLoader.continueLoading(long)w interfejsieSequenceableLoader, abySequenceableLoader.continueLoading(LoadingInfo loadingInfo).LoadingInfozawiera dodatkowe parametry, w tymplaybackSpeedilastRebufferRealtimeMs, oprócz istniejącego parametruplaybackPositionUs. - Ulepsz metodę
ChunkSource.getNextChunk(long, long, List, ChunkHolder)w interfejsieChunkSource, abyChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder). - Dodaliśmy do rejestrowania danych klienta Common Media Client Data (CMCD) dodatkowe pola: buffer starvation (
bs), deadline (dl), szybkość odtwarzania (pr) i startup (su) (#8699). - Dodaj głębię bitową luminancji i chrominancji do
ColorInfo(#491). - Dodanie do rejestrowania danych klienta Common Media Client Data (CMCD) dodatkowych pól: następne żądanie obiektu (
nor) i następne żądanie zakresu (nrr) (#8699). - Dodanie funkcji przesyłania danych Common Media Client Data (CMCD) za pomocą parametrów zapytania (#553).
- Rozwiąż problem
ConcurrentModificationExceptionw sekcjiExperimentalBandwidthMeter(#612). - Dodaj parametr
MediaPeriodIddoCompositeMediaSource.getMediaTimeForChildMediaTime. - Obsługa
ClippingMediaSource(i innych źródeł z okresem/okresem czasu przesunięcia) wConcatenatingMediaSource2(#11226). - Zmień
BaseRenderer.onStreamChanged(), aby otrzymywać też argumentMediaPeriodId.
- Transformer:
- Analizowanie danych o obrocie EXIF w przypadku danych wejściowych w postaci obrazów.
- Usuń typ adnotacji
TransformationRequest.HdrModei powiązane z nim stałe. Zamiast tego użyjComposition.HdrModei powiązanych z nim stałych. - Uprość
OverlaySettings, aby rozwiązać problemy z rotacją. - Zmieniono parametry
frameRateidurationUselementuSampleConsumer.queueInputBitmapnaTimestampIterator.
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness, aby wyraźnie zezwolić na adaptację niepełną lub jej zabronić. Domyślne działanie pozostaje takie samo jak obecnie, czylitrue.
- Dodaj
- Ekstraktory:
- MPEG-TS: upewnij się, że ostatnia klatka jest renderowana przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909).
- Popraw literówkę podczas określania
rotationDegrees. ZmienionoprojectionPosePitchnaprojectionPoseRoll(#461). - Usuń założenie, że instancje
Extractormożna bezpośrednio sprawdzać za pomocąinstanceof. Jeśli chcesz uzyskać dostęp w czasie działania do szczegółów implementacjiExtractor, musisz najpierw wywołaćExtractor.getUnderlyingInstance. - Dodaj
BmpExtractor. - Dodaj
WebpExtractor. - Dodaj
HeifExtractor. - Dodaliśmy obsługę QuickTime Classic w przypadku
Mp4Extractor.
- Dźwięk:
- Dodaliśmy obsługę 24/32-bitowego formatu big endian PCM w formacie MP4 i Matroska oraz analizowanie kodowania PCM dla
lpcmw formacie MP4. - Dodano obsługę wyodrębniania dźwięku Vorbis z pliku MP4.
- Dodaj
AudioSink.getFormatOffloadSupport(Format), który pobiera poziom obsługi odciążania, jaki odbiornik może zapewnić w przypadku formatu, za pomocąDefaultAudioOffloadSupportProvider. Zwraca nowy obiektAudioOffloadSupport, który zawieraisFormatSupported,isGaplessSupportediisSpeedChangeSupported. - Dodaj
AudioSink.setOffloadMode(), za pomocą którego konfiguracja odciążania na odbiorniku audio jest konfigurowana. Wartość domyślna toAudioSink.OFFLOAD_MODE_DISABLED. - Przenoszenie można włączyć w
setAudioOffloadPreferencewTrackSelectionParameters. Jeśli ustawiona preferencja to włączenie, urządzenie obsługuje odciążanie w przypadku danego formatu, a wybór ścieżki to pojedyncza ścieżka audio, odciążanie audio zostanie włączone. - Jeśli wartość
audioOffloadModePreferencetoAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED,DefaultTrackSelectorwybierze tylko ścieżkę audio i tylko wtedy, gdy jej format jest obsługiwany w przypadku przeniesienia przetwarzania. Jeśli żadna ścieżka audio nie jest obsługiwana w przypadku odciążania, nie zostanie wybrana żadna ścieżka. - Wyłączanie obsługi bez przerw w przypadku odciążania przed poziomem interfejsu API 33 z powodu problemu z pozycją odtwarzania po przejściu ścieżki.
- Usuń parametr
enableOffloadz sygnatury metodyDefaultRenderersFactory.buildAudioSink. - Usuń metodę
DefaultAudioSink.Builder.setOffloadMode. - Usuń wartość intdef:
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED - Dodano obsługę metadanych bez przerw w przypadku formatu Opus podczas odtwarzania z przeniesieniem obciążenia.
- Zezwól na przywrócenie renderera przez wyłączenie odciążania, jeśli pierwsza próba zapisu się nie powiodła (#627).
- Domyślnie włącz harmonogram odciążania w przypadku odtwarzania odciążonego tylko dźwięku.
- Usuń
ExoPlayer.experimentalSetOffloadSchedulingEnablediAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged. - Zmieniono nazwę
onExperimentalSleepingForOffloadChangednaonSleepingForOffloadChanged, aonExperimentalOffloadedPlaybacknaonOffloadedPlayback. - Przenieś interfejsy i definicje związane z trybem odciążania dźwięku
TrackSelectionParametersdo wewnętrznej klasyAudioOffloadPreferences. - Dodaj wywołania zwrotne
onAudioTrackInitializedionAudioTrackReleaseddoAnalyticsListener,AudioRendererEventListeneriAudioSink.Listener. - Rozwiązanie problemu z niedomiarem bufora audio DTS Express (#650).
- Naprawiono błąd, który powodował, że sprawdzanie możliwości w przypadku E-AC3-JOC zwracało błąd
IllegalArgumentException(#677).
- Dodaliśmy obsługę 24/32-bitowego formatu big endian PCM w formacie MP4 i Matroska oraz analizowanie kodowania PCM dla
- Film:
- Zezwalaj wtyczce
MediaCodecVideoRendererna używanie niestandardowegoVideoFrameProcessor.Factory. - Rozwiązanie problemu polegającego na tym, że pierwsza klatka nie mogła być renderowana, jeśli strumień audio zaczynał się od ujemnych sygnatur czasowych (#291).
- Zezwalaj wtyczce
- Tekst:
- Usuń
ExoplayerCuesDecoder. Ścieżki tekstowe zsampleMimeType = application/x-media3-cuessą teraz obsługiwane bezpośrednio przezTextRendererbez konieczności używania instancjiSubtitleDecoder.
- Usuń
- Metadane:
MetadataDecoder.decodenie będzie już wywoływana w przypadku próbek „tylko do dekodowania”, ponieważ implementacja i tak musi zwracać wartość null.
- Skutek:
- Dodaj
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)kolejkowanie danych wejściowych bitmapy według sygnatury czasowej. - Zmień
VideoFrameProcessor.registerInputStream()na nieblokujące. Aplikacje muszą implementowaćVideoFrameProcessor.Listener#onInputStreamRegistered(). - Zmieniono parametry
frameRateidurationUselementuVideoFrameProcessor.queueInputBitmapnaTimestampIterator.
- Dodaj
- Rozszerzenie IMA:
- Rozwiązanie problemu polegającego na tym, że transmisja na żywo DASH z wieloma okresami, która nie jest pierwszym elementem na playliście, może zgłaszać wyjątek (#571).
- Zwolnij StreamManager przed wywołaniem
AdsLoader.destroy() - Zaktualizuj pakiet IMA SDK do wersji 3.31.0.
- Sesja:
- Ustaw zachowanie usługi pierwszego planu powiadomień na
FOREGROUND_SERVICE_IMMEDIATEwDefaultMediaNotificationProvider(#167). - Używaj tylko
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()interfejsu API w wersji powyżej 31, aby uniknąć problemów z wycofanym interfejsem API na urządzeniach Samsung (#167). - Użyj kontrolera powiadomień o multimediach jako serwera proxy, aby ustawić dostępne polecenia i niestandardowy układ używany do wypełniania powiadomienia i sesji platformy.
- Konwertuj zdarzenia przycisków multimedialnych odbierane przez
MediaSessionService.onStartCommand()w Media3 zamiast kierować je do sesji platformy i z powrotem do Media3. Dzięki temu kontroler połączeń jest zawsze kontrolerem powiadomień o multimediach, a aplikacje mogą łatwo rozpoznawać połączenia przychodzące z powiadomienia w taki sam sposób na wszystkich obsługiwanych poziomach interfejsu API. - Rozwiązanie problemu polegającego na tym, że
MediaController.getCurrentPosition()nie przechodzi do przodu, gdy jest połączony ze starszymMediaSessionCompat. - Dodaj
MediaLibrarySession.getSubscribedControllers(mediaId)dla wygody. - Zastąp
MediaLibrarySession.Callback.onSubscribe(), aby potwierdzić dostępność identyfikatora elementu nadrzędnego, do którego kontroler jest subskrybowany. Jeśli się to uda, subskrypcja zostanie zaakceptowana inotifyChildrenChanged()zostanie natychmiast wywołana, aby poinformować przeglądarkę (#561). - Dodaj moduł demonstracyjny sesji dla systemu operacyjnego Automotive i włącz demonstrację sesji w Androidzie Auto.
- Nie ustawiaj kolejki sesji platformy, gdy wartość
COMMAND_GET_TIMELINEjest niedostępna dla kontrolera powiadomień o multimediach. Gdy Android Auto jest kontrolerem klienta odczytującym dane z sesji platformy, przyciskqueuew interfejsie Androida Auto nie jest wyświetlany (#339). - Domyślnie używaj
DataSourceBitmapLoaderzamiastSimpleBitmapLoader(#271, #327). - Dodano
MediaSession.Callback.onMediaButtonEvent(Intent), który umożliwia aplikacjom zastępowanie domyślnej obsługi zdarzeń przycisków multimedialnych.
- Ustaw zachowanie usługi pierwszego planu powiadomień na
- UI:
- Dodaj implementację
Player.Listenerna urządzenia z Wear OS, która obsługuje wyciszanie odtwarzania z powoduPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUTprzez wyświetlanie okna systemowego, które umożliwia użytkownikowi podłączenie odpowiedniego wyjścia audio (np. słuchawek Bluetooth). Odtwarzanie zostanie automatycznie wznowione, jeśli odpowiednie urządzenie zostanie podłączone w konfigurowalnym czasie (domyślnie 5 minut).
- Dodaj implementację
- Pobrane:
- Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” w przypadku
DownloadService, aby zapewnić zgodność z Androidem 14. Podczas korzystania z tej usługi aplikacja musi też dodaćdataSyncjakoforegroundServiceTypew pliku manifestu oraz dodać uprawnienieFOREGROUND_SERVICE_DATA_SYNC(#11239).
- Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” w przypadku
- Rozszerzenie HLS:
- Odświeżanie playlisty transmisji na żywo HLS w interwale obliczanym na podstawie czasu rozpoczęcia ostatniego wczytywania, a nie czasu zakończenia ostatniego wczytywania (#663).
- Rozszerzenie DASH:
- Zezwalaj na wiele identyfikatorów DASH w adresie URL szablonu segmentu.
- Dodano eksperymentalną obsługę analizowania napisów podczas wyodrębniania. Ta funkcja lepiej obsługuje scalanie nakładających się napisów, w tym rozwiązuje problem migotania podczas przechodzenia między segmentami napisów. Możesz włączyć tę funkcję za pomocą parametru
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()(#288).
- Rozszerzenie RTSP:
- Usunięto sytuację wyścigu, która w pewnych sytuacjach mogła powodować
IndexOutOfBoundsExceptionpodczas powrotu do TCP lub zawieszanie się odtwarzania. - Sprawdzanie stanu podczas konfiguracji RTSP przy zwracaniu stanu ładowania
RtspMediaPeriod(#577). - Ignorowanie niestandardowych metod żądań RTSP w nagłówku publicznym odpowiedzi OPTIONS (#613).
- Użyj wartości czasu oczekiwania na odpowiedź na żądanie konfiguracji RTSP w interwale czasu wysyłania żądań opcji RTSP typu keep-alive (#662).
- Usunięto sytuację wyścigu, która w pewnych sytuacjach mogła powodować
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Wydanie modułu dekodera MIDI, który zapewnia obsługę odtwarzania standardowych plików MIDI za pomocą biblioteki Jsyn do syntezy dźwięku.
- Dodaj
DecoderOutputBuffer.shouldBeSkipped, aby bezpośrednio oznaczyć bufory wyjściowe, które nie muszą być prezentowane. Jest to preferowane rozwiązanie w porównaniu zC.BUFFER_FLAG_DECODE_ONLY, które zostanie wycofane. - Dodaj
Decoder.setOutputStartTimeUsiSimpleDecoder.isAtLeastOutputStartTimeUs, aby umożliwić dekoderom odrzucanie próbek przeznaczonych tylko do dekodowania przed czasem rozpoczęcia. Jest to preferowane rozwiązanie w porównaniu zBuffer.isDecodeOnly, które zostanie wycofane. - Naprawiono błąd publikowania artefaktu dekodera MIDI w repozytorium Maven. Artefakt został zmieniony na
media3-exoplayer-midi(#734).
- Rozszerzenie Leanback:
- Naprawiono błąd, w którym wyłączenie platformy może powodować błąd
ArithmeticExceptionw kodzie Leanback (#617).
- Naprawiono błąd, w którym wyłączenie platformy może powodować błąd
- Narzędzia testowe:
- Zapewnij zgodność
TestExoPlayerBuilderiFakeClockz testami interfejsu Espresso i testami interfejsu Compose. Rozwiązaliśmy problem, w którym odtwarzanie postępowało w sposób nieokreślony podczas interakcji z widokami Espresso lub Compose.
- Zapewnij zgodność
- Usuń symbole, które nie są już używane:
- Usuń
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)iTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Użyj zasadyComposition.Builder.setHdrMode(int)i przekaż wartośćCompositiondo zasadyTransformer.start(Composition, String). - Usuń wycofaną metodę
DownloadNotificationHelper.buildProgressNotificationi użyj metody, która nie została wycofana i przyjmuje parametrnotMetRequirements.
- Usuń
Wersja 1.2.0-rc01
1 listopada 2023 roku
Używaj stabilnej wersji 1.2.0.
Wersja 1.2.0-beta01
19 października 2023 r.
Używaj stabilnej wersji 1.2.0.
Wersja 1.2.0-alpha02
29 września 2023 r.
Używaj stabilnej wersji 1.2.0.
Wersja 1.2.0-alpha01
17 sierpnia 2023 r.
Używaj stabilnej wersji 1.2.0.
Wersja 1.1.0
Wersja 1.1.1
16 sierpnia 2023 r.
- Biblioteka wspólna:
- Usuń przypadkowo dodaną zależność
multidexze wszystkich modułów (#499).
- Usuń przypadkowo dodaną zależność
- ExoPlayer:
- Rozwiązaliśmy problem w
PlaybackStatsListener, który powodował, że po wyczyszczeniu playlisty tworzone były nieprawidłowePlaybackStats. - Dodawanie dodatkowych pól do rejestrowania danych klienta multimediów (CMCD): format strumieniowania (sf), typ strumienia (st), wersja (v), najwyższa szybkość transmisji (tb), czas trwania obiektu (d), zmierzona przepustowość (mtp) i typ obiektu (ot) (#8699).
- Rozwiązaliśmy problem w
- Dźwięk:
- Usunięto błąd, w którym przy odtwarzaniu bardzo krótkich plików stan
Player.getState()nigdy nie przechodził w stanSTATE_ENDED(#538).
- Usunięto błąd, w którym przy odtwarzaniu bardzo krótkich plików stan
- Odciążenie dźwięku:
- Dodaj do strumienia bitów strony nagłówka identyfikatora Ogg i nagłówka komentarza, aby umożliwić odtwarzanie Opus w trybie offload zgodnie z dokumentem RFC 7845.
- Film:
- H.265/HEVC: poprawiono analizowanie informacji o krótkoterminowych i długoterminowych obrazach referencyjnych w SPS.
- Tekst:
- CEA-608: zmiana logiki obcinania wskazówek, aby uwzględniać tylko widoczny tekst. Wcześniej wcięcia i przesunięcia tabulacji były uwzględniane przy ograniczaniu długości sygnału do 32 znaków (co było technicznie zgodne ze specyfikacją) (#11019).
- Rozszerzenie IMA:
- Zaktualizuj pakiet IMA SDK do wersji 3.30.3.
- Sesja:
- Dodaj niestandardowy układ do stanu kontrolera i udostępnij funkcję pobierania, aby uzyskać do niego dostęp. Gdy zmieni się układ niestandardowy, wywoływana jest funkcja
MediaController.Listener.onCustomLayoutChanged. Aplikacje, które chcą wysyłać różne niestandardowe układy do różnych kontrolerów Media3, mogą to zrobić wMediaSession.Callback.onConnect, używającAcceptedResultBuilder, aby mieć pewność, że niestandardowy układ jest dostępny dla kontrolera po zakończeniu połączenia. - Rozwiązaliśmy problem, w którym usługa
MediaLibraryServiceLegacyStubwysyłała błąd do usługiResult, która nie obsługiwała tej funkcji, co powodowało błądUnsupportedOperationException(#78). - Popraw sposób, w jaki
PlayerWrappertworzyVolumeProviderCompat, określającvolumeControlTypeza pomocą starszych poleceń (COMMAND_ADJUST_DEVICE_VOLUMEiCOMMAND_SET_DEVICE_VOLUME) oraz nowych poleceń (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGSiCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).
- Dodaj niestandardowy układ do stanu kontrolera i udostępnij funkcję pobierania, aby uzyskać do niego dostęp. Gdy zmieni się układ niestandardowy, wywoływana jest funkcja
Wersja 1.1.0
5 lipca 2023 r.
- Biblioteka wspólna:
- Dodaj powód wyciszenia nieodpowiedniej ścieżki audio i odtwarzaj, gdy będzie gotowa. Zmień powód wyciszenia, gdy będzie zbyt długi. (#15).
- Dodawanie poleceń do odtwarzacza:
COMMAND_GET_METADATACOMMAND_SET_PLAYLIST_METADATACOMMAND_SET_DEVICE_VOLUME_WITH_FLAGSCOMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- Dodaj do klasy Player przeciążone metody, które pozwalają użytkownikom określać flagi głośności:
void setDeviceVolume(int, int)void increaseDeviceVolume(int)void decreaseDeviceVolume(int)void setDeviceMuted(boolean, int)
- Dodano
BuilderdlaDeviceInfoi wycofano dotychczasowy konstruktor. - Dodaj
DeviceInfo.routingControllerId, aby określić identyfikator kontrolera routingu w przypadku odtwarzania zdalnego. - Dodano
Player.replaceMediaItem(s)jako skrót do dodawania i usuwania elementów w tej samej pozycji (#8046).
- ExoPlayer:
- Zezwalaj ExoPlayerowi na sterowanie metodami głośności urządzenia tylko wtedy, gdy użytkownik wyraźnie się na to zgodzi. Użyj
ExoPlayer.Builder.setDeviceVolumeControlEnabled, aby uzyskać dostęp do:getDeviceVolume()isDeviceMuted()setDeviceVolume(int)isetDeviceVolume(int, int)increaseDeviceVolume(int)iincreaseDeviceVolume(int, int)decreaseDeviceVolume(int)idecreaseDeviceVolume(int, int)
- Dodaj
FilteringMediaSource, który umożliwia filtrowanie dostępnych typów ścieżek zMediaSource. - Dodanie obsługi danych klienta Common Media Client Data (CMCD) w wychodzących żądaniach formatów strumieniowania adaptacyjnego DASH, HLS i SmoothStreaming. Wprowadziliśmy te pola:
br,bl,cid,rtpisid(#8699). Struktura interfejsu API i metody interfejsu API:- Rejestrowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory). - Domyślnie wszystkie klucze są włączone. Zastąp tę wartość, aby odfiltrować klucze, które mają być rejestrowane.
CmcdConfiguration.RequestConfig.isKeyAllowed(String key) - Zastąp
CmcdConfiguration.RequestConfig.getCustomData(), aby włączyć logowanie kluczy niestandardowych.
- Rejestrowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj
- Dodano dodatkowe działanie do pliku manifestu głównej wersji demonstracyjnej, aby ułatwić uruchamianie aplikacji w wersji demonstracyjnej z niestandardowym plikiem
*.exolist.json(#439). - Dodaj
ExoPlayer.setVideoEffects()za korzystanie zEffectpodczas odtwarzania wideo. - Zaktualizuj
SampleQueue, aby przechowywaćsourceIdjakolong, a nieint. Spowoduje to zmianę sygnatur metod publicznychSampleQueue.sourceIdiSampleQueue.peekSourceId. - Dodaj do metod
LoadControlionTracksSelectedparametry, które umożliwiają powiązanie tych metod z odpowiednimMediaPeriod.shouldStartPlayback - Zmień sygnaturę funkcji
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>), dodając parametr osi czasu, który zawiera okresy z identyfikatorami UID używanymi jako klucze na mapie. Jest to wymagane, aby uniknąć problemów z równoczesnością w przypadku transmisji na żywo z wieloma okresami. - Wycofaj:
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)iBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Zamiast tego można wywołać warianty metod bez symbolumediaTimeOffsetUs. Pamiętaj, że nawet w przypadku wycofanych wariantów przesunięcie nie jest już dodawane do wartościstartTimeUsiendTimeUsobiektówMediaLoadDatawysyłanych przez moduł wysyłający. - Zmień nazwę
ExoTrackSelection.blacklistnaexcludeTrackiisBlacklistednaisTrackExcluded. - Naprawiono niespójne działanie funkcji
ExoPlayer.setMediaItem(s)iaddMediaItem(s)wywoływanych na pustej playliście.
- Zezwalaj ExoPlayerowi na sterowanie metodami głośności urządzenia tylko wtedy, gdy użytkownik wyraźnie się na to zgodzi. Użyj
- Transformer:
- Usuń
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Zamiast niej używaj zasadExoPlayerAssetLoader.Factory(MediaSource.Factory)iTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory). - Usuń
Transformer.startTransformation(MediaItem, ParcelFileDescriptor). - Usunęliśmy błąd polegający na tym, że transformacja mogła się zawiesić (co prowadziło do przekroczenia limitu czasu multipleksera), jeśli koniec strumienia wideo został zasygnalizowany w momencie, gdy ramka wejściowa oczekiwała na przetworzenie.
- Aby rozszerzyć obsługę, wysyłaj zapytania o kodeki za pomocą narzędzia
MediaCodecListzamiast narzędzifindDecoder/EncoderForFormat. - Usuń konfigurację klatek B w
DefaultEncoderFactory, ponieważ nie działa ona na niektórych urządzeniach.
- Usuń
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChangektóra jest domyślnie wyłączona. Po włączeniuDefaultTrackSelectorspowoduje wybranie nowej ścieżki, gdy zmienią się możliwości renderowania.
- Dodaj
- Ekstraktory:
- Dźwięk:
- Naprawiono błąd, który powodował, że niektóre odtwarzania kończyły się niepowodzeniem, gdy włączone było tunelowanie i aktywne były np. funkcje bezprzerwowego przycinania (#10847).
AudioProcessors - Enkapsulacja ramek Opus w pakietach Ogg podczas bezpośredniego odtwarzania (odciążanie).
- Ekstrapolacja bieżącej pozycji podczas snu z harmonogramem odciążania.
- Dodaj
Renderer.release()iAudioSink.release(), aby zwolnić zasoby po zakończeniu cyklu życia gracza. - Nasłuchiwanie zmian w funkcjach audio w
DefaultAudioSink. Dodaj wymagany parametrcontextw konstruktorzeDefaultAudioSink, za pomocą któregoDefaultAudioSinkzarejestruje się jako odbiorcaAudioCapabilitiesReceiveri zaktualizuje swoją właściwośćaudioCapabilities, gdy otrzyma informację o zmianie możliwości. - Przekazywanie zmian w funkcjach audio za pomocą nowego zdarzenia
onAudioCapabilitiesChangedw interfejsieAudioSink.Listeneri nowego interfejsuRendererCapabilities.Listener, który wywołuje zdarzeniaonRendererCapabilitiesChanged. - Dodaj
ChannelMixingAudioProcessor, aby zastosować skalowanie lub miksowanie do kanałów audio. - Dodaj nową wartość całkowitą
DISCARD_REASON_AUDIO_BYPASS_POSSIBLEdoDecoderDiscardReasons, aby odrzucić dekoder audio, gdy po zmianie możliwości audio możliwy jest tryb obejścia. - Dodano obsługę bezpośredniego odtwarzania DTS Express i DTS:X (#335).
- Naprawiono błąd, który powodował, że niektóre odtwarzania kończyły się niepowodzeniem, gdy włączone było tunelowanie i aktywne były np. funkcje bezprzerwowego przycinania (#10847).
- Film:
- Spraw, aby
MediaCodecVideoRendererzgłaszałVideoSizeo szerokości i wysokości 0, gdy moduł renderujący jest wyłączony.Player.Listener.onVideoSizeChangedjest wywoływana odpowiednio, gdy zmieni się wartość zmiennejPlayer.getVideoSize(). W wyniku tej zmiany rozmiar wideo ExoPlayera zMediaCodecVideoRendererma szerokość i wysokość 0, gdyPlayer.getCurrentTracksnie obsługuje wideo lub rozmiar obsługiwanej ścieżki wideo nie został jeszcze określony.
- Spraw, aby
- DRM:
- Zmniejsz widoczność kilku metod wewnętrznych w
DefaultDrmSession, które nie powinny być wywoływane spoza pakietu DRM:void onMediaDrmEvent(int)void provision()void onProvisionCompleted()onProvisionError(Exception, boolean)
- Zmniejsz widoczność kilku metod wewnętrznych w
- Muxer:
- Dodano nową bibliotekę multipleksera, której można używać do tworzenia pliku kontenera MP4.
- Rozszerzenie IMA:
- Włącz transmisje na żywo DASH z wieloma przedziałami czasu na potrzeby dynamicznego wstawiania reklam. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania transmisji na żywo (#10912).
- Naprawiono błąd, w którym w transmisjach na żywo wstawiana jest nowa grupa reklam, ponieważ obliczona pozycja treści w kolejnych osiach czasu nieznacznie się różni.
- Sesja:
- Dodaj metodę pomocniczą
MediaSession.getControllerForCurrentRequest, aby uzyskać informacje o kontrolerze, który obecnie wywołuje metodęPlayer. - Dodanie
androidx.media3.session.MediaButtonReceiver, aby umożliwić aplikacjom wznawianie odtwarzania za pomocą zdarzeń przycisków multimedialnych wysyłanych np. przez słuchawki Bluetooth (#167). - Dodaj domyślną implementację do
MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądanychMediaItemsdoPlayer, jeśli mająLocalConfiguration(np. URI)#282. - Dodanie przycisków poleceń „przewiń do poprzedniego” i „przewiń do następnego” w kompaktowym widoku powiadomienia o multimediach domyślnie w przypadku Androida 12 i starszych wersji (#410).
- Dodaj domyślną implementację do
MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądanychMediaItemsdoPlayer, jeśli mająLocalConfiguration(np. URI)#282. - Dodanie przycisków poleceń „przewiń do poprzedniego” i „przewiń do następnego” w kompaktowym widoku powiadomienia o multimediach domyślnie w przypadku Androida 12 i starszych wersji (#410).
- Dodaj metodę pomocniczą
- UI:
- Dodaj metody narzędziowe
shouldShowPlayButtonihandlePlayPauseButtonAction, aby tworzyć niestandardowe elementy interfejsu z przyciskiem odtwarzania/wstrzymywania.
- Dodaj metody narzędziowe
- Rozszerzenie RTSP:
- Rozszerzenie DASH:
- Usuń przesunięcie czasu multimediów z
MediaLoadData.startTimeMsiMediaLoadData.endTimeMsw przypadku strumieni DASH z wieloma przedziałami czasu. - Usunęliśmy błąd, który powodował, że ponowne przygotowanie źródła multimediów Dash na żywo z wieloma okresami generowało
IndexOutOfBoundsException(#10838).
- Usuń przesunięcie czasu multimediów z
- Rozszerzenie HLS:
- Dodaj
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long), aby ustawić limit czasu, w którym wątek wczytywania będzie czekać na zainicjowanie elementuTimestampAdjuster. Jeśli inicjowanie nie zakończy się przed upływem limitu czasu, zostanie zgłoszony wyjątekPlaybackException, aby uniknąć niekończącego się wstrzymania odtwarzania. Domyślnie limit czasu jest ustawiony na zero (#323).
- Dodaj
- Narzędzia testowe:
- Sprawdź, czy w
DataSourceContractTestwielkość liter w schemacie URI nie ma znaczenia.
- Sprawdź, czy w
- Usuń symbole, które nie są już używane:
- Usuń konstruktory
DefaultAudioSinki użyj zamiast nich konstruktorówDefaultAudioSink.Builder. - Usuń polecenie
HlsMasterPlaylisti zamiast niego użyj poleceniaHlsMultivariantPlaylist. - Usuń
Player.stop(boolean). Zamiast niej użyj zasadPlayer.stop()iPlayer.clearMediaItems()(jeśliresetma wartośćtrue). - Usuń 2 wycofane konstruktory
SimpleCache. Zamiast nich użyj niewycofanego konstruktora, który przyjmujeDatabaseProvider, aby uzyskać lepszą wydajność. - Usuń konstruktor
DefaultBandwidthMeteri użyj zamiast niego konstruktoraDefaultBandwidthMeter.Builder. - Usuń konstruktory
DefaultDrmSessionManageri użyj zamiast nichDefaultDrmSessionManager.Builder. - Usuń 2 wycofane konstruktory
HttpDataSource.InvalidResponseCodeException. Użyj niewycofanego konstruktora, który akceptuje dodatkowe pola(cause,responseBody), aby ulepszyć rejestrowanie błędów. - Usuń zasady
DownloadHelper.forProgressive,DownloadHelper.forHls,DownloadHelper.forDashiDownloadHelper.forSmoothStreaming, a zamiast nich używaj zasadDownloadHelper.forMediaItem. - Usuń wycofany konstruktor
DownloadServicei użyj konstruktora, który nie został wycofany i zawiera opcję podania parametruchannelDescriptionResourceId. - Usuń wycofane stałe ciągi znaków dla zestawów znaków (
ASCII_NAME,UTF8_NAME,ISO88591_NAME,UTF16_NAMEiUTF16LE_NAME). Zamiast nich używaj zestawów znaków Kotlin z pakietukotlin.text,java.nio.charset.StandardCharsetslubcom.google.common.base.Charsets. - Usuń wycofany konstruktor
WorkManagerScheduleri użyj konstruktora, który nie został wycofany i zawiera opcję podania parametruContext. - Usuń wycofane metody
createVideoSampleFormat,createAudioSampleFormat,createContainerFormaticreateSampleFormat, które były używane do tworzenia instancji klasyFormat. Zamiast tego użyjFormat.Builderdo tworzenia instancjiFormat. - Usuń wycofane metody
copyWithMaxInputSize,copyWithSubsampleOffsetUs,copyWithLabel,copyWithManifestFormatInfo,copyWithGaplessInfo,copyWithFrameRate,copyWithDrmInitData,copyWithMetadata,copyWithBitrateicopyWithVideoSize. Zamiast nich używaj metodFormat.buildUpon()i metod ustawiających. - Usuń wycofany tag
ExoPlayer.retry()i zamiast niego użyj taguprepare(). - Usuń wycofany konstruktor
DefaultTrackSelectorbez argumentów i użyj zamiast niego konstruktoraDefaultTrackSelector(Context). - Usuń wycofany konstruktor
OfflineLicenseHelperi użyj konstruktoraOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher). - Usuń wycofany konstruktor
DownloadManageri użyj konstruktora, który przyjmuje argumentExecutor. - Usuń wycofane konstruktory
Cuei zamiast nich używaj konstruktorówCue.Builder. - Usuń wycofany konstruktor
OfflineLicenseHelperi użyj konstruktoraOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher). - Usuń 4 wycofane metody
AnalyticsListener:onDecoderEnabled, użyj zamiast niejonAudioEnabledlubonVideoEnabled.onDecoderInitialized, użyjonAudioDecoderInitializedlubonVideoDecoderInitialized.onDecoderInputFormatChanged, użyj zamiast niejonAudioInputFormatChangedlubonVideoInputFormatChanged.onDecoderDisabled, użyj zamiast niejonAudioDisabledlubonVideoDisabled.
- Usuń wycofane polecenia
Player.Listener.onSeekProcessediAnalyticsListener.onSeekProcessed, a zamiast nich użyj poleceniaonPositionDiscontinuityz parametremDISCONTINUITY_REASON_SEEK. - Usuń polecenie
ExoPlayer.setHandleWakeLock(boolean)i zamiast niego użyj poleceniasetWakeMode(int). - Usuń wycofany element
DefaultLoadControl.Builder.createDefaultLoadControl()i zamiast niego użyj elementubuild(). - Usuń wycofany tag
MediaItem.PlaybackPropertiesi zamiast niego użyj taguMediaItem.LocalConfiguration. Wycofane poleMediaItem.playbackPropertiesma teraz typMediaItem.LocalConfiguration.
- Usuń konstruktory
Wersja 1.1.0-rc01
21 czerwca 2023 r.
Używaj stabilnej wersji 1.1.0.
Wersja 1.1.0-beta01
7 czerwca 2023 r.
Używaj stabilnej wersji 1.1.0.
Wersja 1.1.0-alpha01
10 maja 2023 r.
Używaj stabilnej wersji 1.1.0.
Wersja 1.0.0
Wersja 1.0.2
18 maja 2023 r.
Publikacja androidx.media3:media3-*:1.0.2 Wersja 1.0.2 zawiera te zmiany.
Ta wersja odpowiada wersji ExoPlayera 2.18.7.
W tej wersji wprowadziliśmy następujące zmiany w porównaniu z wersją 1.0.1:
- Biblioteka podstawowa:
- Dodaj
Buffer.isLastSample(), które wskazuje, czyBufferzawiera flagęC.BUFFER_FLAG_LAST_SAMPLE. - Rozwiązaliśmy problem, który powodował, że ostatnia klatka mogła nie być renderowana, jeśli ostatnia próbka z klatkami została usunięta z kolejki bez odczytania próbki „koniec strumienia”. (#11079).
- Dodaj
- Ekstraktory:
- Naprawiono analizowanie SPS w H.265 w plikach MPEG-TS przez ponowne użycie logiki analizowania, która jest już używana przez ekstraktory RTSP i MP4 (#303).
- Tekst:
- SSA: dodano obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów (#319).
- Sesja:
- Rozwiązano problem polegający na tym, że
MediaControllernie aktualizował dostępnych poleceń po połączeniu ze starszymMediaSessionCompat, który aktualizował swoje działania. - Naprawiono błąd, który uniemożliwiał zwracanie wartości null przez
MediaLibraryServicew przypadku wywołania z interfejsu systemu doCallback.onGetLibraryRootzparams.isRecent == truew interfejsie API 30 (#355). - Naprawiono wyciek pamięci w przypadku
MediaSessionServicelubMediaLibraryService(#346). - Naprawiliśmy błąd, w którym połączona aktualizacja
Timelinei pozycji wMediaSessionmoże powodować zgłaszanie błęduMediaControllerprzezIllegalStateException.
- Rozwiązano problem polegający na tym, że
Wersja 1.0.1
18 kwietnia 2023 r.
Publikacja androidx.media3:media3-*:1.0.1 Wersja 1.0.1 zawiera te zmiany.
Ta wersja odpowiada wersji ExoPlayera 2.18.6.
- Biblioteka podstawowa:
- Resetowanie zastąpienia docelowej transmisji na żywo podczas wyszukiwania domyślnej pozycji (#11051).
- Naprawiono błąd, który powodował zawieszanie się odtwarzania z powodu pustych strumieni próbek w multimediach.
- Sesja:
- Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję
MediaSessionCompatpowodowało wyjątek wMediaController(#290). - Dodano brakujące przekazywanie
MediaSession.broadcastCustomCommanddo starszegoMediaControllerCompat.Callback.onSessionEvent(#293). - Naprawiliśmy błąd, który powodował, że wywołanie
MediaSession.setPlayernie aktualizowało dostępnych poleceń. - Rozwiązaliśmy problem polegający na tym, że instancje
TrackSelectionOverridewysłane zMediaControllersą ignorowane, jeśli odwołują się do grupy zFormat.metadata(#296). - Rozwiązanie problemu, w którym
Player.COMMAND_GET_CURRENT_MEDIA_ITEMmusi być dostępne, aby uzyskać dostęp do metadanych za pomocą starszego interfejsuMediaSessionCompat. - Rozwiązaliśmy problem, który powodował, że instancje
MediaSessionw wątku w tle powodowały awarie podczas używania wMediaSessionService(#318). - Rozwiązanie problemu polegającego na tym, że odbiornik przycisku multimediów był deklarowany przez bibliotekę bez intencji aplikacji (#314).
- Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję
- DASH:
- Poprawiono obsługę pustych osi czasu segmentów (#11014).
- RTSP:
- Ponów próbę z TCP, jeśli konfiguracja RTSP z UDP nie powiedzie się z błędem RTSP 461 UnsupportedTransport (#11069).
Wersja 1.0.0
22 marca 2023 r.
Publikacja androidx.media3:media3-*:1.0.0 Wersja 1.0.0 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayera 2.18.5.
Od wersji 1.0.0-rc02 nie wprowadziliśmy żadnych zmian.
Wersja 1.0.0-rc02
2 marca 2023 r.
Publikacja androidx.media3:media3-*:1.0.0-rc02 Wersja 1.0.0-rc02 zawiera
te zmiany.
Ta wersja odpowiada wersji ExoPlayera 2.18.4.
- Biblioteka podstawowa:
- Pobrane:
- Umożliwienie konfigurowania maksymalnej różnicy między czasem rozpoczęcia 2 segmentów do scalenia w klasie
SegmentDownloaderi jej podklasach (#248).
- Umożliwienie konfigurowania maksymalnej różnicy między czasem rozpoczęcia 2 segmentów do scalenia w klasie
- Dźwięk:
- Film:
- Mapuj format HEVC HDR10 na
HEVCProfileMain10HDR10zamiast naHEVCProfileMain10. - Dodano obejście problemu z urządzeniem Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC o częstotliwości 60 kl./s są oznaczane jako nieobsługiwane (#10898).
- Rozwiązano problemy z wydajnością zwalniania klatek podczas odtwarzania multimediów z częstotliwością klatek znacznie wyższą niż częstotliwość odświeżania ekranu.
- Mapuj format HEVC HDR10 na
- Przesyłaj:
- Rozwiązaliśmy problem z przejściowym
STATE_IDLEpodczas przechodzenia między elementami multimedialnymi (#245).
- Rozwiązaliśmy problem z przejściowym
- RTSP:
- Wyłapywanie wyjątku IllegalArgumentException zgłaszanego podczas analizowania nieprawidłowych wiadomości odpowiedzi RTSP Describe (#10971).
- Sesja:
- Usunęliśmy błąd, który powodował, że przycisk odtwarzania/wstrzymywania w powiadomieniu nie aktualizował się zgodnie ze stanem odtwarzacza (#192).
- Rozszerzenie IMA:
- Naprawiono błąd, który uniemożliwiał rozpoczęcie strumieni DAI bez reklam, ponieważ nie otrzymywano pierwszego (a w przypadku braku reklam jedynego) zdarzenia
LOADED.
- Naprawiono błąd, który uniemożliwiał rozpoczęcie strumieni DAI bez reklam, ponieważ nie otrzymywano pierwszego (a w przypadku braku reklam jedynego) zdarzenia
Wersja 1.0.0-rc01
16 lutego 2023 r.
Publikacja androidx.media3:media3-*:1.0.0-rc01 Wersja 1.0.0-rc01 zawiera
te zmiany.
Ta wersja odpowiada wersji ExoPlayer 2.18.3.
- Biblioteka podstawowa:
- Dostosuj logikę kolejności dekoderów renderera, aby zachować preferencje
MediaCodecSelector, nawet jeśli dekoder zgłosi, że może nie być w stanie odtworzyć multimediów z odpowiednią wydajnością. Na przykład w przypadku domyślnego selektora dekoder sprzętowy z tylko funkcjonalną obsługą będzie preferowany od dekodera programowego, który w pełni obsługuje format (#10604). - Dodaj
ExoPlayer.Builder.setPlaybackLooper, który ustawia istniejący wątek odtwarzania dla nowej instancji ExoPlayera. - Zezwalaj na czyszczenie pomocników menedżera pobierania (#10776).
- Dodaj parametr do
BasePlayer.seekTo, aby wskazać polecenie użyte do przewijania. - Używanie motywu podczas wczytywania elementów rysowalnych w przypadku interfejsu API w wersji 21 lub nowszej (#220).
- Dodano
ConcatenatingMediaSource2, który umożliwia łączenie wielu elementów multimedialnych w jednym oknie (#247).
- Dostosuj logikę kolejności dekoderów renderera, aby zachować preferencje
- Ekstraktory:
- Zgłaszaj wyjątek
ParserExceptionzamiastNullPointerException, jeśli podczas analizowania atomów trak w tabeli próbek (stbl) brakuje wymaganego opisu próbki (stsd). - Prawidłowe pomijanie próbek podczas przewijania bezpośrednio do klatki synchronizacji w fMP4 (#10941).
- Zgłaszaj wyjątek
- Dźwięk:
- Użyj przepływności skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora
dla
AudioTrackw przypadku bezpośredniego odtwarzania (passthrough).
- Użyj przepływności skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora
dla
- Tekst:
- Naprawiono
TextRendererprzekazywanie nieprawidłowego (ujemnego) indeksu doSubtitle.getEventTime, jeśli plik z napisami nie zawiera wskazówek. - SubRip: dodaliśmy obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów.
- Naprawiono
- Metadane:
- Analizuj wiele wartości rozdzielonych znakiem null z ramek ID3, zgodnie z ID3 v2.4.
- Dodaj znak
MediaMetadata.mediaType, aby oznaczyć typ treści lub typ folderu opisywanego przez metadane. - Dodaj
MediaMetadata.isBrowsablejako zamiennikMediaMetadata.folderType. W kolejnej wersji wycofamy ten typ folderu.
- DASH:
- Dodano pełne parsowanie zestawów adaptacyjnych obrazów, w tym liczbę kafelków (#3752).
- UI:
- Naprawiono wycofany element
PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener)aby mieć pewność, że zmiany widoczności są przekazywane do zarejestrowanego detektora (#229). - Poprawiono kolejność elementów sterujących odtwarzaczem w środku w
PlayerViewpodczas korzystania z układu od prawej do lewej (RTL) (#227).
- Naprawiono wycofany element
- Sesja:
- Dodaj abstrakcyjną klasę
SimpleBasePlayer, aby zaimplementować interfejsPlayerdla niestandardowych odtwarzaczy. - Dodanie metody pomocniczej do konwertowania tokena sesji platformy na Media3 (#171).
SessionToken - Użyj
onMediaMetadataChanged, aby wywołać aktualizacje sesji multimediów na platformie (#219). - Dodaj sesję multimedialną jako argument funkcji
getMediaButtons()of theDefaultMediaNotificationProvideri używaj list niemutowalnych dla przejrzystości (#216). - Dodaj
onSetMediaItemsdetektor wywołania zwrotnego, który umożliwi modyfikowanie lub ustawianieMediaItemlisty, indeksu początkowego i pozycji według sesji przed ustawieniem w odtwarzaczu (#156). - Unikanie wykrywania dwukrotnego kliknięcia w przypadku zdarzeń przycisku multimediów innych niż Bluetooth (#233).
- Zwiększono odporność
QueueTimelinew przypadku podejrzanego stanu sesji starszego typu (#241).
- Dodaj abstrakcyjną klasę
- Metadane:
- Analizuj wiele wartości rozdzielonych znakiem null z ramek ID3, zgodnie z ID3 v2.4.
- Dodaj znak
MediaMetadata.mediaType, aby oznaczyć typ treści lub typ folderu opisywanego przez metadane. - Dodaj
MediaMetadata.isBrowsablejako zamiennikMediaMetadata.folderType. W kolejnej wersji wycofamy ten typ folderu.
- Rozszerzenie Cast:
- Zaktualizowano wersję pakietu Cast SDK do 21.2.0.
- Rozszerzenie IMA:
- Usuń odbiornik odtwarzacza
ImaServerSideAdInsertionMediaSourcew wątku aplikacji, aby uniknąć problemów z wątkami. - Dodaj właściwość
focusSkipButtonWhenAvailabledo elementuImaServerSideAdInsertionMediaSource.AdsLoader.Builder, aby poprosić o skupienie się na przycisku pominięcia na urządzeniach telewizyjnych, i ustaw domyślnie wartość „true”. - Dodaj metodę
focusSkipButton()do elementuImaServerSideAdInsertionMediaSource.AdsLoader, aby programowo wysyłać żądanie ustawienia fokusu na przycisku pomijania. - Zaktualizowano pakiet IMA SDK do wersji 3.29.0.
- Usuń odbiornik odtwarzacza
- Aplikacja w wersji demonstracyjnej:
- Prośba o zgodę na wyświetlanie powiadomień o pobranych plikach w czasie działania aplikacji (#10884).
Wersja 1.0.0-beta03
22 listopada 2022 r.
Publikacja androidx.media3:media3-*:1.0.0-beta03 Wersja 1.0.0-beta03
zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayera 2.18.2.
- Biblioteka podstawowa:
- Dodano
ExoPlayer.isTunnelingEnabled, aby sprawdzić, czy tunelowanie jest włączone w przypadku obecnie wybranych ścieżek (#2518). - Dodano
WrappingMediaSource, aby uprościć zawijanie pojedynczego znakuMediaSource(#7279). - Odrzucanie bufora wstecznego, zanim odtwarzanie się zatrzyma z powodu niewystarczającej ilości dostępnej pamięci.
- Zamknij blok śledzenia „doSomeWork”, gdy jest włączone przenoszenie obliczeń.
- Rozwiązano problem ze śledzeniem sesji podczas szybkiego przewijania w
PlaybackStatsListener(#180). - Wysyłanie wywołania zwrotnego
onMediaItemTransitionmissing podczas wywoływaniaseekToNextlubseekToPreviousna playliście z 1 elementem (#10667). - Dodaj
Player.getSurfaceSize, który zwraca rozmiar powierzchni, na której jest renderowany film. - Naprawiono błąd, który powodował, że usunięcie słuchaczy podczas zwalniania odtwarzacza mogło wywołać wyjątek
IllegalStateException(#10758).
- Dodano
- Kompilacja:
- Wymuszanie minimalnej wersji
compileSdkVersion, aby uniknąć błędów kompilacji (#10684). - Unikaj publikowania bloku, gdy jest on uwzględniony w innej kompilacji Gradle.
- Wymuszanie minimalnej wersji
- Wybór ścieżki:
- Jeśli wyświetlacz nie obsługuje Dolby Vision, preferuj inne ścieżki. (#8944).
- Pobrane:
- Rozwiązano problem z potencjalną nieskończoną pętlą w
ProgressiveDownloaderspowodowaną jednoczesnym pobieraniem i odtwarzaniem z tym samymPriorityTaskManager(#10570). - Natychmiastowe wyświetlanie powiadomienia o pobraniu (#183).
- Ograniczono liczbę równoległych usunięć pobierania do 1, aby uniknąć nadmiernego tworzenia wątków (#10458).
- Rozwiązano problem z potencjalną nieskończoną pętlą w
- Film:
- Wypróbuj alternatywny dekoder Dolby Vision, jeśli wyświetlacz go nie obsługuje. (#9794).
- Dźwięk:
- Używaj
SingleThreadExecutordo zwalniania instancjiAudioTrack, aby uniknąć błędów braku pamięci podczas zwalniania wielu odtwarzaczy jednocześnie (#10057). - Dodaje
AudioOffloadListener.onExperimentalOffloadedPlaybackdla stanu odciążenia AudioTrack. (#134). - Ustaw
AudioTrackBufferSizeProviderjako interfejs publiczny. - Dodaj
ExoPlayer.setPreferredAudioDevice, aby ustawić preferowane urządzenie wyjściowe audio (#135). - Zmień nazwę
androidx.media3.exoplayer.audio.AudioProcessornaandroidx.media3.common.audio.AudioProcessor. - Mapowanie 8-kanałowego i 12-kanałowego dźwięku na maski kanałów 7.1 i 7.1.4 odpowiednio we wszystkich wersjach Androida (#10701).
- Używaj
- Metadane:
MetadataRenderermożna teraz skonfigurować tak, aby renderował metadane, gdy tylko staną się dostępne. Utwórz instancję z parametremMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), aby określić, czy moduł renderujący będzie generować metadane wcześniej czy synchronicznie z pozycją odtwarzacza.
- DRM:
- Obejście błędu w implementacji ClearKey w Androidzie 13, który zwraca niepusty, ale nieprawidłowy adres URL licencji.
- Usunęliśmy błąd
setMediaDrmSession failed: session not opened, który występował podczas przełączania między schematami DRM na liście odtwarzania (np. z Widevine na ClearKey).
- Tekst:
- CEA-608: sprawdź, czy pole 2 zawiera prawidłowe polecenia przełączania usługi (#10666).
- DASH:
- Analizowanie
EventStream.presentationTimeOffsetz plików manifestu (#10460).
- Analizowanie
- UI:
- Użyj bieżących zastąpień odtwarzacza jako ustawień wstępnych w
TrackSelectionDialogBuilder(#10429).
- Użyj bieżących zastąpień odtwarzacza jako ustawień wstępnych w
- Sesja:
- Upewnij się, że polecenia są zawsze wykonywane we właściwej kolejności, nawet jeśli niektóre z nich wymagają asynchronicznego rozwiązania (#85).
- Dodaj
DefaultMediaNotificationProvider.Builder, aby utworzyć instancjeDefaultMediaNotificationProvider. Może on skonfigurować identyfikator powiadomienia, identyfikator kanału powiadomień i nazwę kanału powiadomień używane przez dostawcę. Dodaj też metodęDefaultMediaNotificationProvider.setSmallIcon(int), aby ustawić małą ikonę powiadomień. (#104). - Zapewnia, że polecenia wysłane przed
MediaController.release()nie zostaną pominięte (#99). SimpleBitmapLoadermoże wczytywać bitmapy zfile://identyfikatorów URI (#108).- Naprawiono asercję, która uniemożliwiała
MediaControllerprzewijanie reklamy w okresie (#122). - Po zakończeniu odtwarzania
MediaSessionServicejest zatrzymywany na pierwszym planie i wyświetlane jest powiadomienie o możliwości ponownego odtworzenia ostatniego odtwarzanego elementu multimedialnego (#112). - Nie uruchamiaj usługi działającej na pierwszym planie z intencją oczekującą wstrzymania (#167).
- Ręczne ukrywanie „odznaki” powiązanej z powiadomieniem utworzonym przez
DefaultNotificationProviderw przypadku interfejsów API w wersjach 26 i 27 (odznaka jest automatycznie ukrywana w przypadku interfejsów API w wersjach 28 i nowszych) (#131). - Naprawiliśmy błąd, który powodował, że drugie połączenie bindera ze starszej wersji MediaSession z Media3 MediaController powodowało wyjątki IllegalStateException (#49).
- RTSP:
- IMA:
- Dodaj limit czasu wczytywania informacji o reklamie, aby obsługiwać przypadki, w których pakiet IMA SDK zawiesza się podczas wczytywania reklamy (#10510).
- Zapobieganie pomijaniu reklam w trakcie filmu podczas przewijania do końca treści (#10685).
- Prawidłowe obliczanie czasu trwania okna w przypadku transmisji na żywo z reklamami wstawianymi po stronie serwera, np. IMA DAI (#10764).
- Rozszerzenie FFmpeg:
- Dodano nowe wymagane flagi do łączenia bibliotek FFmpeg z NDK w wersji 23.1.7779620 i nowszych (#9933).
- Rozszerzenie AV1:
- Zaktualizowano wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Androida Studio (#9933).
- Rozszerzenie Cast:
- Wprowadź
getDeviceInfo(), aby móc identyfikowaćCastPlayerpodczas sterowania odtwarzaniem za pomocąMediaController(#142).
- Wprowadź
- Transformer:
- Dodanie timera nadzorującego multiplekser, który wykrywa, kiedy generowanie próbki wyjściowej trwa zbyt długo.
- Usuń symbole, które nie są już używane:
- Usuń
Transformer.Builder.setOutputMimeType(String). Ta funkcja została usunięta. Gdy używany jest domyślny multiplekser, typ MIME zawsze będzie MP4.
- Usuń
Wersja 1.0.0-beta02
21 lipca 2022 r.
Publikacja androidx.media3:media3-*:1.0.0-beta02 Wersja 1.0.0-beta02
zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayera 2.18.1.
- Biblioteka podstawowa:
- Sprawdź, czy zmiana
ShuffleOrdernaExoPlayer.setShuffleOrderpowoduje wywołaniePlayer.Listener#onTimelineChangedzreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED(#9889). - W przypadku mediów progresywnych uwzględniaj tylko wybrane ścieżki w pozycji buforowanej (#10361).
- Zezwalanie na niestandardowy rejestrator dla wszystkich danych wyjściowych logów ExoPlayera (#9752).
- Poprawiono implementację
setDataSourceFactorywDefaultMediaSourceFactory, która w niektórych przypadkach nie działała (#116).
- Sprawdź, czy zmiana
- Ekstraktory:
- DASH:
- Parsowanie adresu URL licencji ClearKey z plików manifestu (#10246).
- UI:
- Sprawdź, czy TalkBack odczytuje aktualnie aktywną opcję szybkości w menu elementów sterujących odtwarzaniem (#10298).
- RTSP:
- Dodano obsługę fragmentowanych pakietów VP8 (#110).
- Rozszerzenie Leanback:
- Sprawdzanie zmian w
playWhenReadywLeanbackAdapter(10420).
- Sprawdzanie zmian w
- Przesyłaj:
Wersja 1.0.0-beta01
16 czerwca 2022 r.
Publikacja androidx.media3:media3-*:1.0.0-beta01 Wersja 1.0.0-beta01
zawiera te zatwierdzenia.
Odpowiada to wersji ExoPlayer 2.18.0.
- Biblioteka podstawowa:
- Włącz obsługę diagnostyki platformy Android za pomocą
MediaMetricsManager. ExoPlayer będzie przekazywać do platformy zdarzenia odtwarzania i dane o wydajności, co pomoże dostarczać informacje o wydajności systemu i debugowaniu na urządzeniu. Te dane mogą być też gromadzone przez Google, jeśli użytkownik urządzenia włączy udostępnianie danych o użytkowaniu i diagnostyce. Aplikacje mogą zrezygnować z przesyłania danych do diagnostyki platformy ExoPlayer za pomocąExoPlayer.Builder.setUsePlatformDiagnostics(false). - Naprawiliśmy błąd, który powodował zbyt częste resetowanie ścieżek podczas korzystania z
MergingMediaSource, np. podczas wczytywania napisów z pliku i zmiany wybranych napisów w trakcie odtwarzania (#10248). - Zaprzestanie wykrywania typu sieci 5G-NSA w przypadku interfejsów API w wersjach 29 i 30. Odtwarzanie będzie odbywać się w sieci 4G.
- Nie zezwalaj na przekazywanie parametru
nulldo usługMediaSource.Factory.setDrmSessionManagerProvideriMediaSource.Factory.setLoadErrorHandlingPolicy. W razie potrzeby można jawnie przekazać instancjeDefaultDrmSessionManagerProvideriDefaultLoadErrorHandlingPolicy. - Dodaj symbol
MediaItem.RequestMetadata, aby oznaczyć metadane potrzebne do odtwarzania multimediów, gdy dokładny symbolLocalConfigurationnie jest znany. Usuń teżMediaMetadata.mediaUrl, ponieważ jest to teraz uwzględnione wRequestMetadata. - Dodaj
Player.Command.COMMAND_SET_MEDIA_ITEM, aby umożliwić graczom ustawienie pojedynczego elementu.
- Włącz obsługę diagnostyki platformy Android za pomocą
- Wybór ścieżki:
- Spłaszcz klasę
TrackSelectionOverridesdoTrackSelectionParametersi przenieśTrackSelectionOverridena najwyższy poziom. - Zmień nazwę
TracksInfonaTracks, aTracksInfo.TrackGroupInfonaTracks.Group.Player.getCurrentTracksInfoiPlayer.Listener.onTracksInfoChangedzostały też zmienione naPlayer.getCurrentTracksiPlayer.Listener.onTracksChanged. Obejmuje to „wycofanie wycofania” nazwy metodyPlayer.Listener.onTracksChanged, ale z innymi typami parametrów. - Zmień
DefaultTrackSelector.buildUponParametersiDefaultTrackSelector.Parameters.buildUpon, aby zwracaćDefaultTrackSelector.Parameters.Builderzamiast wycofanegoDefaultTrackSelector.ParametersBuilder. - Dodaj
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilitiesktóra jest domyślnie włączona. Gdy ta opcja jest włączona,DefaultTrackSelectorbędzie preferować ścieżki audio, których liczba kanałów nie przekracza możliwości wyjściowych urządzenia. Na urządzeniach przenośnychDefaultTrackSelectorbędzie preferować formaty stereo/mono zamiast formatów dźwięku wielokanałowego, chyba że format wielokanałowy może być przestrzenny (Android 12L lub nowszy) lub jest formatem dźwięku przestrzennego Dolby. Dodatkowo na urządzeniach obsługujących przestrzenne odtwarzanie dźwiękuDefaultTrackSelectorbędzie monitorować zmiany w właściwościach przestrzennego odtwarzania dźwięku i w razie potrzeby wybierać nową ścieżkę. Urządzenia ztelevisiontrybem interfejsu są wykluczone z tych ograniczeń, a preferowany będzie format z największą liczbą kanałów. Aby włączyć tę funkcję, instancjaDefaultTrackSelectormusi być utworzona za pomocąContext.
- Spłaszcz klasę
- Film:
- Zmień nazwę
DummySurfacenaPlaceholderSurface. - Dodanie obsługi formatu AV1 do
MediaCodecVideoRenderer.getCodecMaxInputSize.
- Zmień nazwę
- Dźwięk:
- Używaj dekodera audio LG AC3 do wyświetlania reklam z niestandardowym typem MIME.
- Zmień typ zwracany
AudioAttributes.getAudioAttributesV21()zandroid.media.AudioAttributesna nową klasę opakowującąAudioAttributesV21, aby zapobiec powolnej weryfikacji ART w przypadku interfejsu API w wersji < 21. - W przypadku przekazywania dźwięku bez zmian, gdy liczba kanałów audio w formacie jest nieustawiona, co ma miejsce w przypadku przygotowania HLS bez segmentów (10204), wysyłaj zapytanie do platformy (API 29+) lub przyjmuj liczbę kanałów kodowania audio.
- Skonfiguruj
AudioTrackz maską kanałuAudioFormat.CHANNEL_OUT_7POINT1POINT4, jeśli dekoder generuje 12-kanałowy dźwięk PCM#10322.
- DRM
- Zapewnienie, że sesja DRM jest zawsze prawidłowo aktualizowana podczas wyszukiwania bezpośrednio po zmianie formatu (10274).
- Tekst:
- Zmień
Player.getCurrentCues(), aby zwracaćCueGroupzamiastList<Cue>. - SSA: obsługa ustawienia stylu
OutlineColour, gdyBorderStyle == 3(np.OutlineColourustawia tło wskazówki) (#8435). - CEA-708: analizuje dane na wiele bloków usług i ignoruje bloki, które nie są powiązane z aktualnie wybranym numerem obsługi klienta.
- Usuń znak
RawCcExtractor, który był używany tylko do obsługi wewnętrznego formatu napisów Google.
- Zmień
- Ekstraktory:
- UI:
- Naprawiono dostarczanie zdarzeń do
OnClickListenerustawionych naPlayerVieww przypadku, gdyuseController=false(#9605). Naprawiono też dostarczanie zdarzeń doOnLongClickListenerwe wszystkich konfiguracjach widoku. - Naprawiliśmy problem z nieprawidłowym traktowaniem sekwencji zdarzeń dotykowych, które wychodzą poza granice
PlayerViewprzedACTION_UP, jako kliknięcia (#9861). - Rozwiązaliśmy problem z ułatwieniami dostępu
PlayerView, który powodował, że kliknięcie mogło przełączać odtwarzanie zamiast ukrywać elementy sterujące (#8627). - Zmień
TrackSelectionViewiTrackSelectionDialogBuilder, aby działały z interfejsemPlayerzamiastExoPlayer. Dzięki temu widoki mogą być używane z innymi implementacjamiPlayer, a zależność modułu interfejsu od modułu ExoPlayer zostaje usunięta. Jest to zmiana powodująca niezgodność wsteczną. - Nie wyświetlaj wymuszonych ścieżek tekstowych w selektorze ścieżek
PlayerViewi zachowaj wybraną odpowiednią wymuszoną ścieżkę tekstową, jeśli wybrano „Brak” (#9432).
- Naprawiono dostarczanie zdarzeń do
- DASH:
- Analizowanie liczby kanałów z elementów DTS
AudioChannelConfiguration. Przywraca to przekazywanie dźwięku w przypadku strumieni DTS (#10159). - Nie zezwalaj na przekazywanie wartości
nulldo usługiDashMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby można jawnie przekazywać instancjeDefaultCompositeSequenceableLoaderFactory.
- Analizowanie liczby kanałów z elementów DTS
- HLS:
- Wróć do przygotowania fragmentów, jeśli atrybut CODECS playlisty nie zawiera kodeka audio (#10065).
- Nie zezwalaj na przekazywanie wartości
nulldo usługHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory,HlsMediaSource.Factory.setPlaylistParserFactoryiHlsMediaSource.Factory.setPlaylistTrackerFactory. InstancjeDefaultCompositeSequenceableLoaderFactory,DefaultHlsPlaylistParserFactorylub odwołanie doDefaultHlsPlaylistTracker.FACTORYmożna przekazywać jawnie, jeśli jest to wymagane.
- Smooth Streaming:
- Nie zezwalaj na przekazywanie wartości
nulldo usługiSsMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby można jawnie przekazywać instancjeDefaultCompositeSequenceableLoaderFactory.
- Nie zezwalaj na przekazywanie wartości
- RTSP:
- Dodano czytnik RTP dla H263 (#63).
- Dodanie czytnika RTP dla MPEG4 (#35).
- Dodano czytnik RTP dla HEVC (#36).
- Dodaj czytnik RTP dla AMR. Obecnie obsługiwane są tylko strumienie AMR jednokanałowe, nieprzeplatane. Złożony ładunek RTP AMR nie jest obsługiwany. (#46)
- Dodano czytnik RTP dla VP8 (#47).
- Dodaj czytnik RTP dla formatu WAV (#56).
- Popraw nagłówek uwierzytelniania podstawowego RTSP. (#9544).
- Przestań sprawdzać obowiązkowe pola SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
- Zgłaszanie sprawdzanego wyjątku podczas analizowania czasu RTSP (#10165).
- Dodano czytnik RTP dla VP9 (#47).
- Dodano czytnik RTP dla OPUS (#53).
- Źródła danych:
- Zmień nazwę
DummyDataSourcenaPlaceholderDataSource. - Obejście obsługi przerwań OkHttp.
- Zmień nazwę
- Sesja:
- Zastąp
MediaSession.MediaItemFillerciągiemMediaSession.Callback.onAddMediaItems, aby zezwolić na asynchroniczne rozwiązywanie żądań. - Obsługa metod
setMediaItems(s), gdyMediaControllerłączy się ze starszą sesją multimedialną. - Usuń
MediaController.setMediaUriiMediaSession.Callback.onSetMediaUri. Tę samą funkcję można uzyskać za pomocą funkcjiMediaController.setMediaItemiMediaSession.Callback.onAddMediaItems. - Przekierowywanie połączeń z usługi
MediaControllerna urządzenieMediaSession.Callback.onAddMediaItemszamiast naonSetMediaUri. - Dodaj
MediaNotification.ProvideriDefaultMediaNotificationProvider, aby dostosować powiadomienie. - Dodano
BitmapLoaderiSimpleBitmapLoaderdo pobierania obrazów z grafikami. - Dodaj
MediaSession.setCustomLayout(), aby zapewnić zgodność wsteczną ze starszą sesją. - Dodaj
MediaSession.setSessionExtras(), aby zapewnić równoważność funkcji ze starszą sesją. - Zmień nazwę
MediaSession.MediaSessionCallbacknaMediaSession.Callback,MediaLibrarySession.MediaLibrarySessionCallbacknaMediaLibrarySession.CallbackiMediaSession.Builder.setSessionCallbacknasetCallback. - Naprawiono błąd NPE w
MediaControllerImplLegacy(#59). - Aktualizowanie informacji o pozycji sesji na osi czasu change(#51).
- Naprawiono błąd NPE w
MediaControllerImplBasepo zwolnieniu kontrolera (#74).
- Zastąp
- Odtwarzanie reklam / IMA:
- Zmniejsz częstotliwość sondowania reklam ze 100 ms do 200 ms, aby dostosować ją do zaleceń organizacji Media Rating Council (MRC).
- Rozszerzenie FFmpeg:
- Zaktualizuj wersję CMake do
3.21.0+, aby uniknąć błędu CMake powodującego niepowodzenie synchronizacji Gradle w Android Studio (#9933).
- Zaktualizuj wersję CMake do
- Usuń symbole, które nie są już używane:
- Usuń
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Zamiast niej użyj zasadyPlayer.Listener.onTracksChanged(Tracks). - Usuń
Player.getCurrentTrackGroupsiPlayer.getCurrentTrackSelections. Zamiast niej użyj zasadyPlayer.getCurrentTracks. Możesz też nadal korzystać z usługExoPlayer.getCurrentTrackGroupsiExoPlayer.getCurrentTrackSelections, ale te metody są już wycofane. - Usuń stałe
DownloadHelperDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORTiDEFAULT_TRACK_SELECTOR_PARAMETERS. W miarę możliwości używaj zasadygetDefaultTrackSelectorParameters(Context), a w pozostałych przypadkach zasadyDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT. - Usuń konstruktora
DefaultTrackSelector(ExoTrackSelection.Factory). Zamiast niej używaj zasadyDefaultTrackSelector(Context, ExoTrackSelection.Factory). - Usuń
Transformer.Builder.setContext. Zamiast tego należy przekazać wartośćContextdo konstruktoraTransformer.Builder.
- Usuń
Wersja 1.0.0-alpha03
14 marca 2022 r.
Publikacja androidx.media3:media3-*:1.0.0-alpha03 Wersja 1.0.0-alpha03 zawiera te zatwierdzenia.
Odpowiada to wersji ExoPlayera 2.17.1.
- Dźwięk:
- Naprawiono błąd sprawdzania możliwości audio dla Dolby Atmos (E-AC3-JOC) w HLS.
- Ekstraktory:
- FMP4: naprawiono problem polegający na tym, że metadane próbki emsg mogły być generowane w niewłaściwej kolejności w przypadku strumieni zawierających atomy emsg w wersjach 0 i 1 (#9996).
- Tekst:
- Naprawiono interakcję między polami
SingleSampleMediaSource.Factory.setTrackIdiMediaItem.SubtitleConfiguration.Builder.setId, aby nadać priorytet poluSubtitleConfigurationi w przypadku jego braku używać wartościFactory(#10016).
- Naprawiono interakcję między polami
- Odtwarzanie reklam:
- Naprawianie niedoborów dźwięku między okresami reklamowymi w transmisjach na żywo HLS z SSAI.
Wersja 1.0.0-alpha02
2 marca 2022 r.
Publikacja androidx.media3:media3-*:1.0.0-alpha02 Wersja 1.0.0-alpha02 zawiera te zatwierdzenia.
Odpowiada to wersji ExoPlayer 2.17.0.
- Biblioteka podstawowa:
- Dodaj metodę chronioną
DefaultRenderersFactory.getCodecAdapterFactory(), aby podklasyDefaultRenderersFactory, które zastępująbuildVideoRenderers()lubbuildAudioRenderers(), mogły uzyskać dostęp do fabryki adapterów kodeków i przekazywać ją do tworzonych przez siebie instancjiMediaCodecRenderer. - Przekazywanie pól nagłówka ICY
nameigenredoMediaMetadata.stationiMediaMetadata.genreodpowiednio, aby docierały do aplikacji przezPlayer.Listener.onMediaMetadataChanged()(#9677). - Usuń klucze o wartości null z kolekcji
DefaultHttpDataSource#getResponseHeaders. - W przypadku niepowodzenia tworzenia instancji
MediaCodecpoczekaj i spróbuj ponownie. Rozwiązuje to problem, który występuje na niektórych urządzeniach podczas przełączania powierzchni z bezpiecznego kodeka na inny kodek (#8696). - Dodaj
MediaCodecAdapter.getMetrics(), aby umożliwić użytkownikom uzyskiwanie danych o metrykach zMediaCodec. (#9766). - Rozwiązano problem z rozwiązywaniem zależności Maven (#8353).
- Wyłącz automatyczne dostosowywanie szybkości w przypadku transmisji na żywo, które nie mają funkcji niskiego opóźnienia ani ustawienia szybkości wybranego przez użytkownika (#9329).
- Zmień nazwę
DecoderCounters#inputBufferCountnaqueuedInputBufferCount. - Ustaw
SimpleExoPlayer.renderersjako prywatne. Do modułów renderujących można uzyskać dostęp za pomocą funkcjiExoPlayer.getRenderer. - Zaktualizowano niektóre stałe wartości
AnalyticsListener.EventFlags, aby były zgodne z wartościami wPlayer.EventFlags. - Podziel
AnalyticsCollectorna interfejs i domyślną implementację, aby R8 mógł go usunąć, jeśli aplikacja go nie potrzebuje.
- Dodaj metodę chronioną
- Wybór ścieżki:
- Obsługa preferowanych flag ról wideo przy wyborze ścieżki (#9402).
- Zaktualizowano logikę wyboru ścieżki wideo, aby podczas wybierania wielu ścieżek wideo do adaptacji uwzględniała preferowane typy MIME i flagi ról (#9519).
- Zaktualizowano logikę wyboru ścieżek wideo i audio, aby wybierać tylko formaty do adaptacyjnego wyboru, które mają ten sam poziom obsługi dekodera i sprzętu (#9565).
- Zaktualizowano logikę wyboru ścieżki wideo, aby preferować bardziej wydajne kodeki, jeśli podstawowe dekodery z akceleracją sprzętową obsługują wiele kodeków (#4835).
- Preferuj ustawienia treści audio (np. „domyślną” ścieżkę audio lub ścieżkę pasującą do języka ustawionego w systemie) zamiast technicznych ograniczeń wyboru ścieżki (np. preferowanego typu MIME lub maksymalnej liczby kanałów).
- Rozwiązano problem z wyborem ścieżki, który polegał na tym, że zastąpienie jednej grupy ścieżek nie powodowało wyłączenia innych grup ścieżek tego samego typu (#9675).
- Rozwiązaliśmy problem z wybieraniem ścieżek, który powodował, że mieszanka niepustych i pustych zastąpień ścieżek nie była prawidłowo stosowana (#9649).
- Zabraniaj duplikowania
TrackGroupwTrackGroupArray.TrackGroups można zawsze odróżnić, ustawiającidw konstruktorzeTrackGroup. Rozwiązuje to problem z awarią podczas wznawiania odtwarzania po przejściu aplikacji do trybu tła z aktywnym zastąpieniem ścieżki (#9718). - Zmiana logiki w
AdaptiveTrackSelection, aby umożliwić zwiększenie jakości przy wystarczającej przepustowości sieci, nawet jeśli odtwarzanie jest bardzo blisko krawędzi transmisji na żywo (#9784).
- Film:
- Poprawiono logikę powrotu dekodera w przypadku Dolby Vision, aby w razie potrzeby używać zgodnego dekodera H264/H265.
- Dźwięk:
- Poprawiono logikę rezerwową dekodera Dolby Atmos (E-AC3-JOC), aby w razie potrzeby używać zgodnego dekodera E-AC3.
- Zmień interfejsy API
AudioCapabilities, aby wymagały jawnego przekazywania wartościAudioCapabilities.DEFAULT_AUDIO_CAPABILITIESzamiastnull. - Umożliwia dostosowanie obliczania rozmiaru bufora
AudioTrackprzez wstrzyknięcieAudioTrackBufferSizeProviderdoDefaultAudioSink. (#8891). - Ponów próbę utworzenia
AudioTrack, jeśli żądany rozmiar bufora był większy niż 1 MB. (#9712).
- Ekstraktory:
- Tekst:
- Dodaj pole
MediaItem.SubtitleConfiguration.id, które jest propagowane do polaFormat.idścieżki napisów utworzonej na podstawie konfiguracji (#9673). - Dodano podstawową obsługę napisów WebVTT w kontenerach Matroska (#9886).
- Uniemożliwiać
Cea708Decoderodczytywanie większej ilości danych niż zadeklarowany rozmiar bloku usługi.
- Dodaj pole
- DRM:
- Usuń urządzenie
playbackLooperz kontaDrmSessionManager.(pre)acquireSession. Jeśli aplikacja używa elementuDrmSessionManagerw niestandardowym elemencieMediaSource, zamiast tego należy przekazać elementplaybackLooperdo elementuDrmSessionManager.setPlayer.
- Usuń urządzenie
- Odtwarzanie reklam / IMA:
- Dodaj obsługę dynamicznego wstawiania reklam (DAI) w pakiecie IMA SDK (#8213).
- Dodaj metodę do
AdPlaybackState, aby umożliwić resetowanie grupy reklam, tak aby można było ją ponownie odtworzyć (#9615). - Wymuszanie szybkości odtwarzania 1,0 podczas odtwarzania reklam (#9018).
- Rozwiązaliśmy problem polegający na tym, że grupa reklam, której nie udało się załadować, powodowała natychmiastowe zresetowanie odtwarzania (#9929).
- UI:
- DASH:
- Dodanie do
Representationprzeanalizowanych właściwości podstawowych i dodatkowych (#9579). - Obsługa roli ścieżki
forced-subtitle(#9727). - Przestań interpretować rolę ścieżki
mainjakoC.SELECTION_FLAG_DEFAULT. - Poprawiono logikę wykluczania adresów URL w przypadku plików manifestu, które nie deklarują przestrzeni nazw DVB (#9856).
- Obsługa względnych adresów URL
MPD.Location(#9939).
- Dodanie do
- HLS:
- Prawidłowo wypełnij pole
Format.labelw przypadku strumieni HLS zawierających tylko audio (#9608). - Domyślnie używaj przygotowywania bez podziału na części, aby skrócić czas uruchamiania. Jeśli Twoje wersje zawierają zmuksowane ścieżki napisów, które nie są zadeklarowane w playliście reklamy nadrzędnej, musisz dodać je do tej playlisty, aby były dostępne do odtwarzania, lub wyłączyć przygotowanie bez podziału na części za pomocą parametru
HlsMediaSource.Factory.setAllowChunklessPreparation(false). - Obsługa precyzyjnego przewijania do klatki kluczowej w HLS (#2882).
- Prawidłowo wypełnij pole
- RTSP:
- Udostępnij interfejs API klienta, aby zastąpić
SocketFactoryużywany w przypadku połączeń z serwerem (#9606). - Preferuj metodę uwierzytelniania DIGEST zamiast BASIC, jeśli obie są obecne (#9800).
- Obsługa sytuacji, w której czas ścieżki RTSP jest niedostępny (#9775).
- Ignoruj nieprawidłowe wartości nagłówka RTP-Info (#9619).
- Udostępnij interfejs API klienta, aby zastąpić
- Transformer:
- Zwiększ minimalną wymaganą wersję interfejsu API do 21.
TransformationExceptionjest teraz używane do opisywania błędów, które występują podczas przekształcenia.- Dodaj
TransformationRequest, aby określić opcje przekształcania. - Zezwalaj na rejestrację wielu słuchaczy.
- Rozwiązaliśmy problem z zawieszaniem się transformatora, gdy dane wyjściowe kodeka są odczytywane częściowo.
- Naprawianie potencjalnego błędu NPE w
Transformer.getProgresspodczas zwalniania multipleksera throws. - Dodaj aplikację w wersji demonstracyjnej do stosowania przekształceń.
- Rozszerzenie MediaSession:
- Domyślnie
MediaSessionConnectorczyści teraz playlistę po zatrzymaniu. Aplikacje, które chcą zachować playlistę, mogą wywołać funkcjęsetClearMediaItemsOnStop(false)w przypadku oprogramowania sprzęgającego.
- Domyślnie
- Rozszerzenie Cast:
- Rozszerzenie FFmpeg:
- Ustawienie
build_ffmpeg.shjako zależnego od narzędzi binarnych LLVM zamiast narzędzi GNU (#9933).
- Ustawienie
- Zgodność z Androidem 12:
- Zaktualizuj rozszerzenie Cast, aby zależało od
com.google.android.gms:play-services-cast-framework:20.1.0. Starsze wersjeplay-services-cast-frameworknie są zgodne z aplikacjami kierowanymi na Androida 12 i będą się zamykać z błędemIllegalArgumentExceptionpodczas tworzeniaPendingIntent(#9528).
- Zaktualizuj rozszerzenie Cast, aby zależało od
- Usuń symbole, które nie są już używane:
- Usuń
Player.EventListener. Zamiast niej używaj zasadyPlayer.Listener. - Usuń
MediaSourceFactory#setDrmSessionManager,MediaSourceFactory#setDrmHttpDataSourceFactoryiMediaSourceFactory#setDrmUserAgent. Zamiast niej używaj zasadyMediaSourceFactory#setDrmSessionManagerProvider. - Usuń
MediaSourceFactory#setStreamKeys. Zamiast niej używaj zasadyMediaItem.Builder#setStreamKeys. - Usuń
MediaSourceFactory#createMediaSource(Uri). Zamiast niej używaj zasadyMediaSourceFactory#createMediaSource(MediaItem). - Usuń urządzenie
setTagz kontaDashMediaSource,HlsMediaSourceiSsMediaSource. Zamiast niej używaj zasadyMediaItem.Builder#setTag. - Usuń
DashMediaSource#setLivePresentationDelayMs(long, boolean). Użyj symboliMediaItem.Builder#setLiveConfigurationiMediaItem.LiveConfiguration.Builder#setTargetOffsetMs, aby zastąpić plik manifestu, lub symboluDashMediaSource#setFallbackTargetLiveOffsetMs, aby podać wartość rezerwową. - Usuń
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Rezygnacja z egzekwowania zasad dotyczących wątków nie jest już możliwa. - Usuń
ActionFileiActionFileUpgradeUtil. Aby używać funkcjiActionFileUpgradeUtildo scalania starszych plików działań wDefaultDownloadIndex, używaj ExoPlayera w wersji 2.16.1 lub starszej. - Usuń
ProgressiveMediaSource#setExtractorsFactory. Zamiast tego użyj konstruktoraProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory). - Usuń
ProgressiveMediaSource.Factory#setTagiProgressiveMediaSource.Factory#setCustomCacheKey. Zamiast niej używaj zasadMediaItem.Builder#setTagiMediaItem.Builder#setCustomCacheKey. - Usuń konstruktory
DefaultRenderersFactory(Context, @ExtensionRendererMode int)iDefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Zamiast tego użyj konstruktoraDefaultRenderersFactory(Context),DefaultRenderersFactory#setExtensionRendererModeiDefaultRenderersFactory#setAllowedVideoJoiningTimeMs. - Usuń wszystkie publiczne konstruktory
CronetDataSource. Zamiast niej używaj zasadyCronetDataSource.Factory.
- Usuń
- Zmień
IntDefsna@Target(TYPE_USE). Może to spowodować przerwanie kompilacji użyć w języku Kotlin, co można naprawić, przenosząc adnotację do adnotowania typu (Int).@AacAudioObjectType@Ac3Util.SyncFrameInfo.StreamType@AdLoadException.Type@AdtsExtractor.Flags@AmrExtractor.Flags@AspectRatioFrameLayout.ResizeMode@AudioFocusManager.PlayerCommand@AudioSink.SinkFormatSupport@BinarySearchSeeker.TimestampSearchResult.Type@BufferReplacementMode@C.BufferFlags@C.ColorRange@C.ColorSpace@C.ColorTransfer@C.CryptoMode@C.Encoding@C.PcmEncoding@C.Projection@C.SelectionReason@C.StereoMode@C.VideoOutputMode@CacheDataSource.Flags@CaptionStyleCompat.EdgeType@DataSpec.Flags@DataSpec.HttpMethods@DecoderDiscardReasons@DecoderReuseResult@DefaultAudioSink.OutputMode@DefaultDrmSessionManager.Mode@DefaultTrackSelector.SelectionEligibility@DefaultTsPayloadReaderFactory.Flags@EGLSurfaceTexture.SecureMode@EbmlProcessor.ElementType@ExoMediaDrm.KeyRequest.RequestType@ExtensionRendererMode@Extractor.ReadResult@FileTypes.Type@FlacExtractor.Flags(wcom.google.android.exoplayer2.ext.flacpakiecie)@FlacExtractor.Flags(wcom.google.android.exoplayer2.extractor.flac)@FragmentedMp4Extractor.Flags@HlsMediaPlaylist.PlaylistType@HttpDataSourceException.Type@IllegalClippingException.Reason@IllegalMergeException.Reason@LoadErrorHandlingPolicy.FallbackType@MatroskaExtractor.Flags@Mp3Extractor.Flags@Mp4Extractor.Flags@NotificationUtil.Importance@PlaybackException.FieldNumber@PlayerNotificationManager.Priority@PlayerNotificationManager.Visibility@PlayerView.ShowBuffering@Renderer.State@RendererCapabilities.AdaptiveSupport@RendererCapabilities.Capabilities@RendererCapabilities.DecoderSupport@RendererCapabilities.FormatSupport@RendererCapabilities.HardwareAccelerationSupport@RendererCapabilities.TunnelingSupport@SampleStream.ReadDataResult@SampleStream.ReadFlags@StyledPlayerView.ShowBuffering@SubtitleView.ViewType@TextAnnotation.Position@TextEmphasisSpan.MarkFill@TextEmphasisSpan.MarkShape@Track.Transformation@TrackOutput.SampleDataPart@Transformer.ProgressState@TsExtractor.Mode@TsPayloadReader.Flags@WebvttCssStyle.FontSizeUnit
Wersja 1.0.0-alpha01
27 października 2021 roku
Publikacja androidx.media3:media3-*:1.0.0-alpha01 Wersja 1.0.0-alpha01 zawiera te zatwierdzenia.
Nowe funkcje
Media3 to nowe miejsce dla bibliotek obsługi multimediów, w tym ExoPlayera. Pierwsza wersja alfa zawiera wczesne, działające implementacje bibliotek do wdrażania przypadków użycia multimediów, w tym:
- ExoPlayer, odtwarzacz multimediów na poziomie aplikacji na Androida, który można łatwo dostosowywać i rozszerzać.
- Funkcje sesji multimedialnej do wyświetlania i sterowania odtwarzaniem. Ten nowy moduł sesji korzysta z tego samego interfejsu
Playerco ExoPlayer. - Komponenty interfejsu do tworzenia interfejsów odtwarzania multimediów.
- Moduły zawierające funkcje innych bibliotek do użycia z ExoPlayerem, np. wstawianie reklam za pomocą pakietu IMA SDK.
Więcej informacji znajdziesz w projekcie Media3 na GitHubie.
ExoPlayer był wcześniej hostowany w osobnym projekcie ExoPlayer GitHub. W Media3 nazwa pakietu to androidx.media3.exoplayer. Planujemy jeszcze przez jakiś czas utrzymywać i udostępniać projekt ExoPlayer w GitHubie, aby dać aplikacjom czas na przejście na Media3.
Biblioteka Media3 ma zamienniki wszystkich modułów ExoPlayera z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session. Zapewnia to bezpośrednią integrację między odtwarzaczami a sesjami multimedialnymi bez konieczności używania klasy adaptera lub łącznika.