Media3
| Najnowsza aktualizacja | Wersja stabilna | Wersja kandydująca do publikacji | Wersja beta | Wersja alfa |
|---|---|---|---|---|
| 21 października 2026 r. | 1.11.1 | - | - | 1.12.0-alpha01 |
Deklarowanie zależności
Aby dodać zależność od Media3, musisz dodać do projektu repozytorium Maven Google. Więcej informacji znajdziesz w repozytorium Maven Google.
Dodaj zależności dla artefaktów, których potrzebujesz, w pliku build.gradle aplikacji lub modułu:
Groovy
dependencies { def media3_version = "1.11.1" // 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 extracting and processing video frames implementation "androidx.media3:media3-inspector-frame:$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 applying Lottie effects on video frames implementation "androidx.media3:media3-effect-lottie:$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.11.1" // 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 inspecting media files implementation("androidx.media3:media3-inspector:$media3_version") // For extracting and processing video frames implementation("androidx.media3:media3-inspector-frame:$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 applying Lottie effects on video frames implementation("androidx.media3:media3-effect-lottie:$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.
Prześlij opinię
Twoja opinia pomoże nam ulepszyć Jetpacka. Możesz użyć narzędzia Issue Tracker Media3, aby znaleźć odpowiedzi na pytania, znane problemy i prośby o dodanie funkcji oraz zgłosić nowe problemy.
Wersja 1.12.0
Wersja 1.12.0-alpha01
21 października 2026 r.
Wersja 1.12.0-alpha01 zawiera te zatwierdzenia.
- Biblioteka wspólna:
- Dodaj
C.COLOR_SPACE_DISPLAY_P3i obsługę przestrzeni barw Display P3 w mapowaniu kolorów ISOMediaFormatUtiliColorInfo. - Dodano centralny rejestr
Flagsdo zarządzania flagami funkcji eksperymentalnych i wdrażaniem etapowym (Flags.setCanaryModeEnabled). Przeniesiono wiele istniejących metod@ExperimentalApi, aby korzystały z nowego interfejsu API flag. - Dodaj
MediaMetadata.playlistId,MediaMetadata.Builder.setPlaylistId(String),MediaMetadata.categoriesiMediaMetadata.Builder.setCategories(List<String>). - Zastąp
androidx.media3.common.util.NonNullApiadnotacjami JSpecifyorg.jspecify.annotations.NullMarked.
- Dodaj
- ExoPlayer:
- Rozwiązaliśmy problem, który powodował, że odtwarzanie wielookresowe DASH zacinało się, gdy nie udało się wczytać pierwszego fragmentu następnego okresu (#3396).
- Zgłoś
wasCanceled = truewAnalyticsListener.onLoadErroriMediaSourceEventListener.onLoadError, gdy wyczerpią się próby wczytania. - Obsługa rejestrowania wielu instancji
VideoFrameMetadataListenerza pomocąExoPlayer.addVideoFrameMetadataListeneriExoPlayer.removeVideoFrameMetadataListener, wycofanieExoPlayer.setVideoFrameMetadataListeneriExoPlayer.clearVideoFrameMetadataListener. - Dodaj obsługę reklam w treściach z wieloma przedziałami czasu (np. DASH), dzieląc i przesuwając
AdPlaybackStatedla każdego przedziału czasu. - Naprawiono sytuację wyścigu w
PreCacheHelper, w której anulowanie trwającego żądania przygotowania mogło nadal powodować rozpoczęcie pobierania w tle. - Ogranicz
setLoadOnlySelectedTracks(true)wProgressiveMediaSourceiDefaultMediaSourceFactory, aby odfiltrować tylko niezaznaczone ścieżki wideo i obrazu. Ścieżki audio i tekstowe są zawsze wczytywane, aby umożliwić płynne przełączanie ścieżek bez ponownego buforowania. - Domyślnie włącz
setLoadOnlySelectedTracks(true)na urządzeniachProgressiveMediaSourceiDefaultMediaSourceFactory. Pozwala to zaoszczędzić pamięć i umożliwia dokładniejsze obliczanie przydziału buforaDefaultLoadControl, gdy nie wszystkie ścieżki są wybrane. Pamiętaj, że może to spowodować dodatkowe buforowanie, jeśli niewybrane ścieżki wideo lub obrazu zostaną włączone w trakcie odtwarzania. - Rozwiązaliśmy problem, który powodował, że funkcja
Player.getCurrentPosition()mogła zwracać nieaktualne wartości (aktualizowane tylko kilka razy na sekundę), gdy włączone było dynamiczne planowanie (#3286). - Rozwiązaliśmy problem, który powodował, że nieoczekiwany spadek lub reset pozycji głowicy odtwarzania
AudioTrackmógł być nieprawidłowo traktowany jako przepełnienie liczby całkowitej, co powodowało zatrzymanie odtwarzania podczas buforowania (#3407). - Usuń eksperymentalne
DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean). - Unikanie niepotrzebnego ponownego włączania renderowania i błędów podczas powrotu z reklam pełnoekranowych lub reklam do treści przyciętych na końcu (#3371).
- Rozwiązaliśmy problem, który powodował, że błąd renderowania w przypadku nadchodzącego elementu playlisty mógł przedwcześnie przerywać bieżące odtwarzanie, gdy włączona była opcja
Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION. - Naprawiliśmy błąd (
NullPointerException), który mógł wystąpić, gdyExoPlayerprzełączał renderery na nieprzygotowany okres multimedialny przy włączonej opcjiFlags.FLAG_PER_STREAM_MEDIA_PROGRESSION. - Rozwiązaliśmy problem, który powodował, że klatki wideo mogły być nieoczekiwanie pomijane lub odrzucane podczas dynamicznego planowania, gdy włączona była funkcja
Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS. - Naprawiono błąd
ArrayIndexOutOfBoundsExceptionw detektorach statystyk występujący podczas zatrzymywania odtwarzania w trakcie reklamy w transmisji na żywo (#3423). - Rozwiązaliśmy problem, który powodował, że
PreloadMediaSourcemógł nieoczekiwanie opublikować zdarzenie wstępnego ładowania, gdypreload()nie został wywołany (#3408). - Rozwiązaliśmy problem, który powodował, że parametr
Format.subsampleOffsetUsbył ignorowany w przypadku ścieżek metadanych, co powodowało nieprawidłowe sygnatury czasowe odtwarzania w zdekodowanych poleceniach podziału SCTE-35 (#3413). - Naprawiono wyciek pamięci w
PreloadMediaSourceiDefaultPreloadManager, gdy metodapreload()jest wywoływana wielokrotnie w tym samym źródle (#3445). - Naprawiliśmy błąd
NullPointerException, który występował podczas zwalnianiaAdsMediaSource, gdy oczekiwano na odświeżenie osi czasu treści (#3442). - Rozwiązaliśmy problem, który powodował, że odtwarzanie multimediów progresywnych mogło przeskakiwać do nieprawidłowej pozycji, gdy wczytywanie po przewinięciu (lub rozpoczęcie odtwarzania w pozycji innej niż zero) nie powiodło się i zostało ponowione (#3440).
- Dodano obejście problemu z dekoderem H.264 w Xiaomi TV Stick 4K (MiTV-AYFR0), który zawieszał się podczas płynnych zmian rozdzielczości (#3457).
- Naprawiono błąd
NullPointerExceptionwSteeringManifestTracker, który występował, gdy moduł śledzący został zatrzymany przed wykonaniem opublikowanego wywołania zwrotnego dotyczącego zakończenia wczytywania lub błędu (#3443). - Obsługa odtwarzania metadanych czasowych HAGC (ST 2094-50) ze ścieżek metadanych w ramkach
mebxw plikach MP4. - Rozwiązaliśmy problem, który powodował, że okresy multimediów na playliście, które wolno się przygotowywały, mogły być pomijane.
- CompositionPlayer:
- Obsługa konfigurowania liczby klatek na potrzeby agregacji klatek wideo za pomocą
Composition.Builder.setVideoFrameAggregationParametersw przypadku przepływów pracy związanych z odtwarzaniem. - Naprawiono problem z pomijaniem klatek w kompozycjach z wieloma sekwencjami, który był spowodowany niedopasowaniem kwantyzacji lub zaokrąglania sygnatury czasowej. Teraz podczas agregacji klatek wybierana jest klatka z najbliższą sygnaturą czasową. Ta funkcja jest dostępna tylko od interfejsu API 29, ponieważ wymaga przechowywania 1 dodatkowej klatki w locie na sekwencję wideo.
- Obsługa konfigurowania liczby klatek na potrzeby agregacji klatek wideo za pomocą
- Transformator:
- Obsługa konfigurowania liczby klatek na potrzeby agregacji klatek wideo za pomocą
Composition.Builder.setVideoFrameAggregationParametersw przypadku przepływów pracy związanych z eksportem. - Naprawiono gubienie klatek w kompozycjach z wieloma sekwencjami spowodowane niedopasowaniem kwantyzacji lub zaokrąglania sygnatury czasowej przez wybór klatki z najbliższą sygnaturą czasową podczas agregacji klatek. Ta funkcja jest dostępna tylko od interfejsu API 29, ponieważ wymaga przechowywania 1 dodatkowej klatki w locie na sekwencję wideo.
- Uwzględniaj
Transformer#setAudioMimeType(AUDIO_RAW), gdy używane sąAudioProcessors. Przed wprowadzeniem tej poprawki żądanieMimeTypes.AUDIO_RAWi zastosowanieAudioProcessorpowodowało kompresję danych wyjściowych.
- Obsługa konfigurowania liczby klatek na potrzeby agregacji klatek wideo za pomocą
- Wybór ścieżki:
- Naprawiliśmy błąd, który powodował, że na niektórych urządzeniach ścieżka SDR była nieprawidłowo preferowana nad obsługiwaną ścieżką Dolby Vision (#3135).
- Ekstraktory:
- Mp4Extractor: naprawiono błąd analizy pola
dOpsw przypadku formatu Opus w MP4, gdzie wartościPreSkip,InputSampleRateiOutputGainnie były konwertowane z formatu big-endian na little-endian, co powodowało pominięcie pierwszych ok. 299 ms dźwięku, gdy nie było listy edycji (#3431). - Usuń
Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES,Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265,FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIESiFragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265, ponieważ analiza zależności próbek w ramach GOP dla H.264 i H.265 jest domyślnie włączona. - Mp4Extractor: poprawiono analizowanie metadanych lokalizacji z pól
xyzzawierających współrzędne wysokości, aby wypełnićMp4LocationData. - Dodaliśmy
ExtractorUtil.getFramesPerEncodedSample, aby umożliwić obliczanie liczby klatek audio na próbkę w przypadku zakodowanych formatów audio (#3367). - Dodaj
FLAG_READ_XMP_METADATAdoMp4Extractor, aby wyodrębnić metadane XMP z boksów UUID najwyższego poziomu. - Naprawiono uszkodzony dźwięk AC-3, DTS i LPCM podczas odtwarzania treści MPEG-PS w stylu DVD przez usunięcie nagłówka podstrumienia
private_stream_1z każdego pakietu PES wPsExtractor, zanim ładunek zostanie przekazany do czytnika dźwięku (#3327). - Naprawiono błąd w
FragmentedMp4Extractor, gdy poletfdtw wersji 1 koduje ujemną wartośćbaseMediaDecodeTime(#3412). - MPEG-TS: obsługa analizowania wiadomości SEI dotyczących układu pakowania klatek H.264 i H.265 w celu wypełnienia
Format.stereoMode(#3419). - Analizowanie danych konfiguracji Dolby Vision Profile 20 i odrzucanie nieobsługiwanych profili Dolby Vision zamiast odtwarzania ich jako standardowych plików HEVC z nieprawidłowymi kolorami (#3427).
- MP3: cofnięto dostosowanie metadanych opóźnienia i dopełnienia kodera LAME/Xing, ponieważ jest ono niezgodne z wieloma dekoderami MP3
MediaCodec(#3425). - Matroska: naprawiono błąd
NullPointerExceptionpodczas analizowania zagnieżdżonych elementówChapterAtom(#3438). - Ogg: naprawiono błąd, który powodował, że pakiet o rozmiarze będącym wielokrotnością 255 bajtów i kończący się na granicy strony był scalany z następnym pakietem.
- MP4: analizuj ścieżki metadanych z kodowaniem czasowym w ramkach
mebxwMp4ExtractoriFragmentedMp4Extractor. Ścieżki z kluczemit35są widoczne jakoMimeTypes.APPLICATION_ITUT_T35(co umożliwia odtwarzanie HAGC). Inne ścieżkimebxsą ignorowane, chyba że ustawionoFLAG_EMIT_RAW_MEBX_DATA. W takim przypadku wszystkie ścieżkimebxsą emitowane jako nieprzetworzoneMimeTypes.APPLICATION_MEBX. - Ogg: dodano obsługę wyodrębniania dopełnienia końcowego Opus na potrzeby odtwarzania bez przerw (#2576) i poprawiono sygnatury czasowe próbek po przejściu do strony, która zaczyna się od kontynuowanego pakietu.
- Ogg: naprawiono błędy dekodowania i skoki sygnatury czasowej o około 1 sekundę w połączonych strumieniach Ogg Opus przez ignorowanie pakietów nagłówka komentarza i identyfikatora Opus w środku strumienia.
- Mp4Extractor: naprawiono błąd analizy pola
- Inspektor:
- Obsługa pobierania metadanych XMP z plików MP4 za pomocą
MetadataRetriever. - Obsługa wyodrębniania ścieżek metadanych z ramkami czasowymi
mebxwMediaExtractorCompatjakoMimeTypes.APPLICATION_MEBX.
- Obsługa pobierania metadanych XMP z plików MP4 za pomocą
- Ramka inspektora:
- Naprawiono przycinanie kolorów o szerokiej gamie BT.2020 w obrazie bazowym SDR podczas wyodrębniania klatek Ultra HDR za pomocą
FrameExtractor. Kolory spoza gamy są teraz delikatnie kompresowane do gamy sRGB, a nie przycinane.
- Naprawiono przycinanie kolorów o szerokiej gamie BT.2020 w obrazie bazowym SDR podczas wyodrębniania klatek Ultra HDR za pomocą
- Dźwięk:
- Dodano obejście problemu z urządzeniami, które wywołują
android.media.AudioDeviceCallbackw niewłaściwym wątku (#3386). - Rozwiązaliśmy problem z potencjalnym zawieszaniem się odtwarzania po przejściu między utworami przy użyciu skompresowanego odciążenia.
- Rozwiązaliśmy problem z urządzeniami Amazon Fire TV, na których dźwięk AC-3 mógł się zawieszać podczas przejść między okresami (#3448).
- Obsługa przycinania dopełnienia kodera na końcu strumienia w przypadku odtwarzania bez przerw w formatach Ogg i WebM/Matroska Opus (#2576).
- Naprawiliśmy błąd, który powodował, że aktualizacje opóźnienia i dopełnienia podczas przejść między utworami były stosowane do odtwarzanego utworu, a nie do następnego.
- Przycinanie dopełnienia końcowego kodera w przypadku pojedynczych strumieni i ostatniego strumienia na playliście, a także przejścia bez przerw w środku playlisty (#2576).
- Unikaj niepotrzebnych kopii bufora audio w
TrimmingAudioProcessorpo zakończeniu przycinania opóźnienia kodera na początku strumienia i gdy nie trzeba przycinać dopełnienia na końcu strumienia.
- Dodano obejście problemu z urządzeniami, które wywołują
- Film:
- Naprawiono raportowanie opóźnionych klatek wideo z identycznymi sygnaturami czasowymi, dzięki czemu są one raportowane jako porzucone, a nie pominięte.
- Tekst:
- Dodaj
MediaItem.SubtitleConfiguration.timeOffsetUs, aby przesunąć sygnatury czasowe napisów z nieoficjalnych źródeł względem multimediów. Przesunięcie można zmienić podczas odtwarzania za pomocąPlayer.replaceMediaItem(int, MediaItem)bez przerywania odtwarzania (#1976). - SubRip: dodano obsługę wstrzykiwania
CharsetDetectordoDefaultSubtitleParserFactoryw celu wykrywania kodowania znaków samodzielnych napisów SubRip bez znacznika kolejności bajtów (#2247).
- Dodaj
- Efekt:
- Zaimplementuj
SoundSeparationAudioProcessordo separacji źródeł dźwięku za pomocą modułu StudioSound GMSCore.
- Zaimplementuj
- Multipleksery:
- Naprawiono zapisywanie pola
dOpsdla kodeka Opus wMp4MuxeriFragmentedMp4Muxer, gdziePreSkip,InputSampleRateiOutputGainbyły zapisywane w formacie little-endian zamiast big-endian (#3431). - Obsługa zapisywania wysokości GPS w
Mp4LocationDataza pomocąMp4Muxer. - Dodaj
Muxer.Factory.create(ParcelFileDescriptor), aby umożliwić multipleksowanie bezpośrednio doParcelFileDescriptor. - Domyślnie zapisuj pole
tfdt(Track Fragment Base Media Decode Time) w polachtrafwe fragmentowanych plikach MP4, aby podawać sygnatury czasowe dekodowania multimediów. - Obsługa zapisu kontenerów E-AC-3 i E-AC-3 JOC (Dolby Atmos)
dec3wMp4Muxer. - Dodaj obsługę formatu WebM do:
MediaMuxerCompat. - Zapisuj pole
mfra(Movie Fragment Random Access) na końcu pofragmentowanych plików MP4, aby umożliwić wyszukiwanie wFragmentedMp4Extractorza pomocąFLAG_READ_MFRA_FOR_SEEK_MAP. - Naprawiono błąd powodujący awarię w
Mp4WriteriFragmentedMp4Writerpodczas zapisywania próbki EOS przed zapisaniem innych próbek. - Naprawiono zgodność kontenera podczas multipleksowania treści Dolby do plików MP4 lub pofragmentowanych plików MP4 przez reklamowanie zgodnej marki
dby1w nagłówku kontenera (#3369). - Obsługa 32-bitowych ścieżek audio PCM w formatach
Mp4MuxeriFragmentedMp4Muxer(#3389). - Odrzucaj nieobsługiwane profile Dolby Vision w
Mp4MuxeriFragmentedMp4Muxerpodczas dodawania ścieżek. - Obsługa 24- i 32-bitowych ścieżek audio PCM w formatach
Mp4MuxeriFragmentedMp4Muxer.
- Naprawiono zapisywanie pola
- Rozszerzenie IMA:
- Przekaż zdarzenia wstrzymania i wznowienia odtwarzacza do pakietu IMA SDK w języku
ImaServerSideAdInsertionMediaSource.
- Przekaż zdarzenia wstrzymania i wznowienia odtwarzacza do pakietu IMA SDK w języku
- Sesja:
- Dodaj
MediaConstants.EXTRAS_KEY_PLAYLIST_ID,MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE,MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URIiMediaConstants.EXTRAS_KEY_CATEGORIES, aby wypełnić metadane playlisty i elementu na podstawie starszych metadanych i opisów, orazMediaConstants.EXTRAS_KEY_SUGGESTED_TYPEiMediaConstants.EXTRAS_KEY_TTL_SECONDS, aby uzyskać sugestięLibraryParams.extras. - Naprawiono błąd powodujący awarię
SecurityExceptionpodczas tworzenia lub zwalnianiaMediaSessionna urządzeniach, na których obowiązują rygorystyczne limityPendingIntent. - Naprawiliśmy problem, który powodował, że podczas żądań odtwarzania na Androidzie 12 (API 31 i 32) zwracany był błąd
MediaSession.getControllerForCurrentRequest()null, gdy aplikacjaMediaSessionServicenie była jeszcze na pierwszym planie. - Naprawiono błąd powodujący awarię
IllegalArgumentException, gdyMediaControllerłączy się ze starszą sesją, która zgłasza ujemną maksymalną głośność. - Naprawiliśmy błąd, który powodował, że wywołanie
MediaController.setMediaItemlubsetMediaItems, a następnieplay()w przypadku wstrzymanego starszego elementuMediaSessionCompatmogło wysyłać nieobsługiwane wywołanie zwrotneonPrepareFrom*zamiastonPlayFrom*lub wysyłaćonPlay()bez ponownej inicjalizacji żądanego elementu multimedialnego. - Naprawiono błąd
NullPointerExceptionw starszej wersjiMediaBrowserpodczas otrzymywania odpowiedzi na polecenie niestandardowe (#3432). - Naprawiono błąd powodujący awarię
IllegalArgumentExceptionpodczas odbierania starszych metadanych ze zduplikowanymi kluczami w powiązanym elemencieBundle. - Połączenie wychodzące
MediaControllerCompat.TransportControlswywołuje połączenia wykonane w ramach tej samej iteracjiLooperpodczas kontrolowania starszej wersjiMediaSessionCompat(na przykład wywołaniesetMediaItem,prepareiplayrazem wysyła teraz pojedyncze wywołanie zwrotneonPlayFrom*).
- Dodaj
- UI:
- Naprawiono pozycjonowanie znaków interpunkcyjnych w napisach w językach od prawej do lewej i zachowywanie zakresu rozpiętości, gdy włączone jest dwukierunkowe zawijanie tekstu (#3454, #3455).
- Dodaj klasy
TrackSelectionStateiTrackSelectionParametersStateoraz odpowiadające im funkcje zapamiętywania stanu funkcji typu „composable” do modułumedia3-ui-compose. - Wprowadź
PresentationState.videoAspectRatioi spraw, abyModifier.resizeWithContentScaleprzyjmowałaspectRatio: Float?zamiastsourceSizeDp: Size?. - Dodaj klasę
CuesStatei funkcję kompozycyjnąrememberCuesStatedo modułumedia3-ui-compose, aby słuchać bieżących wskazówek odtwarzacza. - Dodaj obsługę trybu czyszczenia do urządzenia
ProgressSlider, jeśli jest ono oparte na urządzeniuExoPlayerlubCompositionPlayer. - Dodaj obsługę
showArtworkdoPresentationStatei używaj jej do pomiaru czasu renderowania podanego opcjonalnego elementu kompozycyjnegoartworkwContentFrameiPlayer. Dodaj funkcję kompozycyjnąArtwork, która będzie używana jako wartość domyślna dla boksuartwork. - Dodaj nowe pola do
PlayPauseButtonState(showBuffering,showRetry,showReplay) i użyj ich wPlayPauseButton, aby renderować więcej ikon i wskaźnik buforowania. - Dodaj klasę
PlaybackState, aby umożliwić niestandardową obserwację stanu odtwarzania, i wprowadźBufferingIndicatorjako komponent niezależny od przycisku. - Rozwiązaliśmy problem, który powodował, że
PlayerViewiPlayerControlViewwyświetlały znaczniki reklam na granicach okresów w przypadku obiektów zastępczych reklam po filmie w transmisjach na żywo z wieloma okresami. - Komponowalne boksy
Player,ContentFrame,PlayerDefaultsiMiniControllernie otrzymują już odtwarzacza ani widoczności elementów sterujących jako parametrów. Zamiast tego przechwyć je z zakresu wywołania (np.topControlsto teraz@Composable BoxScope.() -> Unit). To zmiana powodująca niezgodność w niestabilnym interfejsie API. - Dodaj parametr
alignmentdoContentFrame,PlayeriModifier.resizeWithContentScale, aby umieścić przeskalowaną treść w kontenerze i przyciąć zawartośćContentFramedo jej granic, dzięki czemu film przeskalowany za pomocąContentScale.Cropnie będzie już wyświetlany poza nią. - Dodaj obsługę interfejsu transmisji na żywo do
ProgressSlider,ProgressStateWithTickCountiProgressStateWithTickInterval, udostępniającisLiveiliveOffsetMs. Dodanie funkcji kompozycyjnejLiveButtondomedia3-ui-compose-material3(#2213).
- Rozszerzenie Ktor:
- Rozwiązaliśmy problem, który powodował, że
KtorDataSourcemógł traktować błędy połączenia w trakcie strumieniowania jako koniec danych wejściowych, zamiast zgłaszać błądHttpDataSourceException(#3460).
- Rozwiązaliśmy problem, który powodował, że
- Rozszerzenie HLS:
- Analizuj
VIDEO-RANGE(PQiHLG) wEXT-X-STREAM-INFiEXT-X-I-FRAME-STREAM-INFdoFormat.colorInfo(#3441). - Naprawiono błąd
NullPointerExceptionpodczas analizowania segmentów inicjowania MPEG-TSEXT-X-MAP, które zawierają próbki multimediów PES (#3456). - Naprawiono regresję, w której
Format.idiFormat.metadatabyłynullw przypadku udostępnionych ścieżek HLS (#3402). - Przycinaj reklamy z listy zasobów do
X-PLAYOUT-LIMITi pomijaj te, które całkowicie przekraczają limit. Ustaw domyślne przesunięcie wznowienia treści na 0, gdy reklama pełnoekranowa pomijaX-RESUME-OFFSET, a jej czas trwania jest nieznany, nawet jeśli ustawionoX-PLAYOUT-LIMIT. - Rozwiązaliśmy problem, który powodował, że rozwiązanie reklamy pełnoekranowej
X-ASSET-LISTzastępowało przesunięcie wznowienia treści innych reklam pełnoekranowych w tej samej grupie reklam.
- Analizuj
- Rozszerzenie DASH:
- Obsługa analizowania zdarzeń wstawiania (
urn:mpeg:dash:event:alternativeMPD:insert:2025) i zastępowania (urn:mpeg:dash:event:alternativeMPD:replace:2025) alternatywnego pliku MPD wDashManifestParseroraz udostępnianie ich jako instancjiAlternativeMpdEventwPeriod.alternativeMpdEvents. Jest to zmiana powodująca niezgodność w aplikacjach, które są podklasąDashManifestParser:DashManifestParser.buildPeriodprzyjmuje teraz dodatkowy parametrList<AlternativeMpdEvent>, a poprzednie przeciążenie zostało usunięte. Aplikacje zastępująceDashManifestParser.parseEventStream(XmlPullParser)muszą zamiast tego zastępowaćDashManifestParser.parseEventStream(XmlPullParser, String), ponieważ pierwsza z tych metod została wycofana i w przyszłej wersji zostanie oznaczona jako prywatna. - Analizowanie informacji o kolorach CICP (
ColourPrimaries,TransferCharacteristics,MatrixCoefficientsiVideoFullRangeFlag) z deskryptorówEssentialPropertyiSupplementalPropertydoFormat.colorInfo(#3426). - Obsługa list wartości
@idrozdzielonych spacjami w atrybutach@valuedeskryptora trybu podstępu (http://dashif.org/guidelines/trickmode) (#3315). - Obsługa analizowania
<ProducerReferenceTime>wDashManifestParser, udostępniania wAdaptationSet.producerReferenceTimesi używania do wypełnianiaTimeline.Window.presentationStartTimeMsiTimeline.Window.windowStartTimeMsw przypadku strumieni VOD. - Dodaliśmy obsługę sterowania treścią DASH (#1689).
- Naprawiono błąd
NullPointerException, który mógł wystąpić podczas analizowania pliku manifestu DASH z brakującym atrybutem w elemencie<UTCTiming>(#3436).
- Obsługa analizowania zdarzeń wstawiania (
- Rozszerzenie RTSP:
- Naprawiono błąd powodujący awarię
IllegalStateExceptionpodczas przetwarzania opóźnionych odpowiedzi sieciowych po zamknięciu klienta RTSP. - Rozwiązaliśmy problem, który powodował, że szybkie przewijanie mogło nieprawidłowo aktywować mechanizm zastępczy protokołu TCP.
- Naprawiono błąd powodujący awarię
IllegalStateException, który mógł wystąpić podczas przetwarzania opóźnionych odpowiedzi sieciowych po zresetowaniu stanu klienta RTSP podczas ponownego wyboru ścieżki, zakończenia sesji lub przekierowania URI. - Rozwiązaliśmy problem, który powodował, że ponowne przewijanie przed wznowieniem odtwarzania mogło powodować awarię
IllegalStateException. - Rozwiązaliśmy problem, który powodował, że przewijanie do tyłu, gdy przewijanie było już w toku, mogło powodować zaniki dźwięku i zatrzymanie odtwarzania filmu.
- Rozwiązaliśmy problem, który powodował, że jednostki dostępu do klatek kluczowych H.264 i H.265 kończące się pakietem agregacji lub pakietem innym niż IDR nie były oznaczane jako klatki kluczowe, co powodowało, że odtwarzanie zatrzymywało się na buforowaniu (#3434).
- Naprawiono błąd powodujący awarię
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Rozszerzenie Opus: naprawiono awarię JNI podczas dekodowania nieprawidłowych danych Opus.
- Rozszerzenie Opus: naprawiono błąd, który powodował ignorowanie dopełnienia odrzucenia, gdy dopełnienie przed pominięciem i dopełnienie odrzucenia znajdowały się w tym samym pakiecie (#2576).
- Rozszerzenie Cast:
- Wprowadź
SessionAvailabilityListener.SessionUnavailableReason, aby przedstawić przyczynę niedostępności sesji, i podaj przeciążoną metodę dlaSessionAvailabilityListener.onCastSessionUnavailable, aby ją ujawnić. - Rozwiązaliśmy problem, który powodował, że po zatrzymaniu sesji przesyłania odtwarzanie było nieoczekiwanie wznawiane lokalnie.
- Rejestrowanie błędu, gdy operacje
RemoteMediaClient(takie jak odtwarzanie, wstrzymanie, zmiana szybkości, tryb powtarzania, głośność, wyciszenie lub wybór utworu) nie powiodą się wRemoteCastPlayer(#3373). - Naprawiono błąd
ArrayIndexOutOfBoundsExceptionwRemoteCastPlayer, który występował, gdy kolejka odbiornika Cast zmieniała się lub zmniejszała podczas operacji wyszukiwania (#3372). - Rozwiązaliśmy problem z domyślnym odbiornikiem Cast, który powodował, że na osi czasu były wyświetlane tylko elementy multimedialne znajdujące się bezpośrednio obok aktywnego elementu, a nie cała playlista (#3129).
- Natychmiastowe aktualizowanie osi czasu i pozycji odtwarzania podczas modyfikowania playlisty (
setMediaItems,addMediaItems,moveMediaItems,removeMediaItems) lub przewijania wRemoteCastPlayeroraz kolejkowanie kolejnych operacji na playliście, aby były wykonywane niezawodnie w odpowiedniej kolejności (#2639, #3272). - Naprawiliśmy błąd, który powodował, że wywołanie
addMediaItemsw pustej kolejce wRemoteCastPlayernie powodowało wczytania elementów multimedialnych w odbiorniku Cast (#2402). - Rozwiązaliśmy problem w aplikacji
RemoteCastPlayer, który powodował, że po dotarciu do końca kolejki odbiornika Cast oś czasu była czyszczona, zamiast zachowywać playlistę. - Rozwiązaliśmy problem, który powodował, że parametry
playWhenReady,repeatModeiplaybackParametersnie były przenoszone ani stosowane, gdy zostały ustawione wRemoteCastPlayerprzed wczytaniem elementów multimedialnych (np. podczas przenoszenia odtwarzania z lokalnego na zdalne wCastPlayer) (#889).
- Wprowadź
- Aplikacja demonstracyjna:
- Dodaj obsługę elementów multimedialnych chronionych przez DRM i dodatkowy przykładowy strumień HLS do katalogu aplikacji demonstracyjnej sesji.
- Skonfiguruj
RemoteCastPlayerza pomocąCastTrackSelectorw aplikacji demonstracyjnej sesji, aby umożliwić wybór napisów i ścieżki audio podczas przesyłania.
- Usuń wycofane symbole:
- Usuń narzędzia
DashUtil.buildDataSpec(Representation, RangedUri, int)iDashUtil.buildDataSpec(Representation, String, RangedUri, int). Użyj w zamian zasadyDashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>).
- Usuń narzędzia
- Kompilacja:
- Zwiększ Gradle
minSdkdo 24.
- Zwiększ Gradle
Wersja 1.11.0
1.11.1
10 września 2026 r.
- ExoPlayer:
- Przenieś flagę, aby włączyć lub wyłączyć metadane HAGC dla multimediów progresywnych z
MediaSource.FactorynaExtractorsFactory. Poprzednia metodasetExperimentalEnableHagcPlaybackzostała usunięta i zastąpiona przezExtractorsFactory.setParseHagcMetadata. Rozwiązuje to też problem, który powodował, że wyłączenie nie działało w przypadku kontenerów Matroska/WebM. - Rozwiązaliśmy problem z zatrzymywaniem odtwarzania, który występował podczas wstępnego rozgrzewania nieumożliwiającego ruchu (między sieciami) mechanizmu renderowania dodatkowego.
- Rozwiązaliśmy problem z wstępnym rozgrzewaniem, który powodował, że
Surfacepowinien zostać zwrócony do głównego renderera, gdy przewijanie resetowało i wyłączało oba renderery. - Naprawiliśmy błąd
ArrayIndexOutOfBoundsException, który powodował, że odświeżenie osi czasu na żywo przesuwało domyślną pozycję za reklamę wstawioną po stronie serwera, która jest obecnie odtwarzana (#3348). - Rozwiązaliśmy problem z trybem przewijania, który powodował, że podczas przewijania z włączoną funkcją
ScrubbingModeParameters.allowSkippingMediaCodecFlushmogły być przez chwilę wyświetlane nieaktualne klatki wideo.
- Przenieś flagę, aby włączyć lub wyłączyć metadane HAGC dla multimediów progresywnych z
- Ekstraktory:
- Matroska: rozwiązaliśmy problem, który powodował, że ścieżki umieszczone po klastrach nie powodowały wyświetlenia osi czasu z możliwością przewijania (#3377).
- Dźwięk:
- Naprawiono obliczanie rozmiaru bufora w
SilenceSkippingAudioProcessor, dzięki czemu minimalny czas trwania ciszy nie jest nieprawidłowo skalowany w dół przez rozmiar klatki (#3271). - Naprawiono obsługę 8-bitowego PCM w
PcmAudioUtil, aby traktować próbki jako niepodpisane, zgodnie z definicją Androida (#3271). - Rozwiązaliśmy problem z odciążaniem, który powodował, że odtwarzanie mogło się zatrzymywać podczas reklam przed filmem lub przejść bez przerw z powodu ograniczonego rozmiaru bufora sprzętowego.
- Naprawiliśmy błąd w
DefaultAudioSink, który powodował, że liczba wydań nie zmniejszała się, gdy wątek odtwarzania nie był już aktywny (#3338).
- Naprawiono obliczanie rozmiaru bufora w
- Sesja:
- Naprawiono błąd
NullPointerException, który występował, gdy przetwarzany obiektMediaControllerbył zwalniany z wywołania zwrotnegoPlayer.Listener(#3375). - Naprawiono blokadę w głównym wątku, gdy starsza wersja
MediaBrowserłączy się z usługą zwracającą wynik asynchroniczny zonGetLibraryRoot()lubonConnectAsync()(#3393).
- Naprawiono błąd
- Rozszerzenie HLS:
- Poprawiliśmy obliczanie przesunięcia wznowienia treści, gdy segment docelowy do przyciągania nie znajduje się jeszcze na playliście (#3322).
- Rozwiązaliśmy problem, który powodował, że w pełni wykorzystany obiekt
HlsMediaChunkponawiał próbę wczytania po otrzymaniu obiektuEOFExceptionz ekstraktora (#3350).
- Rozszerzenie DASH:
- Naprawiliśmy nieprawidłowe obliczanie sygnatury czasowej próbki w przypadku ścieżek obrazu z
presentationTimeOffset(#3334).
- Naprawiliśmy nieprawidłowe obliczanie sygnatury czasowej próbki w przypadku ścieżek obrazu z
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Opus: naprawiono uszkodzenie pamięci, gdy jednocześnie inicjowanych jest kilka instancji
OpusDecoder. - MPEG-H: naprawiono wyciek pamięci, obcinanie znaków spoza zestawu ASCII i potencjalną awarię systemową w warunkach małej ilości pamięci podczas wysyłania poleceń do
MpeghUiManager(#3365).
- Opus: naprawiono uszkodzenie pamięci, gdy jednocześnie inicjowanych jest kilka instancji
Wersja 1.11.0
5 sierpnia 2026 r.
- Biblioteka wspólna:
- Dodaj
Format.channelMask, aby wyraźnie reprezentować maskę kanału audio, oraz nowe przeciążenieUtil.getAudioTrackChannelConfig(Format), aby bezpiecznie ją rozwiązać. - Uaktualnij Kotlin z wersji 2.0.20 do 2.2.0.
- Dodaj
- ExoPlayer:
- Naprawiliśmy błąd równoczesności zależny od czasu, który mógł powodować błąd
IllegalStateExceptionlubIndexOutOfBoundsExceptionw ExoPlayerze. - Złagodzenie kontroli liczby grup reklam w
AdsMediaSource, aby umożliwić zmniejszenie liczby grup reklam po pełnym przetworzeniu grupy reklam (hasUnplayedAds()tofalse), co pozwoli na dynamiczną zmianę rozmiaru grupy reklam podczas przepływów pracy resetowania. - Dodaj
getFlags()iFLAG_STRICT_DURATIONdoSampleStream, aby umożliwić strumieniom zgłaszanie oznaczeń do powiadomienia, i zaktualizuj mechanizmy renderowania, aby dynamicznie sprawdzały te oznaczenia do powiadomienia. - Wróć do estymatora liczby klatek w
MediaCodecVideoRendereri do formatu wyjściowego kodeka wMediaCodecAudioRenderer, aby obliczyć szybkość działania kodeka, gdy formaty strumienia nie zapewniają prawidłowej wartości, i uniknąć niepotrzebnych resetów kodeka. - Usunięcie przycinania treści w przypadku reklam wstawianych po stronie klienta w głównym odtwarzaczu. Zamiast tego
AdsMediaSourcezajmuje się logiką przycinania. Niestandardowe źródła reklam wstawianych po stronie klienta muszą zostać zaktualizowane, aby można było wdrożyć przycinanie treści wewnętrznie. - Ścieżki z prawidłowo sformułowanym, ale nierozpoznanym profilem lub poziomem kodeka są oznaczane jako
supported=NO_EXCEEDS_CAPABILITIES, a niesupported=YES(tak są oznaczane ścieżki z brakującymi lub nieprawidłowo sformułowanymi informacjami o profilu lub poziomie). Dzięki temu te ścieżki (które prawdopodobnie nie są obsługiwane przez urządzenie) nie są wybierane, gdy dostępne są lepiej obsługiwane alternatywy. - Dodaj
DefaultPreloadManager.SimpleRankingDataComparator, czyliRankingDataComparator, który porównuje pozycje elementów multimedialnych na podstawie ich odległości od indeksu aktualnie odtwarzanego elementu multimedialnego. Aplikacje mogą zastąpić metodęcompare(Integer, Integer), jeśli potrzebna jest bardziej precyzyjna logika porównywania. Niestandardowy obiektSimpleRankingDataComparatormożna wstrzyknąć za pomocą nowego konstruktoraDefaultPreloadManager.Builder. - Zmniejsz ryzyko braku pamięci w
DefaultLoadControl.prioritizeTimeOverSizeThresholds, przechodząc na limity rozmiaru bufora w bajtach, jeśli dostępna pamięć sterty wydaje się ograniczona. - Ujednoliciliśmy sposób obsługi obrazów, gdy nie jest ustawiona wartość
MediaItem.imageDurationUs: obrazy JPEG i HEIC są teraz „odtwarzane” z bardzo krótkim domyślnym czasem trwania (tak samo jak wcześniej obrazy PNG i inne). - Dodaj
MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter), aby połączyćBandwidthMeterzMediaSource. Wycofana metoda z niestandardową implementacją będzie jednak nadal domyślnie wywoływana. Zalecamy wdrożenie nowej metody i użycieBandwidthMeter.getTransferListener(), aby uzyskać zgodność ze starą metodą. - W
DefaultBandwidthMeterdodaj obsługę niestandardowego elementuInitialBitrateSupplier. Dzięki temu aplikacje mogą stosować własną logikę do określania początkowej szacowanej szybkości transmisji bitów, która będzie używana podczas tworzeniaDefaultBandwidthMeteri przy zmianach typu sieci. Dostawcę można ustawić za pomocąDefaultBandwidthMeter.Builder.setInitialBitrateSupplier(). - Domyślnie włącz planowanie dynamiczne. Pętla robocza odtwarzania
ExoPlayerbędzie działać dynamicznie, a nie w stałych odstępach czasu. - Usunięcie niepotrzebnego resetowania, które może wystąpić podczas dołączania ścieżek z próbkami reklam przed filmem do aktywnego odtwarzania.
- W pliku
DefaultBandwidthMeterzoptymalizuj funkcjęgetInitialBitrateCountryGroupAssignment, aby zwracała przypisania grup krajów spakowane w 32-bitową liczbę całkowitą zamiast tablicy, co zmniejszy rozmiar kodu i pozwoli uniknąć alokacji. - Naprawiono błędy inicjowania
AudioTrackna niektórych urządzeniach przez zapewnienie, że logika ponawiania zawsze próbuje użyć bufora o rozmiarze co najmniej 1 sekundy, jeśli inne próby (przez zmniejszenie rozmiaru bufora o połowę) się nie powiodą (#3207). - Rozwiązaliśmy problem z kodekiem na niektórych urządzeniach, który powodował, że kodek pochłaniał wszystkie próbki, jeśli został wcześniej opróżniony przed otrzymaniem buforów wejściowych.
- Dodaj eksperymentalną funkcję
ExoPlayer.Builder.enablePerStreamMediaProgression(), aby umożliwić zaawansowane przetwarzanie multimediów na poziomie strumienia. Zmniejsza to czas oczekiwania na uruchomienie między elementami playlisty i zapobiega „zawieszaniu się” odtwarzania w przypadku bardzo krótkich treści (#3122). - Naprawiono sytuację wyścigu związaną z użyciem identyfikatora sesji audio, w której zamiast wartości ustawionej przez
setAudioSessionIdużywany był początkowy identyfikator sesji audio wygenerowany automatycznie przezExoPlayer(#3241). - Dodaliśmy eksperymentalną obsługę odtwarzania metadanych z sygnałami czasowymi HAGC (ST 2094-50) w przypadku multimediów progresywnych (np. MP4, Matroska). Odtwarzacz automatycznie scala ścieżki metadanych HAGC z powiązaną ścieżką wideo i dostarcza metadane poza pasmem do dekodera na urządzeniach z interfejsem API 37 lub nowszym. To działanie można wyłączyć za pomocą
DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false). - Dodano
Format.selectionPriorityreprezentujący względne preferencjeFormatpodczas wyboru ścieżki (#3236). - Rozwiązaliśmy potencjalny problem z trybem przewijania, który mógł powodować zawieszanie się przewijania podczas przechodzenia do końca strumienia.
- Naprawiliśmy błąd równoczesności zależny od czasu, który mógł powodować błąd
- CompositionPlayer:
- Rozwiązaliśmy problem, który powodował, że instancje
TrackSelectornie były zwalniane.
- Rozwiązaliśmy problem, który powodował, że instancje
- Transformator:
- Rozwiązaliśmy problem, który mógł powodować zawyżanie wartości
ExportResult.fileSizeBytes.
- Rozwiązaliśmy problem, który mógł powodować zawyżanie wartości
- Wybór ścieżki:
- Udostępnij
BaseTrackSelection.DEFAULT_FORMAT_COMPARATORi dodajAdaptiveTrackSelection.Factory.setTrackFormatComparator, aby umożliwić niestandardowe porządkowanie formatów i priorytet wyboru ABR poza porządkowaniem tylko według szybkości transmisji bitów. - Rozwiązaliśmy problem z równoczesnością zależną od czasu, który powodował, że szybkie, sekwencyjne aktualizacje parametrów wyboru ścieżki mogły prowadzić do utraty lub zastąpienia niektórych aktualizacji.
- Udostępnij
- Ekstraktory:
- MP4, MP3 i FLAC: dodano
FLAG_DISABLE_ARTWORK_METADATA, aby umożliwić odrzucanie załączonych obrazów i metadanych okładek podczas analizowania kontenera w celu zmniejszenia zużycia pamięci w czasie działania (#2077). Można to też włączyć centralnie za pomocąDefaultExtractorsFactory.setDisableArtworkMetadata. - MP4: dodano obsługę wyodrębniania ścieżek metadanych z sygnaturą czasową ITU-T T.35 (
it35). - MP4: dodano obsługę wyodrębniania metadanych rozdziałów (zarówno w formacie Nero, jak i QuickTime). Jeśli dostępne są oba rodzaje, preferowane są rozdziały QuickTime. Wyodrębnione informacje o rozdziałach są widoczne jako wpisy
ChapterwMetadataścieżki, co umożliwia natywną nawigację po rozdziałach w plikach MP4, M4A i M4B (takich jak audiobooki i podcasty) (#2803). - WAV, Matroska i MP4: dodano obsługę 64-bitowego dźwięku PCM w reprezentacji zmiennoprzecinkowej (#3090).
- Matroska: użyj metadanych strumienia bitów kodeka, aby wypełnić dokładne dane
ColorInfo. - MP4: dodano obsługę wyszukiwania we fragmentowanych plikach MP4 za pomocą pola
mfra, gdy nie ma polasidx. Aby to umożliwić, podajFLAG_READ_MFRA_FOR_SEEK_MAPwFragmentedMp4Extractor, co jest teraz domyślnie wykonywane wDefaultExtractorsFactory(#3088). - Ignoruję dane
av1Cz nieobsługiwaną wersją. - MP4: dodano obsługę reprezentacji zmiennoprzecinkowej PCM big endian w polach
fpcm. - Matroska: analizuj informacje o rozdziałach do wpisów
ChapterwMetadataścieżki. - MPEG-TS: ulepszyliśmy wyodrębnianie strumieni DTS-HD i DTS Express przez połączenie podstrumieni Core i Extension w jedną próbkę, co rozwiązało problemy z odtwarzaniem, gdy te 2 podstrumienie były wcześniej wyodrębniane jako osobne próbki (#3147).
- MP4: zapobieganie nieskończonym pętlom i odczytom poza zakresem podczas analizowania pustych elementów tagów metadanych
ilst(#3191). - MPEG-TS: zapewniono renderowanie ostatniej klatki w przypadku strumieni, w których ostatni pakiet PES ma znaną długość (#3206).
- MP3: poprawiono raportowanie szybkości transmisji bitów w przypadku plików z nagłówkiem Xing i VBRI.
- Matroska: obsługa ścieżek zdefiniowanych w ostatnim klastrze (#3250).
- Matroska: dodano obsługę ALAC (#3268).
- MP4: zezwalanie na pola
sgpdo zmiennej długości we fragmentowanych plikach MP4 (#3243). - AVI: rozwiązaliśmy problem, który powodował, że odtwarzanie plików bez flag klatek kluczowych na ścieżkach audio powodowało utratę dźwięku i
OutOfMemoryError. - MP3: używanie czasu trwania bez przerw z nagłówków Xing/Info (#3183).
- MP3: dostosowano opóźnienie kodera LAME/Xing i metadane dopełnienia, aby dopasować je do przycinania zdekodowanego PCM (#3200).
- MP4, MP3 i FLAC: dodano
- Dźwięk:
- Dodano 100-milisekundowy okres prolongaty w renderowaniu dźwięku w ExoPlayerze podczas przechodzenia ze stanu gotowości do stanu niegotowości, aby uniknąć przejściowych niedomiarów i nieoczekiwanych stanów buforowania podczas aktywnego odtwarzania (#3210).
- Zmieniono domyślną logikę rozmiaru bufora PCM w
DefaultAudioTrackBufferSizeProvider, aby używać stałego bufora 500 ms i zmniejszyć zależność od urządzenia. - Zaktualizuj
MediaCodecAudioRenderer, aby wyodrębnić przestrzenną maskę channelMask z dekodera platformy, co pozwoliDefaultAudioSinkna użycie tej jawnej maski zamiast wnioskowania na podstawie liczby kanałów. - Przekształć parametry
AudioSink.configurew klasę danych. Niestandardowe zastąpieniaForwardingAudioSink.configuremuszą zostać przeniesione do nowej sygnatury metody. - Dodaj obsługę utrzymywania wysokości dźwięku podczas rozciągania w czasie strumienia audio za pomocą
EditedMediaItem.Builder#setSpeed(SpeedParameters). - Ulepszono
ToFloatPcmAudioProcessor, aby obsługiwał konwersję 8-bitowego PCM, 16-bitowego PCM big endian i 64-bitowego PCM z reprezentacją zmiennoprzecinkową na 32-bitowy PCM z reprezentacją zmiennoprzecinkową (#3090). - Zmień wartość zwracaną przez
DecoderAudioRenderer.getChannelMappingnaImmutableIntArray. - Naprawiliśmy błąd, który powodował, że odtwarzanie zacinało się podczas odtwarzania playlisty z dźwiękiem bez przerw w trybie skompresowanego odciążenia.
- Przekazywanie identyfikatora UID
Timelinei okresu doAudioSink.configureiAudioProcessor.StreamMetadataw celu zapewnienia kontekstu playlisty procesorom dźwięku (#418). - Ustaw prawidłową wartość
AudioProcessor.StreamMetadata.positionOffsetUs, aby umożliwić przetwarzanie dźwięku na podstawie czasu (#418). - Dodano obsługę 32-bitowego i 64-bitowego formatu PCM z reprezentacją zmiennoprzecinkową w formacie big endian.
- Usunięto ścieżkę zastępczą EAC3-JOC do EAC3 na potrzeby odtwarzania na urządzeniach Google Pixel, ponieważ ich standardowe dekodery EAC3 nie mogą dekodować strumieni EAC3-JOC (#3257).
- Film:
- Poprawiono logikę dołączania do filmu, aby porzucone bufory podczas dołączania były liczone jako pominięte, a nie porzucone.
- Naprawiono problem z natychmiastową decyzją o renderowaniu podczas ustawiania nowej powierzchni, aby uniknąć pomijania klatek na urządzeniach, które nie obsługują powierzchni zastępczych.
- Poprawiliśmy szacowanie liczby klatek w
MediaCodecVideoRenderer, aby było dokładniejsze dzięki uwzględnianiu pominiętych klatek. - Zezwalaj na konfigurowanie progu używanego do wcześniejszego planowania klatek. Wartość domyślna to 50 ms, ale można ją dostosować za pomocą
MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold(). - Naprawiono błąd w
VideoFrameReleaseHelper, który powodował, że zmiany wyświetlania mogły wywoływać nadmiarowe wywołania zwrotneChoreographeri nadmierne wybudzanie procesora w głównym wątku.
- Tekst:
- Metadane:
- Dodaj pole
MediaMetadata.discSubtitlei przeanalizuj je na podstawie danych ID3v2.4TSSTi VorbisDISCSUBTITLE. - Analizuj numer i liczbę płyt z ramki ID3
TPOS.
- Dodaj pole
- Efekt:
- Wyczyść stan ponownego rysowania w
FinalShaderProgramWrapperpodczas opróżniania, aby zapobiec zawieszaniu się odtwarzacza podczas przewijania.
- Wyczyść stan ponownego rysowania w
- Muksery:
- Dodaj obsługę odniesień do ścieżek (pole
tref) wMp4Muxerza pomocą nowego interfejsu APIaddTrackReference. Umożliwia to ustanawianie relacji między ścieżkami, np. połączenie ścieżki metadanych ze ścieżką wideo, którą opisuje. - Dodaj
OggMuxer, aby umożliwić multipleksowanie strumieni multimedialnychOPUSlubVORBISdo formatu plikuogg. - Dodaj
WavMuxer, aby wygenerować plik WAV (obsługuje liczby całkowite i reprezentację zmiennoprzecinkową PCM). - Dodaj
setAttemptStreamableOutputEnableddoInAppMp4Muxer.Factory, aby umożliwić zapisywanie mniejszych plików, których nie można odtwarzać strumieniowo, bez zarezerwowanego miejsca. - Dodaj obsługę dźwięku IAMF w
Mp4MuxeriFragmentedMp4Muxer.
- Dodaj obsługę odniesień do ścieżek (pole
- Rozszerzenie IMA:
- Dodaj
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot, aby umożliwić udostępnianie boksu reklamowego na potrzeby reklam w trakcie pauzy. - Naprawiliśmy błąd, który powodował, że w przypadku wyświetlanych jedna po drugiej reklam VAST możliwych do pominięcia przycisk pominięcia pojawiał się od razu w drugiej reklamie (#3165).
- Dodaj
- Sesja:
- Naprawiono potencjalne blokady i awarie
IllegalStateExceptionwMediaNotificationManagerpodczas korzystania z sesji z pętlą odtwarzacza w wątku w tle. - Wymuszaj bardziej rygorystyczne wymagania dotyczące wątków w przypadku metod
MediaSession. Metody Void automatycznie publikują teraz wykonanie w wątku pętli aplikacji, a akcesory stanu (gettery) wyraźnie zgłaszają błądIllegalStateException, jeśli są wywoływane z wątku innego niż pętla aplikacji. - Naprawiono błąd powodujący awarię podczas scalania osi czasu poza zakresem (
IllegalStateExceptionwMediaUtils.mergePlayerInfo) przez śledzenie spójności stanu na kontroler po stronie sesji. - Dodaj
androidx.media3.session.MediaSessionManager, aby zapewnić obsługę zapytań o aktywne sesje multimedialne i zwracania instancji Media3SessionToken. - Zmień domyślne działanie metody
MediaSession.Callback.onConnect, jeśli nie została zastąpiona, aby zapewnić kontrolerom niezaufanym dostęp tylko do odczytu. - Dodaj obsługę zastępowania nazwy pakietu podczas tworzenia
MediaSessionza pomocą nowego interfejsu APIMediaSession.Builder#setPackageNameOverride. Aby zastąpić nazwę pakietu sesji, element wywołujący musi mieć uprawnienieandroid.permission.OVERRIDE_MEDIA_SESSION_OWNER. - Dodaj
MediaSession.Callback.onConnectAsync(). Nowa metoda umożliwia asynchroniczne przetwarzanie próby połączenia kontrolera. Aplikacje mogą natychmiast zwrócićFuturezFutures.immediateFuture(ConnectionResult), aby uzyskać poprzednie działanie. Zalecamy przejście na nową metodę, ponieważCallback.onConnectmoże zostać wycofana. - Rozwiązaliśmy problem polegający na tym, że przeglądanie Bluetooth AVRCP nie rozpoznawało
MediaLibraryServicew interfejsach API 36 i 37. - Naprawiono podwójne zmniejszanie grafiki w
MediaSession, gdy rozmiar obrazu jest zbliżony do limitu platformy, co rozwiązuje problem z rozmyciem w powiadomieniach (#3134). - Naprawiono błąd
ForegroundServiceStartNotAllowedExceptionpowodujący awarię wMediaNotificationManager, gdy wywołanie zwrotne asynchronicznego wczytywania bitmapy grafiki próbuje uruchomić usługę działającą na pierwszym planie, gdy aplikacja działa w tle (#3270). - Rozwiązaliśmy problem polegający na tym, że obiekty
PositionInfootrzymane przezMediaControllernie miały oryginalnych identyfikatorów UIDTimeline. Sesja teraz niezawodnie tłumaczy i propaguje te identyfikatory UID podczas aktualizacji stanu. - Naprawiono awarię przez przechwytywanie
ForegroundServiceStartNotAllowedExceptionwMediaSessionService.stopSelfSafely()(#3310). - Naprawiono nieoczekiwane wywołanie zwrotne
onMediaItemTransition()wMediaControllerpodczas przewijania w obrębie tego samego elementu multimedialnego (#3248).
- Naprawiono potencjalne blokady i awarie
- UI:
- Naprawiono błąd powodujący renderowanie pierwszej klatki w nieprawidłowym rozmiarze, gdy
ContentFramejest ponownie komponowany w trakcie odtwarzania (#3238). - Dodaj klasę
CurrentMediaItemStatei odpowiadający jej element kompozycyjnyrememberCurrentMediaItemStatedo modułumedia3-ui-compose. Ta zmienna stanu jest używana wdemo-composedo wyświetlania różnych metadanych dotyczących aktualnie odtwarzanego elementuMediaItem. - Dodaj klasę
PlaylistStatei odpowiadający jej element kompozycyjnyrememberPlaylistStatedo modułumedia3-ui-compose. Ta zmienna stanu jest używana wdemo-composedo wyświetlania różnych metadanych dotyczącychMediaItemsustawionego w odtwarzaczu. - Dodaj interfejs API przyspieszania/zwolnionego tempa do
PlaybackSpeedState. Użyj tej funkcji wdemo-compose, aby pokazać przewijanie do przodu przez przytrzymanie. - Dodaj element kompozycyjny
MiniControllerdo modułumedia3-ui-compose-material3. Zapewnia kompaktowy interfejs do sterowaniaPlayer, wyświetlając tytuł, wykonawcę, okładkę i postęp odtwarzania bieżącego elementu multimedialnego. - Dodaj klasę
ErrorStatei odpowiadający jej element kompozycyjnyrememberErrorStatedo modułumedia3-ui-compose. DodajErrorTextfunkcję kompozycyjną domedia3-ui-compose-material3i ustaw ją jako domyślną nakładkę naPlayer. - Opublikuj obiekt
PlayerDefaultsz elementami kompozycyjnymi dlaTopControls,CenterControls,BottomControlsiErrorOverlay. - Dodaj
FocusRequesterdo funkcji kompozycyjnejPlayeri jej boksów na treści. - Opublikuj
PlayerPool(common-ktx) irememberPooledPlayer(ui-compose), aby umożliwić wstępne wczytywanieMediaItemsw interfejsach z oknem przesuwnym. Zaprezentuj tę funkcję wdemo-composeza pomocą nowegoShortFormPlayerScreen. - Naprawiliśmy błąd związany z blokowaniem migawki w
PlayerViewi ComposePresentationState, który powodował awarie na osiach czasu nieobsługujących wyszukiwania identyfikatora UID okresu (#3264).
- Naprawiono błąd powodujący renderowanie pierwszej klatki w nieprawidłowym rozmiarze, gdy
- Pobrane:
- Rozwiązywanie zmiennych HLS na playliście multimediów podczas pobierania (#3258).
- Rozszerzenie Ktor:
- Rozszerzenie HLS:
- Dodano obsługę sterowania treściami HLS i klonowania ścieżek (#1689).
- Dodaj
setWithAssetListResetdoHlsInterstitialsAdsLoader, aby umożliwić aplikacjom resetowanie w pełni przetworzonych reklam pełnoekranowych z listy zasobów do stanu niedostępności w celu ponownego rozpoznania na żądanie. - Przeanalizuj atrybut
SCOREwEXT-X-STREAM-INFiEXT-X-I-FRAME-STREAM-INF, a następnie wypełnij nimFormat.selectionPriority(#3236). - Naprawiliśmy błąd, który powodował, że zaplanowane odświeżanie playlisty HLS było kontynuowane, nawet jeśli playlista nie była już główna ani aktywna (#3254).
- Poprawiono obliczanie przesunięcia wznowienia treści podczas rozwiązywania list komponentów reklam pełnoekranowych (#3322).
- Naprawiono nieoczekiwaną przerwę w sygnaturze czasowej ścieżki audio podczas wznawiania odtwarzania na żywo z niskim opóźnieniem po nieudanym żądaniu playlisty (#3311).
- Naprawiono błąd w
HlsMediaPeriod.getStreamKeys(), który powodował, że ścieżka ID3 w wersjach audio była traktowana jako napisy (#3333).
- Rozszerzenie DASH:
- Podziel napisy CEA na różne elementy
TrackGroupna podstawie języka (#3113). - Dodano obsługę analizowania wielu elementów
Locationz pliku manifestu (MPD) i wykonywania zastępczej lokalizacji wDashMediaSource, gdy nie uda się wczytać pliku manifestu. - Naprawiono błąd powodujący awarię (
IndexOutOfBoundsException) podczas otwierania plików manifestu z pustym elementem<SegmentTimeline/>(#3326).
- Podziel napisy CEA na różne elementy
- Rozszerzenie RTSP:
- Naprawiono przejściowe problemy z odtwarzaniem lub błędy podczas przygotowywania odtwarzania RTSP spowodowane błędami powiązania portu UDP.
- Rozszerzenie Cast:
- Dodaj nową klasę
CastParams, aby umożliwić konfigurację Cast przez wywołanieCast.initialize(CastParams). - Dodaj nową opcję
CastParams.getShowSystemOutputSwitcherOnCastIconClick(), która powoduje użycie przełącznika wyjścia SystemUI zamiast selektora urządzenia przesyłającego w aplikacji, gdy jest on dostępny. - Dodano
MediaRouteButtonStateirememberMediaRouteButtonState, aby umożliwić obserwowanie stanu widoczności selektora trasy multimediów, oraz dodano parametrstatedoMediaRouteButton(#3172). - Naprawiliśmy błąd, który powodował, że po wybraniu ścieżki
RemoteCastPlayermogła zostać trwale zablokowana w stanie maskowania ścieżki, co powodowało ignorowanie kolejnych aktualizacji ścieżki z odbiornika Cast (#3237). - Naprawiliśmy błąd, który powodował, że
DefaultMediaItemConverterzgłaszał błądNullPointerExceptionpodczas próby dołączenia do sesji przesyłania rozpoczętej przez nadawcę innego niż Media3. - Zapobieganie przesyłaniu przez
CastPlayerMediaItems, których nie można odtworzyć, podczas zmiany aktywnego odtwarzacza (#3199). - Naprawiono błąd, który powodował, że nieskonfigurowane transmisje na żywo (
liveConfiguration == UNSET) były dodawane do kolejki jakoSTREAM_TYPE_BUFFERED(#3318).
- Dodaj nową klasę
- Narzędzia testowe:
- Rozszerz
DataSourceContractTest, aby uwzględnić obsługę żądańPOSTz nagłówkami i treścią, dodaj zasobyPOSTdoHttpDataSourceTestEnvi dodaj asercje dla oczekiwanej metody HTTP, nagłówków i treści wWebServerDispatcher. - Zaostrz asercje w
DataSourceContractTestdla długości zwracanych zDataSource.open(). Zasoby, które mogą powodowaćC.LENGTH_UNSET, powinny to wskazywać za pomocąTestResource.Builder.setMayResolveToUnknownLength(boolean). - Dodano
setPlaybackLooperdoTestExoPlayerBuilder.
- Rozszerz
- Usuń wycofane symbole:
- Usuń
androidx.media3.exoplayer.MetadataRetriever. Użyj w zamian zasadyandroidx.media3.inspector.MetadataRetriever. - Usuń
androidx.media3.exoplayer.MediaExtractorCompat. Użyj w zamian zasadyandroidx.media3.inspector.MediaExtractorCompat. - Usuń
Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA. Zamiast tego użyjHeifExtractor, aby wyodrębnić metadane zdjęć ruchomych z plików HEIC. - Usuń
androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata. Użyj w zamian zasadyandroidx.media3.extractor.metadata.MotionPhotoMetadata. - Usuń
androidx.media3.extractor.DummyTrackOutput. Użyj w zamian zasadyandroidx.media3.extractor.DiscardingTrackOutput. - Usuń
androidx.media3.extractor.DummyExtractorOutput. Użyj w zamian zasadyandroidx.media3.extractor.NoOpExtractorOutput. - Usuń
androidx.media3.common.C.generateAudioSessionIdV21. Użyj w zamian zasadyandroidx.media3.common.util.Util.generateAudioSessionId.
- Usuń
- Budowanie
- Zaktualizowaliśmy instrukcje
README.mddotyczące lokalnego korzystania z Media3, aby używać kompilacji wieloprojektowych Gradle (includeBuild). Skryptcore_settings.gradlezostał usunięty, a właściwościandroidxMediaModulePrefixiandroidxMediaEnableMidiModulenie są już używane.
- Zaktualizowaliśmy instrukcje
1.11.0-rc01
Użyj wersji stabilnej 1.11.0.
1.11.0-beta01
7 lipca 2026 r.
Użyj wersji stabilnej 1.11.0.
1.11.0-alpha01
24 czerwca 2026 r.
Użyj wersji stabilnej 1.11.0.
Wersja 1.10.0
1.10.1
12 maja 2026 r.
- Biblioteka wspólna:
- Poprawiono obsługę
onAudioSessionIdChangedwSimpleBasePlayeriForwardingSimpleBasePlayer.
- Poprawiono obsługę
- ExoPlayer:
- Naprawiono sytuację wyścigu związaną z generowaniem identyfikatora sesji audio, która mogła prowadzić do błędu
IllegalStateExceptionw trybie tunelowania. (#3099). - Naprawiono możliwe awarie aplikacji podczas przywracania po błędach dekodera z wstępnym rozgrzewaniem renderera.
- Rozwiązaliśmy problem, który powodował powstawanie artefaktów wideo przez dostarczanie danych inicjujących podczas korzystania z kodeka Dolby Vision opartego na AV1 (#3153).
- Naprawiono sytuację wyścigu związaną z generowaniem identyfikatora sesji audio, która mogła prowadzić do błędu
- Wybór ścieżki:
- Dostosowanie logiki wyboru ścieżki w
VideoTrackInfo, aby rozwiązać problem z zastępczymi typami MIME, oraz przeniesienie preferencji dotyczących HDR i kodeków do preferencji dotyczących jakości (#3135).
- Dostosowanie logiki wyboru ścieżki w
- Ekstraktory:
- MP3: ignorowanie długości danych Xing, jeśli jest ona większa niż znana długość strumienia (#3117).
- Naprawiono błąd
ArrayIndexOutOfBoundsExceptionwMp4Extractor, gdy ustawionoFLAG_OMIT_TRACK_SAMPLE_TABLE, a ścieżka nie zawierała pola próbki synchronizacji (stss).
- Dźwięk:
- Naprawiliśmy błąd, który mógł powodować nieprawidłowe przekierowywanie zdarzeń audio, jeśli do odtwarzacza dodano kilka modułów renderowania dźwięku.
- Film:
- Dostosowano logikę ponownego użycia kodeka przy zmianach liczby klatek w interfejsie API poniżej 30, aby uniknąć resetowania kodeka, gdy nie jest to korzystne (#3120).
- Wyłącz obejście wymuszonej synchronizacji w
queueSecureInputBufferw przypadku interfejsu API 31 lub nowszego. Obejście było sztucznym wąskim gardłem, które wymuszało szeregowe odszyfrowywanie, co zapobiegało zniekształcaniu obrazu z powodu problemu z platformą występującego przed interfejsem API 31.
- Obraz:
- Rozwiązaliśmy problem w trybie przewijania, w którym aktualizacje obrazu były wprowadzane tylko wtedy, gdy użytkownik „przestał przewijać” (#2815).
- Sesja:
- Naprawiliśmy błąd, który powodował, że
ForegroundServiceStartNotAllowedExceptionnie był propagowany przez granice wątków, jeśli wątek aplikacji nie był wątkiem głównym (#2499). - Naprawiono błąd, który powodował, że
COMMAND_SEEK_TO_MEDIA_ITEMnie był dostępny wMediaControllerpodczas łączenia się z sesją tylko na platformie, która obsługuje przechodzenie do innych elementów, ale nie modyfikowanie playlisty. - Rozwiązaliśmy problem, który powodował, że
MediaControllernie może ustawiać elementów multimedialnych w sesjach multimedialnych na platformie, które nie zezwalają na działaniaPREPARE_FROM. - Naprawiono błąd, który powodował, że własny proces nie był oznaczany jako
Controller.isTrusted()w interfejsie API 27 lub starszym podczas nawiązywania połączenia za pomocą kontrolerów platformy.
- Naprawiliśmy błąd, który powodował, że
- Rozszerzenie HLS:
- Naprawiliśmy błąd, który powodował, że podczas przełączania na strumień zastępczy był zgłaszany wyjątek
ArrayIndexOutOfBoundsException, jeśli wybór ścieżki był podzbiorem dostępnych ścieżek (#3161). - Rozwiązaliśmy problem, który powodował, że segment inicjowania nie był przenoszony między aktualizacjami playlisty multimediów, jeśli tag
#EXT-X-MAPnie był powtarzany w kolejnych aktualizacjach (#3105).
- Naprawiliśmy błąd, który powodował, że podczas przełączania na strumień zastępczy był zgłaszany wyjątek
- Rozszerzenie DASH:
- Naprawiono błąd powodujący awarię w
SampleQueuepodczas przechodzenia do fragmentu, który jest obecnie anulowany.
- Naprawiono błąd powodujący awarię w
1.10.0
26 marca 2026 r.
- Biblioteka wspólna:
- Przenieś
Player.mute()iPlayer.unmute()z:UnstableApido wersji stabilnej. - Przenieś
Format.pcmEncodingiC.PcmEncodingz:UnstableApido wersji stabilnej. - Dodaj
Format.primaryTrackGroupId, aby zidentyfikować główną grupę umieszczonych instancjiFormat(#294).
- Przenieś
- ExoPlayer:
- Dodaj funkcje przycinania do
AdsMediaSource. - Dodaj obsługę dynamicznego planowania w
MediaCodecVideoRenderer, aby lepiej dopasować planowanie pracy i cykle wybudzania procesora do momentu, w którym można przetwarzać klatki wideo. Możesz to włączyć za pomocąexperimentalSetEnableMediaCodecVideoRendererDurationToProgressUs()wDefaultRenderersFactory. - Zezwalaj na ustawianie niestandardowego
DataSource.FactorywDefaultPreloadManager.Builder. - Zezwalaj na pozorowanie
ExoPlayerbez Robolectric przez przeniesienie niektórych domyślnych stałych doExoPlayer.Builder. Zasadniczo nie zaleca się tworzenia makiety tego złożonego interfejsu, chyba że jest on używany w minimalnym, prostym lub przypadkowym zakresie (#2985).- Wymagało to przeniesienia
DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MSzExoPlayerdoExoPlayer.Builder(bez wycofania).
- Wymagało to przeniesienia
- Naprawiliśmy błąd, który powodował, że
ProgressiveMediaSourceprzekazywał odtwarzaczowi nieaktualne informacje o osi czasu, a okresy w kolejce były nieoczekiwanie usuwane (#3016). - Rozwiązaliśmy problem polegający na tym, że ExoPlayer nie żądał opóźnionego fokusu audio, gdy odtwarzanie było żądane podczas połączeń telefonicznych.
- Naprawiliśmy błąd, który powodował, że przejścia z treści na żądanie do treści na żywo mogły powodować ponowne buforowanie pod koniec treści na żądanie (#3052).
- Dodano obsługę Dolby Vision Profile 10 (#2830).
- Naprawiliśmy błąd, który powodował, że niezainicjowana reklama przed filmem generowała błąd
ArrayIndexOutOfBoundsException(#3125).
- Dodaj funkcje przycinania do
- CompositionPlayer:
- Dodaj obsługę
EditedMediaItem.removeVideo.
- Dodaj obsługę
- Transformator:
EditedMediaItem.Builder.setFrameRate()może teraz ustawić maksymalną liczbę klatek na sekundę w filmie, co jest szczególnie przydatne, gdy zwiększasz szybkość multimediów za pomocąsetSpeed().
- Wybór ścieżki:
- Zmień sygnaturę funkcji
DefaultTrackSelector.selectAllTracks, aby uwzględnić tablicę wyjściową jako parametr, wstępnie wypełniony zastąpieniami ścieżek. - Rozwiązano problem polegający na tym, że wbudowane ścieżki metadanych były wybierane niezależnie od tego, czy wybrana była odpowiednia ścieżka podstawowa (#294).
- Opcje stabilizacji
TrackSelectionParametersdla:preferredVideoLanguages,preferredVideoLabels,preferredAudioLabels,preferredTextLabelsiselectTextByDefault.
- Zmień sygnaturę funkcji
- Ekstraktory:
- MP4: obsługa plików z dużymi polami
uuidprzed innymi polami, takimi jakmoov(#3046). - MP4: dodaliśmy obsługę ścieżek Versatile Video Coding (VVC) w kontenerach MP4.
- MP4: obsługa plików z dużymi polami
- 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. - Wprowadzamy 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 obuuszne przez dekoder (w przypadku korzystania z rozszerzenia dekodera IAMF) lub przez Android Spatializer.
- Prawidłowo usuwamy obsługę
AC4Profile22i innych starszych profili podczas oceny obsługi dekodera AC-4 w scenariuszach motoryzacyjnych (#2609). - Ulepszono logikę ponawiania inicjowania
AudioOutputwDefaultAudioSink(#2905). - Próba dopasowania układu wyjściowego głośników (lub Spatializera, jeśli dotyczy) podczas dekodowania IAMF, zarówno z rozszerzeniem IAMF, jak i dekoderami kodeków multimedialnych, obsługiwana przez nowe pola i logikę w AudioCapabilities i AudioCapabilitiesReceiver.
- Naprawiliśmy błąd, który powodował, że odtwarzanie zacinało się podczas odtwarzania playlisty z dźwiękiem bez przerw w trybie skompresowanego odciążenia.
- Zmieniono podstawową bibliotekę dekodowania rozszerzenia dekodera IAMF z
- Tekst:
- VobSub: używanie poleceń sterujących SPU
STARTiSTOPdo określania czasu trwania wskazówki zamiast domyślnego ustawienia 5 sekund (#2935).
- VobSub: używanie poleceń sterujących SPU
- Metadane:
- Zwiększono domyślną liczbę modułów renderujących metadane do 4, aby uwzględnić wszystkie potencjalne ścieżki metadanych publikowane przez warianty i rendery HLS (#3043).
- Efekt:
- Przenieś
LottieOverlaydo nowego modułu:media3-effect-lottie(co wiąże 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, który powodował, że typ MIME reklamy nie pasował do typu MIME podanego w zdarzeniu IMA LOADED. Poprawka mapuje teraz typ MIME reklamy, korzystając z informacji o multimediach reklamy dostarczonych przez IMA.
- Dodaj
setEnableCustomTabsdoImaAdsLoaderiImaServerSideAdInsertionMediaSource, aby umożliwić użytkownikom kontrolowanie, czy docelowe adresy URL reklam są uruchamiane 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 linearnych. Jeśli chcesz dołączyć do grupy testów alfa, skontaktuj się ze swoim partnerem ds. konta.
- 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). - Ustaw
MediaSessionServiceiMediaLibraryServicejakoLifecycleService, co pozwoli na dołączanie do cyklu życia usługi operacji uwzględniających cykl życia (#187). - Przestań 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. - Wykrywanie nieaktualnych instancji
Intent, które uruchomiły usługę jako usługę na pierwszym planie. Zapobiega to zgłaszaniu przez system błęduForegroundServiceDidNotStartInTimeException. Jest to zmiana powodująca niezgodność w niestabilnym interfejsie API w przypadku aplikacji, które implementują niestandardowy elementMediaNotification.Provider, ponieważ pojawiła się nowa wymagana metoda. - Dodano kreatory instancji
PendingIntentdo użycia z widżetami na ekranie głównym (#2933). - Dodano metody statyczne do tworzenia instancji
Intentdla widżetów ekranu głównego opartych na Compose (#2933). - Naprawiliśmy błąd, który powodował, że przejście elementu multimedialnego nie było zgłaszane kontrolerom, gdy odtwarzanie przechodziło z danego indeksu elementu multimedialnego do innego z tym samym elementem multimedialnym z powodu przerwy „AUTO” i „SEEK” (#2997).
- Rozwiązaliśmy problem polegający na tym, że obejście dotyczące umieszczania przycisków interfejsu systemu negatywnie wpływało na inne interfejsy, takie jak Android Auto, lub na producentów, którzy nie potrzebują tego obejścia (#3041).
- Rozwiązaliśmy problem, który powodował, że dostęp do subskrypcji nie był synchronizowany (#3056).
- Obejście błędu SysUI w interfejsie API 29, w przypadku którego grafika sesji multimedialnej o określonym rozmiarze może spowodować awarię SysUI i wymusić ponowne uruchomienie urządzenia (#3118).
- Naprawiono skalowanie ikony grafiki powiadomienia na Androidzie Q (#3084).
- Naprawiliśmy błąd, który powodował, że duże tablice w
- UI:
- Dodaj element kompozycyjny
PlaybackSpeedControldomedia3-ui-compose, aby wyświetlać i modyfikować szybkość odtwarzania. - Dodaj element kompozycyjny
PlaybackSpeedToggleButtondomedia3-ui-compose-material3, aby kontrolować szybkość odtwarzania. - Dodano element kompozycyjny
ProgressSliderdomedia3-ui-compose-material3, aby wyświetlać postępy odtwarzacza i umożliwić przewijanie za pomocą przeciągania i klikania (#2288). - Unikaj dużego bufora poza ekranem podczas animowania PlayerControlView.
- Dodaj element kompozycyjny
Playerdomedia3-ui-compose-material3, który łączyContentFramez dostosowywanymi elementami sterującymi wyrównanymi do góry, środka i dołu. - Ukryj pozycję odtwarzania przed usługą ułatwień dostępu, aby zapobiec ciągłemu aktualizowaniu komunikatów, gdy widoczny jest element
PlayerControlView.
- Dodaj element kompozycyjny
- Rozszerzenie HLS:
- Obsługa X-PLAYOUT-LIMIT z reklamami pełnoekranowymi HLS (#2484).
- Obsługa atrybutu
QUERYPARAMza pomocą#EXT-X-DEFINE(#1854). - Zoptymalizowano analizowanie playlisty HLS przez buforowanie dopasowań wyrażeń regularnych (#3008).
- Udostępnianie ścieżki metadanych ID3 (EMSG) w wersjach audio (#3043).
- Zezwalanie na użycie lokalizacji zastępczej w przypadku wystąpienia błędów wczytywania, jeśli dostępne są nadmiarowe strumienie z różnych lokalizacji (#1988).
- Naprawiliśmy działanie X-SNAP w przypadku reklam pełnoekranowych HLS, aby prawidłowo obliczać pozycję początkową i pozycję wznowienia (#3013).
- Rozszerzenie DASH:
- Rozszerzenie RTSP:
- Naprawiliśmy regresję w strumieniowaniu H.264 i H.265, która powodowała nieprawidłowe analizowanie próbek tej samej jednostki dostępu, które obejmowały wiele pakietów RTP. Powodowało to artefakty wizualne i uszkodzenia filmu (#3121).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Dodano obsługę menedżera interfejsu MPEG-H do rozszerzenia dekodera MPEG-H (#3066).
- Rozszerzenie Cast:
- Dodaj metodę
RemoteCastPlayer.Builder#setTrackSelector, która umożliwia implementację wyboru ścieżki podczas odtwarzania na urządzeniu Cast.
- Dodaj metodę
- Usuń wycofane symbole:
- Usuń
ExperimentalFrameExtractor. Użyj w zamian zasadyandroidx.media3.inspector.frame.FrameExtractor. - Usuń
ChannelMixingMatrix.create(). Użyj w zamian zasadyChannelMixingMatrix.createForConstantGain(). - Usuń
androidx.media3.extractor.metadata.flac.VorbisComment. Użyj w zamian zasadyandroidx.media3.extractor.metadata.vorbis.VorbisComment. - Usuń
MediaSource.prepareSource(MediaSourceCaller, TransferListener). Użyj w zamian zasadyMediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId).
- Usuń
1.10.0-rc03
25 marca 2026 r.
Użyj wersji stabilnej 1.10.0.
1.10.0-rc02
16 marca 2026 r.
Użyj wersji stabilnej 1.10.0.
1.10.0-rc01
10 marca 2026 r.
Użyj wersji stabilnej 1.10.0.
1.10.0-beta01
25 lutego 2026 r.
Użyj wersji stabilnej 1.10.0.
1.10.0-alpha01
6 lutego 2026 r.
Użyj wersji stabilnej 1.10.0.
Wersja 1.9.0
1.9.4
16 maja 2026 r.
Wersja 1.9.4 zawiera te zatwierdzenia.
- Efekt:
- Podczas przechodzenia z kontekstu bez powierzchni jawnie ustaw
GL_DRAW_BUFFERiGL_READ_BUFFER.
- Podczas przechodzenia z kontekstu bez powierzchni jawnie ustaw
1.9.3
16 marca 2026 r.
Wersja 1.9.3 zawiera te zatwierdzenia.
- Dźwięk:
- Naprawiliśmy błąd, który powodował, że odtwarzanie zacinało się podczas odtwarzania playlisty z dźwiękiem bez przerw w trybie skompresowanego odciążenia.
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 umieszczania przycisków interfejsu systemu negatywnie wpływało na inne interfejsy, takie jak Android Auto, lub na producentów, którzy nie potrzebują tego obejścia (#3041).
- Rozszerzenie Cast:
- Naprawiliśmy błąd, który powodował, że przenoszenie z Cast do odtwarzania lokalnego 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 tylko godzinami w przesunięciu strefy czasowej (#2929).
- ExoPlayer:
- Zezwalaj na dynamiczne planowanie, aby spowolnić interwał
doSomeWorkdopiero po rozpoczęciu odtwarzania dźwięku, co pozwoli na płynniejszą synchronizację audio-wideo na początku odtwarzania. - Naprawiono błąd w
DefaultLoadErrorHandlingPolicy, który powodował, że wyjątkiFileNotFoundExceptioni podobne były wielokrotnie ponawiane. - Naprawiono błąd związany z dynamicznym planowaniem, w przypadku którego obliczony czas następnego
doSomeWorkbył błędnie skracany o czas, który upłynął od bieżącej iteracjidoSomeWork. Rozwiązanie tego problemu powinno wydłużyć czas bezczynności procesora i zmniejszyć zużycie energii. - Rozwiązaliśmy problem, który powodował, że niektóre odtworzenia plików Dolby Vision kończyły się niepowodzeniem podczas próby użycia zastępczego kodeka AVC lub HEVC.
- Naprawiono błąd, który powodował, że po usunięciu aktualnie odtwarzanego elementu z playlisty wczytywanie było kontynuowane po zakończeniu odtwarzania (#2873).
- Unikaj wycieku instancji
MediaItempodczas wielokrotnego używaniaExoPlayer.replaceMediaItemna tym samym elemencie (#2993). - Zapobieganie potencjalnym błędom ANR spowodowanym przez awaryjne zwolnienia blokady uśpienia (#2979).
- Zezwalaj na dynamiczne planowanie, aby spowolnić interwał
- Ekstraktory:
- MP3: analizowanie danych LAME ReplayGain (#2840).
- Dźwięk:
- Prawidłowo usuwamy obsługę
AC4Profile22i innych starszych profili podczas oceny obsługi dekodera AC-4 w scenariuszach motoryzacyjnych (#2609).
- Prawidłowo usuwamy obsługę
- Film:
- Odrzucanie kodeków wideo na urządzeniach z interfejsem API na poziomie niższym niż 30, gdy zmienia się liczba klatek treści, aby uniknąć zacinania się odtwarzania (#2941).
- Tekst:
- VobSub: rozwiązaliśmy problem z brakującymi napisami przez prawidłową obsługę SPU, które zawierają tylko jedną sekwencję sterującą lub mają kluczowe informacje podzielone na kilka sekwencji sterujących (#2935).
- Rozszerzenie IMA:
- Poprawka błędu: 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, korzystając z indeksu bloku reklamowego i pozycji reklamy.
- Dodaj sprawdzenie wartości null przed uzyskaniem dostępu do wyniku
getAdsManager()iAdEvent.getAd().
- Sesja:
- Naprawiliśmy błąd, który powodował awarię aplikacji, gdy zatrzymanie sesji
MediaControllerpołączonej z platformą nastąpiło podczas odtwarzania reklamy (#2948). - Dodaj dodatkowe weryfikacje w instancjach
extrasBundlew różnych klasach, aby chronić przed nieprawidłowymi instancjamiBundlewysyłanymi z innych procesów. - Rozwiązaliśmy problem, który powodował, że brakujące polecenia dla
COMMAND_SEEK_NEXTlubCOMMAND_SEEK_BACKmogły powodować luki w powiadomieniach multimedialnych systemu (#2976). - Przeniesienie skalowania bitmapy ikony powiadomienia poza wątek główny (#2829).
- Naprawiliśmy błąd, który powodował, że autor, autor tekstu i kompozytor nie byli używani jako zastępczy podczas konwersji ze starszych wersji
MediaMetadataCompatiMediaDescriptionCompat(#3018).
- Naprawiliśmy błąd, który powodował awarię aplikacji, gdy zatrzymanie sesji
- Pobrane:
- Naprawiliśmy potencjalne nieskończone pętle, gdy
PriorityTooLowExceptionjest obsługiwany przezSegmentDownloader(w przypadku DASH, HLS i SmoothStreaming). Niestandardowe zastąpieniaSegmentDownloaderprzy użyciu chronionej metodyexecutemuszą udostępniać zadanie opakowane wSupplier, aby można było je odtworzyć (#2931).
- Naprawiliśmy potencjalne nieskończone pętle, gdy
- Rozszerzenie HLS:
- Przekaż nieprzetworzony dokument JSON z listą zasobów do wywołania zwrotnego
Listener.onAssetListLoadCompleted. Jest to zmiana powodująca niezgodność w niestabilnym interfejsie API, która wymaga od aplikacji implementujących to wywołanie zwrotne dodania dodatkowego argumentu typuJSONObject(#2950).
- Przekaż nieprzetworzony dokument JSON z listą zasobów do wywołania zwrotnego
- Rozszerzenie RTSP:
- Prawidłowa obsługa pakietów RTP z sygnaturami czasowymi, które się zapętlają (#2930).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Naprawiono potencjalny błąd
NullPointerException, który może wystąpić podczas przewijania przed przetworzeniem pierwszej klatki wideo (#2965).
- Naprawiono potencjalny błąd
- 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:
- Zaktualizowano
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 ustawieniem jej na zero i po nim. - Opublikowano klasy narzędziowe
WakeLockManager,WifiLockManager,AudioFocusManager,AudioBecomingNoisyManageriStuckPlayerDetector, które były wcześniej używane wewnętrznie przezExoPlayer, aby umożliwić ich ponowne użycie w innych odtwarzaczach (#1893). - Naprawiono obsługę detektora
ForwardingPlayer, gdy odtwarzacz delegowany używa równości referencyjnej do porównywania instancji detektora (#2675). - Dodaj funkcję rozszerzenia zawieszającego
Player.listenTow bibliotecemedia3-common-ktx, która określa konkretny elementPlayer.Events, na którym należy wykonać działanie. - Naprawiono błąd powodujący awarię w
BasePlayer.getBufferedPercentage, który wynikał z przepełnienia liczby całkowitej, gdy zgłoszona pozycja buforowana była nieprawdopodobnie większa niż zgłoszony czas trwania (#2750). - Naprawiono automatyczne wykrywanie typu ścieżki
TrackGroupprzez nieignorowanie niestandardowego typu MIME próbki i używanie potencjalnie nieprawidłowego typu ścieżki z typu MIME kontenera (#2860).
- Zaktualizowano
- ExoPlayer:
- Dodaj wykrywanie zablokowanego odtwarzacza, które wywołuje błąd odtwarzacza
StuckPlayerException, jeśli odtwarzacz wydaje się zablokowany. Dzieje się tak w tych przypadkach, gdy każdy domyślny limit czasu można w razie potrzeby skonfigurować wExoPlayer.Builder:- Po 10 minutach
STATE_BUFFERINGpodczas próby odtworzenia i braku postępu buforowania. - Po 10 sekundach
STATE_READYpodczas próby odtworzenia i braku postępu odtwarzania. - Po minucie
STATE_READYpo upływie zadeklarowanego czasu trwania bez osiągnięcia końca elementu. - Po 10 minutach od wystąpienia przyczyny 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. To odpowiednik ustawienia
ExoPlayer.Builder.setWakeModenaC.WAKE_MODE_LOCAL. - Dodaj logikę nasłuchiwania, aby automatycznie aktualizować identyfikator urządzenia wirtualnego, gdy zostanie zgłoszona zmiana w obiekcie
Context, który został pierwotnie przekazany do metodyExoPlayer.Builder. - Dodaj
ExoPlayer.setVirtualDeviceId, aby ręcznie zaktualizować identyfikator urządzenia wirtualnego uzyskany zContextprzekazanego doExoPlayer.Builder. - Upewnij się, że moduły renderujące nie pobierają danych z następnego elementu playlisty wcześniej niż 10 sekund przed końcem bieżącego elementu.
- Dodaj
setSeekBackIncrementMs,setSeekForwardIncrementMsisetMaxSeekToPreviousPositionMsdoExoPlayer, aby zaktualizować te ustawienia po utworzeniu (#2736). - Dodaj funkcję wstępnego buforowania w
DefaultPreloadManager. Aplikacje mogą teraz zwracaćDefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)lubDefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)za pomocąTargetPreloadStatusControl.getTargetPreloadStatus(T rankingData), aby wskazać, że element multimedialny musi zostać wstępnie wczytany. - Użyj funkcji wstępnego buforowania
DefaultPreloadManagerw aplikacji demonstracyjnej do krótkich filmów. - Dodaj metody ustawiające
DefaultLoadControl.Builderdo odtwarzania lokalnego i dostosuj domyślne wartościDefaultLoadControl, aby dobrze działały z szeroką gamą plików lokalnych. - Naprawiono błąd, który powodował, że ustawienie pustej playlisty mogło pozostawić odtwarzacz w stanie
STATE_READYlubSTATE_BUFFERING. - Ulepsz interfejsy API menedżera wstępnego wczytywania:
- Dodaj metody
addMediaItems(List<MediaItem>, List<T>)iaddMediaSources(List<MediaSource>, List<T>), które zbiorczo dodają elementy multimedialne lub źródła multimediów, a następnie automatycznie wywołują metodęinvalidate(). - Dodaj metody
removeMediaItems((List<MediaItem>)iremoveMediaSources(List<MediaSource>), które zbiorczo usuwają elementy multimedialne lub źródła multimediów, i upewnij się, że po usunięciu menedżer wstępnego wczytywania nie rozpoczyna ani nie kontynuuje wstępnego wczytywania żadnego z nich. - Zezwalaj na automatyczne unieważnianie
DefaultPreloadManager.setCurrentPlayingIndex(int). Po zaktualizowaniu indeksu aktualnie odtwarzanego utworu aplikacje nie muszą już bezpośrednio wywoływać metodyinvalidate().
- Dodaj metody
- Dodano możliwość pomijania resetowania klatek kluczowych podczas przewijania do przodu w tej samej grupie obrazów w trybie przewijania.
- Dodaj
DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int), aby aplikacje mogły ustawić wartość docelowych bajtów bufora dla odtwarzacza z określonymplayerName.DefaultLoadControlmoże teraz podejmować decyzje dotyczące każdego odtwarzacza osobno na podstawie przydzielonych mu bajtów i docelowych bajtów bufora. - Dodaj parametr
SkipInfodoAdPlaybackState.AdGroup, aby przekazywać informacje o pominięciu każdej reklamy w grupie reklam. - Naprawiliśmy błąd, który powodował awarię, gdy metoda
removeMediaItems(List)była wywoływana podczas odtwarzania reklamy po filmie (#2746). - Naprawiono błąd powodujący zacinanie się odtwarzania playlisty, gdy klatki były błędnie ustawiane jako ostatnia próbka i renderowane.
- Włącz ścieżkę ponownej próby, jeśli odtwarzacz nie wygeneruje identyfikatora sesji audio (#2382, #2678).
- Dodaj obsługę kontroli łącznej liczby bajtów bufora dla źródeł w
DefaultPreloadManager, aby zapobiec niekontrolowanemu wzrostowi łącznej liczby bajtów bufora na potrzeby wstępnego wczytywania. Aby używać domyślnej logiki sterowania, aplikacje mogą ustawić docelowe bajty bufora na potrzeby 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 przewijania lub automatycznym przejściu (#2484).
- Dodanie interfejsu API do ustawiania i obserwowania parametrów kodeków ścieżek audio i wideo.
Ta funkcja jest zaimplementowana w przypadku mechanizmów renderowania opartych na
MediaCodeci wymaga interfejsu API w wersji 29 lub nowszej.- Aby zastosować parametry, użyj
ExoPlayer.setAudioCodecParameters()iExoPlayer.setVideoCodecParameters(). - Aby nasłuchiwać zmian, użyj
ExoPlayer.addAudioCodecParametersChangeListener()iExoPlayer.addVideoCodecParametersChangeListener(). Obserwowanie kluczy specyficznych dla dostawcy wymaga interfejsu API w wersji 31 lub nowszej.
- Aby zastosować parametry, użyj
- Naprawiono błąd
IllegalStateExceptionspowodowany ustawieniem pustego źródła multimediów po przejś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 przewijanie do innych elementów multimedialnych w trybie przewijania mogło powodować
IllegalStateException. - Naprawiono potencjalny błąd
NullPointerExceptionwDefaultPlaybackSessionManager(#2885). - Włącz ulepszenia wydajności przewijania w kwalifikujących się filmach.
- Ponownie włączono deszyfrowanie asynchroniczne w MediaCodec na poziomie API 36 lub wyższym, gdzie rozwiązano problemy z przekroczeniem limitu czasu w tym interfejsie API platformy (#1641).
- Zmień domyślną wartość
MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUsna 15 ms i włącz bardziej efektywne pomijanie klatek wideo przed dekodowaniem w przypadku odpowiednich 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). - Naprawiliśmy błąd, który powodował, że podczas odtwarzania w trybie playlisty lub powtarzania przewijanie w trybie przewijania blisko końca mogło powodować przejście do następnego elementu multimedialnego.
- Dodaj wykrywanie zablokowanego odtwarzacza, które wywołuje błąd odtwarzacza
- CompositionPlayer:
- Opublikuj
CompositionPlayerz nową adnotacją@ExperimentalApi, aby wskazać, że jest dostępny do eksperymentowania, ale nadal jest rozwijany. Niektóre interfejsy API mogą ulec znacznym zmianom w przyszłych wersjach. Istnieją też znane problemy i ograniczenia związane z niektórymi przypadkami użycia (niektóre z nich nie są udokumentowane). - Dodaj obsługę
COMMAND_SET_AUDIO_ATTRIBUTESi obsługę fokusu audio wCompositionPlayer. - Dodaj obsługę zmiany szybkości w sekwencjach dodatkowych w
CompositionPlayer. - Dodaj obsługę
EditedMediaItem.removeVideo.
- Opublikuj
- Transformator:
- Użyj
InAppMp4Muxerjako domyślnego multipleksera. - Dodaj
EditedMediaItem.Builder#setSpeed()i wycofajEffects#createExperimentalSpeedChangingEffects(). - Zastąp
forceAudioTrackiforceVideoTrackwartościątrackTypeswEditedMediaItemSequence.
- Użyj
- 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. odczytywanych z tagów HLS NAME (#1666).
- Dodaj
- Ekstraktory:
- FLAC: zaostrzono 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: zezwalanie na odstępy między tagami ID3 (i przed nimi) na początku plików MP3 (#811, #5718).
- MP3: zwiększono limit wykrywania do 128 kB, aby dopasować go do istniejącego limitu wyszukiwania bajtu synchronizacji (#2713).
- MP3: zmieniono
FLAG_ENABLE_INDEX_SEEKING, aby preferować wyszukiwanie informacji z nagłówków metadanych (takich jak Xing i VBRI), gdy są dostępne, i wracać 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: zmieniono
Mp3Extractor, aby domyślnie przyjmować stałą szybkość transmisji bitów (CBR), gdy nie zostaną znalezione metadane wyszukiwania (np. Xing, VBRI), nawet jeśli ustawionoFLAG_ENABLE_INDEX_SEEKING. Wynika to z historii specyfikacji MP3, w której standardem był CBR, a VBR wymagał wyraźnych nagłówków. Poprawia to natychmiastową możliwość wyszukiwania plików bez metadanych kosztem potencjalnej dokładności plików VBR bez nagłówków. Wyszukiwanie indeksu jest teraz używane jako rozwiązanie zastępcze, 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: poprawiono wydajność wykrywania bardzo dużych plików przez założenie, że pole
stblwiększe niż 1 MB oznacza, że plik nie może być pofragmentowany (#2650). - MP4: dodano obsługę metadanych
©mvn(nazwa ruchu) i©mvi(indeks ruchu). Są one teraz emitowane jako obiektyTextInformationFramewFormat.metadataz identyfikatorami odpowiednioMVNMiMVIN(#2754). - MP4: ignorowanie ścieżek z brakującym polem
stsd(zamiast niepowodzenia analizy całego pliku). - Matroska: dodano obsługę wykrywania DTS-HD (#6225).
- Rozwiązaliśmy problem w
MatroskaExtractor, który powodował, że przewijanie mogło być niedokładne w przypadku plików z wieloma ścieżkami. Punkty wstawienia są teraz prawidłowo powiązane z odpowiednimi ścieżkami, co umożliwia precyzyjne przewijanie. - MPEG-TS: naprawiono błąd
IllegalArgumentExceptionzReorderingBufferQueuespowodowany przez pakiety PES bez sygnatury czasowej (#2764). - Dodano obsługę wyodrębniania zdjęć ruchomych HEIC.
HeifExtractormoże teraz analizować pliki HEIC zawierające umieszczone ścieżki wideo i audio.
- Inspektor:
- Wprowadziliśmy nowy moduł
:media3-inspector, który służy jako dedykowane miejsce na narzędzia do sprawdzania multimediów. Ten moduł zawiera teraz nowy interfejsandroidx.media3.inspector.MetadataRetriever, który zapewnia ujednolicony interfejs API do wyodrębniania metadanych i klatek. Dotychczasowa wersjaandroidx.media3.exoplayer.MetadataRetrieverzostała wycofana na rzecz nowej. - Wprowadziliśmy
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 niestandardowego wyboru dekodera. Należy go utworzyć za pomocąBuilderdla konkretnego elementuMediaItem. - FrameExtractor: dodaj
getThumbnail(), aby wyodrębnić reprezentatywną klatkę miniatury z pliku multimedialnego bez konieczności podawania konkretnej sygnatury czasowej. - Dodaj
androidx.media3.inspector.MediaExtractorCompat, który zastępujeandroid.media.MediaExtractorplatformy i umożliwia wyodrębnianie nieprzetworzonych, zakodowanych próbek multimediów z pliku multimedialnego. Dotychczasowa klasaandroidx.media3.exoplayer.MediaExtractorCompatzostała wycofana na rzecz tej nowej klasy.
- Wprowadziliśmy nowy moduł
- Dźwięk:
- Powiadom instancje
AudioProcessoro przewijaniu. - Zezwalaj na wstrzykiwanie nowego interfejsu
AudioOutputProviderdoDefaultAudioSink.Builder, aby obsługiwać niestandardowe ścieżki wyjścia audio. Wartość domyślna toAudioTrackAudioOutputProvider. - Obsługa przewijania w aplikacji
GainProcessor. - Wykorzystanie możliwości profilu i poziomu dekodera AC-4 w ocenie obsługi formatu ścieżki (#2580).
- Unikaj potencjalnych opóźnień spowodowanych obsługą wywołań zwrotnych dotyczących zmiany routingu na początku odtwarzania (#2646).
- Zezwoliliśmy na ponowne używanie kodeków w przypadku formatów EAC3, EAC3-JOC i AC-4 (#1346).
- Dodaj obsługę próbek PCM typu float w
Sonic. - Dodaj obsługę 16-bitowych próbek PCM w
ToFloatPcmAudioProcessor.
- Powiadom instancje
- Film:
- Wyłącz ponowne używanie kodeka w przypadku treści Dolby Vision z różnymi profilami.
- Ponownie włączono obejście problemu z błędnie zgłaszanymi punktami wydajności w przypadku bezpiecznych kodeków (#2856).
- Tekst:
- Naprawiono analizowanie napisów CEA-6/708 w treściach Dolby Vision (#2775).
- Obraz:
- Rozwiązaliśmy problem ze ScrubbingMode, który powodował, że odtwarzacz zawieszał się podczas przewijania ścieżki miniatury DASH (#2815).
- DRM:
- Zmień zwracany typ metod
MediaDrmCallbackzbyte[]na nowy typMediaDrmCallback.Response, aby umożliwić zwracanie dodatkowych opcjonalnych informacji. Jest to zmiana powodująca niezgodność w kodzie źródłowym, ale można je łatwo rozwiązać, opakowując poprzednią wartość zwracanąbyte[]wnew Responseprzed zwróceniem. - Dodaj do
AnalyticsListener.onDrmKeysLoadedkluczowe informacje o żądaniu, takie jak adres URL i czas oczekiwania (#1001). - Przenieś dane żądania obsługi administracyjnej z parametru adresu URL do treści POST.
- Zmień zwracany typ metod
- Efekt:
- Dodaj
Presentation.copyWithUnsetSideRoundedTo, aby zaokrąglić nieustawioną stronę wyjściową, gdyPresentationjest tworzony z jedną długością boku.
- Dodaj
- Multipleksery:
- Dodaj
MediaMuxerCompat, który jest bezpośrednim zamiennikiem platformyMediaMuxer. - Dodaj
MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo(), aby umożliwić tworzenie zdjęć ruchomych. - Dodaj
WebmMuxer, aby umożliwić multipleksowanie strumieni multimedialnychOPUS,VORBIS,VP8iVP9do formatu plikuwebm.
- Dodaj
- Rozszerzenie IMA:
- Usunięcie niestandardowych reguł ProGuard, dzięki czemu aplikacje mogą używać reguł opublikowanych w archiwum IMA na Androida.
- Dodaliśmy
ImaServerSideAdInsertionUriBuilder.setNetworkCode, nowy interfejs API do ustawiania kodu sieci Google Ad Managera dla pakietu IMA SDK, aby obsługiwać identyfikatory reklam zgodnie z ustawieniami Google Ad Managera. Kody sieci są opcjonalne, ale zalecane w przypadku żądań strumienia Full Service. Aby dowiedzieć się, jak znaleźć kod sieci, przeczytaj ten artykuł. - Zaktualizowano zależność IMA do wersji 3.37.0, która wymaga włączenia odlukrzania biblioteki podstawowej. Ta funkcja musi być też włączona w aplikacjach zależnych. Zapoznaj się z uwagami dotyczącymi konfiguracji IMA. * Obsługa opcji niestandardowego interfejsu IMA DAI w narzędziu do tworzenia identyfikatorów URI SSAI. Opcje niestandardowego interfejsu użytkownika w przypadku wstawiania reklam po stronie serwera obejmują obsługę renderowania opcji „Możliwa do pominięcia” i „O tej reklamie”. Ta funkcja jest obecnie dostępna dla wybranych wydawców na liście dozwolonych. Ta zmiana powoduje też uaktualnienie pakietu IMA SDK do wersji 3.38.0 (informacje o wersji), aby umożliwić dostęp do interfejsu API opcji niestandardowego interfejsu.
- Rozwiązaliśmy problem, który powodował, że błąd przygotowania treści po reklamie był błędnie zgłaszany jako błąd odtwarzania reklamy (#2656).
- Sesja:
- Dodaj nowy parametr do
MediaSession.Callback.onPlaybackResumption, aby wskazać, czy wywołanie ma na celu tylko zebranie informacji, czy rozpoczęcie odtwarzania (#1764). - Zaktualizowano
MediaSession.ControllerInfo.isTrusted, aby kontrolery z własnej aplikacji były również deklarowane jako zaufane (#2542). - Dodaj
MediaSessionService.triggerNotificationUpdate, aby ręcznie aktywować aktualizację powiadomienia (#1833). - Dodaj
ProgressListenerdo metod poleceń niestandardowych. - Zmień domyślną wartość
MediaLibrarySession.Builder.setLibraryErrorReplicationModena niekrytyczną. - Dodaj parametr
ContextdoMediaButtonReceiver.onForegroundServiceStartNotAllowedException(#2625). - Odczytaj identyfikator sterowania głośnością z platformy
PlaybackInfozamiast pobierać go przez binder. Dzięki temu typ odtwarzania i identyfikator sterowania głośnością są odczytywane niepodzielnie i pasują do siebie. - Naprawiliśmy błąd, który powodował odfiltrowywanie kluczowych zdarzeń
ACTION_UPprzed przekazaniem ich do wywołania zwrotnego na potrzeby niestandardowej obsługi. Zapewnia to zgodność z tym, co robi media1 i platforma (#2637). - Naprawiono błąd, który powodował, że
getCurrentTimeline()był wywoływany przezPlayerWrapper, nawet gdy polecenie było niedostępne (#2665). - Naprawiliśmy błąd, który powodował, że wiadomość pozostawała w kolejce wiadomości głównej pętli, co po zakończeniu usługi powodowało wyciek pamięci (#2692).
- Po połączeniu ze starszą aplikacją sesji za pomocą
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. - Zaimplementowano metodę
onAudioSessionIdChanged, aby powiadamiać kontrolery multimediów, gdy identyfikator sesji audio jest ustawiany przez sesję (#244). - Naprawiliśmy błąd, który powodował, że
KEYCODE_HEADSETHOOKnie uruchamiało odtwarzacza, gdy zdarzenie klawisza multimedialnegoIntentdocierało doonStartCommand(). Problem został rozwiązany przez obsługę „KEYCODE_HEADSETHOOK” tak samo jakKEYCODE_MEDIA_PLAY_PAUSE(#2816). - Naprawiliśmy błąd, który powodował, że rozmiar powierzchni nie był przekazywany między sesją a kontrolerem, co uniemożliwiało stosowanie 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 znaków w stylu span (#2853). - Dodaj
CommandButton.executeAction, aby kontrolery mogły łatwiej wywoływać zamierzone działanie. Umożliwiają też określanie parametrów niektórych poleceń odtwarzacza i sesji, aby zdefiniować, które działanie ma zostać wywołane. - Dodaj zgodność wsteczną dla instancji
CommandButton, używającPlayer.Commandlub niestandardowegoSessionCommand, aby zdefiniować ich działanie. Są one teraz prawidłowo reprezentowane w sesjach multimedialnych platformy, np. w interfejsie systemu lub Androidzie Auto. - Rozwiązaliśmy problem, który powodował, że ten sam element
Bitmapbył wielokrotnie kompresowany podczas łączeniaMediaControllerz sesją multimedialną platformy.
- Dodaj nowy parametr do
- UI:
- Dodaj klasę
ProgressStateWithTickIntervali odpowiadający jej element kompozycyjnyrememberProgressStateWithTickIntervaldo modułumedia3-ui-compose. Ta zmienna stanu jest używana wdemo-composedo wyświetlania bieżącej pozycji i czasu trwania w formie tekstowej. - Dodaj
MuteButtonStatedoui-compose, który obsługuje wyciszanie głośnościPlayer. Ta zmienna stanu jest używana wdemo-composedo wyświetlania przycisku przełączania wyciszenia/wyłączenia wyciszenia. - Dodaj klasy
ProgressStateWithTickCounti odpowiadający im elementrememberProgressStateWithTickCountComposable do modułumedia3-ui-compose. Ta zmienna stanu jest używana wdemo-composedo wyświetlania postępu w postaci poziomego paska postępu tylko do odczytu. - Dodaj element kompozycyjny
ContentFramedomedia3-ui-compose, który łączy zarządzaniePlayerSurfaceze zmianą rozmiaru formatu obrazu i zakrywaniem migawką. - Obejście znanego błędu platformy API 34, który powoduje rozciąganie lub przycinanie filmów podczas używania
SurfaceVieww ComposeAndroidView, co wpływa na elementy kompozycyjneContentFrameiPlayerSurfacezSURFACE_TYPE_SURFACE_VIEW(#1237, #2811). - Utwórz nowy moduł
media3-ui-compose-material3i dodaj do niego elementy kompozycyjne z motywem Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton). - Dodaj element kompozycyjny
TimeTextdomedia3-ui-compose-material3, aby wyświetlać postępy gracza w formie tekstowej. Można go skonfigurować tak, aby pokazywał bieżącą pozycję, czas trwania lub pozostały czas. - Dodaj obsługę umieszczania przycisku trasy multimediów w
PlayerView. - Używaj
BidiFormatter, aby prawidłowo wyświetlać znaki interpunkcyjne w napisach w językach zapisywanych od prawej do lewej (#11214).
- Dodaj klasę
- Rozszerzenie HLS:
- Analizuj atrybuty pomijania reklam pełnoekranowych HLS.
- Zmapuj atrybuty sterowania pomijaniem z playlisty HLS i dokumentu z listą zasobów na
AdPlaybackState, aby zapewnić dostęp publiczny. - Naprawiliśmy błąd, który powodował, że czas rozpoczęcia playlisty był pomijany, gdy tag EXT-X-PROGRAM-START-DATE definiujący czas rozpoczęcia został usunięty z playlisty (#2760).
- Używanie wyszukiwania binarnego do znajdowania indeksu segmentu danej pozycji na playliście (#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 reklamowego (#2859). - Akceptuj spację jako separator daty i godziny w ciągach daty i godziny w formacie ISO 8601.
- Prawidłowo obsługuj pobieranie następnego fragmentu dla
HlsMediaPlaylistbez segmentów (#2821). - Użyj domyślnej pozycji początkowej w przypadku reklam przed filmem w transmisjach na żywo.
- Rozszerzenie DASH:
- Naprawiono błąd
UnsupportedOperationExceptionwystępujący podczas odtwarzania strumieni DASH z niehierarchicznym identyfikatorem URI pliku manifestudata:(#2688). - Zresetuj
LiveConfigurationdo wartości podanej przezMediaItemelementuDashMediaSourcepo zwolnieniu i gdy element multimedialny zostanie zaktualizowany przez użytkownika (#2606). - Unikanie awarii spowodowanych przez nieprawidłowe aktualizacje pliku manifestu, które nie zostały zgłoszone jako błędy odtwarzacza (#2805).
- Naprawiono błąd
- Rozszerzenie RTSP:
- Obsługa błędu brakujących pakietów RTP podczas przetwarzania pofragmentowanych jednostek NAL dla H264 i H265 (#2613).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Rozszerzenie AV1: dekoder oprogramowania AV1 używa teraz wysokowydajnej biblioteki
dav1d, która zastępuje poprzednią implementacjęlibgav1, co zwiększa szybkość dekodowania. - Rozszerzenie FFmpeg: rozwiązano problem, który uniemożliwiał odtwarzanie niektórych plików FLAC, przez zapewnienie prawidłowego analizowania bloku
STREAMINFOi przekazywania go do dekodera (#2887).
- Rozszerzenie AV1: dekoder oprogramowania AV1 używa teraz wysokowydajnej biblioteki
- Rozszerzenie Cast:
- Dodaj
CastPlayer.Builder, co umożliwiCastPlayerodtwarzanie lokalne i przesyłanie. Aby zachować stare zachowanieCastPlayer, które obsługuje tylko odtwarzanie Cast, możesz użyćRemoteCastPlayer. Dotychczasowe konstruktoryCastPlayerzachowują swoje stare działanie, ale zostały wycofane na rzecz kreatorówCastPlayerlubRemoteCastPlayer. - Przestań wymuszać typ MIME inny niż null w
DefaultMediaItemConverter. - Użyj
MediaItem.mediaMetadata.mediaType, aby określić parametr MEDIA_TYPE przesyłania, który ma być używany wDefaultCastOptionsProvider#toMediaQueueItem, gdy jest dostępny. - Włącz przesyłanie z urządzenia zdalnego na lokalne w
DefaultCastOptionsProvider. - Dodaj obsługę Cast w wersji demonstracyjnej sesji.
- Dodaj obsługę wyświetlania przycisku trasy multimediów w interfejsie Composable.
- Dodaj obsługę wyświetlania przycisku trasy multimediów w menu paska działań.
- Dodaj obsługę wyświetlania przycisku trasy multimediów jako interfejsu widoku.
- Dodaj
- Narzędzia testowe:
- Dodaj maksymalną różnicę czasu dla automatycznego przechodzenia do następnego elementu w przypadku
FakeClock. Domyślna wartość to 1 sekunda, ale można ją skonfigurować za pomocąFakeClock.Builder. - Dodaj maksymalną różnicę czasu między wiadomościami dla
RobolectricUtil.runMainLooperUntil(irunLooperUntil). Domyślnie jest to 1 sekunda, ale można to skonfigurować za pomocą nowych przeciążeń tych metod. - Przenieś
CapturingRenderersFactoryz kampaniitest-utilsdo kampaniitest-utils-robolectric.
- Dodaj maksymalną różnicę czasu dla automatycznego przechodzenia do następnego elementu w przypadku
- Usuń wycofane symbole:
- Usuń wycofany konstruktor
DefaultPreloadManager. Użyj w zamian zasadyDefaultPreloadManager.Builder. - Usunięto wycofane konstruktory
EditedMediaItemSequence. Użyj w zamian zasadyEditedMediaItemSequence.Builder. - Usuń
BitmapFactoryImageDecoder.BitmapDecoder. Użyj w zamian zasadyExternallyLoadedImageDecoder. - Usuń wycofany element
ShadowMediaCodecConfig.forAllSupportedMimeTypes(). Użyj w zamian zasadyShadowMediaCodecConfig.withAllDefaultSupportedCodecs(). - Usuń wycofane
ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes(). Użyj w zamian zasadyShadowMediaCodecConfig.withNoDefaultSupportedCodecs().
- Usuń wycofany konstruktor
1.9.0-rc01
1 grudnia 2025 r.
Użyj wersji stabilnej 1.9.0.
1.9.0-beta01
20 listopada 2025 r.
Użyj wersji stabilnej 1.9.0.
1.9.0-alpha01
22 października 2025 r.
Użyj wersji stabilnej 1.9.0.
Wersja 1.8.0
1.8.1
21 maja 2026 r.
Wersja 1.8.1 zawiera te zatwierdzenia.
- Efekt:
- Podczas przechodzenia z kontekstu bez powierzchni jawnie ustaw
GL_DRAW_BUFFERiGL_READ_BUFFER.
- Podczas przechodzenia z kontekstu bez powierzchni jawnie ustaw
Wersja 1.8.0
30 lipca 2025 r.
Wersja 1.8.0 zawiera te zatwierdzenia.
- Biblioteka wspólna:
- Dodaj obsługę zastępowania odtwarzacza w
ForwardingSimpleBasePlayer.
- Dodaj obsługę zastępowania odtwarzacza w
- ExoPlayer:
- Dodano metodę pobierającą dla trybu odtwarzania losowego do interfejsu
ExoPlayer(#2522). - Wyraźniej zgłaszaj wyjątek, jeśli dostęp do
DefaultAudioSinkjest uzyskiwany 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 używana do odtwarzania (#1191). - Naprawiliśmy błąd, który powodował, że formaty audio inne niż stereo na telewizorach mogły być oznaczane przez
DefaultTrackSelectorjako nieobsługiwane. - Sprawdź, czy ostatnia klatka jest prawidłowo renderowana, gdy używasz flagi
DECODE_ONLYMediaCodec (która jest domyślnie włączona w trybie przewijania). - Dodaj obsługę korzystania z identyfikatora urządzenia wirtualnego z
Contextprzekazanego doExoPlayer.Builder. - Domyślnie włącz dynamiczne planowanie w trybie przewijania.
- Unikanie niepotrzebnego ponownego wczytywania źródła podczas przewijania do końca elementu.
- Domyślnie używaj
MediaCodec.BUFFER_FLAG_DECODE_ONLYw trybie czyszczenia. - Zgłaszanie błędu
IllegalStateException, gdyPreloadMediaSourcejest odtwarzany przezExoPlayerz wątkiem odtwarzania innym niż wątek wstępnego wczytywania (#2495). - Dodaj
cloneAndMovedoShuffleModez domyślną implementacją (#2226). - Zmień domyślne działanie funkcji
Renderer.getMinDurationToProgressUs, aby zwracała większą wartość, jeśli nie jest wymagane wywołanie funkcjirender. - Naprawiono błąd, który powodował, że wewnętrzne planowanie opóźniało ostatnią klatkę podczas przewijania do końca w trybie wstrzymania. Na razie poprawka błędu działa tylko wtedy, gdy włączona jest flaga
ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled. - Dodaj metodę
ExoPlayer.setScrubbingModeEnabled(boolean). Dzięki temu odtwarzacz jest zoptymalizowany pod kątem częstego przewijania (np. gdy użytkownik przeciąga pasek przewijania). Działanie trybu przewijania można dostosować za pomocąsetScrubbingModeParameters(..)wExoPlayeriExoPlayer.Builder. - Zezwalaj na dostosowywanie tolerancji ułamkowej podczas przewijania w trybie przewijania.
- Zwiększ szybkość działania kodeka w trybie przewijania.
- Naprawiono błąd, który powodował, że błędy przygotowania w treści
AdsMediaSourcemogły nie być zgłaszane (#2337). - Naprawiono wyciek pamięci w
MergingMediaSource, który występował np. podczas instalowania napisów z nieoficjalnych źródeł (#2338). - Zezwolono, aby metoda
CmcdConfiguration.Factoryzwracała wartośćnullw celu wyłączenia logowania CMCD w przypadku określonych elementów multimedialnych (#2386). - Zwiększono domyślny rozmiar bufora obrazu ze 128 kB (błąd kopiowania i wklejania ze ścieżek tekstowych) do 26 MB, co wystarcza na obrazy Ultra HDR o rozdzielczości 50 Mpix (#2417).
- Dodaj
PreCacheHelper, który umożliwia aplikacjom wstępne buforowanie pojedynczego pliku multimedialnego z określoną pozycją początkową i czasem trwania. - Dodaj obsługę wstępnego wczytywania z określonej pozycji w
DefaultPreloadManager.
- Dodano metodę pobierającą dla trybu odtwarzania losowego do interfejsu
- Transformator:
- Dodaj
CodecDbLite, który 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 wartość false. - Wypełnienie początkowej luki (dodanej za pomocą
addGap()) ciszą wymaga teraz wyraźnego ustawieniaexperimentalSetForceAudioTrack(true)wEditedMediaItemSequence.Builder. Jeśli luka znajduje się w środku sekwencji, ta flaga nie jest wymagana. - Przenieś interfejs
Muxerzmedia3-transformerdomedia3-muxer. - Ustawienie
MediaItem.Builder().setImageDuration(long)musi być obowiązkowe, aby można było importować element multimedialny jako obraz. - Dodaj
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean), który zawiera listę edycji MP4 podczas przycinania, aby poinstruować odtwarzacze, aby ignorowały próbki między klatką kluczową przed punktem początkowym przycięcia a punktem początkowym przycięcia. - Zaktualizuj aplikację Composition Demo, aby używała Kotlina i Jetpack Compose, i dodaj niestandardowy element
VideoCompositorSettings, aby ułożyć sekwencje w układzie 2 x 2 lub PiP.
- Dodaj
- Ekstraktory:
- Analizowanie metadanych z pofragmentowanych plików MP4 (#2084).
- JPEG: obsługa zdjęć ruchomych, które nie mają segmentu Exif na początku (#2552).
- Dodano obsługę przewijania we fragmentowanych plikach MP4 z wieloma atomami
sidx. To zachowanie można włączyć za pomocą flagiFLAG_MERGE_FRAGMENTED_SIDXnaFragmentedMp4Extractor(#9373). - Ignorowanie pustych tabel wyszukiwania w plikach FLAC (w tym tych, które zawierają tylko zastępcze punkty wyszukiwania) i przełączanie się na wyszukiwanie binarne, jeśli czas trwania pliku jest znany (#2327).
- Naprawiliśmy błąd związany z analizowaniem jednostek H.265 SEI, aby całkowicie pomijać nierozpoznane typy SEI (#2456).
- Zaktualizuj
WavExtractor, aby podczas analizowania pliku typuWAVE_FORMAT_EXTENSIBLEużywać danych SubFormat rozszerzenia nagłówka dla formatu audio. - MP4: dodano obsługę boksów
ipcmifpcmdefiniujących nieprzetworzone ścieżki audio PCM (64-bitowa zmiennoprzecinkowa modulacja PCM nie jest obsługiwana). - MP4: obsługa części obrotu macierzy przekształceń
tkhd, które zarówno obracają, jak i odzwierciedlają film. Dzięki temu filmy nagrane przednim aparatem iPhone'a są wyświetlane prawidłowo, ale nieprawidłowo odzwierciedlone na osi Y (#2012). - MP3: używanie czasu trwania i rozmiaru danych z nieobsługujących przewijania metadanych Xing, VBRI i podobnych metadanych o zmiennej szybkości transmisji bitów podczas przełączania się na przewijanie ze stałą szybkością transmisji bitów z powodu
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)(#2194).
- Dźwięk:
- Naprawiono błąd, który powodował, że metoda
AnalyticsListener.onAudioPositionAdvancingnie była wywoływana, gdy odtwarzanie dźwięku rozpoczynało się bardzo blisko końca multimediów. - Dodaj obsługę wszystkich formatów próbek liniowego PCM w
ChannelMappingAudioProcessoriTrimmingAudioProcessor. - Dodano obsługę przerw w dźwięku w
CompositionPlayer. - Usuń nieprawidłowe wywołanie funkcji
BaseAudioProcessor#flush()z plikuBaseAudioProcessor#reset(). - Zezwalaj na stałe zwiększanie/zmniejszanie liczby kanałów w DefaultAudioMixer.
- Ustawienie
ChannelMappingAudioProcessor,TrimmingAudioProcessoriToFloatPcmAudioProcessorjako publicznych (#2339). - Użyj
AudioTrack#getUnderrunCount()wAudioTrackPositionTracker, aby wykrywać niedomogi wDefaultAudioSinkzamiast szacowania na podstawie najlepszych starań. - Ulepszyliśmy wygładzanie sygnatur czasowych dźwięku w przypadku nieoczekiwanego przesunięcia pozycji z urządzenia wyjściowego audio.
- Naprawiono błąd, który powodował, że synchronizacja audio-wideo była uszkodzona przez pierwsze 10 sekund po wznowieniu odtwarzania po wstrzymaniu, gdy urządzenie było połączone z urządzeniami Bluetooth.
- Naprawiono błąd, który powodował, że
AnalyticsListener.onAudioPositionAdvancingnie raportował czasu rozpoczęcia odtwarzania dźwięku, ale czas pierwszego pomiaru. - Naprawiono przywracanie dźwięku wielokanałowego po przełączeniu na dźwięk stereo na niektórych urządzeniach (#2258).
- Naprawiono błąd, który powodował, że metoda
- Film:
- Rozszerzono obejście problemu z odłączoną powierzchnią na urządzenia „lenovo” i „motorola” (#2059).
- Poprawiono płynność wyświetlania klatek wideo podczas uruchamiania, gdy próbki audio nie zaczynają się dokładnie w żądanej pozycji.
- Rozszerzono obejście problemu z odłączoną powierzchnią na urządzenia „realme” (#2059).
- Dodaj eksperymentalny interfejs API
ExoPlayer, aby uwzględnić flagęMediaCodec.BUFFER_FLAG_DECODE_ONLYpodczas kolejkowania buforów wejściowych tylko do dekodowania. Ta flaga sygnalizuje dekoderowi, aby pominął bufory tylko do dekodowania, co przyspiesza wyszukiwanie. Włącz ją za pomocąDefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Ulepszyliśmy sprawdzanie wydajności kodeków w przypadku programowych kodeków wideo. Może to spowodować, że niektóre dodatkowe ścieżki zostaną oznaczone jakoEXCEEDS_CAPABILITIES. - Naprawiono błędy odtwarzania VP9 Widevine na niektórych urządzeniach (#2408).
- Tekst:
- Dodano obsługę ścieżek VobSub w plikach MP4 (#2510).
- Naprawiono błąd powodujący zatrzymanie odtwarzania, gdy segment napisów początkowo nie wczytywał się, a później wczytywał się prawidłowo, po czym następowało kilka pustych segmentów napisów (#2517).
- Naprawiono błąd, który powodował, że podczas włączania napisów w formatach SSA i SubRip wyświetlał się komunikat o trwającym procesie (#2309).
- Rozwiązaliśmy 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).
- Naprawiliśmy problem ze zniekształconymi napisami 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 „zaawansowany” (v4+) wariant napisów SubStation Alpha (ale logika analizy ExoPlayera jest taka sama w przypadku obu wariantów) (#2384). - Dodanie obsługi właściwości
layerw plikach napisów SubStation Alpha (SSA), która służy do definiowania kolejności wyświetlania wskazówek, gdy na ekranie jest ich więcej niż jedna (#2124).
- Metadane:
- Dodano obsługę pobierania czasu trwania multimediów i
TimelinedoMetadataRetrieveroraz przeniesiono ją do interfejsu APIAutoCloseableopartego na instancjach. Użyj nowegoBuilder, 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 zdekodowane bitmapy do rozmiaru wyświetlania 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ę
DefaultRenderersFactory.getImageDecoderFactory(), aby przyjmowała parametrContext. - Dopasuj maksymalny rozmiar wyjściowy bitmapy używany w
CompositionPlayerdo rozmiaru używanego już wTransformer(co oznacza, że w przeciwieństwie doExoPlayerCompositionPlayernie uwzględnia rozmiaru wyświetlacza podczas dekodowania bitmap).
- Ogranicz zdekodowane bitmapy do rozmiaru wyświetlania w
- DRM:
- Dodano nowe przeciążenie
OfflineLicenseHelper.newWidevineInstanceakceptująceMediaItem.DrmConfiguration, aby nagłówki żądań HTTP mogły być prawidłowo stosowane (#2169).
- Dodano nowe przeciążenie
- Efekt:
- Dodaj
Presentation.createForShortSide(int), który tworzyPresentation, aby najkrótszy bok zawsze odpowiadał podanej wartości, niezależnie od orientacji wejściowej.
- Dodaj
- Multipleksery:
- Naprawiliśmy błąd, który powodował, że w przypadku próbek audio we fragmencie MP4 nie były ustawiane prawidłowe flagi próbek.
- Interfejs API
writeSampleData()używa teraz klasyBufferInfopowiązanej z multiplekserem zamiast klasyMediaCodec.BufferInfo. - Dodaj
Muxer.Factory#supportsWritingNegativeTimestampsInEditList, który domyślnie ma wartość false.
- Rozszerzenie IMA:
- Naprawiliśmy błąd, który powodował, że błąd wczytywania jednej reklamy 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 oknie nie są już dodawane do kolejki w
MediaPeriodQueue(#2215).
- Sesja:
- Naprawiono błąd, który powodował ignorowanie połączeń z zewnętrznych kontrolerów Media3 bez uprawnień.
- Usunięto sprawdzanie dostępnych poleceń podczas wysyłania poleceń niestandardowych do starszej wersji
MediaBrowserServiceCompat. Jest to zgodne z zachowaniem starszych kontrolerów i przeglądarek po połączeniu ze starszą aplikacją. - Naprawiliśmy błąd, który powodował, że pierwszy błąd odtwarzania był nieprawidłowo traktowany jako trwały wyjątek niestandardowy. Uniemożliwia to przywrócenie aplikacji.
- Naprawiono błąd, który powodował, że niektóre zmiany kontrolera nieobsługiwane przez sesję mogły powodować błąd
IllegalStateExceptions. - Naprawiliśmy błąd, który powodował, że działania kontrolera nieobsługiwane przez sesję mogły pozostawiać kontroler w nieprawidłowym stanie.
- Naprawiono ostrzeżenie o naruszeniu zasad dotyczących niebezpiecznego uruchamiania StrictMode (#2330).
- Naprawiliśmy błąd, który powodował, że wywołanie
setSessionExtrasz głównego wątku, gdy odtwarzacz był uruchamiany z innego wątku aplikacji niż 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 (#2423https://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, który powodował, że przewijanie transmisji na żywo na urządzeniu
MediaControllermogło powodować błądIllegalArgumentException. - W przypadku transmisji na żywo zatrzymano publikowanie pozycji odtwarzania i możliwość przewijania bieżącego elementu w kontrolerach multimediów platformy, aby uniknąć artefaktów pozycji w interfejsie Androida Auto (i innych kontrolerach korzystających z tych informacji z sesji multimedialnej platformy) (#1758).
- Naprawiliśmy błąd, który powodował, że przekazanie wartości null do
getLibraryRootwMediaBrowserpołączonym ze starszą wersjąMediaBrowserServiceCompatpowodowało błądNullPointerException. - Naprawiliśmy błąd, który powodował, że wysyłanie działań niestandardowych, wyniku wyszukiwania lub żądania getItem powodowało awarię starszej wersji aplikacji sesji z błędem
ClassNotFoundException. - Naprawiono błąd, który powodował, że
MediaItem.LocalConfiguration.uribył udostępniany wMediaMetadatasesji platformy. Aby celowo udostępnić identyfikator URI i umożliwić kontrolerom ponowne żądanie multimediów, ustawMediaItem.RequestMetadata.mediaUri.
- UI:
- Naprawiliśmy błąd, który powodował, że
PlayerSurfacew komponentach wielokrotnego użytku, takich jakLazyColumn, nie działał prawidłowo (#2493). - Naprawiliśmy błąd w Compose, który powodował opóźnienie między ustawieniem początkowych stanów przycisków a obserwowaniem zmiany stanu (np. kształtu ikony lub włączenia). Wszystkie zmiany wprowadzone w odtwarzaczu poza okresem obserwacji są teraz uwzględniane (#2313).
- Dodaj zmienne stanu i funkcje kompozycyjne do modułu
media3-ui-composedlaSeekBackButtonStateiSeekForwardButtonState. - Dodaj obsługę trybu przewijania ExoPlayera do
PlayerControlView. Gdy ta funkcja jest włączona, odtwarzacz przechodzi w tryb przewijania, gdy użytkownik zaczyna przeciągać pasek przewijania, wywołujeplayer.seekToprzy każdym ruchu, a następnie wychodzi z trybu przewijania, gdy użytkownik odsuwa palec od ekranu. Tę integrację można włączyć za pomocątime_bar_scrubbing_enabled = truew pliku XML lub metodysetTimeBarScrubbingEnabled(boolean)w języku Java/Kotlin. - Zmień
PlayerSurface, aby akceptował argumentPlayer, który może mieć wartość null.
- Naprawiliśmy błąd, który powodował, że
- Pobrane:
- Dodaj obsługę częściowego pobierania strumieni progresywnych. Aplikacje mogą przygotować strumień progresywny za pomocą
DownloadHelperi poprosić oDownloadRequestz pomocnika, określając pozycje początkowe i końcowe multimediów, które powinny zostać pobrane. Zwrócony obiektDownloadRequestzawiera rozpoznany zakres bajtów, za pomocą którego można utworzyć obiektProgressiveDownloaderi pobrać odpowiednie treści. - Dodaj
DownloadHelper.Factory, który zastąpi metody statyczneDownloadHelper.forMediaItem(). - Dodaj
Factoryw przypadku implementacjiSegmentDownloader. - Dodaj obsługę częściowego pobierania strumieni adaptacyjnych. Aplikacje mogą przygotować strumień adaptacyjny za pomocą
DownloadHelperi poprosić oDownloadRequestz pomocnika, określając pozycje początkowe i końcowe multimediów, które mają zostać pobrane. Zwrócony obiektDownloadRequestzawiera rozwiązany zakres czasu, za pomocą którego można utworzyć konkretny obiektSegmentDownloaderi odpowiednio pobrać zawartość.
- Dodaj obsługę częściowego pobierania strumieni progresywnych. Aplikacje mogą przygotować strumień progresywny za pomocą
- Rozszerzenie Cronet:
- Dodano automatyczną obsługę plików cookie (#5975).
- Rozszerzenie HLS:
- Naprawiono błąd, który powodował, że
HlsSampleStreamWrapperpróbował wyszukiwać w buforze, gdy nie było w nim dostępnych fragmentów #2598. - Naprawiono błąd, który powodował, że zmiana wyboru ścieżki po wczytaniu części o małym opóźnieniu i wskazówek dotyczących wstępnego wczytywania mogła powodować zablokowanie lub zawieszenie odtwarzania (#2299).
- Zapobieganie nadmiernemu ponownemu wczytywaniu przez oczekiwanie przez połowę docelowego czasu trwania, gdy serwer nie uwzględnia
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 i próby rozpoznania listy zasobów dla nieprawidłowej reklamy (#2558).
- Naprawiono analizowanie playlisty, aby akceptować
\f(znak wysuwu strony) w wartościach atrybutów ciągów znaków w cudzysłowie (#2420). - Dodano obsługę aktualizowania reklam pełnoekranowych o tym samym identyfikatorze (#2427).
- Naprawiliśmy błąd, który powodował, że błędy wczytywania playlisty czasami nie były przekazywane, gdy w transmisji na żywo kończyły się segmenty do wczytania (#2401https://github.com/androidx/media/issues/2401).
- Grupowanie wersji napisów według tagu NAME, podobnie jak w przypadku wersji audio (#1666).
- Obsługa X-ASSET-LIST i transmisji na żywo za pomocą
HlsInterstitialsAdsLoader.
- Naprawiono błąd, który powodował, że
- Rozszerzenie DASH:
- Rozwiązaliśmy problem polegający na tym, że zestaw adaptacyjny trybu trick-play był scalany z głównym zestawem adaptacyjnym, co powodowało utworzenie nieprawidłowego elementu
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).
- Naprawiliśmy błąd, który powodował, że przekierowanie nie było wykonywane, gdy używane były parametry zapytania CMCD (#2475).
- Rozwiązaliśmy problem polegający na tym, że zestaw adaptacyjny trybu trick-play był scalany z głównym zestawem adaptacyjnym, co powodowało utworzenie nieprawidłowego elementu
- Rozszerzenie RTSP:
- Dodaliśmy obsługę pakietu agregacji RTP dla H265 zgodnie z RFC 7798#4.4.2 (#2413).
- Naprawiono błąd
RtspClient, aby podczas przetwarzania odpowiedzi HTTP 302 używany był podany identyfikator URI lokalizacji (#2398). - Dodano obsługę analizowania SessionDescriptions zawierających wiersze z końcowymi znakami odstępu (#2357).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
- Naprawiono błąd, który powodował, że metoda
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChangenie działała w przypadku rozszerzeń dekodera dźwięku (#2258).
- Naprawiono błąd, który powodował, że metoda
- Rozszerzenie Cast:
- Narzędzia testowe:
- Dodaj
advance(player).untilPositionAtLeastiuntilMediaItemIndexdoTestPlayerRunHelper, aby odtwarzacz przechodził do przodu, aż osiągnie określoną pozycję. W większości przypadków te metody są bardziej niezawodne niż dotychczasowe metodyuntilPositioniuntilStartOfMediaItem. - Przenieś
FakeDownloaderdo modułutest-utils-robolectric, aby użyć go ponownie w innych testach. - Usunięto:
transformer.TestUtil.addAudioDecoders(String...),transformer.TestUtil.addAudioEncoders(String...)itransformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...). Zamiast tego skonfiguruj kodery i dekodery cieni za pomocąShadowMediaCodecConfig. - Zastąpiono prefiks „exotest” prefiksem „media3” w nazwach kodeków zgłaszanych przez
ShadowMediaCodecConfig.
- Dodaj
- Usuń wycofane symbole:
- Usunięto wycofany konstruktor
SegmentDownloaderSegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor)i odpowiadające mu konstruktory w podklasachDashDownloader,HlsDownloaderiSsDownloader. - Usunięto wycofane:
Player.hasNext(),Player.hasNextWindow(). Użyj w zamian zasadyPlayer.hasNextMediaItem(). - Usunięto wycofaną funkcję
Player.next(). Użyj w zamian zasadyPlayer.seekToNextMediaItem(). - Usunięto wycofaną funkcję
Player.seekToPreviousWindow(). Użyj w zamian zasadyPlayer.seekToPreviousMediaItem(). - Usunięto wycofaną funkcję
Player.seekToNextWindow(). Użyj w zamian zasadyPlayer.seekToNextMediaItem(). - Usunięto wycofany element
BaseAudioProcessorw moduleexoplayer. UżyjBaseAudioProcessorw modulecommon. - Usuń wycofany konstruktor
MediaCodecVideoRendererMediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider).
- Usunięto wycofany konstruktor
Wersja 1.8.0-rc02
24 lipca 2025 r.
Użyj wersji stabilnej 1.8.0.
Wersja 1.8.0-rc01
16 lipca 2025 r.
Użyj wersji stabilnej 1.8.0.
Wersja 1.8.0-beta01
2 lipca 2025 r.
Użyj wersji stabilnej 1.8.0.
Wersja 1.8.0-alpha01
19 maja 2025 r.
Użyj wersji stabilnej 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 jest udostępniana, aby była widoczna 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 być oznaczona jako 1.7.0-alpha01, ale została przypadkowo oznaczona jako 1.7.0 (czyli stabilna) na maven.google.com. Nie używaj jej. Pozostań przy wersji 1.6.1 lub przejdź na wersję 1.7.1 (która ma ten sam kod co 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 zatwierdzenia.
- Biblioteka wspólna:
- Dodano metodę
PlaybackParameters.withPitch(float), która ułatwia kopiowaniePlaybackParametersz nową wartościąpitch(#2257).
- Dodano metodę
- ExoPlayer:
- Rozwiązaliśmy problem, który powodował, że przejście elementu multimedialnego kończyło się niepowodzeniem z powodu możliwego do naprawienia błędu renderowania podczas inicjowania następnego elementu multimedialnego (#2229).
- Naprawiono błąd, który powodował, że
ProgressiveMediaPeriodzgłaszał błądIllegalStateException, gdyPreloadMediaSourcepróbował wywołaćgetBufferedDurationUs(), zanim był on gotowy (#2315). - Naprawiono wysyłanie parametru
CmcdDataw żądaniach pliku manifestu w przypadku DASH, HLS i SmoothStreaming (#2253). - Upewnij się, że po usunięciu grup reklam można 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: analizuj
alternate_groupz polatkhdi udostępniaj jako wpisMp4AlternateGroupDatawFormat.metadatakażdej ścieżki (#2242).
- MP4: analizuj
- Dźwięk:
- Rozwiązano problem z odciążaniem, który powodował, że pozycja mogła się zacinać podczas odtwarzania playlisty z krótkimi treściami (#1920).
- Sesja:
- Zmniejsz limit czasu oczekiwania na agregację w przypadku wywołań zwrotnych platformy
MediaSessionz 500 do 100 milisekund i dodaj eksperymentalną metodę ustawiającą, 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, który powodował, że sesja zwracała oś czasu z jednym elementem, gdy odtwarzacz był pusty. Działo się tak, gdy odtwarzacz nie miał dostępnej metody
COMMAND_GET_TIMELINE, ale miał dostępną metodęCOMMAND_GET_CURRENT_MEDIA_ITEMi był pusty (#2320). - Naprawiono błąd, który powodował, że wywołanie
MediaSessionService.setMediaNotificationProviderbyło ignorowane bez powiadomienia po innych interakcjach z usługą, takich jaksetForegroundServiceTimeoutMs(#2305).
- Zmniejsz limit czasu oczekiwania na agregację w przypadku wywołań zwrotnych platformy
- UI:
- Włącz
PlayerSurface, aby korzystać zExoPlayer.setVideoEffectsiCompositionPlayer. - Naprawiono błąd, który uniemożliwiał ponowne utworzenie
PlayerSurfacez nowymPlayer.
- Włącz
- Rozszerzenie HLS:
- Rozwiązaliśmy problem, który powodował, że czas trwania fragmentu nie był ustawiany w
CmcdDataw przypadku multimediów HLS, co powodowało błąd asercji podczas przetwarzania zaszyfrowanych segmentów multimediów (#2312).
- Rozwiązaliśmy problem, który powodował, że czas trwania fragmentu nie był ustawiany 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ć odpowiednie klasy wandroidx.media. - Uaktualnij Kotlin z wersji 1.9.20 do 2.0.20 i użyj wtyczki Gradle do obsługi kompilatora Compose. Uaktualniono bibliotekę KotlinX Coroutines z wersji 1.8.1 do 1.9.0.
- Usuń metodę
Format.toBundle(boolean excludeMetadata)i użyj metodyFormat.toBundle(). - Naprawiono błąd w
SimpleBasePlayer, który powodował, że ustawienie nowegocurrentMediaItemIndexwStateposetPlaylistznullMediaMetadatanie powodowało ponownej oceny metadanych (#1940). - Zmień dostęp 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 na potrzeby odtwarzania za pomocą
MediaCodecVideoRenderer. Możesz skonfigurowaćDefaultRenderersFactoryza pomocąexperimentalSetEnableMediaCodecVideoRendererPrewarming, aby udostępnić dodatkowyMediaCodecVideoRendererdlaExoPlayer. Jeśli ta opcja jest włączona,ExoPlayerwstępnie przetwarza filmy z kolejnych elementów multimedialnych podczas odtwarzania, aby skrócić czas oczekiwania na przejście między elementami multimedialnymi. - Zmniejsz domyślne wartości
bufferForPlaybackMsibufferForPlaybackAfterRebufferMswDefaultLoadControlodpowiednio do 1000 i 2000 ms. - Asynchronicznie inicjuj
DeviceInfoi głośność urządzenia (jeśli włączono za pomocąsetDeviceVolumeControlEnabled). Te wartości nie są dostępne natychmiast poExoPlayer.Builder.build(), aPlayer.Listenerpowiadamia o zmianach za pomocąonDeviceInfoChangedionDeviceVolumeChanged. - Początkowy identyfikator sesji audio nie jest już dostępny natychmiast po utworzeniu odtwarzacza. W razie potrzeby możesz użyć
AnalyticsListener.onAudioSessionIdChanged, aby odsłuchać początkową aktualizację. - Podczas wybierania ścieżki wideo weź pod uwagę język. Domyślnie wybierz „główną” ścieżkę wideo, która odpowiada językowi 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. - Naprawiliśmy błąd, który powodował, że elementy playlisty lub okresy w wielookresowych strumieniach DASH o czasie trwania niezgodnym z rzeczywistą treścią mogły powodować zawieszanie się klatek na końcu elementu (#1698).
- Przenieś
BasePreloadManager.Listenerna najwyższy poziomPreloadManagerListener. - Można zaimplementować
RenderersFactory.createSecondaryRenderer, aby udostępnić dodatkowe mechanizmy renderowania na potrzeby wstępnego rozgrzewania. Wstępne wczytywanie umożliwia szybsze przechodzenie między elementami multimedialnymi podczas odtwarzania. - Włączono wysyłanie
CmcdDataw przypadku żądań pliku manifestu w formatach strumieniowania adaptacyjnego DASH, HLS i SmoothStreaming (#1951). - Podaj
MediaCodecInfokodeka, który zostanie zainicjowany wMediaCodecRenderer.onReadyToInitializeCodec(#1963). - Zmień
AdsMediaSource, aby umożliwić rozwójAdPlaybackStatesprzez dodanie grup reklam. Nieprawidłowe modyfikacje są wykrywane i powodują wyjątek. - Rozwiązaliśmy problem polegający na tym, że po przejściu do treści multimedialnych po reklamie w trakcie filmu mogły być wyświetlane w szybkich odstępach czasu dodatkowe klatki tylko do dekodowania.
- Spraw, aby
DefaultRenderersFactorydodawał 2 instancjeMetadataRenderer, aby aplikacje mogły domyślnie otrzymywać 2 różne schematy metadanych. - Ponowna ocena, czy trwające wczytywanie fragmentu powinno zostać anulowane, gdy odtwarzanie jest wstrzymane (#1785).
- Dodaj opcję do
ClippingMediaSource, aby umożliwić przycinanie w nieprzeszukiwalnych multimediach. - Naprawiliśmy błąd, który powodował, że przewijanie z wstępnym rozgrzewaniem mogło blokować przejście do następnego elementu multimedialnego.
- Naprawiono błąd, który powodował, że
ExoPlayer.isLoading()pozostawał w stanietrue, mimo że przeszedł do stanuSTATE_IDLElubSTATE_ENDED(#2133). - Dodaj
lastRebufferRealtimeMsdoLoadControl.Parameter(#2113).
- Dodaj
- Transformator:
- Dodaj obsługę transmutacji do alternatywnych formatów zgodnych wstecznie.
- Dodaliśmy obsługę transkodowania i transmutacji formatu Dolby Vision (profil 8).
- Zaktualizuj parametry
VideoFrameProcessor.registerInputStreamiVideoFrameProcessor.Listener.onInputStreamRegistered, aby używaćFormat. - Wygeneruj statyczne metadane HDR, gdy używasz
DefaultEncoderFactory. - Włącz obsługę diagnostyki platformy Androida za pomocą
MediaMetricsManager. Transformer przekazuje zdarzenia edycji i dane o skuteczności do platformy, co pomaga dostarczać informacje na potrzeby debugowania na urządzeniu. Te dane mogą być też zbierane przez Google, jeśli użytkownik urządzenia włączył udostępnianie danych o użytkowaniu i diagnostyce. Aplikacje mogą zrezygnować z udostępniania danych diagnostycznych platformy dla Transformer za pomocąTransformer.Builder.setUsePlatformDiagnostics(false). - Podziel
InAppMuxernaInAppMp4MuxeriInAppFragmentedMp4Muxer.InAppMp4Muxersłuży do tworzenia niesfragmentowanego pliku MP4, aInAppFragmentedMp4Muxer– do tworzenia pliku sfragmentowanego. - Przenieś interfejs
Muxerzmedia3-muxerdomedia3-transformer. - Dodaj
MediaProjectionAssetLoader, który udostępnia multimedia zMediaProjectiondo nagrywania ekranu, i dodaj obsługę nagrywania ekranu do aplikacji demonstracyjnej Transformer. - Dodaj
#getInputFormat()do interfejsuCodec. - Jeśli to możliwe, przenieś odpowiedzialność za zwolnienie
GlObjectsProviderna element wywołujący wDefaultVideoFrameProcessoriDefaultVideoCompositor.
- Ekstraktory:
- AVI: poprawiono obsługę plików ze skompresowanym dźwiękiem o stałej szybkości transmisji bitów, w których nagłówek strumienia przechowuje liczbę bajtów zamiast liczby fragmentów.
- Poprawiliśmy 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ązaliśmy problem, który powodował, że strumienie TS mogły się zacinać na niektórych urządzeniach (#2069).
- FLAC: dodano obsługę 32-bitowych plików FLAC. Wcześniej nie można było ich odtworzyć z powodu błędu
IllegalStateException: Playback stuck buffering and not loading(#2197).
- Dźwięk:
- Poprawiono wywołanie
onAudioPositionAdvancing, aby następowało po wznowieniu odtwarzania (wcześniej było wywoływane po wstrzymaniu odtwarzania). - Nie pomijaj
SonicAudioProcessor, gdySpeedChangingAudioProcessorjest skonfigurowany z parametrami domyślnymi. - Naprawiono niedomiar w
Sonic#getOutputSize(), który mógł powodować zawieszanie sięDefaultAudioSink. - Popraw
MediaCodecAudioRenderer.getDurationToProgressUs()iDecoderAudioRenderer.getDurationToProgressUs(), aby przewijanie prawidłowo resetowało podane czasy trwania. - Ustaw
androidx.media3.common.audio.SonicAudioProcessorjako ostateczną. - Dodaj obsługę zmiennoprzecinkowego PCM do
ChannelMappingAudioProcessoriTrimmingAudioProcessor.
- Poprawiono wywołanie
- Film:
- Zmieniono
MediaCodecVideoRenderer.shouldUsePlaceholderSurfacena chronione, aby aplikacje mogły zastępować blokowanie użycia powierzchni zastępczych (#1905). - Dodano eksperymentalną analizę zależności próbek AV1
ExoPlayer, aby przyspieszyć przewijanie. Włącz go za pomocą nowego interfejsu APIDefaultRenderersFactory.experimentalSetParseAv1SampleDependencies. - Dodano eksperymentalny interfejs API
ExoPlayer, który umożliwia odrzucanie opóźnionych buforów wejściowych dekoderaMediaCodecVideoRenderer, od których nie ma zależności. Włącz ją za pomocąDefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * Rozwiązaliśmy problem, który powodował, że odtwarzacz bez powierzchni był natychmiast gotowy i bardzo wolno dekodował oczekujące klatki (#1973). - Wykluczono urządzenia Xiaomi i OPPO z trybu odłączonej powierzchni, aby uniknąć migotania ekranu (#2059).
- Zmieniono
- Tekst:
- Dodano obsługę napisów VobSub (#8260).
- Zatrzymanie niecierpliwego wczytywania wszystkich plików napisów skonfigurowanych za pomocą
MediaItem.Builder.setSubtitleConfigurationsi wczytywanie tylko jednego, jeśli został wybrany przez wybór ścieżki (#1721). - TTML: dodano obsługę odwoływania się do
tts:originitts:extentza pomocąstyle(#2953). - Ogranicz sygnatury czasowe 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 problem z zawieszaniem się odtwarzania, gdy playlista zawierała przycięte elementy z napisami CEA-608 lub CEA-708.
- Naprawiono błąd
IllegalStateException, który występował, gdy plik SSA zawierał sygnał o zerowym czasie trwania (czas rozpoczęcia i zakończenia był taki sam) (#2052). - Pomijanie (i rejestrowanie) błędów analizy napisów, gdy napisy są multipleksowane w tym samym kontenerze co dźwięk i obraz (#2052).
- Naprawiono 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 configurationwystępujący podczas odtwarzania treści ClearKey na urządzeniach z interfejsem API < 27 (#1732).
- Naprawiono błąd
- Efekt:
- Przenieśliśmy funkcje
OverlaySettingsdoStaticOverlaySettings. KlasaOverlaySettingsmoże być podklasą, aby umożliwić dynamiczne ustawienia nakładki.
- Przenieśliśmy funkcje
- Multipleksery:
- Przeniesiono
MuxerExceptionpoza interfejsMuxer, aby uniknąć bardzo długiej pełnej i jednoznacznej nazwy. - Zmieniono nazwę metody
setSampleCopyEnabled()nasetSampleCopyingEnabled()wMp4Muxer.BuilderiFragmentedMp4Muxer.Builder. Mp4Muxer.addTrack()iFragmentedMp4Muxer.addTrack()zwracają teraz identyfikator śledzeniaintzamiastTrackToken.Mp4MuxeriFragmentedMp4Muxernie implementują już interfejsuMuxer.- Domyślnie wyłącz grupowanie i kopiowanie próbek
Mp4Muxer. - Napraw błąd w
FragmentedMp4Muxer, który powoduje tworzenie wielu fragmentów, gdy zapisywana jest tylko ścieżka audio.
- Przeniesiono
- Sesja:
- Utrzymuj stan usługi na pierwszym planie przez dodatkowe 10 minut, gdy odtwarzanie zostanie wstrzymane, zatrzymane lub nie powiedzie się. Dzięki temu użytkownicy mogą wznowić odtwarzanie w tym czasie bez ryzyka ograniczeń usług na pierwszym planie na różnych urządzeniach. Pamiętaj, że nie można już używać samego wywołania
player.pause()do zatrzymania usługi na pierwszym planie przedstopSelf(). Podczas zastępowaniaonTaskRemovedużyjMediaSessionService.pauseAllPlayersAndStopSelf(). - Powiadomienie pozostaje widoczne, gdy odtwarzanie zostanie zatrzymane lub wystąpi błąd. 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 Androida, aby ustawiać tylko jedno z nich zgodnie z dostępnymi poleceniami i akceptować, jeśli ustawione jest tylko jedno z nich.
- Dodaj
Contextjako parametr doMediaButtonReceiver.shouldStartForegroundService(#1887). - Naprawiono błąd, który powodował, że wywołanie metody
Playerw obiekcieMediaControllerpołączonym ze starszą sesją powodowało odrzucenie zmian z oczekującej aktualizacji. - Umożliwienie akceptowania wartości null przez
MediaSession.setSessionActivity(PendingIntent)(#2109). - Naprawiono błąd, który powodował, że po wyczyszczeniu playlisty powiadomienie o niej pozostawało widoczne (#2211).
- Utrzymuj stan usługi na pierwszym planie przez dodatkowe 10 minut, gdy odtwarzanie zostanie wstrzymane, zatrzymane lub nie powiedzie się. Dzięki temu użytkownicy mogą wznowić odtwarzanie w tym czasie bez ryzyka ograniczeń usług na pierwszym planie na różnych urządzeniach. Pamiętaj, że nie można już używać samego wywołania
- UI:
- Dodaj zmienne stanu i funkcje kompozycyjne do modułu
media3-ui-composedla:PlayerSurface,PresentationState,PlayPauseButtonState,NextButtonState,PreviousButtonState,RepeatButtonState,ShuffleButtonStateiPlaybackSpeedState.
- Dodaj zmienne stanu i funkcje kompozycyjne 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 zablokowane, gdy źródło danych zgłaszało błądExceptioninny niżIOException(#9760).
- Naprawiono błąd w
- Rozszerzenie HLS:
- Dodaj pierwszą wersję:
HlsInterstitialsAdsLoader. Moduł ładowania reklam odczytuje reklamy pełnoekranowe HLS z playlisty multimediów HLS i mapuje je na obiektAdPlaybackState, który jest przekazywany do obiektuAdsMediaSource. Ta początkowa wersja obsługuje tylko strumienie HLS VOD z atrybutamiX-ASSET-URI. - Dodaj
HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Aplikacje mogą go używać do tworzenia instancjiAdsMediaSource, które korzystają zHlsInterstitialsAdsLoaderw wygodny i bezpieczny sposób. - Analizuj tag
SUPPLEMENTAL-CODECSz playlisty HLS, aby wykrywać formaty Dolby Vision (#1785). - Złagodzono warunek przewijania w celu synchronizacji pozycji w strumieniu HLS (#2209).
- Dodaj pierwszą wersję:
- Rozszerzenie DASH:
- Dodano obsługę formatu AC-4 Level-4 w DASH (#1898).
- Rozwiązaliśmy problem z obliczaniem interwału aktualizacji na potrzeby 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). - Ulepszona obsługa 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ązaliśmy problem, który powodował, że zestawy adaptacyjne oznaczone jako
adaptation-set-switching, ale z różnymi językami lub flagami ról, były scalane (#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:
- Połącz niestandardowe instancje
AudioSinkiAudioRendererEventListenerzMidiRenderer.
- Połącz niestandardowe instancje
- Rozszerzenie Cast:
- Zwiększ zależność
play-services-cast-frameworkdo wersji 21.5.0, aby naprawić błądFLAG_MUTABLEpowodujący awarię aplikacji kierowanych na interfejs API 34 lub nowszy na urządzeniach z zainstalowanymi, ale wyłączonymi usługami Google Play (#2178).
- Zwiększ zależność
- Aplikacja demonstracyjna:
- Rozszerz
demo-composeo dodatkowe przyciski i ulepsz integrację zPlayerSurfacedzięki obsłudze skalowania i migawki.
- Rozszerz
- Usuń wycofane symbole:
- Usuń wycofaną metodę
AudioMixer.create(). Użyj w zamian zasadyDefaultAudioMixer.Factory().create(). - Usuń te wycofane metody
Transformer.Builder:setTransformationRequest(), użyj 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 zEditedMediaItemprzekazanego doTransformer.start().setRemoveVideo(), użyjEditedMediaItem.Builder.setRemoveVideo(), aby usunąć film zEditedMediaItemprzekazanego doTransformer.start().setFlattenForSlowMotion(), użyjEditedMediaItem.Builder.setFlattenForSlowMotion(), aby spłaszczyćEditedMediaItemprzekazywane 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. Użyj w zamian zasadyExportResult. - Usuń wycofaną klasę
TransformationException. Użyj w zamian zasadyExportException. - Usuń wycofany element
Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Użyj w zamian zasadyTransformer.PROGRESS_STATE_NOT_STARTED. - Usuń wycofany element
Transformer.setListener(). Użyj w zamian zasadyTransformer.addListener(),Transformer.removeListener()lubTransformer.removeAllListeners(). - Usuń wycofany element
Transformer.startTransformation(). Użyj w zamian zasadyTransformer.start(MediaItem, String). - Usuń wycofany element
SingleFrameGlShaderProgram. Użyj w zamian zasadyBaseGlShaderProgram. - Usuń
Transformer.flattenForSlowMotion. Użyj w zamian zasadyEditedMediaItem.flattenForSlowMotion. - Usunięto:
ExoPlayer.VideoComponent,ExoPlayer.AudioComponent,ExoPlayer.TextComponentiExoPlayer.DeviceComponent. - Kontakt
androidx.media3.exoplayer.audio.SonicAudioProcessorzostał usunięty. - Usunęliśmy te wycofane metody
DownloadHelper:- Konstruktor
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), użyj zamiast niegoDownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList). - W przypadku
getRendererCapabilities(RenderersFactory)równoważną funkcjonalność można uzyskać, tworzącDefaultRendererCapabilitiesListzRenderersFactoryi wywołującDefaultRendererCapabilitiesList.getRendererCapabilities(). - Usunęliśmy metodę
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat). Zamiast tego użyjPlayerNotificationManager.setMediaSessionToken(MediaSession.Token)i przekaż(MediaSession.Token) compatToken.getToken().
- Konstruktor
- Usuń wycofaną metodę
1.6.0-rc02
19 marca 2025 r.
Użyj wersji stabilnej 1.6.0.
1.6.0-rc01
12 marca 2025 r.
Użyj wersji stabilnej 1.6.0.
1.6.0-beta01
26 lutego 2025 r.
Użyj wersji stabilnej 1.6.0.
Wersja 1.6.0-alpha03
6 lutego 2025 r.
Użyj wersji stabilnej 1.6.0.
Wersja 1.6.0-alpha02
30 stycznia 2025 r.
Użyj wersji stabilnej 1.6.0.
Wersja 1.6.0-alpha01
20 grudnia 2024 r.
Użyj wersji stabilnej 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 zatwierdzenia.
- ExoPlayer:
- Wyłączono używanie deszyfrowania asynchronicznego w MediaCodec, aby uniknąć zgłaszanych problemów z przekroczeniem limitu czasu kodeka w przypadku tego interfejsu API platformy (#1641).
- Ekstraktory:
- MP3: nie zatrzymuj odtwarzania przedwcześnie, gdy spis treści ramki
VBRInie obejmuje wszystkich danych MP3 w pliku (#1904).
- MP3: nie zatrzymuj odtwarzania przedwcześnie, gdy spis treści ramki
- Film:
- Wycofanie używania wartości formatu obrazu piksela podanych w
MediaCodecAdapter, gdy są one podane podczas przetwarzaniaonOutputFormatChanged(#1371).
- Wycofanie używania wartości formatu obrazu piksela podanych w
- Tekst:
- Naprawiliśmy błąd w
ReplacingCuesResolver.discardCuesBeforeTimeUs, który powodował, że wskazówka aktywna otimeUs(rozpoczęta wcześniej, ale jeszcze niezakończona) była nieprawidłowo odrzucana (#1939).
- Naprawiliśmy błąd w
- Metadane:
- Wyodrębnianie numeracji płyt/ścieżek i gatunku z komentarzy Vorbis do
MediaMetadata(#1958).
- Wyodrębnianie numeracji płyt/ś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 zatwierdzenia.
- Biblioteka wspólna:
- Dodano
ForwardingSimpleBasePlayer, który umożliwia przekazywanie do innego odtwarzacza z niewielkimi korektami, zapewniając jednocześnie pełną spójność i obsługę słuchaczy (#1183). - Zastąp metodę
SimpleBasePlayer.State.playlistmetodągetPlaylist(). - Dodaj zastąpienie dla
SimpleBasePlayer.State.Builder.setPlaylist(), aby bezpośrednio określićTimelineoraz bieżąceTracksiMetadatazamiast 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 Kotlina, oparte na bibliotece Common. - Dodaj funkcję rozszerzenia zawieszającego
Player.listen, aby uruchomić współprogram do nasłuchiwaniaPlayer.Eventsw bibliotecemedia3-common-ktx. - 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 wyodrębniają takie wywołania, aby uniknąć błędów w czasie działania (dzięki czemu ręczne wyodrębnianie nie jest już wymagane). Wszyscy użytkownicy Gradle korzystający z biblioteki muszą już używać wersji wtyczki Androida do obsługi Gradle, która korzysta z wersji R8, która to robi, ze względu nacompileSdk = 35. Użytkownicy biblioteki z systemami kompilacji innymi niż Gradle muszą upewnić się, że krok zmniejszania/zaciemniania kodu odpowiadający R8 wykonuje podobny automatyczny proces out-of-lining, aby uniknąć błędów weryfikacji klas w czasie działania. Ta zmiana została już wprowadzona w innych bibliotekach AndroidX.
- Dodano
- ExoPlayer:
- Funkcję
MediaCodecRenderer.onProcessedStreamChange()można teraz wywołać w przypadku każdego elementu multimedialnego. Wcześniej nie było wywoływane w przypadku pierwszego. Aby włączyć tę funkcję, użyjMediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart(). - Dodaj
PreloadMediaSource.PreloadControl.onPreloadError, aby umożliwić implementacjomPreloadMediaSource.PreloadControlpodejmowanie działań w przypadku wystąpienia błędu. - Dodaj
BasePreloadManager.Listener, aby rozpowszechniać zdarzenia wstępnego ładowania w aplikacjach. - Zezwalaj na zmianę limitu czasu klienta SNTP i ponowne próby połączenia z alternatywnymi adresami po przekroczeniu limitu czasu (#1540).
- Usunięto pole
MediaCodecAdapter.Configuration.flags, ponieważ zawsze miało wartość 0. - Zezwalaj użytkownikowi na wybieranie wbudowanego głośnika do odtwarzania na Wear OS API 35 lub nowszym (jeśli urządzenie obsługuje tę funkcję).
- Odrocz wywołanie blokujące do
Context.getSystemService(Context.AUDIO_SERVICE), dopóki nie zostanie włączona obsługa fokusu audio. Dzięki temu wywołanie blokujące nie jest wykonywane, jeśli obsługa fokusu audio nie jest włączona (#1616). - Zezwalanie na odtwarzanie niezależnie od czasu buforowania, gdy wczytywanie się nie powiedzie (#1571).
- Dodaj
AnalyticsListener.onRendererReadyChanged(), aby sygnalizować, kiedy poszczególne mechanizmy renderowania zezwalają na odtwarzanie. - Naprawiono błąd, który powodował, że
MediaCodec.CryptoExceptionbył czasami zgłaszany jako „nieoczekiwany błąd środowiska wykonawczego”, gdyMediaCodecdziałał w trybie asynchronicznym (działanie domyślne w przypadku interfejsu API 31 lub nowszego). - Przekaż
bufferedDurationUszamiastbufferedPositionUsza pomocąPreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Zmienia teżDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MSnaDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS, dzięki czemu aplikacje muszą przekazywać wartość reprezentującą określony czas od domyślnej pozycji początkowej, dla której odpowiednie źródło multimediów musi zostać wstępnie załadowane za pomocą tego IntDef, zamiast pozycji. - Dodano implementację
ForwardingRenderer, która przekazuje wszystkie wywołania metod do innego mechanizmu renderowania (1703). - Dodaj wstępne wczytywanie playlisty dla następnego elementu na playliście. Aplikacje mogą włączyć wstępne wczytywanie, wywołując odpowiednio
ExoPlayer.setPreloadConfiguration(PreloadConfiguration). Domyślnie wstępne wczytywanie jest wyłączone. Jeśli ta opcja jest włączona, aby nie zakłócać odtwarzania,DefaultLoadContrologranicza wstępne wczytywanie, tak aby rozpoczynało się i było kontynuowane tylko wtedy, gdy odtwarzacz nie wczytuje treści do odtworzenia. Aplikacje mogą zmienić to zachowanie, odpowiednio implementującLoadControl.shouldContinuePreloading()(np. zastępując tę metodę wDefaultLoadControl). Domyślna implementacjaLoadControlwyłącza wstępne wczytywanie, jeśli aplikacja używa niestandardowej implementacjiLoadControl. - Dodano metodę
MediaSourceEventListener.EventDispatcher.dispatchEvent(), aby umożliwić wywoływanie zdarzeń detektorów podklas (1736). - Dodaj
DefaultPreloadManager.Builder, który tworzy instancjeDefaultPreloadManageriExoPlayerze spójnymi konfiguracjami udostępnionymi. - Usuń parametr
Renderer[]zLoadControl.onTracksSelected(), ponieważ implementacjaDefaultLoadControlmoże pobierać typy strumieni zExoTrackSelection[]. - Wycofano
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])i oznaczono metodę jako final, aby zapobiec zastępowaniu. Zamiast tego należy użyć nowego elementuDefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]). - Raportuj zdarzenia
MediaSourceEventListenerze źródeł dodatkowych w:MergingMediaSource. Spowoduje to raportowanie zdarzeń rozpoczęcia/błędu/anulowania/zakończenia wczytywania napisów dodanych z nieoficjalnych źródeł (dodanych za pomocąMediaItem.LocalConfiguration.subtitleConfigurations), które mogą pojawiać się jako zduplikowane zdarzenia wczytywania wysyłane przezAnalyticsListener. - Zapobieganie całkowitemu zatrzymaniu odtwarzania przez błędy napisów i metadanych.
Zamiast tego problematyczna ścieżka jest wyłączana, a odtwarzanie pozostałych ścieżek jest kontynuowane (#1722).
- W nowej obsłudze napisów (podczas wyodrębniania) powiązane błędy analizy (np. nieprawidłowe dane napisów) i błędy wczytywania (np. HTTP 404) są emitowane przez wywołania zwrotne
onLoadError. - W przypadku starszego sposobu obsługi napisów (podczas renderowania) tylko powiązane błędy wczytywania są emitowane przez wywołania zwrotne
onLoadError, a błędy analizy są ignorowane (jest to dotychczasowe zachowanie).
- W nowej obsłudze napisów (podczas wyodrębniania) powiązane błędy analizy (np. nieprawidłowe dane napisów) i błędy wczytywania (np. HTTP 404) są emitowane przez wywołania zwrotne
- Naprawiliśmy błąd, który powodował, że elementy playlisty lub okresy w wielookresowych strumieniach DASH o czasie trwania niezgodnym z rzeczywistą treścią mogły powodować zawieszanie się klatek na końcu elementu (#1698).
- Dodano metodę ustawiającą do
SntpClient, aby ustawić maksymalny czas, jaki upłynął od ostatniej aktualizacji, po którym klient jest ponownie inicjowany (#1794).
- Funkcję
- Transformator:
- Dodaj
SurfaceAssetLoader, który obsługuje kolejkowanie danych wideo do Transformer za pomocąSurface. ImageAssetLoaderzgłasza nieobsługiwane dane wejściowe przezAssetLoader.onErrorzamiast zgłaszaćIllegalStateException.- Ustawienie czasu trwania obrazu za pomocą
MediaItem.Builder.setImageDurationMsjest wymagane do eksportu obrazu. - Dodanie obsługi eksportu luk w sekwencjach audio EditedMediaItems.
- Dodaj
- Wybór ścieżki:
DefaultTrackSelector: preferuj dźwięk obiektowy nad dźwiękiem kanałowym, gdy inne czynniki są takie same.
- Ekstraktory:
- Zezwalaj na identyfikowanie przez
Mp4ExtractoriFragmentedMp4Extractorpróbek H264, które nie są używane jako odniesienie przez kolejne próbki. - Dodaj opcję umożliwiającą wyszukiwanie na podstawie indeksu w aplikacji
AmrExtractor. - Traktuj pliki MP3 z ponad 128 kB między prawidłowymi klatkami jako obcięte (zamiast nieprawidłowych). Oznacza to, że pliki z danymi innymi niż MP3 na końcu, które nie mają innych metadanych wskazujących długość bajtów MP3, zatrzymują teraz odtwarzanie na końcu danych MP3, zamiast kończyć się błędem
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}(#1563). - Rozwiązaliśmy problem z obsługą próbek reklam przed filmem w przypadku pozycji początkowych multimediów innych niż klatki kluczowe podczas przetwarzania list edycji w plikach MP4 (#1659).
- Ulepszono obliczanie liczby klatek przez użycie czasu trwania multimediów z pola
mdhdwMp4ExtractoriFragmentedMp4Extractor(#1531). - Naprawiono nieprawidłowe skalowanie
media_timena listach edycji MP4. Wartośćsegment_durationbyła już prawidłowo skalowana przy użyciu skali czasu filmu, a teraz wartośćmedia_timejest prawidłowo skalowana przy użyciu skali czasu ścieżki, zgodnie ze standardem formatu MP4 (#1792). - Obsługa klatek poza kolejnością w obliczeniach
endIndicesdla MP4 z listą edycji (#1797). - Naprawiono analizowanie czasu trwania multimediów w polu
mdhdplików MP4, aby obsługiwać wartości-1(#1819). - Dodano obsługę identyfikacji pola
h263w plikach MP4 w przypadku filmów H.263 (#1821). - Dodaliśmy obsługę formatu pliku multimedialnego AC-4 Level-4 ISO base (#1265).
- Zezwalaj na identyfikowanie przez
- Źródło danych:
- Zaktualizowano
HttpEngineDataSource, aby umożliwić korzystanie z rozszerzenia 7 od wersji S zamiast API na poziomie 34 (#1262). DataSourceContractTest: sprawdź, czyDataSource.getUri()zwraca rozwiązany identyfikator URI (zgodnie z dokumentacją). Jeśli różni się on od identyfikatora URI żądania, testy mogą to wskazywać za pomocą nowej metodyDataSourceContractTest.TestResource.Builder.setResolvedUri().DataSourceContractTest: potwierdź, żeDataSource.getUri()igetResponseHeaders()zwracają wartość „open” po nieudanym wywołaniuopen()(z powodu zasobu „nie znaleziono”) i przed kolejnym wywołaniemclose().- Zastąpienie
DataSourceContractTest.getNotFoundResources()umożliwia podklasom testowym udostępnianie wielu zasobów „nie znaleziono” oraz wszelkich 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
- Zaktualizowano
- Dźwięk:
- Automatycznie konfiguruj metadane głośności CTA-2075 w kodeku, jeśli są obecne w multimediach.
- Zapewnij płynne zmniejszanie głośności podczas przewijania.
- Naprawiliśmy problem z trzaskami, które mogły występować podczas przewijania.
- Naprawiono błąd akumulacji obcinania w algorytmie rozciągania czasu i zmiany wysokości dźwięku Sonic.
- Naprawiono błąd w
SpeedChangingAudioProcessor, który powodował pomijanie klatek wyjściowych.
- Film:
MediaCodecVideoRendererunika dekodowania próbek, które nie są renderowane ani używane jako odniesienie przez inne próbki.- W interfejsie API 35 i nowszych
MediaCodecAdaptermoże teraz otrzymywaćnullSurfacewconfigurei wywołania nowej metodydetachOutputSurface, aby usunąć wcześniej ustawionySurface, jeśli kodek to obsługuje (MediaCodecInfo.detachedSurfaceSupported). - Używanie podanych wartości formatu obrazu piksela
MediaCodecAdapter, jeśli zostały podane, podczas przetwarzaniaonOutputFormatChanged(#1371). - Dodaliśmy obejście problemu z urządzeniem Galaxy Tab S7 FE, który powoduje, że bezpieczne strumienie H264 60 kl./s są oznaczane jako nieobsługiwane (#1619).
- Dodano obejście problemu z kodekami, które zawieszają się po ostatniej próbce bez zwracania sygnału końca strumienia.
- Tekst:
- Dodaj niestandardowy element
VoiceSpani wypełnij go dla zakresów głosu WebVTT (#1632). - Zapewniliśmy wyświetlanie napisów WebVTT w HLS z bardzo dużymi sygnaturami czasowymi (które przekraczają 64-bitową wartość
long, gdy są reprezentowane jako mikrosekundy i pomnożone przez podstawę czasu MPEG90,000) (#1763). - Obsługa napisów CEA-608 w treściach Dolby Vision (#1820).
- Naprawiono błąd powodujący zawieszanie się odtwarzania strumieni DASH z wieloma okresami, gdy włączone są napisy CEA-608 (#1863).
- Dodaj niestandardowy element
- Metadane:
- Przypisz typ
C.TRACK_TYPE_METADATAdo ścieżek zawierających treści icy lub vnd.dvb.ait.
- Przypisz typ
- Obraz:
- Dodaj
ExternallyLoadedImageDecoder, aby uprościć integrację z zewnętrznymi bibliotekami do wczytywania obrazów, takimi jak Glide czy Coil.
- Dodaj
- Źródło danych:
- Dodano
FileDescriptorDataSource, nowyDataSource, którego można używać do odczytu zFileDescriptor(#3757).
- Dodano
- Efekt:
- Dodaj obejście
DefaultVideoFrameProcessordla drobnego skalowaniaSurfaceTexture.SurfaceTexturemoże obejmować niewielkie skalowanie, które odcina obramowanie o szerokości 1 teksela wokół krawędzi przyciętego bufora. Teraz jest to obsługiwane w taki sposób, że dane wyjściowe są bliższe oczekiwanym. - Przyspiesz
DefaultVideoFrameProcessor.queueInputBitmap(). Dzięki temu eksportowanie obrazów do filmów za pomocąTransformerjest szybsze.
- Dodaj obejście
- Rozszerzenie IMA:
- Naprawiono błąd, który powodował, że wyczyszczenie playlisty mogło spowodować błąd
ArrayIndexOutOfBoundsExceptionwImaServerSideAdInsertionMediaSource. - Naprawiliśmy błąd, który powodował, że 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ć błąd
- Sesja:
- Dodaj
MediaButtonReceiver.shouldStartForegroundService(Intent), aby umożliwić aplikacjom pomijanie polecenia odtwarzania, które przychodzi w celu wznowienia odtwarzania, przez zastąpienie tej metody. Domyślnie usługa jest zawsze uruchamiana, a odtwarzania nie można pominąć bez awarii usługi i wyświetlenia błęduForegroundServiceDidNotStartInTimeException(#1528). - Naprawiliśmy błąd, który powodował, że polecenia niestandardowe wysyłane z
MediaBrowserbyły wysyłane do wariantu metodyMediaSessionCompat.CallbackzamiastMediaBrowserServiceCompat, gdy urządzenie było połączone ze starszą usługą. Uniemożliwiało toMediaBrowserotrzymanie rzeczywistej wartości zwracanej przez starszą usługę (#1474). - Obsługa błędu
IllegalArgumentExceptionzgłaszanego przez urządzenia niektórych producentów podczas ustawiania odbiornika transmisji dla intencji przycisku multimediów (#1730). - Dodaj przyciski poleceń dla elementów multimedialnych. Spowoduje to dodanie interfejsu Media3 API dla elementu, który w starszej wersji biblioteki był znany jako
Custom browse actions, zMediaBrowserCompat. Pamiętaj, że w Media3 przyciski poleceń dla elementów multimedialnych są dostępne zarówno wMediaBrowser, jak i wMediaController. Zobacz Wdrażanie niestandardowych działań przeglądania. * Naprawiliśmy 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 nawiązywania połączenia ze starszą wersjąMediaBrowserCompat. Usługa może otrzymywać wskazówki dotyczące połączenia przekazywane jako wskazówki główne przy pierwszym wywołaniu metodyonGetRoot(). - Naprawiliśmy błąd, który powodował, że po zasubskrybowaniu przez przeglądarkę
parentidMediaBrowserpołączony ze starszą usługą przeglądarki nie otrzymywał błędu wysłanego przez usługę. - Ulepszyliśmy działanie interoperacyjności, dzięki czemu przeglądarka Media3 połączona ze starszą wersją
MediaBrowserServicenie żąda dwukrotnie elementów podrzędnychparentIdpodczas subskrybowania elementu nadrzędnego.
- Dodaj
- UI:
- Udostępnij rozciągnięty/przycięty film w ramach obejścia
PlayerView-in-Compose-AndroidViewze względu na problemy z przejściami udostępnionymi opartymi na XML. Aplikacje używającePlayerViewwewnątrzAndroidViewmuszą wywołaćPlayerView.setEnableComposeSurfaceSyncWorkaround, aby wyrazić zgodę (#1237, #1594). - Dodaj
setFullscreenButtonStatedoPlayerView, aby umożliwić aktualizowanie ikony przycisku pełnego ekranu na żądanie, czyli poza pasmem i nie w reakcji na kliknięcie (#1590, #184). - Naprawiono błąd, który powodował, że opcja „Brak” w wyborze tekstu nie działała, jeśli były ustawione preferencje wyboru ścieżki tekstowej zdefiniowane przez aplikację.
- Udostępnij rozciągnięty/przycięty film w ramach obejścia
- Rozszerzenie DASH:
- Dodano obsługę okresów rozpoczynających się w środku segmentu (#1440).
- Rozszerzenie Smooth Streaming:
- Naprawiono błąd
Bad magic number for Bundlewystępujący podczas 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 przy użyciu biblioteki natywnej libiamf do syntezy dźwięku.
- Odtwarzanie jest możliwe w układzie stereo oraz 5.1 z przestrzennym dźwiękiem i opcjonalnym śledzeniem ruchów głowy, ale odtwarzanie obustronne nie jest obecnie obsługiwane.
- Dodano obsługę 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 przy użyciu biblioteki natywnej libiamf do syntezy dźwięku.
- Rozszerzenie Cast:
- Zatrzymanie czyszczenia osi czasu po rozłączeniu CastSession, co umożliwia aplikacji nadawcy wznowienie odtwarzania lokalnie po rozłączeniu.
- Wypełnij
DeviceInfoCastPlayer, gdy podany jestContext. Umożliwia to połączenieMediaSessionzRoutingSession, co jest niezbędne do integracji przełącznika wyjścia (#1056).
- Narzędzia testowe:
DataSourceContractTestzawiera teraz testy, które sprawdzają:- Strumień wejściowy
read positionzostał zaktualizowany. - Bufor wyjściowy
offsetjest stosowany prawidłowo.
- Strumień wejściowy
- Aplikacja w wersji demonstracyjnej
- Rozwiązaliśmy problem z wyciekami pamięci w aplikacji demonstracyjnej do krótkich filmów (#1839).
- Usuń wycofane symbole:
- Usuń wycofane:
Player.hasPrevious,Player.hasPreviousWindow(). Użyj w zamian zasadyPlayer.hasPreviousMediaItem(). - Usuń wycofaną metodę
Player.previous(). Użyj w zamian zasadyPlayer.seekToPreviousMediaItem(). - Usuń wycofaną metodę
DrmSessionEventListener.onDrmSessionAcquired. - Usuń wycofane konstruktory
DefaultEncoderFactory. Użyj w zamian zasadyDefaultEncoderFactory.Builder.
- Usuń wycofane:
Wersja 1.5.0-rc02
19 listopada 2024 r.
Użyj wersji stabilnej 1.5.0.
Wersja 1.5.0-rc01
13 listopada 2024 r.
Użyj wersji stabilnej 1.5.0.
Wersja 1.5.0-beta01
30 października 2024 r.
Użyj wersji stabilnej 1.5.0.
Wersja 1.5.0-alpha01
10 września 2024 r.
Użyj wersji stabilnej 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 zatwierdzenia.
- ExoPlayer:
- Ekstraktory:
- MP3: naprawiono błąd
Searched too many bytesprzez prawidłowe ignorowanie końcowych danych innych niż MP3 na podstawie pola długości w ramceInfo(#1480).
- MP3: naprawiono błąd
- Tekst:
- TTML: poprawiono obsługę wartości procentowych
tts:fontSize, aby były prawidłowo dziedziczone z węzłów nadrzędnych z wartościami procentowymitts:fontSize. - Naprawiono błąd
IndexOutOfBoundsExceptionwLegacySubtitleUtilspowodowany nieprawidłową obsługą przypadku, gdy żądany czas rozpoczęcia danych wyjściowych jest większy lub równy czasowi ostatniego zdarzenia wSubtitle(#1516).
- TTML: poprawiono obsługę wartości procentowych
- DRM:
- Napraw błąd
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLEna urządzeniach z interfejsem API 31 lub nowszym, na których odtwarzane są treści Widevine L1. Ten błąd jest spowodowany niepełną implementacją metodyMediaDrm.requiresSecureDecoderplatformy (#1603).
- Napraw błąd
- Efekt:
- Dodaj metodę
release()doGlObjectsProvider.
- Dodaj metodę
- Sesja:
- Zmień dwukrotne kliknięcie
KEYCODE_HEADSETHOOKna działanie „przejdź do następnego”, zgodnie z dokumentacją (#1493). - Podczas podejmowania decyzji, czy zignorować
KEYCODE_HEADSETHOOK, aby uniknąćForegroundServiceDidNotStartInTimeException, traktuj to polecenie jako polecenie „odtwórz” wMediaButtonReceiver(#1581).
- Zmień dwukrotne kliknięcie
- Rozszerzenie RTSP:
- Pomijanie nieprawidłowych opisów 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 zatwierdzenia.
- Biblioteka wspólna:
- Przekazuj przypuszczalne wywołania wyszukiwania bez operacji do chronionych metod
BasePlayer.seekTo()iSimpleBasePlayer.handleSeek(), zamiast je ignorować. Jeśli implementujesz te metody w niestandardowym odtwarzaczu, może być konieczne obsłużenie tych dodatkowych wywołań za pomocąmediaItemIndex == C.INDEX_UNSET. - Usunięto zależność kompilacji od ulepszonego odlukrzania Javy 8 (#1312).
- Upewnij się, że czas trwania przekazany do
MediaItem.Builder.setImageDurationMs()jest ignorowany w przypadku elementuMediaItem, który nie jest obrazem (zgodnie z dokumentacją). - Dodaj
Format.customData, aby przechowywać niestandardowe informacje o instancjachFormatdostarczane przez aplikację.
- Przekazuj przypuszczalne wywołania wyszukiwania bez operacji do chronionych metod
- ExoPlayer:
- Dodaj
BasePreloadManager, który koordynuje wstępne wczytywanie wielu źródeł na podstawie priorytetów określonych przez ichrankingData. Dostosowywanie jest możliwe przez rozszerzenie tej klasy. DodajDefaultPreloadManager, który używaPreloadMediaSourcedo wstępnego wczytywania próbek multimediów ze źródeł do pamięci, oraz liczbę całkowitąrankingData, która wskazuje indeks elementu w interfejsie. - Dodaj
PlayerIddo większości metodLoadControl, aby umożliwić implementacjomLoadControlobsługę wielu odtwarzaczy. - Usuń
Buffer.isDecodeOnly()iC.BUFFER_FLAG_DECODE_ONLY. Nie trzeba ustawiać tej flagi, ponieważ mechanizmy renderowania i dekodery decydują o pominięciu buforów na podstawie sygnatury czasowej. Niestandardowe implementacjeRendererpowinny sprawdzać, czy dodany czas wynosi co najmniejBaseRenderer.getLastResetPositionUs(), aby zdecydować, czy próbka powinna zostać wyświetlona. Niestandardowe implementacjeSimpleDecodermogą w razie potrzeby sprawdzaćisAtLeastOutputStartTimeUs()lub oznaczać inne bufory za pomocąDecoderOutputBuffer.shouldBeSkipped, aby je pominąć. - Zezwól na zwracanie wartości null przez
TargetPreloadStatusControl.getTargetPreloadStatus(T), aby wskazać, że nie należy wstępnie wczytywaćMediaSourcez danymrankingData. - Dodano
remove(MediaSource)doBasePreloadManager. - Dodaj
reset()doBasePreloadManager, aby zwolnić wszystkie źródła, zachowując instancję menedżera wstępnego wczytywania. - Dodaj
ExoPlayer.setPriority()(iBuilder.setPriority()), aby zdefiniować wartość priorytetu używaną wPriorityTaskManageri dla ważności MediaCodec z interfejsu API 35. - Rozwiązaliśmy problem z aktualizacją czasu ostatniego ponownego buforowania, który powodował nieprawidłowy klucz
bs(brak danych w buforze) w CMCD (#1124). - Dodaj
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource), aby wskazać, że źródło zostało wczytane do końca. Dzięki temu implementacjeDefaultPreloadManageri niestandardowe implementacjePreloadMediaSource.PreloadControlmogą wstępnie wczytać następne źródło lub wykonać inne działania. - Naprawiliśmy błąd, który powodował, że pomijanie ciszy na końcu elementów mogło wywołać wyjątek odtwarzania.
- Dodaj
cleardoPreloadMediaSource, aby odrzucić okres wstępnego wczytywania. - Dodano nowy kod błędu
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, który jest używany, gdy zasoby kodeka są odzyskiwane na potrzeby zadań o wyższym priorytecie. - Zezwól
AdsMediaSourcena wczytywanie reklam przed filmem, zanim zakończy się przygotowywanie początkowych treści multimedialnych (#1358). - Naprawiliśmy błąd, który powodował, że odtwarzanie przechodziło do
STATE_ENDEDpodczas ponownego przygotowywania transmisji na żywo DASH z wieloma przedziałami czasu po usunięciu pierwotnego przedziału czasu z pliku manifestu. - Zmień nazwę
onTimelineRefreshed()naonSourcePrepared()ionPrepared()naonTracksSelected()wPreloadMediaSource.PreloadControl. Zmień też odpowiednio nazwy IntDefs w plikuDefaultPreloadManager.Stage. - Dodano eksperymentalną obsługę dynamicznego planowania, aby lepiej dopasować pracę do cykli wybudzania procesora i opóźnić wybudzanie do momentu, gdy renderery będą mogły kontynuować działanie.
Możesz to włączyć, używając
experimentalSetDynamicSchedulingEnabled()podczas konfigurowania instancji ExoPlayera. - Dodaj
Renderer.getDurationToProgressUs().Renderermoże implementować tę metodę, aby zwracać do ExoPlayer czas, o który odtwarzanie musi się przesunąć, aby renderer mógł kontynuować. JeśliExoPlayerjest ustawiony naexperimentalSetDynamicSchedulingEnabled(),ExoPlayerwywoła tę metodę podczas obliczania czasu na zaplanowanie 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 ustawione naexperimentalSetDynamicSchedulingEnabled(),ExoPlayerzaplanuje pętlę roboczą, ponieważ moduły renderujące mogą robić postępy. - Zamiast poszczególnych parametrów używaj klasy danych dla metod
LoadControl. - Dodaj
ExoPlayer.isReleased(), aby sprawdzić, czy wywołanoExoplayer.release(). - Dodaj
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs(), aby skonfigurować maksymalną pozycję, do którejseekToPrevious()przechodzi do poprzedniego elementu (#1425). - Naprawiliśmy pewne niespójności związane z fokusem dźwięku, np. brak zgłaszania pełnej lub tymczasowej utraty fokusu, gdy odtwarzacz jest wstrzymany (#1436).
- Naprawiliśmy potencjalny błąd
IndexOutOfBoundsExceptionspowodowany przez ekstraktory zgłaszające dodatkowe ścieżki po początkowym kroku przygotowania (#1476). EffectswExoPlayer.setVideoEffect()będzie otrzymywać sygnatury czasowe z usuniętym przesunięciem renderowania (#1098).- Naprawiono potencjalny błąd
IllegalArgumentExceptionpodczas obsługi błędu odtwarzacza, który wystąpił podczas odczytywania z wyprzedzeniem innego elementu playlisty (#1483).
- Dodaj
- Transformator:
- Dodaj
audioConversionProcessivideoConversionProcessdoExportResult, aby wskazać, jak powstała odpowiednia ścieżka w pliku wyjściowym. - Złagodzenie kontroli poziomu H.264 w ramach optymalizacji przycinania.
- Dodaj obsługę przełączania się między multimediami wejściowymi SDR i HDR w sekwencji.
- Dodanie obsługi efektów dźwiękowych 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 generował prawidłowej liczby bajtów. - Obejście błędu dekodera, który powodował, że liczba kanałów audio była ograniczona do stereo podczas obsługi danych wejściowych PCM.
- Podczas wybierania ścieżek w:
ExoPlayerAssetLoaderignoruj ograniczenia dotyczące liczby kanałów audio, ponieważ dotyczą one tylko odtwarzania. - Zastąp interfejs
androidx.media3.transformer.Muxerinterfejsemandroidx.media3.muxer.Muxeri usuńandroidx.media3.transformer.Muxer. - Naprawiono błąd związany z ładowaniem obrazów HEIC ze schematów URI treści. (#1373).
- Dostosuj czas trwania ścieżki audio w aplikacji
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 zamiast niego polaDefaultDecoderFactory.listener. W przypadku wyjątku dotyczącego kodeka szczegóły kodeka będą dostępne wExportException.codecInfo.
- Dodaj
- Ekstraktory:
- MPEG-TS: wycofano zmianę, która zapewniała renderowanie ostatniej klatki przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wprowadziliśmy poprawki, które rozwiązują problemy występujące w strumieniach HLS tylko z klatkami I(#1150) i strumieniach HLS H.262 (#1126).
- MP3: preferuj rozmiar danych z ramki
Infozamiast rozmiaru zgłaszanego przez strumień bazowy (np. rozmiar pliku lub nagłówek HTTPContent-Length). Pomaga to wykluczyć dane zwiastuna, którego nie można odtworzyć (np. okładki albumu), z obliczeń wyszukiwania stałej szybkości transmisji bitów, co zwiększa dokładność wyszukiwania (#1376). - MP3: używanie liczby klatek i innych danych w ramce
Info(jeśli jest obecna) do obliczania średniej szybkości transmisji bitów na potrzeby wyszukiwania stałej szybkości transmisji bitów zamiast ekstrapolacji na podstawie szybkości transmisji bitów ramki po ramceInfo, która może być sztucznie mała, np. ramkaPCUT(#1376). - Naprawiono wyodrębnianie formatu audio PCM w kontenerach AVI.
- Dźwięk:
- Naprawiono atrybuty kodowania DTS:X Profile 2 na potrzeby odtwarzania w trybie passthrough (#1299).
- W przypadku odtwarzania z odciążeniem zresetuj pole śledzenia zakończenia strumienia w
DefaultAudioSinkprzed wywołaniemAudioTrack.stop(), abyAudioTrack.StreamEventCallback#onPresentationEndedprawidłowo identyfikował, kiedy wszystkie oczekujące dane zostały odtworzone. - Naprawiono błąd w
SilenceSkippingAudioProcessor, który powodował, że przejścia między różnymi formatami dźwięku (np. stereo na mono) mogły powodować zgłaszanie wyjątku przez procesor (#1352). - Zaimplementuj
MediaCodecAudioRenderer.getDurationToProgressUs(), aby ExoPlayer dynamicznie planował główną pętlę roboczą, gdy MediaCodecAudioRenderer może robić postępy.
- Film:
- Naprawiono problem, który powodował, że
Listener.onRenderedFirstFrame()pojawiało się zbyt wcześnie podczas przełączania powierzchni w trakcie odtwarzania. - Naprawiono logikę zastępczą dekodera Dolby Vision, aby w razie potrzeby używał zgodnego dekodera AV1 (#1389).
- Naprawiono wyjątek kodeka, który mógł być spowodowany włączeniem renderowania wideo w trakcie odtwarzania.
- Naprawiono problem, który powodował, że
- Tekst:
- Rozwiązaliśmy problem, który powodował pomijanie napisów zaczynających się przed pozycją wyszukiwania. Ten problem pojawił się dopiero w Media3 1.4.0-alpha01.
- Zmień domyślne zachowanie analizy napisów, tak aby odbywała się ona podczas wyodrębniania, a nie renderowania (różnicę między wyodrębnianiem a renderowaniem znajdziesz na schemacie architektury ExoPlayera).
- Tę zmianę można zastąpić, wywołując zarówno
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false), jak iTextRenderer.experimentalSetLegacyDecodingEnabled(true). Aby dowiedzieć się, jak podłączyć te komponenty do instancjiExoPlayer, zapoznaj się z dokumentacją dotyczącą dostosowywania. Te metody (oraz cała obsługa starszych wersji dekodowania napisów) zostaną usunięte w przyszłej wersji. - Aplikacje z niestandardowymi implementacjami
SubtitleDecodermuszą je zaktualizować, aby zamiast nich wdrożyćSubtitleParser(orazSubtitleParser.FactoryzamiastSubtitleDecoderFactory).
- Tę zmianę można zastąpić, wywołując zarówno
- PGS: poprawiono dekodowanie długości serii, aby
0był rozpoznawany jako indeks koloru, a nie dosłowna wartość koloru (#1367). - CEA-708: ignoruj wartość
rowLock. Specyfikacja CEA-708-E S-2023 określa, że zarównorowLock, jak icolumnLockpowinny być uznawane za prawdziwe, niezależnie od wartości obecnych w strumieniu (obsługacolumnLocknie jest zaimplementowana, więc w praktyce zakłada się, że zawsze jest fałszywa).- Pierwotnie ta informacja została uwzględniona 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.
- Pierwotnie ta informacja została uwzględniona w informacjach o wersji
- CEA-708: unikaj dodawania duplikatów znaków nowego wiersza przez naiwną obsługę polecenia „ustaw lokalizację pióra” w ExoPlayerze (#1315).
- Naprawiliśmy błąd
IllegalArgumentExceptionzLegacySubtitleUtil, który występował, gdy próbka napisów WebVTT nie zawierała żadnych sygnałów, np. w ramach strumienia DASH (#1516).
- Metadane:
- Poprawiono mapowanie tagów sortowania MP4 na 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). - Naprawiono odczytywanie numerycznych tagów MP4 (/iTunes)
gnre(gatunek) itmpo(tempo), gdy wartość jest dłuższa niż 1 bajt. - Propagowanie ramki ID3
TCONdoMediaMetadata.genre(#1305).
- Poprawiono mapowanie tagów sortowania MP4 na ID3. Wcześniej tagi MP4 „album sort” (
- Obraz:
- Dodaliśmy obsługę niekwadratowych siatek miniatur DASH (#1300).
- Dodaj obsługę formatu AVIF w przypadku interfejsu API na poziomie 34 lub wyższym.
- Zezwalaj na używanie
nulljako parametru dlaExoPlayer.setImageOutput(), aby wyczyścić wcześniej ustawionyImageOutput.
- Źródło danych:
- Zaimplementuj obsługę identyfikatorów URI zasobów niezdefiniowanych
android.resource://package/id, gdziepackageróżni się od pakietu bieżącej aplikacji. Wcześniej nie było to udokumentowane, ale jest to bardziej wydajny sposób uzyskiwania dostępu do zasobów w innym pakiecie niż według nazwy. - Sprawdź, czy
urlnie ma wartości null w konstruktorachDataSpec. Ten parametr został już oznaczony jako niepusty. - Zezwalaj
ByteArrayDataSourcena rozpoznawanie identyfikatora URI jako tablicy bajtów podczasopen(), zamiast kodowania na stałe podczas tworzenia (#1405).
- Zaimplementuj obsługę identyfikatorów URI zasobów niezdefiniowanych
- DRM:
- Zezwalaj na ustawianie
LoadErrorHandlingPolicynaDefaultDrmSessionManagerProvider(#1271).
- Zezwalaj na ustawianie
- Efekt:
- Obsługa wielu zmian prędkości w tym samym
EditedMediaItemlubCompositionwSpeedChangeEffect. - Obsługa danych wyjściowych HLG i PQ z danych wejściowych bitmapy ultra HDR.
- Dodano obsługę EGL_GL_COLORSPACE_BT2020_HLG_EXT, co ulepsza dane wyjściowe powierzchni HLG w ExoPlayer.setVideoEffect i Debug SurfaceView w Transformerze.
- Zaktualizuj implementację macierzy nakładki, aby była zgodna z dokumentacją, odwracając wartości x i y zastosowane w
setOverlayFrameAnchor(). Jeśli używaszOverlaySettings.Builder.setOverlayFrameAnchor(), odwróć wartości x i y, mnożąc je przez-1. - Naprawiono błąd, który powodował awarię
TimestampWrapper, gdy usługa była używana zExoPlayer#setVideoEffects(#821). - Zmień domyślną przestrzeń roboczą kolorów SDR z kolorów liniowych na elektryczne wideo BT 709 SDR. Udostępnij też trzecią opcję, która pozwoli zachować oryginalną przestrzeń kolorów.
- Zezwoliliśmy na definiowanie nieokreślonej kolejności Z obiektów EditedMediaItemSequences (#1055).
- Utrzymuj spójny zakres luminancji w różnych treściach HDR (używa zakresu HLG).
- Dodaj obsługę nakładek Ultra HDR (bitmap) na treściach HDR.
- Zezwalaj na używanie efektów
SeparableConvolutionprzed interfejsem API 26. - Usuń nieużywane
OverlaySettings.useHdr, ponieważ zakres dynamiczny nakładki i ramki musi być taki sam. - Dodaj obsługę HDR dla:
TextOverlay. Luminancję nakładki tekstowej można dostosować za pomocą parametruOverlaySettings.Builder.setHdrLuminanceMultiplier().
- Obsługa wielu zmian prędkości w tym samym
- Rozszerzenie IMA:
- Przenieś interfejs API wymagany do odtwarzania przez aplikacje strumieni reklam DAI do wersji stabilnej.
- Dodaj
replaceAdTagParameters(Map <String, String>)doImaServerSideAdInsertionMediaSource.AdLoader, aby umożliwić zastępowanie parametrów tagu reklamy w czasie działania. - Naprawiliśmy błąd, który powodował, że metoda
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 rozwiązać problem z
NullPointerExceptionpodczas używania identyfikatorów URI tagów reklamydata://(#700).
- Sesja:
- Zmień domyślną wartość
CommandButton.enablednatruei upewnij się, że wartość może pozostać fałszywa dla kontrolerów, nawet jeśli powiązane polecenie jest dostępne. - Dodaj stałe wartości ikon dla
CommandButton, które powinny 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 umożliwia wygodne wstrzymywanie odtwarzania wszystkich sesji, i wywołajstopSelf(), aby zakończyć cykl życiaMediaSessionService. - Zastąp
MediaSessionService.onTaskRemoved(Intent), aby zapewnić bezpieczną domyślną implementację, która utrzymuje działanie usługi na pierwszym planie, jeśli odtwarzanie jest w toku, lub zatrzymuje usługę w przeciwnym razie. - Ukrywanie paska przewijania w powiadomieniu o multimediach w przypadku transmisji na żywo przez nieustawianie czasu trwania w metadanych sesji platformy (#1256).
- Dostosuj konwersję
MediaMetadatadoMediaDescriptionCompat, aby używać tej samej preferowanej kolejności i logiki podczas wybierania właściwości metadanych co w przypadku media1. - Dodaj
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 jest używany do aktualizowania stanuPlaybackStatesesji platformy do stanu błędu z podanymi informacjami o błędzie (#543). - Dodaj
MediaSession.Callback.onPlayerInteractionFinished(), aby informować sesje o zakończeniu serii 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 przekazanych do
MediaSession[Builder].setSessionExtras()Media3 doPlaybackStateCompat.getExtras()kontrolera Media1. - Mapowanie błędów krytycznych i niekrytycznych na sesję platformy i z niej.
PlaybackExceptionjest mapowany na stan błędu krytycznegoPlaybackStateCompat. BłądSessionErrorwysłany do kontrolera powiadomień o multimediach zMediaSession.sendError(ControllerInfo, SessionError)jest mapowany na błąd niekrytyczny wPlaybackStateCompat, co oznacza, że kod błędu i komunikat są ustawione, ale stan sesji platformy pozostaje inny niżSTATE_ERROR. - Zezwalaj na ustawianie aktywności sesji na kontroler, aby zastąpić globalną aktywność sesji. Aktywność sesji można zdefiniować dla kontrolera w momencie połączenia, tworząc obiekt
ConnectionResultza pomocą metodyAcceptedResultBuilder.setSessionActivivty(PendingIntent). Po połączeniu aktywność sesji można aktualizować za pomocąMediaSession.setSessionActivity(ControllerInfo, PendingIntent). - Ulepszanie replikacji błędów wywołań do
MediaLibrarySession.Callback. Replikację błędów można teraz skonfigurować za pomocąMediaLibrarySession.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:
- Dodano obsługę wyświetlania obrazów w
PlayerViewpo połączeniu zExoPlayer(#1144). - Dodano możliwość dostosowywania różnych ikon w
PlayerControlViewza pomocą atrybutów XML, aby umożliwić używanie różnych obiektów rysowalnych w poszczególnych instancjachPlayerViewzamiast globalnych zastąpień (#1200). - Obejście błędu platformy powodującego rozciąganie lub przycinanie filmu podczas używania
SurfaceVieww ComposeAndroidVieww interfejsie API 34 (#1237).
- Dodano obsługę wyświetlania obrazów w
- Pobrane:
- Upewnij się, że
DownloadHelpernie powoduje wycieku niezwolnionych 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:CronetDataSource. W niektórych wersjach Cronet żądanie dostarczone przez wywołanie zwrotne nie zawsze jest takie samo. Prowadzi to do nieukończenia wywołania zwrotnego i przekroczenia limitu czasu żądania (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 przekazywane w
HlsSampleStreamWrapperz nieprawidłowym przesunięciem, co powodowało błądIndexOutOfBoundsExceptionlubIllegalArgumentException(#1002). - Naprawiliśmy błąd, który powodował, że playlisty inne niż główne były stale ponownie wczytywane w przypadku strumieni LL-HLS (#1240).
- Naprawiono błąd, który powodował, że włączenie CMCD dla HLS z segmentami inicjującymi powodowało błędy
Source ErroriIllegalArgumentException. - Naprawiono błąd, który powodował, że playlisty inne niż główna nie były odświeżane podczas odtwarzania na żywo (#1240).
- Naprawiliśmy błąd, który powodował, że 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 przekazywane w
- Rozszerzenie DASH:
- Rozszerzenie Cast:
- Naprawiliśmy błąd, który powodował, że tytuł albumu
MediaQueueItembył konwertowany na wykonawcę w elemencie multimedialnym Media3 (#1255).
- Naprawiliśmy błąd, który powodował, że tytuł albumu
- Narzędzia testowe:
- Zaimplementuj
onInit()ionRelease()wFakeRenderer. - Zmień metody
TestPlayerRunHelper.runUntil()/playUntil(), aby nie działały w przypadku błędów niekrytycznych (np. zgłaszanych doAnalyticsListener.onVideoCodecError()). Aby wyłączyć to zachowanie, użyj nowego łańcucha metodTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX().
- Zaimplementuj
- Aplikacja demonstracyjna:
- Użyj
DefaultPreloadManagerw aplikacji demonstracyjnej z krótkimi filmami. - Zezwalaj na ustawianie trybu powtarzania za pomocą argumentów
Intentz wiersza poleceń (#1266). - Używaj
HttpEngineDataSourcejakoHttpDataSource, gdy urządzenie to obsługuje.
- Użyj
- Usuń wycofane symbole:
- Usuń
CronetDataSourceFactory. Użyj w zamian zasadyCronetDataSource.Factory. - Usuń niektóre konstruktory
DataSpec. Użyj w zamian zasadyDataSpec.Builder. - Usunęliśmy metodę
setContentTypePredicate(Predicate)z klasDefaultHttpDataSource,OkHttpDataSourceiCronetDataSource. Zamiast tego użyj odpowiedniej metody na każdym elemencieXXXDataSource.Factory. - Usuń konstruktory
OkHttpDataSourceiOkHttpDataSourceFactory. Użyj w zamian zasadyOkHttpDataSource.Factory. - Usuń
PlayerMessage.setHandler(Handler). Użyj w zamian zasadysetLooper(Looper). - Usuń pole
Timeline.Window.isLive. Zamiast tego użyj metodyisLive(). - Usuń konstruktory
DefaultHttpDataSource. Użyj w zamian zasadyDefaultHttpDataSource.Factory. - Usuń
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Użyj w zamian zasadyDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS. - Usuń
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Użyj w zamian zasadyMediaCodecInfo.canReuseCodec(Format, Format). - Usuń metodę
DrmSessionManager.DUMMYigetDummyDrmSessionManager(). Użyj w zamian 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ąDecoderReuseEvaluation. - Usunęliśmy
RendererSupport.FormatSupportIntDef i stałeFORMAT_HANDLED,FORMAT_EXCEEDS_CAPABILITIES,FORMAT_UNSUPPORTED_DRM,FORMAT_UNSUPPORTED_SUBTYPE,FORMAT_UNSUPPORTED_TYPE. Zamiast tego użyj odpowiednika 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żyj wersji stabilnej 1.4.0.
Wersja 1.4.0-beta01
26 czerwca 2024 r.
Użyj wersji stabilnej 1.4.0.
Wersja 1.4.0-alpha02
7 czerwca 2024 r.
Użyj wersji stabilnej 1.4.0.
Wersja 1.4.0-alpha01
17 kwietnia 2024 r.
Użyj wersji stabilnej 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 zatwierdzenia.
- Biblioteka wspólna:
- Dodaj
Format.labels, aby zezwolić na etykiety zlokalizowane lub inne etykiety alternatywne.
- Dodaj
- ExoPlayer:
- Rozwiązaliśmy problem, który powodował, że usługa
PreloadMediaPeriodnie mogła zachować strumieni po ponownym wstępnym załadowaniu. - Zastosuj prawidłowy
TrackSelectionResultdo okresu odtwarzania podczas ponownego wyboru ścieżki. - Rozpoczęcie renderowania z włączonym wcześniejszym uruchamianiem tylko po przejściu do okresu odtwarzania podczas przełączania się między elementami multimedialnymi (#1017).
- Dodano brakujący zwracany typ do reguły proguard
-keepclasseswithmembersdlaDefaultVideoFrameProcessor.Factory.Builder.build()(#1187).
- Rozwiązaliśmy problem, który powodował, że usługa
- Transformator:
- Dodano obejście problemu z wyjątkiem zgłaszanym, ponieważ
MediaMuxernie obsługuje ujemnych sygnatur czasowych prezentacji przed interfejsem API 30.
- Dodano obejście problemu z wyjątkiem zgłaszanym, ponieważ
- Wybór ścieżki:
DefaultTrackSelector: preferuj ścieżki wideo z „rozsądną” liczbą klatek na sekundę (>=10 kl./s) nad ścieżkami z mniejszą lub nieustawioną liczbą klatek na sekundę. Dzięki temu odtwarzacz wybiera „prawdziwą” ścieżkę wideo w plikach MP4 wyodrębnionych ze zdjęć ruchomych, 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 dopełnienie nie było pomijane podczas odczytywania fragmentów o nietypowym rozmiarze z plików WAV (#1117).
- MP3: wypełnij pole
Format.averageBitratena podstawie ramek metadanych, takich jakXINGiVBRI. - MPEG-TS: cofnięto zmianę, która miała na celu zapewnienie renderowania ostatniej klatki przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wynika to z tego, że zmiana powoduje nowe problemy ze strumieniami HLS tylko z klatkami I (#1150) i strumieniami HLS H.262 (#1126).
- Dźwięk:
- Zezwalaj na przywracanie 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ądzeniem na Galaxy Tab S7 FE, Chromecaście z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie H265 60 kl./s 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 zgodnie z wymaganiami interfejsu API (#1169). (#966).
- Rozwiązaliśmy problem, który powodował, że obsługa informacji o kolorach HDR 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 przez bezpośrednio następujące po sobie wskazówki fałszywych dodatkowych instancji
CuesWithTimingzWebvttParser.parse(#1177).
- WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie wskazówki fałszywych dodatkowych instancji
- DRM:
- Obejście problemu z wyjątkiem
NoSuchMethodError, który może być zgłaszany przez platformęMediaDrmzamiastResourceBusyExceptionlubNotProvisionedExceptionna niektórych urządzeniach z Androidem 14 (#1145).
- Obejście problemu z wyjątkiem
- Efekt:
- Ulepszone mapowanie tonów PQ na SDR dzięki konwersji przestrzeni barw.
- Sesja:
- Rozwiązaliśmy problem polegający na tym, że bieżąca pozycja przeskakiwała do tyłu, gdy kontroler zastępował bieżący element (#951).
- Rozwiązaliśmy problem, który powodował, że obiekt
MediaMetadataz samą wartością inną niż nullextrasnie był przesyłany między kontrolerami multimediów a sesjami (#1176).
- UI:
- Jeśli
Localenie może zidentyfikować wyświetlanej nazwy, używana jest nazwa języka ścieżki audio (#988).
- Jeśli
- 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 (tagi i) 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 zatwierdzenia.
- Biblioteka wspólna:
- Zaimplementuj obsługę identyfikatorów URI zasobów niezdefiniowanych
android.resource://package/[type/]name, gdziepackageróż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.
- Zdefiniuj reklamy za pomocą pełnego elementu
MediaItemzamiast pojedynczego elementuUriwAdPlaybackState. - Zwiększ wartość
minSdkdo 19 (Android KitKat). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX i wymagane do uaktualnienia do najnowszych wersji zależności AndroidX. - Wypełnij pola
artworkUriiartworkDatawMediaMetadata.Builder.populate(MediaMetadata), gdy co najmniej jedno z nich nie ma wartości null (#964).
- Zaimplementuj obsługę identyfikatorów URI zasobów niezdefiniowanych
- ExoPlayer:
- Dodaj
PreloadMediaSourceiPreloadMediaPeriod, które umożliwiają aplikacjom wstępne wczytywanie źródła treści multimedialnych w określonej pozycji początkowej przed odtworzeniem.PreloadMediaSourcezajmuje się przygotowaniem źródła multimediów treści do odbioruTimeline, przygotowaniem i buforowaniem okresu w danej pozycji początkowej, wyborem ścieżek i wczytywaniem danych multimedialnych dla danego okresu. Aplikacje kontrolują postęp wstępnego wczytywania, implementując interfejsPreloadMediaSource.PreloadControl, i ustawiają wstępnie wczytane źródło w odtwarzaczu. - Dodaj uprawnienie
ExoPlayer.setImageOutput, które umożliwia aplikacjom ustawianieImageRenderer.ImageOutput. DefaultRenderersFactoryteraz domyślnie udostępnia odtwarzaczowiImageRendererz wartościami null dlaImageOutputiImageDecoder.Factory.DEFAULT.- Emitowanie zdarzenia
Player.Listener.onPositionDiscontinuity, gdy cisza jest pomijana (#765). - Dodano eksperymentalną obsługę analizowania napisów podczas wyodrębniania. Możesz to włączyć za pomocą
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(). - Obsługa adaptacyjnych źródeł multimediów za pomocą
PreloadMediaSource. - Zaimplementuj
HttpEngineDataSource,HttpDataSource, korzystając z interfejsu API HttpEngine. - Zapobiegaj tworzeniu podklas
CompositeSequenceableLoader. Ten komponent został wcześniej rozszerzony, ale nigdy nie utworzono jego podklasy w bibliotece. Dostosowywanie można przeprowadzić, opakowując instancję za pomocą wzorca dekoratora i implementując niestandardowy interfejsCompositeSequenceableLoaderFactory. - Rozwiązaliśmy problem polegający na tym, że powtarzanie tego samego czasu powodowało usunięcie metadanych z tego elementu (#1007).
- Zmieniono nazwy metod
experimentalSetSubtitleParserFactorywBundledChunkExtractor.FactoryiDefaultHlsExtractorFactorynasetSubtitleParserFactoryi nie zezwolono na przekazywanienull. Użyj nowych metodexperimentalParseSubtitlesDuringExtraction(boolean), aby kontrolować zachowanie podczas analizowania. - Dodaj obsługę dostosowywania
SubtitleParser.Factoryużywanego podczas wyodrębniania. Można to zrobić za pomocąMediaSource.Factory.setSubtitleParserFactory(). - Dodaj prefiks źródła do wszystkich pól
Format.idwygenerowanych zMergingMediaSource. Ułatwia to określenie, które źródło wygenerowało błądFormat(#883). - Naprawiono wyrażenie regularne używane do sprawdzania poprawności niestandardowych nazw kluczy Common Media Client Data (CMCD) przez zmodyfikowanie go tak, aby sprawdzało tylko łącznik (#1028).
- Zatrzymanie podwójnego kodowania parametrów zapytania CMCD (#1075).
- Dodaj
- Transformator:
- Dodaliśmy obsługę spłaszczania filmów w zwolnionym tempie H.265/HEVC SEF.
- Zwiększyliśmy szybkość transmuksowania, zwłaszcza w przypadku zmian polegających na usunięciu filmu.
- Dodaj interfejs API, aby mieć pewność, że plik wyjściowy zaczyna się od klatki wideo. Dzięki temu wyniki operacji przycinania mogą być bardziej zgodne z implementacjami odtwarzacza, które nie wyświetlają pierwszej klatki filmu do momentu jej sygnatury czasowej (#829).
- Dodano obsługę optymalizacji operacji przycinania pojedynczego zasobu MP4.
- Dodaj obsługę, aby klatka wideo miała pierwszą sygnaturę czasową w pliku wyjściowym. Naprawiliśmy błąd powodujący, że pliki wyjściowe zaczynały się od czarnej klatki w odtwarzaczach na iOS (#829).
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.selectImageTrack, aby umożliwić wybór ś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 priorytet ma wybór ścieżki wideo.
- Dodaj
- Ekstraktory:
- Dodano dodatkowe analizowanie AV1C do ekstraktora MP4, aby pobierać wartości
ColorInfo.colorSpace,ColorInfo.colorTransferiColorInfo.colorRange(#692). - MP3: używaj wyszukiwania ze stałą szybkością transmisji bitów (CBR) w przypadku plików z nagłówkiem
Info(odpowiednik CBR nagłówkaXing). Wcześniej używaliśmy tabeli wyszukiwania z nagłówkaInfo, ale powodowało to mniej precyzyjne przewijanie niż w przypadku, gdy ją ignorujemy i zakładamy, że plik ma stałą szybkość transmisji bitów. - MPEG2-TS: dodano obsługę DTS, DTS-LBR i DTS:X Profile2 (#275).
- Wyodrębnianie typów dźwięku z deskryptorów TS i mapowanie ich na flagi ról, co pozwala użytkownikom na bardziej świadomy wybór ścieżek audio (#973).
- Dodano dodatkowe analizowanie AV1C do ekstraktora MP4, 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 obiektVideoFrameProcessor.Factory, mogą utworzyć instancję obiektuCompositingVideoSinkProvider, który używa niestandardowego obiektuVideoFrameProcessor.Factory, i przekazać dostawcę ujścia wideo do obiektuMediaCodecVideoRenderer.
- Zmień konstruktor
- Tekst:
- Naprawiono serializację wskazówek dotyczących bitmap, 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 określa, że zarównorowLock, jak icolumnLockpowinny być uznawane za prawdziwe, niezależnie od wartości obecnych w strumieniu (obsługacolumnLocknie jest zaimplementowana, więc w praktyce zakłada się, że zawsze jest fałszywa).
- Naprawiono serializację wskazówek dotyczących bitmap, aby rozwiązać błąd
- Obraz:
- Dodaj obsługę miniatur DASH. Obrazy siatki są przycinane, a poszczególne miniatury są dostarczane do
ImageOutputw czasie zbliżonym do czasu ich prezentacji.
- Dodaj obsługę miniatur DASH. Obrazy siatki są przycinane, a poszczególne miniatury są dostarczane do
- DRM:
- Domyślnie odtwarzaj niezaszyfrowane próbki „clear lead” w treściach DRM natychmiast, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to prowadzić do zatrzymania odtwarzania, jeśli klucze nadal nie są gotowe, gdy pozycja odtwarzania osiągnie zaszyfrowane próbki (ale wcześniej odtwarzanie w ogóle by się nie rozpoczęło). To zachowanie można wyłączyć za pomocą zasady
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKeylubDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.- Rozszerzenie IMA:
- Rozwiązaliśmy problem, który uniemożliwiał odtwarzanie reklam DASH i HLS bez odpowiedniego rozszerzenia pliku.
- Domyślnie odtwarzaj niezaszyfrowane próbki „clear lead” w treściach DRM natychmiast, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to prowadzić do zatrzymania odtwarzania, jeśli klucze nadal nie są gotowe, gdy pozycja odtwarzania osiągnie zaszyfrowane próbki (ale wcześniej odtwarzanie w ogóle by się nie rozpoczęło). To zachowanie można wyłączyć za pomocą zasady
- Sesja:
- Wyłączono wykrywanie dwukrotnego kliknięcia w aplikacjach TV (#962).
- Rozwiązaliśmy problem, który powodował, że obiekt
MediaItem.RequestMetadataz dodatkami innymi niż null nie był przesyłany między kontrolerami multimediów a sesjami. - Dodaj do
MediaLibrarySession.Builderkonstruktor, który przyjmuje tylkoContextzamiastMediaLibraryService.
- Rozszerzenie HLS:
- Zmniejsz widoczność elementu
HlsMediaPerioddo poziomu pakietu prywatnego. Ten typ nie powinien być bezpośrednio zależny od elementów spoza pakietu HLS. - Bardziej efektywne rozwiązywanie problemów z przewijaniem do początku segmentu (#1031).
- Zmniejsz widoczność elementu
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Dekoder MIDI: ignorowanie komunikatów o zdarzeniach SysEx (#710).
- Narzędzia testowe:
- Nie wstrzymuj odtwarzania w aplikacji
TestPlayerRunHelper.playUntilPosition. Test utrzymuje odtwarzanie w stanie odtwarzania, ale zawiesza postęp, dopóki nie będzie można dodać asercji i dalszych działań.
- Nie wstrzymuj odtwarzania w aplikacji
- Aplikacja demonstracyjna:
- Dodaj moduł demonstracyjny dotyczący krótkich treści, aby pokazać, jak korzystać z funkcji
PreloadMediaSourcew przypadku krótkich treści.
- Dodaj moduł demonstracyjny dotyczący krótkich treści, aby pokazać, jak korzystać z funkcji
Wersja 1.3.0-rc01
22 lutego 2024 r.
Użyj wersji stabilnej 1.3.0.
Wersja 1.3.0-beta01
7 lutego 2024 r.
Użyj wersji stabilnej 1.3.0.
Wersja 1.3.0-alpha01
15 stycznia 2024 r.
Użyj wersji stabilnej 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 zakres
LiveConfiguration.min/maxOffsetpowodowało ciągłe przywracanie przesunięcia do wartościmin/maxOffset. - Rozwiązaliśmy problem, który powodował, że układy kanałów OPUS i VORBIS były nieprawidłowe w przypadku 3, 5, 6, 7 i 8 kanałów (#8396).
- Rozwiązaliśmy problem, który powodował, że po wybraniu ścieżki i przewinięciu do zera w transmisji na żywo transmisja nieprawidłowo rozpoczynała się od domyślnej pozycji (#9347).
- Rozwiązaliśmy problem, który powodował, że nowe instancje
CmcdData.Factoryotrzymywały ujemne wartościbufferedDurationUsze źródeł fragmentów, co skutkowało błędemIllegalArgumentException(#888).
- Rozwiązaliśmy problem, który powodował, że ręczne przewijanie poza zakres
- Transformator:
- 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 ruchomych JPEG jako
ROLE_FLAG_ALTERNATE, aby zapobiec ich automatycznemu wybieraniu do odtwarzania ze względu na wyższą rozdzielczość. - Naprawiono błąd wykrywania klatek kluczowych w strumieniach TS H264 (#864).
- Poprawiono szacowanie czasu trwania strumieni TS dłuższych niż 47 721 sekund (#855).
- Oznacz dodatkowe (nieodtwarzalne) ścieżki HEVC w zdjęciach ruchomych JPEG jako
- Dźwięk:
- Poprawiono obsługę EOS dla
SilenceSkippingAudioProcessorw przypadku wielokrotnego wywołania (#712).
- Poprawiono obsługę EOS dla
- Film:
- Dodano obejście problemu z urządzeniem na Galaxy Tab S7 FE, Chromecastem z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC 60 kl./s są oznaczane jako nieobsługiwane (#693).
- Metadane:
- Naprawiono błąd, który powodował, że pole
MediaMetadatabyło wypełniane tylko z komentarzy Vorbis z kluczami pisanymi wielkimi literami (#876). - Przechwytywanie błędu
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, który powodował, że pole
- DRM:
- Rozszerzono obejście problemu z fałszywym adresem URL licencji ClearKey
https://default.urlna interfejs API na poziomie 33 lub wyższym (wcześniej obejście dotyczyło tylko interfejsu API na poziomie 33) (#837). - Naprawiono błąd
ERROR_DRM_SESSION_NOT_OPENEDwystępujący podczas przełączania z treści zaszyfrowanych na niezaszyfrowane, gdy do odtwarzacza nie jest podłączona żadna powierzchnia. Błąd był spowodowany nieprawidłowym użyciem bezpiecznego dekodera do odtwarzania treści niezaszyfrowanych.
- Rozszerzono obejście problemu z fałszywym adresem URL licencji ClearKey
- Sesja:
- Umieść niestandardowe klucze i wartości w polach
MediaMetadataCompatiMediaMetadata.extras(#756, #802).MediaMetadataCompatMediaMetadata.extras - Naprawiono rozgłaszanie
notifyChildrenChangedw przypadku starszych kontrolerów (#644). - Naprawiliśmy błąd, który powodował, że ustawienie ujemnego czasu dla wyłączonego minutnika
setWhenpowiadomienia powodowało awarię na niektórych urządzeniach (#903). - Naprawiono błąd
IllegalStateException, który występował, gdy kontroler powiadomień multimedialnych nie zakończył połączenia, gdy zażądano pierwszej aktualizacji powiadomienia (#917).
- Umieść niestandardowe klucze i wartości w polach
- UI:
- Rozwiązaliśmy problem polegający na tym, że przyciski przewijania do przodu i do tyłu nie były widoczne, gdy były używane z Material Design w BottomSheetDialogFragment (#511).
- Rozwiązaliśmy problem polegający na tym, że liczby na przycisku przewijania do przodu w
PlayerControlViewbyły nieprawidłowo wyrównane (#547).
- Rozszerzenie DASH:
- Analizowanie „f800” jako liczby kanałów 5 w przypadku Dolby w pliku manifestu DASH (#688).
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Rozszerzenie Cast:
- Oczyszczanie tworzenia
Timeline, aby nie powodować awarii aplikacji, gdy nie uda się wczytać multimediów na urządzeniu przesyłającym (#708).
- Oczyszczanie tworzenia
Wersja 1.2.0
15 listopada 2023 r.
- Biblioteka wspólna:
- Dodaj parametr
@Nullable Throwabledo metod w interfejsieLog.Logger. Parametrmessagetych metod nie zawiera już żadnych informacji o obiekcieThrowableprzekazanym do metodLog.{d,i,w,e}(), więc implementacje będą musiały ręcznie dołączyć te informacje, jeśli jest to wymagane (być może za pomocąLogger.appendThrowableString(String, Throwable)). - Rozwiązaliśmy problem ze zgodnością z Kotlinem, który powodował, że parametry typu ogólnego z możliwością wartości null i typy elementów tablicy z możliwością wartości null nie były wykrywane jako takie. Przykłady to parametry metody
TrackSelectorResultiSimpleDecoder(#6792). - Zmień domyślny interfejs i zachowanie powiadomień w
Util.shouldShowPlayButton, aby wyświetlać przycisk „Odtwórz”, gdy odtwarzanie jest tymczasowo wstrzymane (np. z powodu chwilowej utraty aktywności audio). Starsze działanie można zachować, używającPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)lubMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)(#11213). - Aby rozwiązać problem, uaktualnij
androidx.annotation:annotation-experimentaldo wersji1.3.1.https://issuetracker.google.com/251172715 - Przenieś
ExoPlayer.setAudioAttributesdo interfejsuPlayer.
- Dodaj parametr
- ExoPlayer:
- Rozwiązaliśmy problemy z przewijaniem w strumieniach AC4 spowodowane nieprawidłowym identyfikowaniem próbek przeznaczonych tylko do dekodowania (#11000).
- Dodaj blokowanie 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 przez
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Jeśli próba odtworzenia zostanie podjęta, gdy nie będą dostępne żadne odpowiednie wyjścia audio, lub jeśli wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania, przyczyna wstrzymania odtwarzania zostanie zaktualizowana jakoPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT. Przyczyna wyciszenia zostanie usunięta po podłączeniu odpowiedniego urządzenia wyjściowego. - Dodaj
MediaSource.canUpdateMediaItemiMediaSource.updateMediaItem, aby akceptować aktualizacjeMediaItempo utworzeniu za pomocąPlayer.replaceMediaItem(s). - Zezwalaj na aktualizacje
MediaItemwszystkich klasMediaSourceudostępnianych przez bibliotekę za pomocąPlayer.replaceMediaItem(s)(#33, #9978). - Zmień nazwę
MimeTypes.TEXT_EXOPLAYER_CUESnaMimeTypes.APPLICATION_MEDIA3_CUES. - Dodaj
PngExtractor, który 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 dotychczasowegoplaybackPositionUs. - Ulepsz metodę
ChunkSource.getNextChunk(long, long, List, ChunkHolder)w interfejsieChunkSource, abyChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder). - Dodanie dodatkowych pól do logowania Common Media Client Data (CMCD): brak danych w buforze (
bs), termin (dl), szybkość odtwarzania (pr) i uruchomienie (su) (#8699). - Dodano głębię bitową luminancji i chrominancji do
ColorInfo(#491). - Dodanie dodatkowych pól do logowania Common Media Client Data (CMCD): żądanie następnego obiektu (
nor) i żądanie następnego zakresu (nrr) (#8699). - Dodaliśmy funkcję przesyłania danych CMCD (Common Media Client Data) za pomocą parametrów zapytania (#553).
- Rozwiąż problem
ConcurrentModificationExceptionw:ExperimentalBandwidthMeter(#612). - Dodaj parametr
MediaPeriodIddoCompositeMediaSource.getMediaTimeForChildMediaTime. - Obsługa
ClippingMediaSource(i innych źródeł z przesunięciami czasu okresu/okna) wConcatenatingMediaSource2(#11226). - Zmień
BaseRenderer.onStreamChanged(), aby otrzymywać też argumentMediaPeriodId.
- Transformator:
- Przeanalizuj dane EXIF dotyczące obrotu obrazów wejściowych.
- Usunięcie typu adnotacji
TransformationRequest.HdrModei powiązanych z nim stałych. Zamiast tego użyjComposition.HdrModei powiązanych z nim stałych. - Uprość
OverlaySettings, aby rozwiązać problemy z obracaniem. - Zmieniono parametry
frameRateidurationUsurządzeniaSampleConsumer.queueInputBitmapnaTimestampIterator.
- Wybór ścieżki:
- Dodaj
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness, aby wyraźnie zezwolić na adaptację bez płynnego przejścia lub jej zabronić. Domyślne zachowanie pozostanie takie samo jak w przypadku wartościtrue.
- Dodaj
- Ekstraktory:
- MPEG-TS: zapewniono renderowanie ostatniej klatki 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 sprawdzać bezpośrednio za pomocąinstanceof. Jeśli chcesz uzyskać dostęp do szczegółów implementacjiExtractorw czasie działania, musisz najpierw wywołaćExtractor.getUnderlyingInstance. - Dodaj
BmpExtractor. - Dodaj
WebpExtractor. - Dodaj
HeifExtractor. - Dodaj obsługę QuickTime Classic do
Mp4Extractor.
- Dźwięk:
- Dodaliśmy obsługę 24- i 32-bitowego formatu PCM big endian w MP4 i Matroska oraz analizę kodowania PCM dla
lpcmw MP4. - Dodaliśmy obsługę wyodrębniania dźwięku Vorbis w formacie MP4.
- Dodaj
AudioSink.getFormatOffloadSupport(Format), który pobiera poziom obsługi odciążania, jaki ujście może zapewnić dla formatu, za pomocąDefaultAudioOffloadSupportProvider. Zwraca nowy obiektAudioOffloadSupport, który zawieraisFormatSupported,isGaplessSupportediisSpeedChangeSupported. - Dodaj
AudioSink.setOffloadMode(), za pomocą którego konfigurowane jest odciążanie na ujściu audio. Wartość domyślna toAudioSink.OFFLOAD_MODE_DISABLED. - Odciążanie można włączyć za pomocą
setAudioOffloadPreferencewTrackSelectionParameters. Jeśli ustawiono preferencję włączenia, urządzenie obsługuje odciążanie dla danego formatu, a wybór ścieżki to pojedyncza ścieżka audio, odciążanie dźwięku zostanie włączone. - Jeśli zasada
audioOffloadModePreferencema wartośćAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED,DefaultTrackSelectorwybierze tylko ścieżkę audio i tylko wtedy, gdy jej format jest obsługiwany w trybie odciążania. Jeśli żadna ścieżka audio nie jest obsługiwana w trybie odciążania, nie zostanie wybrana żadna ścieżka. - Wyłączam obsługę odtwarzania bez przerw w przypadku odciążania na poziomie interfejsu API starszym niż 33 z powodu problemu z pozycją odtwarzania po przejściu do innego utworu.
- Usuń parametr
enableOffloadz sygnatury metodyDefaultRenderersFactory.buildAudioSink. - Usuń metodę
DefaultAudioSink.Builder.setOffloadMode. - Usuń wartość intdef
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED. - Dodaliśmy obsługę metadanych Opus gapless podczas odtwarzania z odciążeniem.
- Zezwalaj na przywracanie renderera przez wyłączenie odciążania, jeśli nie uda się wykonać pierwszego zapisu (#627).
- Domyślnie włącz planowanie odciążania w przypadku odtwarzania z odciążaniem tylko dźwięku.
- Usuń:
ExoPlayer.experimentalSetOffloadSchedulingEnablediAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged. - Zmieniono nazwę
onExperimentalSleepingForOffloadChangednaonSleepingForOffloadChanged, aonExperimentalOffloadedPlaybacknaonOffloadedPlayback. - Przenieś interfejsy i definicje
TrackSelectionParameterszwiązane z trybem odciążania dźwięku do klasy wewnętrznejAudioOffloadPreferences. - Dodaj wywołania zwrotne
onAudioTrackInitializedionAudioTrackReleaseddoAnalyticsListener,AudioRendererEventListeneriAudioSink.Listener. - Rozwiązaliśmy problem z niedopełnieniem bufora audio DTS Express (#650).
- Naprawiono błąd, który powodował, że sprawdzanie możliwości E-AC3-JOC zgłaszało błąd
IllegalArgumentException(#677).
- Dodaliśmy obsługę 24- i 32-bitowego formatu PCM big endian w MP4 i Matroska oraz analizę kodowania PCM dla
- Film:
- Zezwalaj usłudze
MediaCodecVideoRendererna używanie niestandardowegoVideoFrameProcessor.Factory. - Naprawiono błąd, który uniemożliwiał renderowanie pierwszej klatki, jeśli strumień audio zaczynał się od ujemnych sygnatur czasowych (#291).
- Zezwalaj usłudze
- Tekst:
- Usuń
ExoplayerCuesDecoder. Ścieżki tekstowe z atrybutemsampleMimeType = application/x-media3-cuessą teraz obsługiwane bezpośrednio przezTextRendererbez konieczności używania instancjiSubtitleDecoder.
- Usuń
- Metadane:
- Metoda
MetadataDecoder.decodenie będzie już wywoływana w przypadku próbek „tylko do dekodowania”, ponieważ implementacja i tak musi zwracać wartość null.
- Metoda
- Efekt:
- Dodaj
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)kolejkując dane wejściowe bitmapy według sygnatury czasowej. - Zmień
VideoFrameProcessor.registerInputStream()na nieblokujące. Aplikacje muszą implementować interfejsVideoFrameProcessor.Listener#onInputStreamRegistered(). - Zmieniono parametry
frameRateidurationUselementuVideoFrameProcessor.queueInputBitmapnaTimestampIterator.
- Dodaj
- Rozszerzenie IMA:
- Naprawiliśmy błąd, który powodował, że wielookresowa transmisja na żywo DASH, która nie jest pierwszym elementem na playliście, mogła zgłaszać wyjątek (#571).
- Zwolnij StreamManager przed wywołaniem metody
AdsLoader.destroy() - Zaktualizowano pakiet IMA SDK do wersji 3.31.0.
- Sesja:
- Ustaw zachowanie usługi na pierwszym planie powiadomień na
FOREGROUND_SERVICE_IMMEDIATEwDefaultMediaNotificationProvider(#167). - Używaj tylko
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()powyżej interfejsu API 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 rozmówcy jest zawsze kontrolerem powiadomień o multimediach, a aplikacje mogą łatwo rozpoznawać połączenia przychodzące z powiadomienia w ten sam sposób na wszystkich obsługiwanych poziomach interfejsu API. - Rozwiązaliśmy problem, który powodował, że
MediaController.getCurrentPosition()nie przechodzi dalej po połączeniu ze starszym urządzeniemMediaSessionCompat. - Dodaj
MediaLibrarySession.getSubscribedControllers(mediaId), aby ułatwić sobie życie. - Zastąp
MediaLibrarySession.Callback.onSubscribe(), aby potwierdzić dostępność identyfikatora nadrzędnego, który subskrybuje kontroler. Jeśli się powiedzie, subskrypcja zostanie zaakceptowana i natychmiast zostanie wywołana funkcjanotifyChildrenChanged(), aby poinformować przeglądarkę (#561). - Dodaj moduł demonstracyjny sesji dla Automotive OS i włącz wersję demonstracyjną sesji dla Androida Auto.
- Nie ustawiaj kolejki sesji platformy, gdy
COMMAND_GET_TIMELINEjest niedostępny 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ślne używanie
DataSourceBitmapLoaderzamiastSimpleBitmapLoader(#271, #327). - Dodaj
MediaSession.Callback.onMediaButtonEvent(Intent), który umożliwia aplikacjom zastępowanie domyślnej obsługi zdarzeń przycisków multimedialnych.
- Ustaw zachowanie usługi na pierwszym planie powiadomień na
- UI:
- Dodaj implementację
Player.Listenerna urządzeniach z Wear OS, która obsługuje blokowanie odtwarzania z powoduPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT, uruchamiając okno systemowe, aby umożliwić użytkownikowi podłączenie odpowiedniego wyjścia audio (np. słuchawek Bluetooth). Odtwarzanie zostanie automatycznie wznowione, jeśli w określonym czasie (domyślnie 5 minut) zostanie podłączone odpowiednie urządzenie.
- Dodaj implementację
- Pobrane:
- Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” w przypadku aplikacji
DownloadService, aby zapewnić zgodność z Androidem 14. Podczas korzystania z tej usługi aplikacja musi też dodaćdataSyncjakoforegroundServiceTypew pliku manifestu oraz uprawnienieFOREGROUND_SERVICE_DATA_SYNC(#11239).
- Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” w przypadku aplikacji
- Rozszerzenie HLS:
- Odświeżanie playlisty HLS na żywo w odstępach obliczanych od czasu rozpoczęcia ostatniego wczytywania, a nie od czasu zakończenia ostatniego wczytywania (#663).
- Rozszerzenie DASH:
- Zezwalaj na wiele takich samych identyfikatorów DASH w adresie URL szablonu segmentu.
- Dodano eksperymentalną obsługę analizowania napisów podczas wyodrębniania. Zapewnia on lepszą obsługę scalania nakładających się napisów, w tym rozwiązywanie problemów z migotaniem podczas przechodzenia między segmentami napisów. Możesz to włączyć za pomocą
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()(#288).
- Rozszerzenie RTSP:
- Naprawiono sytuację wyścigu, która mogła prowadzić do błędu
IndexOutOfBoundsExceptionpodczas przełączania na TCP lub zawieszania odtwarzania w niektórych sytuacjach. - Sprawdzanie stanu w konfiguracji RTSP podczas zwracania stanu wczytywania
RtspMediaPeriod(#577). - Ignorowanie niestandardowych metod żądania Rtsp w nagłówku publicznym odpowiedzi Options (#613).
- Używanie wartości czasu oczekiwania na odpowiedź konfiguracji RTSP w interwale czasowym wysyłania żądań opcji RTSP utrzymujących połączenie (#662).
- Naprawiono sytuację wyścigu, która mogła prowadzić do błędu
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Wydanie modułu dekodera MIDI, który umożliwia odtwarzanie standardowych plików MIDI przy użyciu biblioteki Jsyn do syntezy dźwięku.
- Dodaj
DecoderOutputBuffer.shouldBeSkipped, aby bezpośrednio oznaczać bufor wyjściowy, który nie musi być prezentowany. 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. Zalecamy używanie tej zasady zamiast zasadyBuffer.isDecodeOnly, która zostanie wycofana. - Naprawiliśmy błąd związany z publikowaniem artefaktu dekodera MIDI w repozytorium Maven. Nazwa artefaktu została zmieniona na
media3-exoplayer-midi(#734).
- Rozszerzenie Leanback:
- Naprawiono błąd, który powodował, że wyłączenie platformy mogło wywołać
ArithmeticExceptionw kodzie Leanback (#617).
- Naprawiono błąd, który powodował, że wyłączenie platformy mogło wywołać
- Narzędzia testowe:
- Zapewnij zgodność
TestExoPlayerBuilderiFakeClockz testami interfejsu Espresso i testami interfejsu Compose. Naprawiliśmy błąd, który powodował, że odtwarzanie postępowało w sposób niedeterministyczny podczas interakcji z widokiem Espresso lub Compose.
- Zapewnij zgodność
- Usuń wycofane symbole:
- Usuń
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)iTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Zamiast tego użyjComposition.Builder.setHdrMode(int)i przekażCompositiondoTransformer.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żyj wersji stabilnej 1.2.0.
Wersja 1.2.0-beta01
19 października 2023 r.
Użyj wersji stabilnej 1.2.0.
Wersja 1.2.0-alpha02
29 września 2023 r.
Użyj wersji stabilnej 1.2.0.
Wersja 1.2.0-alpha01
17 sierpnia 2023 r.
Użyj wersji stabilnej 1.2.0.
Wersja 1.1.0
Wersja 1.1.1
16 sierpnia 2023 r.
- Biblioteka wspólna:
- Usunięto przypadkowo dodaną zależność
multidexze wszystkich modułów (#499).
- Usunięto przypadkowo dodaną zależność
- ExoPlayer:
- Rozwiązaliśmy problem w aplikacji
PlaybackStatsListener, który powodował, że po wyczyszczeniu playlisty tworzone były nieprawidłowe elementyPlaybackStats. - Dodano dodatkowe pola do logowania Common Media Client Data (CMCD): format strumieniowania (sf), typ strumienia (st), wersja (v), maksymalna szybkość transmisji bitów (tb), czas trwania obiektu (d), zmierzona przepustowość (mtp) i typ obiektu (ot) (#8699).
- Rozwiązaliśmy problem w aplikacji
- Dźwięk:
- Naprawiono błąd, który powodował, że podczas odtwarzania bardzo krótkich plików stan
Player.getState()nigdy nie zmieniał się naSTATE_ENDED(#538).
- Naprawiono błąd, który powodował, że podczas odtwarzania bardzo krótkich plików stan
- Odciążanie dźwięku:
- Dołącz nagłówek identyfikatora Ogg i nagłówek komentarza do strumienia bitów, aby umożliwić odtwarzanie plików Opus zgodnie z RFC 7845.
- Film:
- H.265/HEVC: poprawiono analizowanie informacji o krótko- i długoterminowych obrazach referencyjnych SPS.
- Tekst:
- CEA-608: zmieniono logikę obcinania wskazówek, aby uwzględniała tylko widoczny tekst. Wcześniej wcięcie i przesunięcie tabulatora były uwzględniane podczas ograniczania długości wskazówki do 32 znaków (co było technicznie poprawne zgodnie ze specyfikacją) (#11019).
- Rozszerzenie IMA:
- Zaktualizowano pakiet IMA SDK do wersji 3.30.3.
- Sesja:
- Dodaj układ niestandardowy do stanu kontrolera i udostępnij metodę pobierającą, aby uzyskać do niego dostęp. Gdy układ niestandardowy się zmienia, wywoływana jest funkcja
MediaController.Listener.onCustomLayoutChanged. Aplikacje, które chcą wysyłać różne układy niestandardowe do różnych kontrolerów Media3, mogą to zrobić w metodzieMediaSession.Callback.onConnect, używającAcceptedResultBuilder, aby upewnić się, że układ niestandardowy jest dostępny dla kontrolera po nawiązaniu połączenia. - Naprawiono przypadki, w których
MediaLibraryServiceLegacyStubwysyłał błąd doResult, który nie obsługiwał tej funkcji, co powodowałoUnsupportedOperationException(#78). - Poprawiono sposób, w jaki
PlayerWrappertworzyVolumeProviderCompat, przez określenievolumeControlTypeza 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 układ niestandardowy do stanu kontrolera i udostępnij metodę pobierającą, aby uzyskać do niego dostęp. Gdy układ niestandardowy się zmienia, wywoływana jest funkcja
Wersja 1.1.0
5 lipca 2023 r.
- Biblioteka wspólna:
- Dodaj powód pominięcia w przypadku nieodpowiedniej ścieżki audio i odtwarzaj, gdy będzie gotowa. Zmień powód zbyt długiego pominięcia. (#15).
- Dodaj polecenia 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 umożliwiają użytkownikom określanie flag głośności:
void setDeviceVolume(int, int)void increaseDeviceVolume(int)void decreaseDeviceVolume(int)void setDeviceMuted(boolean, int)
- Dodaj
BuilderdlaDeviceInfoi wycofaj dotychczasowy konstruktor. - Dodaj
DeviceInfo.routingControllerId, aby określić identyfikator kontrolera routingu na potrzeby odtwarzania zdalnego. - Dodaj
Player.replaceMediaItem(s)jako skrót do dodawania i usuwania elementów na tej samej pozycji (#8046).
- ExoPlayer:
- Zezwalaj ExoPlayerowi na sterowanie głośnością urządzenia tylko wtedy, gdy użytkownik wyraźnie wyrazi na to zgodę. 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. - Dodano obsługę uwzględniania danych CMCD (Common Media Client Data) w żądaniach wychodzących formatów strumieniowania adaptacyjnego DASH, HLS i SmoothStreaming. Uwzględniliś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
CmcdConfiguration.RequestConfig.isKeyAllowed(String key), aby odfiltrować klucze, które są rejestrowane. - 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 demonstracyjnej z niestandardowym plikiem
*.exolist.json(#439). - Dodaj
ExoPlayer.setVideoEffects()za korzystanie zEffectpodczas odtwarzania filmu. - Zaktualizuj
SampleQueue, aby przechowywaćsourceIdjakolong, a nieint. Zmienia to sygnatury metod publicznychSampleQueue.sourceIdiSampleQueue.peekSourceId. - Dodaj parametry do metod
LoadControlshouldStartPlaybackionTracksSelected, które umożliwiają powiązanie tych metod z odpowiednimMediaPeriod. - Zmień sygnaturę
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ć wariant metod bezmediaTimeOffsetUs. Pamiętaj, że nawet w przypadku wycofanych wariantów przesunięcie nie jest już dodawane do właściwościstartTimeUsiendTimeUsobiektówMediaLoadDatawysyłanych przez dyspozytora. - Zmień nazwę
ExoTrackSelection.blacklistnaexcludeTrackiisBlacklistednaisTrackExcluded. - Naprawiono niespójne działanie metod
ExoPlayer.setMediaItem(s)iaddMediaItem(s), gdy są wywoływane na pustej playliście.
- Zezwalaj ExoPlayerowi na sterowanie głośnością urządzenia tylko wtedy, gdy użytkownik wyraźnie wyrazi na to zgodę. Użyj
- Transformator:
- Usuń
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Zamiast niej użyj zasadExoPlayerAssetLoader.Factory(MediaSource.Factory)iTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory). - Usuń
Transformer.startTransformation(MediaItem, ParcelFileDescriptor). - Naprawiono błąd, który mógł powodować zawieszanie się przekształcenia (prowadzące do przekroczenia limitu czasu multipleksera), jeśli koniec strumienia wideo został zasygnalizowany w momencie, gdy klatka wejściowa oczekiwała na przetworzenie.
- Aby rozszerzyć obsługę, wysyłaj zapytania o kodeki za pomocą
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.allowInvalidateSelectionsForRendererCapabilitiesChange, który jest domyślnie wyłączony. Gdy ta opcja jest włączona,DefaultTrackSelectorwywoła nowy wybór ścieżki, gdy zmienią się możliwości renderowania.
- Dodaj
- Ekstraktory:
- Dźwięk:
- Naprawiliśmy błąd, który powodował, że niektóre odtworzenia kończyły się niepowodzeniem, gdy tunelowanie było włączone, a
AudioProcessorsbyły aktywne, np. w przypadku przycinania bez przerw (#10847). - Hermetyzuj ramki Opus w pakietach Ogg podczas bezpośredniego odtwarzania (odciążanie).
- Ekstrapoluj bieżącą pozycję podczas uśpienia z harmonogramem odciążania.
- Dodaj metody
Renderer.release()iAudioSink.release(), aby zwolnić zasoby na końcu cyklu życia odtwarzacza. - Monitorowanie zmian funkcji 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 możliwości audio za pomocą nowego zdarzenia
onAudioCapabilitiesChangedw interfejsieAudioSink.Listeneri nowego interfejsuRendererCapabilities.Listener, który wywołuje zdarzeniaonRendererCapabilitiesChanged. - Dodaj
ChannelMixingAudioProcessor, aby zastosować skalowanie/miksowanie do kanałów audio. - Dodaj nową wartość całkowitą
DISCARD_REASON_AUDIO_BYPASS_POSSIBLEdoDecoderDiscardReasons, aby odrzucić dekoder dźwięku, gdy po zmianie możliwości dźwięku możliwy jest tryb obejścia. - Dodano obsługę bezpośredniego odtwarzania DTS Express i DTS:X (#335).
- Naprawiliśmy błąd, który powodował, że niektóre odtworzenia kończyły się niepowodzeniem, gdy tunelowanie było włączone, a
- Film:
- Spraw, aby
MediaCodecVideoRendererzgłaszałVideoSizeo szerokości i wysokości 0, gdy renderer jest wyłączony. FunkcjaPlayer.Listener.onVideoSizeChangedjest wywoływana odpowiednio, gdy zmienia sięPlayer.getVideoSize(). W wyniku tej zmiany rozmiar filmu w ExoPlayerze zMediaCodecVideoRendererma szerokość i wysokość 0, gdyPlayer.getCurrentTracksnie obsługuje filmu 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
- Multiplekser:
- Dodaj nową bibliotekę multipleksera, której można używać do tworzenia pliku kontenera MP4.
- Rozszerzenie IMA:
- Włączanie transmisji na żywo DASH z wieloma przedziałami czasu na potrzeby dynamicznego wstawiania reklam. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania w transmisjach na żywo (#10912).
- Naprawiliśmy błąd, który powodował wstawianie nowej grupy reklam w transmisjach na żywo, ponieważ obliczona pozycja treści na kolejnych osiach czasu nieznacznie się różniła.
- Sesja:
- Dodaj metodę pomocniczą
MediaSession.getControllerForCurrentRequest, aby uzyskać informacje o kontrolerze, który obecnie wywołuje metodęPlayer. - Dodano
androidx.media3.session.MediaButtonReceiver, aby umożliwić aplikacjom implementowanie wznawiania odtwarzania za pomocą zdarzeń przycisku multimediów wysyłanych np. przez zestaw słuchawkowy 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 widoku kompaktowym powiadomienia o multimediach domyślnie w Androidzie 12 i starszych (#410).
- Dodaj domyślną implementację do
MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądanychMediaItemsdoPlayer, jeśli mająLocalConfiguration(np. URI) (#282). - Domyślnie dodano przyciski poleceń „przewiń do poprzedniego” i „przewiń do następnego” w widoku kompaktowego powiadomienia o multimediach na urządzeniach z Androidem 12 i starszym (#410).
- Dodaj metodę pomocniczą
- UI:
- Dodaj metody Util
shouldShowPlayButtonihandlePlayPauseButtonAction, aby utworzyć niestandardowe elementy interfejsu z przyciskiem odtwarzania/wstrzymania.
- Dodaj metody Util
- Rozszerzenie RTSP:
- Rozszerzenie DASH:
- Usuń przesunięcie czasu multimediów z
MediaLoadData.startTimeMsiMediaLoadData.endTimeMsw przypadku strumieni DASH z wieloma przedziałami czasu. - Naprawiliśmy błąd, który powodował, że ponowne przygotowanie wielookresowego źródła multimediów Dash na żywo powodowało błąd
IndexOutOfBoundsException(#10838).
- Usuń przesunięcie czasu multimediów z
- Rozszerzenie HLS:
- Dodaj
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long), aby ustawić czas oczekiwania wątku wczytywania na zainicjowanieTimestampAdjuster. Jeśli inicjowanie nie zakończy się przed upływem limitu czasu, zostanie wygenerowany błądPlaybackException, aby uniknąć niekończącego się zatrzymywania odtwarzania. Domyślnie limit czasu jest ustawiony na 0 (#323).
- Dodaj
- Narzędzia testowe:
- Sprawdź, czy w
DataSourceContractTestwielkość liter w schemacie URI nie jest rozróżniana.
- Sprawdź, czy w
- Usuń wycofane symbole:
- Usuń konstruktory
DefaultAudioSinki użyj zamiast nichDefaultAudioSink.Builder. - Usuń
HlsMasterPlaylisti użyjHlsMultivariantPlaylist. - Usuń
Player.stop(boolean). Zamiast tego użyj zasadPlayer.stop()iPlayer.clearMediaItems()(jeśliresettotrue). - Usuń 2 wycofane konstruktory
SimpleCachei użyj konstruktora, który nie został wycofany i który przyjmujeDatabaseProvider, aby uzyskać lepszą wydajność. - Usuń konstruktor
DefaultBandwidthMeteri użyj zamiast niegoDefaultBandwidthMeter.Builder. - Usuń konstruktory
DefaultDrmSessionManageri użyj zamiast nichDefaultDrmSessionManager.Builder. - Usuń 2 wycofane konstruktory
HttpDataSource.InvalidResponseCodeExceptioni użyj niewycofanego konstruktora, który akceptuje dodatkowe pola(cause,responseBody), aby ulepszyć rejestrowanie błędów. - Usuń
DownloadHelper.forProgressive,DownloadHelper.forHls,DownloadHelper.forDashiDownloadHelper.forSmoothStreaming, a zamiast nich użyjDownloadHelper.forMediaItem. - Usuń wycofany konstruktor
DownloadServicei użyj niewycofanej wersji, która zawiera opcję podania parametruchannelDescriptionResourceId. - Usuń wycofane stałe typu String dla zestawów znaków (
ASCII_NAME,UTF8_NAME,ISO88591_NAME,UTF16_NAMEiUTF16LE_NAME). Zamiast tego użyj 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.Builder, aby utworzyć instancjeFormat. - Usuń wycofane metody
copyWithMaxInputSize,copyWithSubsampleOffsetUs,copyWithLabel,copyWithManifestFormatInfo,copyWithGaplessInfo,copyWithFrameRate,copyWithDrmInitData,copyWithMetadata,copyWithBitrateicopyWithVideoSize. Zamiast nich używaj metodyFormat.buildUpon()i metod ustawiających. - Usuń wycofaną metodę
ExoPlayer.retry()i użyj metodyprepare(). - Usuń wycofany konstruktor
DefaultTrackSelectorbez argumentów i użyj zamiast niegoDefaultTrackSelector(Context). - Usuń wycofany konstruktor
OfflineLicenseHelperi użyj zamiast niegoOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher). - Usuń wycofany konstruktor
DownloadManageri użyj konstruktora, który przyjmujeExecutor. - Usuń wycofane konstruktory
Cuei użyj zamiast nichCue.Builder. - Usuń wycofany konstruktor
OfflineLicenseHelperi użyj zamiast niegoOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher). - Usuń 4 wycofane metody
AnalyticsListener:onDecoderEnabled, użyjonAudioEnabledlubonVideoEnabled.onDecoderInitialized, użyj zasadonAudioDecoderInitializedlubonVideoDecoderInitialized.onDecoderInputFormatChanged, użyj zamiast tegoonAudioInputFormatChangedlubonVideoInputFormatChanged.onDecoderDisabled, użyjonAudioDisabledlubonVideoDisabled.
- Usuń wycofane polecenia
Player.Listener.onSeekProcessediAnalyticsListener.onSeekProcessed, a zamiast nich użyj poleceniaonPositionDiscontinuityzDISCONTINUITY_REASON_SEEK. - Usuń
ExoPlayer.setHandleWakeLock(boolean), użyjsetWakeMode(int). - Usuń wycofaną metodę
DefaultLoadControl.Builder.createDefaultLoadControl()i użyj zamiast niej metodybuild(). - Usuń wycofaną metodę
MediaItem.PlaybackPropertiesi użyj zamiast niej metodyMediaItem.LocalConfiguration. Wycofane poleMediaItem.playbackPropertiesjest teraz typuMediaItem.LocalConfiguration.
- Usuń konstruktory
Wersja 1.1.0-rc01
21 czerwca 2023 r.
Użyj wersji stabilnej 1.1.0.
Wersja 1.1.0-beta01
7 czerwca 2023 r.
Użyj wersji stabilnej 1.1.0.
Wersja 1.1.0-alpha01
10 maja 2023 r.
Użyj wersji stabilnej 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 zatwierdzenia.
Ta wersja odpowiada wersji 2.18.7 ExoPlayera.
Ta wersja zawiera te zmiany w porównaniu z wersją 1.0.1:
- Biblioteka podstawowa:
- Dodaj
Buffer.isLastSample(), który wskazuje, czyBufferzawiera flagęC.BUFFER_FLAG_LAST_SAMPLE. - Rozwiązaliśmy problem, który powodował, że ostatnia klatka mogła nie zostać wyrenderowana, jeśli ostatnia próbka z klatkami została usunięta z kolejki bez odczytania próbki „koniec strumienia”. (#11079).
- Dodaj
- Ekstraktory:
- Naprawiono analizowanie H.265 SPS w plikach MPEG-TS przez ponowne użycie logiki analizowania używanej już 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ązaliśmy problem, który powodował, że
MediaControllernie aktualizował dostępnych poleceń po połączeniu ze starszą wersjąMediaSessionCompat, która aktualizuje swoje działania. - Naprawiono błąd, który uniemożliwiał metodzie
MediaLibraryServicezwracanie wartości null w przypadku wywołania z interfejsu systemu doCallback.onGetLibraryRootzparams.isRecent == truew interfejsie API 30 (#355). - Naprawiono wyciek pamięci w
MediaSessionServicelubMediaLibraryService(#346). - Naprawiliśmy błąd, który powodował, że połączona aktualizacja
Timelinei pozycji wMediaSessionmogła powodować, żeMediaControllerzgłaszałIllegalStateException.
- Rozwiązaliśmy problem, który powodował, że
Wersja 1.0.1
18 kwietnia 2023 r.
Publikacja androidx.media3:media3-*:1.0.1 Wersja 1.0.1 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji ExoPlayer 2.18.6.
- Biblioteka podstawowa:
- Zresetowanie zastąpienia docelowej transmisji na żywo podczas przewijania do pozycji domyślnej (#11051).
- Naprawiliśmy błąd, który powodował, że puste strumienie próbek w multimediach mogły powodować zawieszanie się odtwarzania.
- Sesja:
- Naprawiliśmy błąd, który powodował, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję
MediaSessionCompatpowodowało wyjątek wMediaController(#290). - Dodaj brakujące przekierowanie
MediaSession.broadcastCustomCommanddo starszej wersjiMediaControllerCompat.Callback.onSessionEvent(#293). - Naprawiono błąd, który powodował, że wywołanie
MediaSession.setPlayernie aktualizowało dostępnych poleceń. - Rozwiązaliśmy problem, który powodował, że instancje
TrackSelectionOverridewysyłane zMediaControllerbyły ignorowane, jeśli odwoływały się do grupy zFormat.metadata(#296). - Rozwiązaliśmy problem, który powodował, że usługa
Player.COMMAND_GET_CURRENT_MEDIA_ITEMmusiała być dostępna, aby można było uzyskać dostęp do metadanych za pomocą starszej wersjiMediaSessionCompat. - Naprawiono błąd, który powodował, że instancje
MediaSessionw wątku w tle powodowały awarie, gdy były używane wMediaSessionService(#318). - Naprawiliśmy problem, który powodował, że odbiornik przycisku multimediów był deklarowany przez bibliotekę, mimo że aplikacja nie miała takiego zamiaru (#314).
- Naprawiliśmy błąd, który powodował, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję
- DASH:
- Naprawiono 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 2.18.5 ExoPlayera.
Brak zmian od wersji 1.0.0-rc02.
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 2.18.4 ExoPlayera.
- Biblioteka podstawowa:
- Pobrane:
- Umożliwienie konfigurowania maksymalnej różnicy czasu rozpoczęcia 2 segmentów, które mają zostać scalone, w klasie
SegmentDownloaderi jej podklasach (#248).
- Umożliwienie konfigurowania maksymalnej różnicy czasu rozpoczęcia 2 segmentów, które mają zostać scalone, w klasie
- Dźwięk:
- Film:
- Mapuj format HEVC HDR10 na
HEVCProfileMain10HDR10zamiastHEVCProfileMain10. - Dodano obejście problemu z urządzeniem na Chromecaście z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC 60 kl./s są oznaczane jako nieobsługiwane (#10898).
- Rozwiązaliśmy problemy z wydajnością uwalniania klatek podczas odtwarzania multimediów z liczbą klatek znacznie wyższą niż częstotliwość odświeżania ekranu.
- Mapuj format HEVC HDR10 na
- Obsada:
- Naprawiono błąd przejściowy
STATE_IDLEpodczas przechodzenia między elementami multimedialnymi (#245).
- Naprawiono błąd przejściowy
- RTSP:
- Przechwytywanie wyjątku IllegalArgumentException zgłaszanego podczas analizowania nieprawidłowego RTSP Opis komunikatów odpowiedzi (#10971).
- Sesja:
- Naprawiliśmy błąd, który powodował, że przycisk odtwarzania/wstrzymania w powiadomieniu nie aktualizował się wraz ze stanem odtwarzacza (#192).
- Rozszerzenie IMA:
- Rozwiązaliśmy problem, który uniemożliwiał rozpoczęcie transmisji DAI bez reklam, ponieważ nie otrzymano pierwszego (i w przypadku braku reklam jedynego) zdarzenia
LOADED.
- Rozwiązaliśmy problem, który uniemożliwiał rozpoczęcie transmisji DAI bez reklam, ponieważ nie otrzymano pierwszego (i 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 ExoPlayer 2.18.3.
- Biblioteka podstawowa:
- Dostosuj logikę kolejności dekoderów w rendererze, aby zachować preferencje
MediaCodecSelector, nawet jeśli dekoder zgłasza, ż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 obsługą tylko funkcjonalną będzie preferowany nad dekoderem programowym, który w pełni obsługuje dany format (#10604). - Dodaj
ExoPlayer.Builder.setPlaybackLooper, który ustawia istniejący wcześniej wątek odtwarzania dla nowej instancji ExoPlayer. - Zezwalanie na czyszczenie pomocników menedżera pobierania (#10776).
- Dodaj parametr do
BasePlayer.seekTo, aby wskazać też polecenie używane do przewijania. - Używanie motywu podczas wczytywania obiektów rysowalnych w interfejsie API 21+ (#220).
- Dodano
ConcatenatingMediaSource2, który umożliwia łączenie wielu elementów multimedialnych w jednym oknie (#247).
- Dostosuj logikę kolejności dekoderów w rendererze, aby zachować preferencje
- Ekstraktory:
- Jeśli podczas analizowania atomów trak w tabeli próbek (stbl) brakuje wymaganego opisu próbki (stsd), zgłaszany jest błąd
ParserExceptionzamiastNullPointerException. - Prawidłowe pomijanie próbek podczas przechodzenia bezpośrednio do klatki synchronizacji w fMP4 (#10941).
- Jeśli podczas analizowania atomów trak w tabeli próbek (stbl) brakuje wymaganego opisu próbki (stsd), zgłaszany jest błąd
- Dźwięk:
- Użyj szybkości transmisji bitów skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora dla
AudioTrackw przypadku bezpośredniego odtwarzania (przekazywania).
- Użyj szybkości transmisji bitów skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora dla
- Tekst:
- Naprawiono błąd, który powodował, że funkcja
TextRendererprzekazywała nieprawidłowy (ujemny) indeks do funkcjiSubtitle.getEventTime, jeśli plik napisów nie zawierał żadnych wskazówek. - SubRip: dodano obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów.
- Naprawiono błąd, który powodował, że funkcja
- Metadane:
- Analizowanie wielu wartości rozdzielonych wartościami null z ramek ID3, zgodnie z ID3 v2.4.
- Dodaj
MediaMetadata.mediaType, aby określić typ treści lub typ folderu opisany przez metadane. - Dodaj
MediaMetadata.isBrowsablejako zamiennik dla:MediaMetadata.folderType. Typ folderu zostanie wycofany w następnej wersji.
- DASH:
- Dodano pełne analizowanie zestawów adaptacji obrazów, w tym liczby kafelków (#3752).
- UI:
- Naprawiono wycofany element
PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener), aby zmiany widoczności były przekazywane do zarejestrowanego detektora (#229). - Naprawiono kolejność elementów sterujących odtwarzaczem w
PlayerViewpodczas korzystania z układu od prawej do lewej (#227).
- Naprawiono wycofany element
- Sesja:
- Dodaj abstrakcyjną klasę
SimpleBasePlayer, aby ułatwić implementację interfejsuPlayerw przypadku odtwarzaczy niestandardowych. - Dodanie metody pomocniczej do konwertowania tokena sesji platformy na Media3
SessionToken(#171). - Używaj
onMediaMetadataChangeddo wywoływania aktualizacji sesji multimedialnej platformy (#219). - Dodaj sesję multimediów jako argument
getMediaButtons()wDefaultMediaNotificationProvideri użyj niezmiennych list, aby zachować przejrzystość (#216). - Dodaj detektor wywołania zwrotnego
onSetMediaItems, aby umożliwić modyfikowanie/ustawianie listyMediaItem, indeksu początkowego i pozycji według sesji przed ustawieniem w odtwarzaczu (#156). - Unikanie wykrywania dwukrotnego kliknięcia w przypadku zdarzeń przycisków multimedialnych innych niż Bluetooth (#233).
- Zwiększono stabilność
QueueTimelinew przypadku podejrzanego stanu sesji starszej wersji (#241).
- Dodaj abstrakcyjną klasę
- Metadane:
- Analizowanie wielu wartości rozdzielonych wartościami null z ramek ID3, zgodnie z ID3 v2.4.
- Dodaj
MediaMetadata.mediaType, aby określić typ treści lub typ folderu opisany przez metadane. - Dodaj
MediaMetadata.isBrowsablejako zamiennik dla:MediaMetadata.folderType. Typ folderu zostanie wycofany w następnej wersji.
- Rozszerzenie Cast:
- Zaktualizowano pakiet Cast SDK do wersji 21.2.0.
- Rozszerzenie IMA:
- Aby uniknąć problemów z wątkami, usuń detektor odtwarzacza
ImaServerSideAdInsertionMediaSourcez wątku aplikacji. - Dodaj właściwość
focusSkipButtonWhenAvailabledoImaServerSideAdInsertionMediaSource.AdsLoader.Builder, aby poprosić o ustawienie zaznaczenia na przycisku pominięcia na telewizorach, i domyślnie ustaw jej wartość na „true”. - Dodaj metodę
focusSkipButton()doImaServerSideAdInsertionMediaSource.AdsLoader, aby automatycznie prosić o ustawienie fokusu na przycisku pomijania. - Zaktualizowano pakiet IMA SDK do wersji 3.29.0.
- Aby uniknąć problemów z wątkami, usuń detektor odtwarzacza
- Aplikacja demonstracyjna:
- Prośba o zgodę na wyświetlanie powiadomień o pobieraniu w czasie działania (#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 2.18.2 ExoPlayera.
- Biblioteka podstawowa:
- Dodaj
ExoPlayer.isTunnelingEnabled, aby sprawdzić, czy tunelowanie jest włączone dla obecnie wybranych ścieżek (#2518). - Dodano
WrappingMediaSource, aby uprościć zawijanie pojedynczego elementuMediaSource(#7279). - Odrzuć bufor wsteczny, zanim odtwarzanie zostanie zatrzymane z powodu niewystarczającej ilości dostępnej pamięci.
- Zamknij blok śledzenia „doSomeWork”, gdy odciążanie jest włączone.
- Rozwiązanie problemu ze śledzeniem sesji podczas szybkiego przewijania w
PlaybackStatsListener(#180). - Wysyłanie brakującego wywołania zwrotnego
onMediaItemTransitionpodczas wywoływaniaseekToNextlubseekToPreviousna playliście z 1 elementem (#10667). - Dodaj
Player.getSurfaceSize, który zwraca rozmiar powierzchni, na której jest renderowany film. - Naprawiliśmy błąd, który powodował, że usunięcie detektorów podczas udostępniania odtwarzacza mogło wywołać błąd
IllegalStateException(#10758).
- Dodaj
- Kompilacja:
- Wymuszanie minimalnej wersji
compileSdkVersion, aby uniknąć błędów kompilacji (#10684). - Unikaj publikowania bloku, gdy jest on uwzględniony w innym procesie kompilacji Gradle.
- Wymuszanie minimalnej wersji
- Wybór ścieżki:
- Jeśli wyświetlacz nie obsługuje Dolby Vision, preferuj inne ścieżki. (#8944).
- Pobrane:
- Naprawiono potencjalną pętlę nieskończoną w
ProgressiveDownloaderspowodowaną jednoczesnym pobieraniem i odtwarzaniem z tym samymPriorityTaskManager(#10570). - Powiadomienie o pobieraniu pojawia się natychmiast (#183).
- Ograniczono liczbę równoległych usunięć pobranych plików do 1, aby uniknąć tworzenia nadmiernej liczby wątków (#10458).
- Naprawiono potencjalną pętlę nieskończoną w
- Film:
- Jeśli wyświetlacz nie obsługuje technologii Dolby Vision, wypróbuj alternatywny dekoder. (#9794).
- Dźwięk:
- Używaj
SingleThreadExecutordo zwalniania instancjiAudioTrack, aby uniknąć błędów OutOfMemory 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- i 12-kanałowego dźwięku na maski kanałów odpowiednio 7.1 i 7.1.4 we wszystkich wersjach Androida (#10701).
- Używaj
- Metadane:
- Teraz można skonfigurować
MetadataRenderertak, aby renderował metadane, gdy tylko będą dostępne. Utwórz instancję za pomocąMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), aby określić, czy renderer będzie generować metadane wcześniej czy w synchronizacji z pozycją odtwarzacza.
- Teraz można skonfigurować
- DRM:
- Obejście błędu w implementacji ClearKey na Androidzie 13, który zwraca niepusty, ale nieprawidłowy adres URL licencji.
- Naprawiono błąd
setMediaDrmSession failed: session not openedwystępujący podczas przełączania się między schematami DRM na playliście (np. Widevine na ClearKey).
- Tekst:
- CEA-608: upewnij się, że polecenia przełączania usług w polu 2 są prawidłowo obsługiwane (#10666).
- DASH:
- Analizowanie
EventStream.presentationTimeOffsetz plików manifestu (#10460).
- Analizowanie
- UI:
- Użyj bieżących zastąpień odtwarzacza jako gotowych ustawień w
TrackSelectionDialogBuilder(#10429).
- Użyj bieżących zastąpień odtwarzacza jako gotowych ustawień w
- Sesja:
- Zapewnij, że polecenia są zawsze wykonywane we właściwej kolejności, nawet jeśli niektóre wymagają asynchronicznego rozwiązania (#85).
- Dodaj
DefaultMediaNotificationProvider.Builder, aby utworzyćDefaultMediaNotificationProviderinstancje. Konstruktor może skonfigurować identyfikator powiadomienia, identyfikator kanału powiadomień i nazwę kanału powiadomień używaną przez dostawcę. Dodaj też metodęDefaultMediaNotificationProvider.setSmallIcon(int), aby ustawić małą ikonę powiadomień. (#104). - Upewnij się, że polecenia wysłane przed
MediaController.release()nie zostały odrzucone (#99). SimpleBitmapLoadermoże wczytywać bitmapę z identyfikatorów URIfile://(#108).- Naprawiono asercję, która uniemożliwiała
MediaControllerprzewijanie reklamy w okresie (#122). - Po zakończeniu odtwarzania
MediaSessionServicejest zatrzymywana na pierwszym planie i wyświetlane jest powiadomienie o ponownym uruchomieniu odtwarzania ostatnio odtwarzanego elementu multimedialnego (#112). - Nie uruchamiaj usługi działającej na pierwszym planie z intencją oczekującą na wstrzymanie (#167).
- Ręczne ukrywanie „plakietki” powiązanej z powiadomieniem utworzonym przez
DefaultNotificationProviderw interfejsach API 26 i 27 (plakietka jest automatycznie ukrywana w interfejsie API 28 i nowszych) (#131). - Naprawiliśmy błąd, który powodował, że drugie połączenie binder z starszej wersji MediaSession do Media3 MediaController powodowało błędy IllegalStateExceptions (#49).
- RTSP:
- IMA:
- Dodano limit czasu na wczytywanie informacji o reklamie, aby obsłużyć przypadki, gdy pakiet IMA SDK zacina się podczas wczytywania reklamy (#10510).
- Zapobieganie pomijaniu reklam w trakcie filmu podczas przewijania do końca treści (#10685).
- Prawidłowo obliczaj czas trwania okna w przypadku transmisji na żywo z reklamami wstawianymi po stronie serwera, np. IMA DAI (#10764).
- Rozszerzenie FFmpeg:
- Dodano nowe wymagane flagi, aby połączyć biblioteki FFmpeg z NDK 23.1.7779620 i nowszymi (#9933).
- Rozszerzenie AV1:
- Zaktualizowano wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Android Studio (#9933).
- Rozszerzenie Cast:
- Zaimplementuj
getDeviceInfo(), aby móc identyfikowaćCastPlayerpodczas sterowania odtwarzaniem za pomocąMediaController(#142).
- Zaimplementuj
- Transformator:
- Dodano licznik czasu watchdog multipleksera, aby wykrywać, kiedy generowanie próbki wyjściowej jest zbyt wolne.
- Usuń wycofane symbole:
- Usuń
Transformer.Builder.setOutputMimeType(String). Ta funkcja została usunięta. Jeśli używany jest domyślny multiplekser, typem 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 2.18.1 ExoPlayera.
- Biblioteka podstawowa:
- Upewnij się, że zmiana
ShuffleOrderza pomocąExoPlayer.setShuffleOrderpowoduje wywołaniePlayer.Listener#onTimelineChangedzreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED(#9889). - W przypadku multimediów progresywnych uwzględniaj tylko wybrane ścieżki w pozycji buforowanej (#10361).
- Zezwoliliśmy na używanie niestandardowego loggera we wszystkich danych wyjściowych logów ExoPlayera (#9752).
- Naprawiono implementację
setDataSourceFactorywDefaultMediaSourceFactory, która w niektórych przypadkach nie działała (#116).
- Upewnij się, że zmiana
- Ekstraktory:
- DASH:
- Analizowanie adresu URL licencji ClearKey z plików manifestu (#10246).
- UI:
- Upewnij się, że TalkBack odczytuje aktualnie aktywną opcję szybkości w menu elementów sterujących odtwarzaniem (#10298).
- RTSP:
- Dodano obsługę pofragmentowanych pakietów VP8 (#110).
- Rozszerzenie Leanback:
- Posłuchaj zmian w
playWhenReadywLeanbackAdapter(10420).
- Posłuchaj zmian w
- Obsada:
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 2.18.0 ExoPlayera.
- Biblioteka podstawowa:
- Włącz obsługę diagnostyki platformy Androida przez
MediaMetricsManager. ExoPlayer będzie przekazywać zdarzenia odtwarzania i dane o skuteczności do platformy, co pomoże dostarczać informacje o wydajności systemu i informacje na potrzeby debugowania na urządzeniu. Te dane mogą być też zbierane przez Google, jeśli użytkownik urządzenia włączył udostępnianie danych o użytkowaniu i diagnostyce. Aplikacje mogą zrezygnować z udostępniania danych diagnostycznych 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, na przykład podczas wczytywania napisów z boku i zmiany wybranych napisów w trakcie odtwarzania (#10248). - Zatrzymanie wykrywania typu sieci 5G-NSA w interfejsach API 29 i 30. Te odtworzenia będą zakładać sieć 4G.
- Nie zezwalaj na przekazywanie parametru
nulldo usługMediaSource.Factory.setDrmSessionManagerProvideriMediaSource.Factory.setLoadErrorHandlingPolicy. W razie potrzeby instancjeDefaultDrmSessionManagerProvideriDefaultLoadErrorHandlingPolicymożna przekazywać bezpośrednio. - Dodaj
MediaItem.RequestMetadata, aby reprezentować metadane potrzebne do odtwarzania multimediów, gdy dokładnyLocalConfigurationnie jest znany. Usuń teżMediaMetadata.mediaUrl, ponieważ jest teraz częściąRequestMetadata. - Dodaj
Player.Command.COMMAND_SET_MEDIA_ITEM, aby umożliwić graczom ustawienie pojedynczego elementu.
- Włącz obsługę diagnostyki platformy Androida przez
- Wybór ścieżki:
- Przekształć klasę
TrackSelectionOverrideswTrackSelectionParametersi awansujTrackSelectionOverridedo klasy najwyższego poziomu. - Zmień nazwę
TracksInfonaTracks, aTracksInfo.TrackGroupInfonaTracks.Group. Zmieniono też nazwyPlayer.getCurrentTracksInfoiPlayer.Listener.onTracksInfoChangednaPlayer.getCurrentTracksiPlayer.Listener.onTracksChanged. Obejmuje to „cofnięcie wycofania” nazwy metodyPlayer.Listener.onTracksChanged, ale z innymi typami parametrów. - Zmień
DefaultTrackSelector.buildUponParametersiDefaultTrackSelector.Parameters.buildUpon, aby zwracałyDefaultTrackSelector.Parameters.Builderzamiast wycofanegoDefaultTrackSelector.ParametersBuilder. - Dodaj
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities, która jest domyślnie włączona. Gdy ta opcja jest włączona,DefaultTrackSelectorpreferuje ś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 wielokanałowych, chyba że format wielokanałowy można przekształcić w dźwięk przestrzenny (Android 12L lub nowszy) lub jest to format dźwięku przestrzennego Dolby. Dodatkowo na urządzeniach obsługujących uprzestrzennianie dźwiękuDefaultTrackSelectorbędzie sprawdzać, czy nie nastąpiły zmiany we właściwościach uprzestrzenniania, i na tej podstawie uruchamiać wybór nowej ścieżki. 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 zostać utworzona za pomocąContext.
- Przekształć klasę
- Film:
- Zmień nazwę
DummySurfacenaPlaceholderSurface. - Dodaj obsługę AV1 do
MediaCodecVideoRenderer.getCodecMaxInputSize.
- Zmień nazwę
- Dźwięk:
- Użyj dekodera dźwięku LG AC3, który rozgłasza niestandardowy typ MIME.
- Zmień zwracany typ
AudioAttributes.getAudioAttributesV21()zandroid.media.AudioAttributesna nową klasę otokiAudioAttributesV21, aby zapobiec powolnej weryfikacji ART w interfejsie API < 21. - Wysyłanie zapytania do platformy (interfejs API 29 lub nowszy) lub zakładanie liczby kanałów kodowania dźwięku na potrzeby przekazywania dźwięku, gdy liczba kanałów dźwiękowych formatu nie jest ustawiona, co ma miejsce w przypadku przygotowywania HLS bez fragmentów (10204).
- 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 przewijania bezpośrednio po zmianie formatu (10274).
- Tekst:
- Zmień
Player.getCurrentCues(), aby zwracaćCueGroupzamiastList<Cue>. - SSA: obsługa ustawienia stylu
OutlineColour, gdyBorderStyle == 3(czyliOutlineColourustawia tło wskazówki) (#8435). - CEA-708: analizuj dane w wielu blokach usług i ignoruj bloki, które nie są powiązane z aktualnie wybranym numerem usługi.
- Usunięto
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). Napraw też dostarczanie zdarzeń doOnLongClickListenerwe wszystkich konfiguracjach widoku. - Naprawiliśmy błąd, który powodował, że sekwencja zdarzeń dotknięcia, które wychodzą poza granice
PlayerViewprzedACTION_UP, była nieprawidłowo traktowana jako kliknięcie (#9861). - Rozwiązaliśmy problem z ułatwieniami dostępu w
PlayerView, który powodował, że kliknięcie mogło przełączać odtwarzanie zamiast ukrywać elementy sterujące (#8627). - Zmodyfikuj
TrackSelectionViewiTrackSelectionDialogBuilder, aby działały z interfejsemPlayer, a nieExoPlayer. Dzięki temu widoki mogą być używane z innymi implementacjamiPlayeri usuwana jest zależność modułu interfejsu od modułu ExoPlayer. Jest to zmiana powodująca niezgodność. - Nie pokazuj 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:
- Analizuj liczbę kanałów z elementów DTS
AudioChannelConfiguration. Ponownie włączono przekazywanie dźwięku w przypadku strumieni DTS (#10159). - Nie zezwalaj na przekazywanie parametru
nulldo:DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby można jawnie przekazać instancjeDefaultCompositeSequenceableLoaderFactory.
- Analizuj liczbę kanałów z elementów DTS
- HLS:
- Wycofanie do przygotowania z fragmentami, jeśli atrybut CODECS playlisty nie zawiera kodeka audio (#10065).
- Nie zezwalaj na przekazywanie danych (
null) do tych usług:HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory,HlsMediaSource.Factory.setPlaylistParserFactoryiHlsMediaSource.Factory.setPlaylistTrackerFactory. W razie potrzeby można jawnie przekazać instancjeDefaultCompositeSequenceableLoaderFactory,DefaultHlsPlaylistParserFactorylub odwołanie doDefaultHlsPlaylistTracker.FACTORY.
- Smooth Streaming:
- Nie zezwalaj na przekazywanie parametru
nulldo:SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby instancjeDefaultCompositeSequenceableLoaderFactorymożna przekazywać bezpośrednio.
- Nie zezwalaj na przekazywanie parametru
- RTSP:
- Dodanie czytnika 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 jednokanałowe, nieprzeplatane strumienie AMR. Złożone dane RTP AMR nie są obsługiwane. (#46)
- Dodanie czytnika RTP dla VP8 (#47).
- Dodanie czytnika RTP dla WAV (#56).
- Popraw nagłówek podstawowej autoryzacji RTSP. (#9544).
- Zatrzymanie sprawdzania obowiązkowych pól SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
- Zgłaszanie wyjątku podczas analizowania czasu RTSP (#10165).
- Dodanie czytnika 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.MediaItemFillerelementemMediaSession.Callback.onAddMediaItems, aby umożliwić asynchroniczne rozwiązywanie żądań. - Obsługuj metody
setMediaItems(s), gdyMediaControllerłączy się ze starszą sesją multimedialną. - Usuń narzędzia
MediaController.setMediaUriiMediaSession.Callback.onSetMediaUri. Tę samą funkcję można uzyskać, używającMediaController.setMediaItemiMediaSession.Callback.onAddMediaItems. - Przekieruj połączenia starszego typu
MediaControllerdo odtwarzania multimediów naMediaSession.Callback.onAddMediaItemszamiast naonSetMediaUri. - Dodaj
MediaNotification.ProvideriDefaultMediaNotificationProvider, aby umożliwić dostosowywanie powiadomienia. - Dodaj
BitmapLoaderiSimpleBitmapLoader, aby pobrać obrazy okładek. - 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). - Zaktualizuj informacje o pozycji sesji na osi czasu(#51).
- Naprawiono błąd NPE w
MediaControllerImplBasepo zwolnieniu kontrolera (#74).
- Zastąp
- Odtwarzanie reklam / IMA:
- Zmniejsz częstotliwość sprawdzania reklam z co 100 ms do co 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, który powoduje niepowodzenie synchronizacji Gradle w Android Studio (#9933).
- Zaktualizuj wersję CMake do
- Usuń wycofane symbole:
- Usuń
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Użyj w zamian zasadyPlayer.Listener.onTracksChanged(Tracks). - Usuń narzędzia
Player.getCurrentTrackGroupsiPlayer.getCurrentTrackSelections. Użyj w zamian zasadyPlayer.getCurrentTracks. Możesz też nadal używać metodExoPlayer.getCurrentTrackGroupsiExoPlayer.getCurrentTrackSelections, chociaż są one wycofane. - Usuń stałe
DownloadHelper,DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORTiDEFAULT_TRACK_SELECTOR_PARAMETERS. W miarę możliwości używajgetDefaultTrackSelectorParameters(Context), a w pozostałych przypadkach –DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT. - Usuń konstruktora
DefaultTrackSelector(ExoTrackSelection.Factory). Użyj w zamian zasadyDefaultTrackSelector(Context, ExoTrackSelection.Factory). - Usuń
Transformer.Builder.setContext. Zamiast tego należy przekazać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 2.17.1 ExoPlayera.
- Dźwięk:
- Naprawiliśmy błąd sprawdzania możliwości dźwiękowych Dolby Atmos (E-AC3-JOC) w HLS.
- Ekstraktory:
- FMP4: rozwiązaliśmy problem, który powodował, że metadane próbek emsg mogły być wyświetlane w niewłaściwej kolejności w przypadku strumieni zawierających atomy emsg v0 i v1 (#9996).
- Tekst:
- Naprawiono interakcję między
SingleSampleMediaSource.Factory.setTrackIdiMediaItem.SubtitleConfiguration.Builder.setId, aby nadać priorytet poluSubtitleConfigurationi wrócić do wartościFactory, jeśli nie jest ustawiona (#10016).
- Naprawiono interakcję między
- Odtwarzanie reklamy:
- Naprawiono błędy niedomiaru dźwięku między okresami reklamowymi w transmisjach na żywo HLS 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 2.17.0 ExoPlayera.
- Biblioteka podstawowa:
- Dodaj chronioną metodę
DefaultRenderersFactory.getCodecAdapterFactory(), aby podklasyDefaultRenderersFactory, które zastępująbuildVideoRenderers()lubbuildAudioRenderers(), mogły uzyskać dostęp do fabryki adapterów kodeków i przekazać ją do tworzonych przez siebie instancjiMediaCodecRenderer. - Przekazywanie pól nagłówka ICY
nameigenreodpowiednio doMediaMetadata.stationiMediaMetadata.genre, aby docierały do aplikacji przezPlayer.Listener.onMediaMetadataChanged()(#9677). - Usuń puste klucze z aplikacji
DefaultHttpDataSource#getResponseHeaders. - Jeśli nie uda się utworzyć instancji
MediaCodec, odczekaj 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 wskaźnikach zMediaCodec. (#9766). - Naprawiono rozwiązywanie zależności Maven (#8353).
- Wyłącz automatyczne dostosowywanie szybkości w przypadku transmisji na żywo, które nie mają funkcji małych opóźnień ani ustawienia szybkości wybranego przez użytkownika (#9329).
- Zmień nazwę
DecoderCounters#inputBufferCountnaqueuedInputBufferCount. - Ustaw
SimpleExoPlayer.renderersjako prywatne. Dostęp do modułów renderujących można uzyskać za pomocąExoPlayer.getRenderer. - Zaktualizowano niektóre wartości stałych
AnalyticsListener.EventFlags, aby odpowiadały wartościom wPlayer.EventFlags. - Podzielono
AnalyticsCollectorna interfejs i domyślną implementację, aby umożliwić usunięcie przez R8, jeśli aplikacja nie potrzebuje tej funkcji.
- Dodaj chronioną metodę
- Wybór ścieżki:
- Dodaliśmy obsługę flag preferowanych ról wideo podczas wyboru ścieżki (#9402).
- Zaktualizowaliśmy 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).
- Zaktualizowaliśmy logikę wyboru ścieżki wideo i audio, aby wybierać tylko formaty do wyboru adaptacyjnego, 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 systemu) nad technicznymi ograniczeniami wyboru ścieżki (np. preferowanym typem MIME lub maksymalną liczbą kanałów).
- Rozwiązaliśmy 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 wyborem ścieżki, który powodował, że kombinacja niepustych i pustych zastąpień ścieżki nie była prawidłowo stosowana (#9649).
- Zabroń duplikowania
TrackGroupw:TrackGroupArray.TrackGroupmożna zawsze odróżnić, ustawiającidw konstruktorzeTrackGroup. Rozwiązaliśmy problem z awarią podczas wznawiania odtwarzania po przełączeniu aplikacji w tło z aktywnym zastąpieniem ścieżki (#9718). - Zmieniono logikę 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ę zastępczą dekodera Dolby Vision, aby w razie potrzeby używać zgodnego dekodera H264/H265.
- Dźwięk:
- Poprawiono logikę zastępczą dekodera Dolby Atmos (E-AC3-JOC), aby w razie potrzeby używać zgodnego dekodera E-AC3.
- Zmień interfejsy API
AudioCapabilities, aby wymagały jawnego przekazywaniaAudioCapabilities.DEFAULT_AUDIO_CAPABILITIESzamiastnull. - Zezwalaj na dostosowywanie 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:
- Dodano 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 danych poza zadeklarowanym rozmiarem bloku usługi.
- Dodano pole
- DRM:
- Usuń urządzenie
playbackLooperz kontaDrmSessionManager.(pre)acquireSession. GdyDrmSessionManagerjest używany przez aplikację w niestandardowymMediaSource,playbackLoopermusi zostać przekazany doDrmSessionManager.setPlayer.
- Usuń urządzenie
- Odtwarzanie reklam / IMA:
- Dodano obsługę dynamicznego wstawiania reklam (DAI) w pakiecie IMA (#8213).
- Dodano metodę do
AdPlaybackState, aby umożliwić resetowanie grupy reklam, dzięki czemu można ją odtworzyć ponownie (#9615). - Wymuszanie szybkości odtwarzania 1,0 podczas odtwarzania reklamy (#9018).
- Rozwiązaliśmy problem, który powodował, ż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 podstawowego adresu 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łniaj parametr
Format.labelw przypadku strumieni HLS zawierających tylko dźwięk (#9608). - Domyślnie używaj przygotowania bez fragmentów, aby skrócić czas uruchamiania. Jeśli Twoje wersje zawierają zmultipleksowane ścieżki z napisami, które nie są zadeklarowane na playliście reklamy nadrzędnej, dodaj je do playlisty reklamy nadrzędnej, aby były dostępne do odtwarzania, lub wyłącz przygotowywanie bez fragmentów za pomocą parametru
HlsMediaSource.Factory.setAllowChunklessPreparation(false). - Obsługa dokładnego wyszukiwania klatek kluczowych w HLS (#2882).
- Prawidłowo wypełniaj parametr
- RTSP:
- Udostępnienie interfejsu API klienta, który zastępuje
SocketFactoryużywany w przypadku dowolnego połączenia z serwerem (#9606). - Jeśli dostępne są obie metody uwierzytelniania, preferuj metodę DIGEST zamiast BASIC (#9800).
- Obsługa sytuacji, gdy czas ścieżki RTSP jest niedostępny (#9775).
- Ignorowanie nieprawidłowych wartości nagłówka RTP-Info (#9619).
- Udostępnienie interfejsu API klienta, który zastępuje
- Transformator:
- Zwiększ wymagany minimalny poziom API do 21.
TransformationExceptionjest teraz używany do opisywania błędów, które występują podczas przekształcania.- Dodaj
TransformationRequest, aby określić opcje przekształcania. - Zezwalaj na rejestrowanie wielu detektorów.
- Naprawiono błąd, który powodował, że Transformer zacinał się, gdy dane wyjściowe kodeka były częściowo odczytywane.
- Naprawiono potencjalny błąd NPE w
Transformer.getProgresspodczas zwalniania muxera. - Dodaj aplikację demonstracyjną, aby zastosować przekształcenia.
- Rozszerzenie MediaSession:
- Domyślnie
MediaSessionConnectorczyści teraz playlistę po zatrzymaniu. Aplikacje, które chcą zachować playlistę, mogą wywołać funkcjęsetClearMediaItemsOnStop(false)w oprogramowaniu sprzęgającym.
- Domyślnie
- Rozszerzenie Cast:
- Rozszerzenie FFmpeg:
- Uzależnienie
build_ffmpeg.shod binarnych narzędzi LLVM zamiast GNU (#9933).
- Uzależnienie
- Zgodność z Androidem 12:
- Zaktualizuj rozszerzenie Cast, aby zależało od
com.google.android.gms:play-services-cast-framework:20.1.0. Wcześniejsze wersjeplay-services-cast-frameworknie są zgodne z aplikacjami kierowanymi na Androida 12 i będą ulegać awarii z błędemIllegalArgumentExceptionpodczas tworzeniaPendingIntent(#9528).
- Zaktualizuj rozszerzenie Cast, aby zależało od
- Usuń wycofane symbole:
- Usuń
Player.EventListener. Użyj w zamian zasadyPlayer.Listener. - Usuń
MediaSourceFactory#setDrmSessionManager,MediaSourceFactory#setDrmHttpDataSourceFactoryiMediaSourceFactory#setDrmUserAgent. Użyj w zamian zasadyMediaSourceFactory#setDrmSessionManagerProvider. - Usuń
MediaSourceFactory#setStreamKeys. Użyj w zamian zasadyMediaItem.Builder#setStreamKeys. - Usuń
MediaSourceFactory#createMediaSource(Uri). Użyj w zamian zasadyMediaSourceFactory#createMediaSource(MediaItem). - Usuń
setTagz witrynDashMediaSource,HlsMediaSourceiSsMediaSource. Użyj w zamian zasadyMediaItem.Builder#setTag. - Usuń
DashMediaSource#setLivePresentationDelayMs(long, boolean). UżyjMediaItem.Builder#setLiveConfigurationiMediaItem.LiveConfiguration.Builder#setTargetOffsetMs, aby zastąpić plik manifestu, lubDashMediaSource#setFallbackTargetLiveOffsetMs, aby podać wartość zastępczą. - Usuń
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Nie można już zrezygnować z egzekwowania zasad dotyczących wątków. - Usuń
ActionFileiActionFileUpgradeUtil. Użyj ExoPlayera w wersji 2.16.1 lub starszej, aby użyćActionFileUpgradeUtildo scalenia starszych plików działań zDefaultDownloadIndex. - Usuń
ProgressiveMediaSource#setExtractorsFactory. Zamiast tego użyj konstruktoraProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory). - Usuń narzędzia
ProgressiveMediaSource.Factory#setTagiProgressiveMediaSource.Factory#setCustomCacheKey. Zamiast niej użyj 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. Użyj w zamian zasadyCronetDataSource.Factory.
- Usuń
- Zmień te ustawienia:
IntDefsna@Target(TYPE_USE). Może to spowodować błąd kompilacji użyć w Kotlinie, który można naprawić, przenosząc adnotację, aby dodać adnotację do 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(w pakieciecom.google.android.exoplayer2.ext.flac)@FlacExtractor.Flags(w pakieciecom.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 r.
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 ExoPlayer. Pierwsza wersja alfa zawiera wczesne, funkcjonalne implementacje bibliotek do implementowania przypadków użycia multimediów, w tym:
- ExoPlayer, odtwarzacz multimedialny na poziomie aplikacji na Androida, który można łatwo dostosowywać i rozszerzać.
- funkcje sesji multimedialnej do wyświetlania odtwarzania i sterowania nim; Ten nowy moduł sesji używa tego samego interfejsu
Playerco ExoPlayer. - Komponenty interfejsu do tworzenia interfejsów odtwarzania multimediów.
- Moduły opakowujące funkcje w innych bibliotekach 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 na GitHubie. W Media3 nazwa pakietu to androidx.media3.exoplayer. Planujemy przez jakiś czas utrzymywać i publikować projekt ExoPlayer na GitHubie, aby dać aplikacjom czas na przejście na Media3.
Media3 zawiera zamienniki wszystkich modułów ExoPlayer z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session. Zapewnia to bezpośrednią integrację odtwarzaczy i sesji multimedialnych bez konieczności używania klasy adaptera/konektora.