Media3
| Najnowsza aktualizacja | Wersja stabilna | Wersja kandydująca do publikacji | Wersja beta | Wersja alfa |
|---|---|---|---|---|
| 11 listopada 2026 r. | 1.11.1 | - | 1.12.0-beta01 | - |
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:
Odlotowe
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, a także zgłosić nowe problemy.
Wersja 1.12.0
Wersja 1.12.0-beta01
11 listopada 2026 r.
Wersja 1.12.0-beta01 zawiera te zatwierdzenia.
- Biblioteka wspólna:
- Zmniejsz
C.DEFAULT_BUFFER_SEGMENT_SIZEz65536do65520, aby każda alokacja bufora (w tym nagłówek obiektubyte[]) mieściła się w całych stronach systemu operacyjnego w przestrzeni dużych obiektów ART, co zmniejszy wykorzystanie pamięci bufora próbek o około 6% na urządzeniach ze stronami 4 KiB i o około 20% na urządzeniach ze stronami 16 KiB. - Zastąp
androidx.media3.common.util.NullableTypeadnotacją JSpecifyorg.jspecify.annotations.Nullable. - Usuń
androidx.media3.common.util.UnknownNullna rzecz adnotacji JSpecify nullness. Podklasy KotlinRunnableFutureTaskz typem wyniku, który może mieć wartość null (np.Void?), muszą określać argument typu, który może mieć wartość null (np.RunnableFutureTask<Void?, Exception>). - Dodaj
AdViewProvider.getAdVideoView(), aby udostępnić kontener wideoView, którego rozmiar można zmieniać podczas odtwarzania reklamy. - Zmapowano ciąg kodeka RFC 6381
mlpanaMimeTypes.AUDIO_TRUEHDwMimeTypes.getMediaMimeType, co rozwiązuje problem z brakującymi ścieżkami audio Dolby TrueHD podczas przygotowywania HLS bez fragmentów (#3485). - Popraw
AdPlaybackState.withAdDurationsUs, aby skopiować przekazaną tablicę, iAdPlaybackState.fromAdPlaybackState, aby skopiować wszystkie pola tablicy grup reklam, tak aby nie można było już modyfikować instancji za pomocą zachowanych lub udostępnionych tablic. - Naprawiliśmy błąd
IllegalStateException(„Player is accessed on the wrong thread”), który występował, gdy metodaPlayer.listenlubPlayer.listenTobyła anulowana z wątku innego niż wątek aplikacji odtwarzacza (np. podczas usuwania testu interfejsu Compose) (#3005).
- Zmniejsz
- ExoPlayer:
- Rozwiązaliśmy problem, który powodował, że moduł renderujący włączony wcześniej dla nadchodzącego okresu multimediów mógł rozpocząć renderowanie, zanim odtwarzanie przeszło do tego okresu.
- Podklasy Kotlin klasy
CompositeMediaSource, które używają identyfikatorów źródeł podrzędnych z możliwością wartości null (takich jakVoid?), muszą określać argument typu z możliwością wartości null (np.CompositeMediaSource<Void?>). - Sprawdź w
AdsMediaSource, czy wartośćAdPlaybackState.removedAdGroupCountnie zmniejsza się w przypadku aktualizacjiAdPlaybackState. - Rozwiązaliśmy problem, który powodował, że przejście między okresami multimediów korzystającymi z różnych modułów renderujących mogło przedwcześnie włączyć moduł renderujący, zanim poprzedni moduł renderujący zakończył renderowanie (np. powodując błąd
IllegalStateException(„Włączono wiele zegarów multimediów modułu renderującego”)), gdy włączona jest opcjaFlags.FLAG_PER_STREAM_MEDIA_PROGRESSION. - Rozwiązaliśmy problem, który powodował, że przejście do reklamy przy niestandardowej szybkości odtwarzania mogło opóźniać przejście wszystkich modułów renderujących do okresu reklamy, gdy włączona była opcja
Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION. - Rozwiązaliśmy problemy z wstępnym rozgrzewaniem modułów renderujących podczas przejść między okresami multimediów i ponownym wybieraniem ścieżek.
- Dodaj
MediaPeriod.supportsStreamPrerollFlags()(domyślniefalse), aby niestandardowe implementacjeMediaPeriodmogły raportować początkowe przerwy za pomocąSampleStream.getFlags(), przechodząc naMediaPeriod.readDiscontinuity(), gdy nie jest to obsługiwane i włączona jest opcjaFlags.FLAG_PER_STREAM_MEDIA_PROGRESSION. - Rozwiązaliśmy problem, który powodował, że pominięcie reklamy, po której następowała kolejna reklama w tej samej grupie reklam, było zgłaszane jako
DISCONTINUITY_REASON_AUTO_TRANSITIONzamiastDISCONTINUITY_REASON_SKIPlub nie było zgłaszane wcale, gdyAdsMediaSourceużywało leniwego przygotowywania źródła treści.
- Transformator:
- Dodaj CodecDB (
androidx.media3.transformer.codecdb), który na podstawie zmierzonych danych o jakości kodera rekomenduje konfiguracje kodera wideo (kodek, ustawienia kodera i szybkość transmisji bitów) dla bieżącego urządzenia.
- Dodaj CodecDB (
- Ekstraktory:
- ADTS: naprawiono błąd
AdtsExtractor, który powodował, że format audio był określany na podstawie fałszywego słowa synchronizacji w ładunku częściowej pierwszej klatki, co mogło powodować niepowodzenie lub zatrzymanie odtwarzania transmisji AAC na żywo dołączonych w połowie klatki (#3464). - Naprawiono błąd
ArrayIndexOutOfBoundsExceptionwFragmentedMp4Extractor, gdy fragment zawiera poletrunbez próbek (#3471). - ADTS: dodaj
FLAG_DISABLE_ID3_METADATAdoAdtsExtractor, aby zatrzymać dane ID3 w strumieniu przed ich wyjściem jako ścieżkaapplication/id3. - MP4: rozwiązano problem z odtwarzaniem bez przerw ścieżek AAC, których multiplekser (np. FFmpeg) skraca ostatni wpis
stts, aby wykluczyć dopełnienie kodera, co powodowało, że dopełnienie było określane jako 0 z listy edycjielsti był odtwarzany koniec ostatniej klatki (#3489). - Naprawiono duże początkowe przydziały bufora podglądu i
OutOfMemoryErrorpodczas wykrywania uszkodzonych lub innych niż multimedialne plików, które zaczynają się odID3(#3502).
- ADTS: naprawiono błąd
- Inspektor:
- Naprawiliśmy błąd, który powodował, że anulowanie obiektu Future zwracanego przez
MetadataRetriever.retrieveDurationUs()uniemożliwiałoclose()zwolnienie powiązanego obiektuMediaSource(#3468). - Popraw
MediaExtractorCompat, aby zwracaćMediaFormat.KEY_FRAME_RATEjako liczbę całkowitą, zgodnie z platformąMediaExtractor.
- Naprawiliśmy błąd, który powodował, że anulowanie obiektu Future zwracanego przez
- Dźwięk:
- Rozwiązaliśmy problem, który powodował, że buforowana pominięta cisza była uwzględniana w
AudioSink.getCurrentPositionUs(boolean)i zgłaszana za pomocąAudioSink.Listener.onSilenceSkipped(), zanim odtwarzanie dotarło do pominiętego regionu (#3472). - Ustaw pochodzenie kodeka za pomocą
AudioTrack.Builder.setCodecProvenancew interfejsie API 37 lub nowszym podczas odtwarzania wielokanałowego dźwięku PCM z efektem przestrzennym, który został zdekodowany ze skompresowanego formatu. - Naprawiono błąd polegający na pomijaniu ponownych prób inicjowania
AudioTrack, gdy 1 sekunda dźwięku jest co najmniej tak duża jak początkowy rozmiar bufora, co powodowało niepowodzenie przekazywania DTS-HD na urządzeniach z ograniczoną pamięcią audio (#3487).
- Rozwiązaliśmy problem, który powodował, że buforowana pominięta cisza była uwzględniana w
- Film:
- Zezwoliliśmy na przełączanie się na dekoder H.265/HEVC w przypadku strumieni Dolby Vision Profile 7 zgodnych wstecznie i nie przełączamy się już na dekoder AV1 w przypadku strumieni Profile 10, których warstwa podstawowa sygnalizuje pełny zakres z nieokreśloną charakterystyką transferu (#3486).
- Poprawiono wybór dekodera w
MediaCodecUtil, aby uniknąć wybierania dekoderów głównych, które nie obsługują profilu formatu (np. dekodera Dolby Vision dla innego profilu), gdy żaden dekoder nie obsługuje formatu w pełni (#3486).
- Tekst:
- Zmniejsz wykorzystanie pamięci w aplikacji
DvbParser, renderując regiony napisów bezpośrednio w bitmapach o rozmiarze regionu, zamiast zachowywać pełnoekranową bitmapę tymczasową.
- Zmniejsz wykorzystanie pamięci w aplikacji
- Efekt:
- Naprawiliśmy błąd
NullPointerExceptionwDefaultVideoFrameProcessorpodczas czyszczenia (np. podczas przewijania lub przesuwania wCompositionPlayer) (#3470). - Naprawiono błąd, który powodował, że
DefaultGlObjectsProvider.releasezgłaszałGlException, gdy dostawca był ponownie używany po wydaniu (#2016).
- Naprawiliśmy błąd
- Muksery:
- Sprawdź ścieżkę
Formatpodczas dodawania ścieżki doMp4MuxerlubFragmentedMp4Muxer, zamiast niepowodzenia później podczas zapisywania próbek lub zamykania multipleksera. - Spraw, aby wielokrotne wywołania metody
Muxer.close()nie powodowały żadnych działań we wszystkich implementacjach bibliotekiMuxeri traktuj multiplekser jako zamknięty, nawet jeśliclose()zgłasza wyjątek. Wywołanie dowolnej innej metody poclose()powoduje teraz zgłoszenie błęduIllegalStateException.
- Sprawdź ścieżkę
- Rozszerzenie IMA:
- Obsługuj interfejs
ResizablePlayerpakietu IMA SDK, aby umożliwić reklamom interaktywnym zmianę rozmiaru i pozycji widoku odtwarzacza wideo w kontenerze reklamy, oraz dodajImaAdsLoader.requestAds(DataSpec, Object, AdViewProvider)(wycofującImaAdsLoader.requestAds(DataSpec, Object, ViewGroup)).
- Obsługuj interfejs
- Sesja:
- Ustabilizowanie interfejsów API preferencji przycisków multimedialnych.
- Zmniejsz wykorzystanie pamięci, nie przechowując już skompresowanych danych grafiki w:
CacheBitmapLoader. - Unikaj zbędnych wywołań
MediaSession.setQueue(null)podczas aktualizacji osi czasu, gdy kolejka sesji platformy jest jużnull(np. gdyPlayer.COMMAND_GET_TIMELINEjest niedostępny). - Rozwiązaliśmy problem, który powodował, że
MediaSessionServicenie pozwalał implementacji usługi na prawidłowe przywrócenie działania, ponieważ nie próbował utworzyć nowej sesji (#3490). - Zgłaszaj
Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATEzamiastPlayer.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, gdy starsza aktualizacja metadanychMediaSessionCompatmodyfikuje metadane lub czas trwania aktywnego elementu kolejki bez zmiany kolejki. - Naprawiono brakującą grafikę w starszych sesjach, które ustawiają
nullMETADATA_KEY_DISPLAY_ICON(lub identyfikator URI grafiki) obok prawidłowegoMETADATA_KEY_ALBUM_ART: wartości null grafiki są teraz pomijane podczas konwertowania starszych metadanych.
- UI:
- Dodaj slot
subtitlesComposable doContentFrameiPlayerz domyślną obsługą wmedia3-ui-compose-material3renderowania bitmapy i poziomych wskazówek tekstowych napisów. - Dodano
SubtitleView.setTextDirectionHeuristic, aby umożliwić dostosowywanie heurystyki kierunku tekstu używanej do zawijania tekstu napisów dwukierunkowych (#3454). - Animuj wszystkie boksy elementów sterujących w
Playerwmedia3-ui-compose-material3, w tym niestandardowe, i usuń parametrvisiblezPlayerDefaults.TopControls,CenterControlsiBottomControls. Jest to zmiana powodująca niezgodność w niestabilnym interfejsie API. - Obsługuj
AdViewProvider.getAdVideoView()wPlayerView, opakowującexo_content_framewexo_content_frame_container. - Zmniejszono wykorzystanie pamięci w
SubtitleViewprzez zwalnianie buforowanych bitmap napisów i układów tekstu po wyczyszczeniu wskazówek oraz rozwiązano problem, który powodował, że nieaktualny tekst napisów mógł pozostawać widoczny, gdy wskazówka miała niewystarczającą szerokość do wyświetlenia.
- Dodaj slot
- Rozszerzenie HLS:
- Rozwiązaliśmy problemy, które powodowały, że ponowne wczytywanie nieudanego lub anulowanego fragmentu multimediów HLS mogło zachować częściowo zbuforowane próbki bez odrzucania lub łączenia albo zresetować pozycję wczytywania do nieaktualnej pozycji wyszukiwania (#3362).
- Naprawiono błąd
IllegalStateExceptionwystępujący podczas przechodzenia do początku buforowanego segmentu po przełączeniu ścieżki adaptacyjnej. - Rozwiązaliśmy kilka problemów z odtwarzaniem występujących podczas przełączania ścieżek za pomocą sterowania treściami HLS (#3465).
- Rozszerzenie DASH:
- Naprawiono błąd powodujący duplikowanie lub zniekształcanie napisów CEA-608, gdy strumień zawiera wiele osadzonych ścieżek z napisami (#887).
- Rozszerzenie Cast:
- Rozwiązaliśmy problem, który powodował, że żądania wczytania
RemoteCastPlayerbyły odrzucane przez odbiorniki Android TV (#3462). - Zaktualizuj zależność
com.google.android.gms:play-services-cast-frameworkdo wersji23.0.0. - Dodaj
CastParams.Builder.setSystemOutputSwitcherEnabled(boolean), aby określić, czy urządzenia Cast mają się wyświetlać w systemowym przełączniku wyjścia bez konieczności deklarowaniaMediaTransferReceiverwAndroidManifest.xml, i domyślnie włącz systemowy przełącznik wyjścia w przypadku aplikacji kierowanych na interfejs API 37 lub nowszy na urządzeniach z interfejsem API 37 lub nowszym. - Obsługuj wstępnie zdefiniowane pola Cast
MediaMetadatawDefaultMediaItemConverter, mapując pola bez dedykowanej właściwościMediaItem.mediaMetadatado i zMediaItem.mediaMetadata.extras, oraz zachowuj niestandardowe dodatki wMediaInfo.customData. - Zatrzymano zgłaszanie wyjątków w
DefaultMediaItemConverter, gdy brakuje identyfikatora URI odtwarzania lub konwersja się nie powiedzie, co pozwala zachować identyfikator multimediów i metadane na osi czasuCastPlayerw przypadku elementów kolejki przesyłania bez identyfikatora URI odtwarzania. - Dodaj
SessionAvailabilityListener.onCastSessionAvailable(boolean), aby wskazać, czy dostępna sesja Cast została rozpoczęta za pomocą Intent to Join, i zachowaj stan odtwarzania zdalnego zamiast zastępować go stanem odtwarzacza lokalnego podczas dołączania do sesji Cast za pomocą Intent to Join wCastPlayer. - Wypełniaj
MediaInfoi czas trwania na osi czasu zMediaMetadata.durationMsw przypadku elementów innych niż na żywo wDefaultMediaItemConverteriRemoteCastPlayeroraz zachowuj czas trwania określony przez odbiornik i stan transmisji na żywo podczas wyszukiwania w kolejce.
- Rozwiązaliśmy problem, który powodował, że żądania wczytania
- Aplikacja demonstracyjna:
- Zezwalaj na zmianę kolejności elementów na playliście przez przeciąganie w aplikacji demonstracyjnej sesji.
- Usuń wycofane symbole:
- Usuń
androidx.media3.transformer.TextureAssetLoader. Użyj w zamian zasadyandroidx.media3.transformer.RawAssetLoader. - Usuń publiczne konstruktory
DefaultDecoderFactory. Użyj w zamian zasadyDefaultDecoderFactory.Builder. - Usuń
DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_BLACKLIST_MS. Użyj w zamian zasadyDefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_EXCLUSION_MS. - Usuń
DefaultVideoFrameProcessor.Factory.Builder.setRequireRegisteringAllInputFrames(boolean). Użyj w zamian zasadyVideoFrameProcessor.INPUT_TYPE_SURFACE_AUTOMATIC_FRAME_REGISTRATION. - Usuń
EditedMediaItemSequence.Builder.experimentalSetForceAudioTrack(boolean)iEditedMediaItemSequence.Builder.experimentalSetForceVideoTrack(boolean). Użyj w zamian zasadyEditedMediaItemSequence.Builder(Set). - Usuń
EditedMediaItemSequence.forceAudioTrack. Użyj w zamian zasadytrackTypes.contains(C.TRACK_TYPE_AUDIO). - Usuń
EditedMediaItemSequence.forceVideoTrack. Użyj w zamian zasadytrackTypes.contains(C.TRACK_TYPE_VIDEO). - Usuń narzędzia
ExportResult.durationMsiExportResult.Builder.setDurationMs. Zamiast niej użyj zasadExportResult.approximateDurationMsiExportResult.Builder.setApproximateDurationMs. - Usuń
SilenceSkippingAudioProcessor.DEFAULT_PADDING_SILENCE_US. Zamiast tego określ zachowanie ciszy za pomocąsilenceRetentionRatio. - Usuń
Timeline.getPeriodPosition(Window, Period, int, long, long). Użyj w zamian zasadyTimeline.getPeriodPositionUs(Window, Period, int, long, long).
- Usuń
Wersja 1.12.0-alpha02
26 października 2026 r.
Wersja 1.12.0-alpha02 zawiera te zatwierdzenia.
- Usługi Google Play dotyczące efektów:
- Wprowadzamy nowy moduł
media3-effect-play-services, który udostępnia efekty multimedialne Usług Google Play, w tymEnhancementSessionDecoratordo ulepszania filmów iStudioSoundAudioProcessordo separacji źródeł dźwięku.
- Wprowadzamy nowy moduł
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ługuj przestrzeń 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.NonNullApiadnotacją 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ę załadować pierwszego fragmentu następnego okresu (#3396).
- Zgłoś błąd
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 dokładniej obliczać przydział 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. - Naprawiono błąd, który powodował, że funkcja
Player.getCurrentPosition()mogła zwracać nieaktualne wartości (aktualizowane tylko kilka razy na sekundę), gdy włączone było planowanie dynamiczne (#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 nadchodzącego elementu playlisty mógł przedwcześnie przerwać bieżące odtwarzanie, gdy włączona była opcja
Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION. - Naprawiono błąd (
NullPointerException), który mógł wystąpić, gdyExoPlayerprzełączał renderery na nieprzygotowany okres multimedialny, gdy włączona była opcjaFlags.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, który występował podczas zatrzymywania odtwarzania reklamy w transmisji na żywo (#3423). - Rozwiązaliśmy problem, który powodował, że
PreloadMediaSourcemogło nieoczekiwanie opublikować zdarzenie wstępnego ładowania, gdypreload()nie zostało wywołane (#3408). - Rozwiązaliśmy problem, który powodował, że wartość
Format.subsampleOffsetUsbyła ignorowana w przypadku ścieżek metadanych, co powodowało nieprawidłowe sygnatury czasowe odtwarzania w zdekodowanych poleceniach łączenia SCTE-35 (#3413). - Naprawiono wyciek pamięci w
PreloadMediaSourceiDefaultPreloadManager, gdy metodapreload()jest wywoływana wielokrotnie w tym samym źródle (#3445). - Naprawiono błąd
NullPointerExceptionpodczas 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 podczas rozpoczynania 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 były wolno przygotowywane, 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. - Naprawiliśmy 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ą. Jest to możliwe 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 eksportu. - Naprawiliśmy 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ą. Jest to możliwe 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 kompresowanie 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ć poleMp4LocationData. - Dodaliśmy
ExtractorUtil.getFramesPerEncodedSample, aby obliczać liczbę klatek audio na próbkę w przypadku zakodowanych formatów audio (#3367). - Dodaj
FLAG_READ_XMP_METADATAdoMp4Extractor, aby wyodrębnić metadane XMP z pól 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 komunikatów 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: analizowanie ścieżek metadanych z kodem 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 naprawiono sygnatury czasowe próbek po przejściu do strony, która zaczyna się od kontynuowanego pakietu.
- Ogg: naprawiono błędy dekodowania i przeskoki 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 kodowaniem czasowym w ramkach
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 Opus w formatach Ogg i WebM/Matroska (#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 płynne przejścia 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, tak aby były zgłaszane 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 GMSCore dźwięku studyjnego.
- Zaimplementuj
- Muksery:
- Naprawiono zapisywanie pola
dOpsdla 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). - Odrzucanie nieobsługiwanych profili 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
ImaServerSideAdInsertionMediaSource.
- Przekaż zdarzenia wstrzymania i wznowienia odtwarzacza do pakietu IMA SDK w
- 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. - Rozwiązaliś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ść. - Rozwiązaliśmy problem, 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 ponownego inicjowania żą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ązanymBundle. - Połączenie wychodzące
MediaControllerCompat.TransportControlswywołuje się 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 zawijanie tekstu dwukierunkowego (#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 przewijania do urządzenia
ProgressSlider, jeśli jest ono oparte na urządzeniuExoPlayerlubCompositionPlayer. - Dodaj obsługę
showArtworkdoPresentationStatei używaj jej do mierzenia czasu renderowania podanego opcjonalnego elementu kompozycyjnegoartworkwContentFrameiPlayer. Dodaj element kompozycyjnyArtwork, który będzie używany 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ąć treść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 strumienia 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 alternatywnego MPD (
urn:mpeg:dash:event:alternativeMPD:insert:2025) i zastępowania (urn:mpeg:dash:event:alternativeMPD:replace:2025) wDashManifestParseroraz udostępnianie ich jako instancjiAlternativeMpdEventwPeriod.alternativeMpdEvents. Jest to zmiana powodująca niezgodność w aplikacjach, które są podklasamiDashManifestParser: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 będzie 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 podglądu (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ściami 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 alternatywnego MPD (
- 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 może wystąpić podczas przetwarzania opóźnionych odpowiedzi sieciowych po zresetowaniu stanu przez klienta RTSP podczas ponownego wyboru ścieżki, zakończenia sesji lub przekierowania URI. - Rozwiązaliśmy problem, który powodował, że ponowne przewijanie przed ponownym uruchomieniem 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 błąd JNI podczas dekodowania nieprawidłowych danych Opus.
- Rozszerzenie Opus: rozwiązano problem z ignorowaniem dopełnienia odrzucenia, gdy dopełnienie przed pominięciem i dopełnienie odrzucenia znajdują 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 w odpowiedniej kolejności (#2639, #3272). - Rozwiązaliśmy problem, 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 wartości
playWhenReady,repeatModeiplaybackParametersnie były przenoszone ani stosowane, gdy ustawiono je wRemoteCastPlayerprzed wczytaniem elementów multimedialnych (np. podczas przenoszenia odtwarzania z urządzenia 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
RemoteCastPlayerzCastTrackSelectorw 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
- Utwórz:
- 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) renderera dodatkowego.
- Rozwiązaliśmy problem ze wstępnym rozgrzewaniem, który powodował, że
Surfacepowinien zostać zwrócony do głównego renderera, gdy przewijanie resetuje i wyłącza oba renderery. - Naprawiono błąd
ArrayIndexOutOfBoundsException, który powodował, że gdy odświeżenie osi czasu na żywo przesuwało domyślną pozycję za reklamę wstawioną po stronie serwera, która była aktualnie 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 filmu.
- 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.
- Naprawiono 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ł, gdyMediaControllerw trakcie przetwarzania był 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:
- Rozszerzenie DASH:
- Naprawiliśmy błąd powodujący nieprawidłowe obliczanie sygnatury czasowej próbki w przypadku ścieżek obrazu z
presentationTimeOffset(#3334).
- Naprawiliśmy błąd powodujący 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. - Zmniejszono rygorystyczność sprawdzania liczby grup reklam w
AdsMediaSource, aby umożliwić zmniejszenie liczby grup reklam po pełnym przetworzeniu grupy reklam (hasUnplayedAds()tofalse), co pozwala na dynamiczne zmienianie rozmiaru grup reklam podczas procesów 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. - W przypadku gdy formaty strumienia nie podają prawidłowej wartości, do obliczenia szybkości działania kodeka użyj estymatora liczby klatek w
MediaCodecVideoRendereri formatu wyjściowego kodeka wMediaCodecAudioRenderer. Pozwoli to uniknąć niepotrzebnych resetów kodeka. - Usuń przycinanie treści w przypadku reklam wstawianych po stronie klienta w głównym odtwarzaczu. Zamiast tego logiką przycinania zajmuje się
AdsMediaSource. 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 poprawnie sformułowanym, ale nierozpoznanym profilem lub poziomem kodeka oznaczaj 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 elementSimpleRankingDataComparatormoż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. - Ujednolicenie obsługi obrazów nieruchomych, gdy nie jest ustawiony parametr
MediaItem.imageDurationUs: obrazy nieruchome 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 wyrównaćBandwidthMeterdoMediaSource. Domyślnie nadal będzie wywoływana wycofana metoda z niestandardową implementacją. Zalecamy jednak 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ęto niepotrzebne resetowanie, które może wystąpić podczas dołączania ścieżek z próbkami reklam przed filmem do aktywnego odtwarzania.
- W
DefaultBandwidthMeterzoptymalizujgetInitialBitrateCountryGroupAssignment, aby zwracać 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). - Dodano eksperymentalną obsługę odtwarzania metadanych czasowych 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 w wersji 37 lub nowszej. 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 liczby zdarzeń
ExportResult.fileSizeBytes.
- Rozwiązaliśmy problem, który mógł powodować zawyżanie liczby zdarzeń
- 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 powodować utratę lub zastąpienie 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: dodaliśmy 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ą udostępniane 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żywaj 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 strumieni podrzędnych Core i Extension w jedną próbkę, co rozwiązało problemy z odtwarzaniem, gdy wcześniej były one odtwarzane 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: upewnij się, że ostatnia klatka jest renderowana 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 wyeliminować przejściowe niedobory i uniknąć nieoczekiwanych stanów buforowania podczas aktywnego odtwarzania (#3210).
- Zmień 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ąpienia metodyForwardingAudioSink.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- 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:
- Poprawiliśmy logikę dołączania do filmu, aby porzucone bufory podczas dołączania były liczone jako pominięte, a nie porzucone.
- Naprawiono 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 z 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 przesyłać 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 błędy
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 dla poszczególnych kontrolerów 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, 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. - Naprawiliśmy problem, który powodował, że przeglądanie Bluetooth AVRCP nie rozpoznawało
MediaLibraryServicew interfejsach API 36 i 37. - Naprawiono podwójne zmniejszanie grafiki w aplikacji
MediaSession, gdy rozmiar obrazu jest zbliżony do limitu platformy, co rozwiązuje problem z niewyraźnymi powiadomieniami (#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 rozpowszechnia 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 błędy
- UI:
- Naprawiono błąd powodujący renderowanie pierwszej klatki w nieprawidłowym rozmiarze, gdy
ContentFramejest rekomponowany w trakcie odtwarzania (#3238). - Dodaj klasę
CurrentMediaItemStatei odpowiadający jej elementrememberCurrentMediaItemStateComposable do 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 elementrememberPlaylistStateComposable do 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ę, grafikę i postęp bieżącego elementu multimedialnego. - Dodaj klasę
ErrorStatei odpowiadający jej elementrememberErrorStateComposable do 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 treści. - Opublikuj
PlayerPool(common-ktx) irememberPooledPlayer(ui-compose), aby umożliwić wstępne wczytywanieMediaItemsw środowiskach interfejsu 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 pliki:
- Rozwiązywanie zmiennych HLS na playliście multimediów podczas pobierania (#3258).
- Rozszerzenie Ktor:
- Rozszerzenie HLS:
- Dodaliśmy 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 na potrzeby ponownego rozpoznawania 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ż podstawowa ani aktywna (#3254).
- Naprawiono obliczanie przesunięcia wznowienia treści podczas rozwiązywania list komponentów 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:
- Rozdziel napisy CEA na różne elementy
TrackGroupna podstawie języka (#3113). - Dodaj 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 (
IndexOutOfBoundsException) powodujący awarię podczas otwierania plików manifestu z pustym elementem<SegmentTimeline/>(#3326).
- Rozdziel napisy CEA na różne elementy
- Rozszerzenie RTSP:
- Naprawiono przejściowe problemy z zatrzymywaniem lub niepowodzeniem odtwarzania 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). - Dodano nową opcję
CastParams.getShowSystemOutputSwitcherOnCastIconClick(), która powoduje użycie przełącznika wyjścia SystemUI zamiast selektora urządzenia przesyłającego w aplikacji, jeśli jest 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). - Naprawiono 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
CastPlayerelementówMediaItems, 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ń
- Tworzenie
- Zaktualizowaliśmy instrukcje
README.mddotyczące lokalnego polegania na 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 wyniku kodeka do preferencji 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:
- Naprawiono błąd, który mógł powodować nieprawidłowe kierowanie zdarzeń audio, jeśli do odtwarzacza dodano wiele 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
queueSecureInputBufferdla interfejsu API 31+. 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:
- Naprawiono błąd, który powodował zgłaszanie wyjątku
ArrayIndexOutOfBoundsExceptionpodczas przełączania na strumień zastępczy, jeśli wybrana ścieżka była podzbiorem dostępnych ścieżek (#3161). - Naprawiliśmy błąd, 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).
- Naprawiono błąd, który powodował zgłaszanie wyjątku
- 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. Zazwyczaj 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 żądano odtwarzania 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 na końcu 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 przypadku filmów, co jest szczególnie przydatne, gdy zwiększasz szybkość multimediów za pomocąsetSpeed().
- Wybór ścieżki:
- Zmień sygnaturę metody
DefaultTrackSelector.selectAllTracks, aby uwzględnić tablicę wyjściową jako parametr, wstępnie wypełniony zastąpieniami ścieżek. - Rozwiązaliśmy problem polegający na tym, że wbudowane ścieżki metadanych były wybierane niezależnie od tego, czy wybrana była odpowiednia ścieżka główna (#294).
- Opcje stabilizacji
TrackSelectionParametersdla:preferredVideoLanguages,preferredVideoLabels,preferredAudioLabels,preferredTextLabelsiselectTextByDefault.
- Zmień sygnaturę metody
- 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. - Wprowadź nowy moduł do wyodrębniania i przetwarzania zdekodowanych klatek wideo.
- Zmiana powodująca niezgodność: usuń
- Dźwięk:
- Zmieniono podstawową bibliotekę dekodowania rozszerzenia dekodera IAMF z
libiamfnaiamf_tools. - Dekodowanie IAMF obsługuje wyjście obustronne przez dekoder (przy użyciu rozszerzenia dekodera IAMF) lub przez Android Spatializer.
- Prawidłowe usuwanie obsługi
AC4Profile22i innych starszych profili podczas oceny obsługi dekodera AC-4 w scenariuszach motoryzacyjnych (#2609). - Ulepszono logikę ponawiania inicjowania
AudioOutputwDefaultAudioSink(#2905). - 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 podpowiedzi 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 wersje 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 API Ad media info.
- 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. kont.
- Sesja:
- Naprawiliśmy błąd, który powodował, że duże tablice w
MediaMetadata.artworkDatamogły powodować awarię aplikacji. - Użyj typu int dla argumentu
@Player.Commandw interfejsieActionFactory(#2933). - 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 nieaktywnych 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 programów, które implementują niestandardowy elementMediaNotification.Provider, ponieważ pojawiła się nowa wymagana metoda. - Dodaj kreatory instancji
PendingIntentdo użycia z widżetami ekranu głównego (#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, który powodował, że obejście dotyczące umieszczania przycisków interfejsu systemu negatywnie wpływało na inne elementy interfejsu, 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 którym 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 wykonywać operacje przewijania za pomocą przeciągania i kliknięcia (#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 powiadomień, 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 playlist HLS przez buforowanie dopasowań wyrażeń regularnych (#3008).
- Udostępnianie ścieżki metadanych ID3 (EMSG) w wersjach audio (#3043).
- Zezwalanie na zastępczą lokalizację w przypadku wystąpienia błędów wczytywania, jeśli dostępne są nadmiarowe strumienie z różnych lokalizacji (#1988).
- Poprawiono działanie X-SNAP w przypadku reklam pełnoekranowych HLS, aby prawidłowo obliczać pozycję 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óra obejmowała wiele pakietów RTP. Powodowało to powstawanie artefaktów wizualnych i uszkodzeń w filmie (#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 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, który powodował, że obejście dotyczące umieszczania przycisków interfejsu systemu negatywnie wpływało na inne elementy interfejsu, 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ł, żeFileNotFoundExceptioni podobne typy wyjątków były wielokrotnie ponawiane. - Naprawiono błąd związany z dynamicznym planowaniem, w wyniku 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 pliki Dolby Vision nie były odtwarzane, gdy próbowano użyć 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).
- Unikanie 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łowe usuwanie obsługi
AC4Profile22i innych starszych profili podczas oceny obsługi dekodera AC-4 w scenariuszach motoryzacyjnych (#2609).
- Prawidłowe usuwanie obsługi
- Film:
- Odrzucanie kodeków wideo na urządzeniach z interfejsem API w wersji starszej niż 30, gdy zmienia się liczba klatek treści, aby uniknąć zacinania się odtwarzania (#2941).
- Tekst:
- VobSub: naprawiliśmy problem z brakującymi napisami przez prawidłową obsługę SPU, które zawierają tylko jedną sekwencję sterującą lub mają ważne informacje podzielone na kilka sekwencji sterujących (#2935).
- Rozszerzenie IMA:
- Poprawka błędu: rozwiązaliśmy problem, 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 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 instancji
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 systemowych dotyczących multimediów (#2976). - Przeniesiono skalowanie bitmapy ikony powiadomienia poza główny wątek (#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 pliki:
- 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:
- Naprawiono błąd, który uniemożliwiał prawidłowe aktualizowanie osi czasu
RemoteCastPlayerpodczas zastępowania playlisty.
- Naprawiono 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, co 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 przypadku innych odtwarzaczy (#1893). - Naprawiono obsługę detektora
ForwardingPlayer, gdy odtwarzacz delegowany używa równości referencyjnej do porównywania instancji detektora (#2675). - Dodaj funkcję rozszerzenia zawieszenia
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 niewiarygodnie 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_READYprzekraczającej zadeklarowany czas 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. Jest 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
Contextpierwotnie przekazanym 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.Builderna potrzeby 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 dodają elementy multimedialne lub źródła multimediów zbiorczo, a następnie automatycznie wywołują metodęinvalidate(). - Dodaj metody
removeMediaItems((List<MediaItem>)iremoveMediaSources(List<MediaSource>), które usuwają elementy multimedialne lub źródła multimediów zbiorczo, i upewnij się, że menedżer wstępnego wczytywania nie rozpocznie ani nie będzie kontynuować wstępnego wczytywania żadnego z nich po usunięciu. - 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 zdjęć 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
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).
- Dodaj interfejs API, aby ustawiać i obserwować parametry 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 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 przechodzenie do innych elementów multimedialnych w trybie przewijania mogło powodować
IllegalStateException. - Napraw potencjalny błąd
NullPointerExceptionwDefaultPlaybackSessionManager(#2885). - Włącz ulepszenia wydajności przewijania w przypadku kwalifikujących się filmów.
- Ponownie włączono używanie asynchronicznego odszyfrowywania w MediaCodec w interfejsie API 36+, w którym 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 działać 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ępna do eksperymentowania, ale nadal jest w fazie rozwoju. 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. odczytanych 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ł jawnych 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óżnianie typów MIME
audio/mpeg(MP3),audio/mpeg-L1iaudio/mpeg-L2przez sprawdzanie wartości warstwy pierwszej próbki przed wyemitowaniem formatu ścieżki z ekstraktora (#2683). - MP4: poprawiono skuteczność wykrywania bardzo dużych plików przez założenie, że pole
stblwiększe niż 1 MB oznacza, że plik nie może być 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 osadzone ś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 będzie udostępniać 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ługuj przewijanie w aplikacji
GainProcessor. - Wykorzystanie możliwości profilu i poziomu dekodera AC-4 w ocenie obsługi formatu ścieżki (#2580).
- Unikanie 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 z trybem ScrubbingMode, który powodował zawieszanie się odtwarzacza 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ść źródła, ale można ją ł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
- Muksery:
- 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, aby aplikacje mogły 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żliwość 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). - Dodano
MediaSessionService.triggerNotificationUpdate, aby ręcznie aktywować aktualizację powiadomień (#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. - Naprawiono 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 funkcjami media1 i platformy (#2637). - Naprawiono błąd, który powodował, że funkcja
getCurrentTimeline()była wywoływana przezPlayerWrapper, nawet gdy polecenie było niedostępne (#2665). - Naprawiono błąd, który powodował, że wiadomość pozostawała w kolejce wiadomości głównej pętli, co prowadziło do wycieku pamięci po zakończeniu działania usługi (#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 sesja ustawia identyfikator sesji audio (#244). - Naprawiliśmy błąd, który powodował, że
KEYCODE_HEADSETHOOKnie uruchamiało odtwarzacza, gdy zdarzenie klawisza multimedialnegoIntentdocierało doonStartCommand(). Rozwiązaliśmy ten problem, obsługując „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 może obsłużyć 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ł kompresowany wielokrotnie podczas łączenia elementuMediaControllerz 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 do
ui-composeelementMuteButtonState, 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 w funkcjidemo-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. - Naprawiono błąd, który powodował, że czas rozpoczęcia playlisty był pomijany, gdy tag EXT-X-PROGRAM-START-DATE definiujący datę rozpoczęcia został usunięty z playlisty (#2760).
- Użycie wyszukiwania binarnego do znalezienia 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
UnsupportedOperationExceptionpodczas odtwarzania strumieni DASH z niehierarchicznym plikiem manifestu URIdata:(#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ązaliśmy 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 działanieCastPlayer, które obsługuje tylko odtwarzanie Cast, możesz użyćRemoteCastPlayer. Dotychczasowe konstruktoryCastPlayerzachowują swoje stare działanie, ale są wycofywane na rzecz kreatorówCastPlayerlubRemoteCastPlayer. - Przestań wymuszać typ MIME inny niż null w
DefaultMediaItemConverter. - Użyj
MediaItem.mediaMetadata.mediaType, aby określić MEDIA_TYPE przesyłania, który ma być używany wDefaultCastOptionsProvider#toMediaQueueItem, gdy jest dostępny. - Włącz przesyłanie z lokalizacji zdalnej do lokalnej 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ślnie jest to 1 sekunda, ale można to 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 aplikacji
ForwardingSimpleBasePlayer.
- Dodaj obsługę zastępowania odtwarzacza w aplikacji
- 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łania metodyRendererCapabilities.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 przechodzenia do końca elementu.
- Domyślnie używaj
MediaCodec.BUFFER_FLAG_DECODE_ONLYw trybie przewijania. - Zgłaszanie błędu
IllegalStateException, gdyPreloadMediaSourcejest odtwarzany przezExoPlayerz wątkiem odtwarzania innym niż wątek wstępnego wczytywania (#2495). - Dodano
cloneAndMovedoShuffleModez domyślną implementacją (#2226). - Zmień działanie domyślne 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 opcja
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(..)naExoPlayeriExoPlayer.Builder. - Zezwalaj na dostosowywanie tolerancji ułamkowej podczas przewijania w trybie czyszczenia.
- 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 metodzie
CmcdConfiguration.Factoryna zwracanie wartościnull, aby wyłączyć logowanie CMCD w przypadku określonych elementów multimedialnych (#2386). - Zwiększyliśmy 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()) cichym dźwiękiem 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, żeby 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ą na początku segmentu Exif (#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).
- Naprawiono analizowanie 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-bitowy zmiennoprzecinkowy format PCM nie jest obsługiwany). - MP4: obsługa części obrotu w macierzach przekształceń
tkhd, które zarówno obracają, jak i odzwierciedlają film. Dzięki temu filmy nagrane przednim aparatem iPhone'a są wyświetlane we właściwej orientacji, ale nieprawidłowo odbite w osi Y (#2012). - MP3: używaj czasu trwania i rozmiaru danych z nieobsługujących przewijania metadanych Xing, VBRI i podobnych metadanych o zmiennej szybkości transmisji bitów, gdy przełączasz 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 funkcja
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 liniowych PCM w
ChannelMappingAudioProcessoriTrimmingAudioProcessor. - Dodaliśmy obsługę przerw w dźwięku w
CompositionPlayer. - Usuń nieprawidłowe wywołanie funkcji
BaseAudioProcessor#flush()z plikuBaseAudioProcessor#reset(). - Zezwalaj na miksowanie w górę i w dół ze stałą mocą w DefaultAudioMixer.
- Ustaw
ChannelMappingAudioProcessor,TrimmingAudioProcessoriToFloatPcmAudioProcessorjako publiczne (#2339). - Użyj
AudioTrack#getUnderrunCount()wAudioTrackPositionTracker, aby wykrywać niedopełnienia wDefaultAudioSinkzamiast szacowania na podstawie najlepszych starań. - Ulepszyliśmy wygładzanie sygnatury czasowej 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.
- Rozwiązaliśmy problem polegający na tym, że
AnalyticsListener.onAudioPositionAdvancingnie podawał czasu rozpoczęcia odtwarzania dźwięku, tylko 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 funkcja
- Film:
- Rozszerzono obejście problemu z odłączoną powierzchnią na urządzenia „lenovo” i „motorola” (#2059).
- Ulepszyliśmy płynne wyświetlanie 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, że ma 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 utwory 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 wczytuje się, a później wczytuje się prawidłowo, po czym następuje kilka pustych segmentów napisów (#2517).
- Naprawiono błąd, który powodował, że po włączeniu napisów w formatach SSA i SubRip wyświetlał się komunikat o trwającym procesie (#2309).
- Naprawiono błąd, który powodował, że odtwarzanie zacinało się 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). - Dodano obsługę 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ę funkcji
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
- Muksery:
- Naprawiliśmy błąd polegający na tym, że w przypadku próbek audio we fragmencie MP4 nie były ustawiane prawidłowe flagi próbek.
- Interfejs API
writeSampleData()używa teraz klasyBufferInfo, która jest powiązana 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
MediaPeriodQueue(#2215).
- Sesja:
- Naprawiliśmy błąd, który powodował, że połączenia z zewnętrznych kontrolerów Media3 bez uprawnień były ignorowane.
- 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 StrictMode dotyczących niebezpiecznego uruchamiania (#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 aplikacji sesji z błędem
ClassNotFoundException. - Naprawiliśmy 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 zaobserwowaniem 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ń
PlayerSurfacetak, aby akceptował argumentPlayer, który może mieć wartość null.
- Naprawiliśmy błąd, który powodował, że
- Pobrane pliki:
- 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órym zastąpione zostaną 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 określony 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 zmiany wyboru ścieżki po załadowaniu części o niskim opóźnieniu i wskazówki dotyczące wstępnego ładowania mogły powodować zawieszanie się odtwarzania (#2299).
- Zapobieganie nadmiernemu ponownemu wczytywaniu przez oczekiwanie przez połowę docelowego czasu trwania, gdy serwer nie uwzględnia nagłówka
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). - Dodaliśmy 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 zabrakło segmentów 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 ze znakami odstępu na końcu (#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 jego 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 mieć oznaczenie 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).
- Rozwiązaliśmy problem, który powodował, że
ProgressiveMediaPeriodzgłaszał błądIllegalStateException, gdyPreloadMediaSourcepróbował wywołaćgetBufferedDurationUs(), zanim był on gotowy (#2315). - Naprawiono wysyłanie
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ązaliśmy 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 agregacji dla 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 metodaCOMMAND_GET_CURRENT_MEDIA_ITEMbyła dostępna, a odtwarzacz 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 agregacji dla wywołań zwrotnych platformy
- UI:
- Włącz
PlayerSurface, aby współpracować 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 kompilatora Compose. Uaktualnij 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). - Zmieniono 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. - Dodaj eksperymentalną obsługę wstępnego rozgrzewania ExoPlayera na potrzeby odtwarzania za pomocą
MediaCodecVideoRenderer. Możesz skonfigurowaćDefaultRenderersFactoryza pomocąexperimentalSetEnableMediaCodecVideoRendererPrewarming, aby zapewnić dodatkowyMediaCodecVideoRendererdlaExoPlayer. Jeśli ta opcja jest włączona,ExoPlayerwstępnie przetwarza filmy z kolejnych elementów multimedialnych podczas odtwarzania, aby zmniejszyć opóźnienie przejścia 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 odpowiadających im 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ń plików 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 dodatkowe klatki tylko do dekodowania w krótkich odstępach czasu.
- Spraw, aby
DefaultRenderersFactorydodawał 2 instancjeMetadataRenderer, aby aplikacje domyślnie otrzymywały 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 przypadku multimediów, których nie można przewijać. - 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 niepofragmentowanego pliku MP4, aInAppFragmentedMp4Muxer– do tworzenia pofragmentowanego pliku MP4. - Przenieś interfejs
Muxerzmedia3-muxerdomedia3-transformer. - Dodaj
MediaProjectionAssetLoader, który udostępnia multimedia zMediaProjectiondo nagrywania ekranu, i dodaj obsługę nagrywania ekranu do aplikacji 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).
- Naprawiliśmy 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ć, a na ekranie pojawiał się komunikat
IllegalStateException: Playback stuck buffering and not loading(#2197).
- Dźwięk:
- Poprawiono
onAudioPositionAdvancing, aby wywołanie następowało po wznowieniu odtwarzania (wcześniej wywołanie następowało 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 formatu PCM do
ChannelMappingAudioProcessoriTrimmingAudioProcessor.
- Poprawiono
- Film:
- Zmieniono
MediaCodecVideoRenderer.shouldUsePlaceholderSurfacena chronione, aby aplikacje mogły zastępować i blokować użycie powierzchni zastępczych (#1905). - Dodaj eksperymentalną analizę zależności próbek AV1
ExoPlayer, aby przyspieszyć wyszukiwanie. 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:
- Dodaliśmy 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 dziesiętnych, 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). - Tłumienie (i rejestrowanie) błędów analizy napisów, gdy napisy są multipleksowane do tego samego kontenera co dźwięk i obraz (#2052).
- Poprawiliśmy 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. Można utworzyć podklasęOverlaySettings, aby umożliwić dynamiczne ustawienia nakładki.
- Przenieśliśmy funkcje
- Muksery:
- 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. - Naprawiono błąd w
FragmentedMp4Muxer, który powodował tworzenie wielu fragmentów, gdy zapisywana była tylko ścieżka audio.
- Przeniesiono
- Sesja:
- Utrzymuj stan usługi działającej 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(), aby zatrzymać usługę 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 działającej 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 pliki:
- 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 wyjątekExceptioninny 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 do pozycji synchronizacji w strumieniu HLS (#2209).
- Dodaj pierwszą wersję:
- Rozszerzenie DASH:
- Dodaliśmy 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). - Ulepszono obsługę przejść między okresami w transmisjach na żywo, w których okres zawiera próbki multimediów wykraczające poza zadeklarowany czas trwania okresu (#1698).
- Rozwią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:
- Podłącz niestandardowe instancje
AudioSinkiAudioRendererEventListenerdoMidiRenderer.
- Podłącz niestandardowe instancje
- Rozszerzenie Cast:
- Zaktualizuj 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).
- Zaktualizuj zależność
- Aplikacja demonstracyjna:
- Rozszerz możliwości
demo-composeo dodatkowe przyciski i ulepsz integrację zPlayerSurfacedzięki obsłudze skalowania i migawki.
- Rozszerz możliwości
- 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
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 asynchronicznego odszyfrowywania 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
MediaCodecAdapterpodanych wartości formatu obrazu piksela, gdy są one podane podczas przetwarzaniaonOutputFormatChanged(#1371).
- Wycofanie używania
- Tekst:
- Naprawiliśmy błąd w
ReplacingCuesResolver.discardCuesBeforeTimeUs, który powodował, że sygnał aktywny wtimeUs(rozpoczęty wcześniej, ale jeszcze niezakończony) był nieprawidłowo odrzucany (#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ę detektora (#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 do biblioteki
media3-common-ktxfunkcję rozszerzenia zawieszeniaPlayer.listen, aby uruchomić współprogram do nasłuchiwaniaPlayer.Events. - Usuń adnotacje
@DoNotInlinez ręcznie wyodrębnionych klas wewnętrznych, które mają zapobiegać błędom weryfikacji klas w czasie działania. Najnowsze wersje R8 automatycznie wywołują takie wywołania, aby uniknąć błędów w czasie działania (dlatego ręczne wywoływanie 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:
- Teraz można wywołać
MediaCodecRenderer.onProcessedStreamChange()dla 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 przekazywać zdarzenia wstępnego ładowania do aplikacji. - Zezwalaj na zmianę limitu czasu klienta SNTP i ponowne próby z alternatywnymi adresami po przekroczeniu limitu czasu (#1540).
- Usuń
MediaCodecAdapter.Configuration.flags, ponieważ pole 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 dźwięku nie jest włączona (#1616). - Zezwalanie na odtwarzanie niezależnie od czasu trwania buforowania, gdy wczytywanie się nie powiedzie (#1571).
- Dodaj
AnalyticsListener.onRendererReadyChanged(), aby sygnalizować, kiedy poszczególne renderery zezwalają na odtwarzanie. - Naprawiono błąd, który powodował, że
MediaCodec.CryptoExceptionbył czasami zgłaszany jako „nieoczekiwany błąd ś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ójnie udostępnianymi konfiguracjami. - 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 zAnalyticsListener. - 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 wczytywania (np. HTTP 404) są emitowane przez wywołania zwrotne
onLoadError. - W starszej wersji 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 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).
- Teraz można wywołać
- Transformator:
- Dodano
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.- Ustaw czas trwania obrazu za pomocą
MediaItem.Builder.setImageDurationMs, który jest wymagany do eksportu obrazu. - Dodanie obsługi eksportu luk w sekwencjach audio EditedMediaItems.
- Dodano
- 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 używanie opcji
Mp4ExtractoriFragmentedMp4Extractordo identyfikowania próbek H264, które nie są używane jako odniesienie przez kolejne próbki. - Dodaj opcję umożliwiającą wyszukiwanie na podstawie indeksu w
AmrExtractor. - Traktuj pliki MP3 z ponad 128 kB między prawidłowymi klatkami jako obcięte (a nie nieprawidłowe). 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, teraz zatrzymują odtwarzanie na końcu danych MP3, zamiast kończyć się błędem
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}(#1563). - Naprawiliśmy 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 czasowej filmu, a teraz wartośćmedia_timejest prawidłowo skalowana przy użyciu skali czasowej ś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ę identyfikowania pola
h263w plikach MP4 w przypadku filmów H.263 (#1821). - Dodano obsługę formatu pliku multimedialnego ISO AC-4 Level-4 (#1265).
- Zezwalaj na używanie opcji
- Źródło danych:
- Zaktualizowano
HttpEngineDataSource, aby umożliwić korzystanie z rozszerzenia 7 w wersji S zamiast interfejsu API na poziomie 34 (#1262). DataSourceContractTest: sprawdź, czyDataSource.getUri()zwraca rozwiązany identyfikator URI (zgodnie z dokumentacją). Jeśli różni się on od żądanego identyfikatora URI, 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 oczekiwanych nagłówków. Dzięki temu można 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.
- Napraw błąd w
SpeedChangingAudioProcessor, który powoduje pomijanie klatek wyjściowych.
- Film:
MediaCodecVideoRendererunika dekodowania próbek, które nie są renderowane ani używane jako odniesienie przez inne próbki.- W przypadku interfejsu API na poziomie 35 lub wyższym
MediaCodecAdaptermoże teraz otrzymać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). - Zapewnienie wyświetlania 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 problem z zawieszaniem 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 wywołać 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 wywołać błąd
- Sesja:
- Dodaj
MediaButtonReceiver.shouldStartForegroundService(Intent), aby umożliwić aplikacjom pomijanie polecenia odtwarzania przychodzącego w celu wznowienia odtwarzania przez zastąpienie tej metody. Domyślnie usługa jest zawsze uruchamiana, a odtwarzania nie można wyłączyć bez awarii usługi z błędemForegroundServiceDidNotStartInTimeException(#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 wyjątku
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 Implementowanie niestandardowych działań przeglądania. * Naprawiliśmy błąd, który powodował, że kontroler Media3 czasami nie mógł pozwolić 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 elementu
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 przeglądarka
MediaBrowserpołączona ze starszą usługą przeglądarki nie otrzymywała błędu wysłanego przez usługę po zasubskrybowaniuparentid. - Ulepszyliśmy interoperacyjność, dzięki czemu przeglądarka Media3 połączona ze starszą wersją
MediaBrowserServicenie żąda dwukrotnie elementów podrzędnychparentIdpodczas subskrybowania elementu nadrzędnego.
- Dodaj
- UI:
- Ze względu na problemy z przejściami udostępnionymi opartymi na XML-u obejście problemu z rozciągniętym/przyciętym filmem w
PlayerView-in-Compose-AndroidViewjest opcjonalne. 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ę.
- Ze względu na problemy z przejściami udostępnionymi opartymi na XML-u obejście problemu z rozciągniętym/przyciętym filmem w
- Rozszerzenie DASH:
- Dodano obsługę okresów rozpoczynających się w środku segmentu (#1440).
- Rozszerzenie Smooth Streaming:
- Naprawiono błąd
Bad magic number for 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 obsługuje odtwarzanie 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 obsługuje odtwarzanie 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
DeviceInfoCastPlayera, 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
offsetzostał zastosowany 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 niż czas ostatniego zdarzenia wSubtitlelub mu równy (#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 na poziomie 31 lub wyższym odtwarzających 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:
- Przekształć dwukrotne kliknięcie
KEYCODE_HEADSETHOOKw działanie „przejdź do następnego”, zgodnie z dokumentacją (#1493). - Traktuj
KEYCODE_HEADSETHOOKjako polecenie „odtwarzaj” wMediaButtonReceiverpodczas podejmowania decyzji, czy je zignorować, aby uniknąćForegroundServiceDidNotStartInTimeException(#1581).
- Przekształć 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 domniemane 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 domniemane 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 graczy. - Usuń narzędzia
Buffer.isDecodeOnly()iC.BUFFER_FLAG_DECODE_ONLY. Nie trzeba ustawiać tej flagi, ponieważ mechanizmy renderowania i dekodery będą decydować o pomijaniu 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 od interfejsu API 35. - Rozwiązaliśmy problem z aktualizowaniem 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 niestandardowePreloadMediaSource.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ływać 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 ExoPlayera 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 Work Tasks. - Dodaj
MediaCodecAdapter#OnBufferAvailableListener, aby otrzymywać alerty, gdy bufory wejściowe i wyjściowe będą 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). - Naprawiono 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).- Naprawiliśmy 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 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ż mają one zastosowanie tylko do odtwarzania. - Zastąp interfejs
androidx.media3.transformer.Muxerinterfejsemandroidx.media3.muxer.Muxeri usuńandroidx.media3.transformer.Muxer. - Naprawiono błąd związany z wczytywaniem obrazów HEIC ze schematów identyfikatoró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 informacji o kodeku, 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). Dodaliś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, dzięki czemu wyszukiwanie jest dokładniejsze (#1376). - MP3: używanie liczby klatek i innych danych w klatce
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 klatki po klatceInfo, która może być sztucznie mała, np. klatkaPCUT(#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 ukoń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:
- Rozwiązaliśmy problem, który powodował, że
Listener.onRenderedFirstFrame()docierał za 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.
- Rozwiązaliśmy 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 metod 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ć traktowane jako prawda, niezależnie od wartości obecnych w strumieniu (obsługacolumnLocknie jest zaimplementowana, więc w praktyce zawsze przyjmuje się, że jest to fałsz).- Ta informacja została pierwotnie 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.
- Ta informacja została pierwotnie 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).
- Naprawiono 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:
- Naprawiono 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).
- Naprawiono 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 elemencie
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ć zgodny. - Dodaj obsługę HDR dla:
TextOverlay. Luminancję nakładki tekstowej można dostosować za pomocą opcjiOverlaySettings.Builder.setHdrLuminanceMultiplier().
- Obsługa wielu zmian prędkości w tym samym elemencie
- Rozszerzenie IMA:
- Przenieś interfejs API wymagany do odtwarzania strumieni reklam DAI w aplikacjach do wersji stabilnej.
- Dodaj do
ImaServerSideAdInsertionMediaSource.AdLoaderparametrreplaceAdTagParameters(Map <String, String>), który umożliwia 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).
- Dopasuj konwersję
MediaMetadatadoMediaDescriptionCompat, aby używać tej samej preferowanej kolejności i logiki podczas wybierania właściwości metadanych co w 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 aktualizowaniaPlaybackStatesesji 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 podać 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 zaktualizować 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ć stosowanie różnych elementó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 pliki:
- Zadbaj o to, aby obiekt
DownloadHelpernie powodował wycieku niezwolnionych instancjiRenderer, co może ostatecznie doprowadzić do awarii aplikacji z błędemIllegalStateException: Too many receivers, total of 1000, registered for pid(#1224).
- Zadbaj o to, aby obiekt
- Rozszerzenie Cronet:
- Rozwiąż problem
SocketTimeoutExceptionw:CronetDataSource. W niektórych wersjach Cronet żądanie dostarczone przez wywołanie zwrotne nie zawsze jest takie samo. Powoduje to, że wywołanie zwrotne nie jest realizowane, a żądanie przekracza limit czasu (https://issuetracker.google.com/328442628).
- Rozwiąż problem
- Rozszerzenie HLS:
- Naprawiliśmy błąd, który powodował, że oczekujące próbki EMSG czekające na przerwę były 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 inicjowania powodowało błędy
Source ErroriIllegalArgumentException. - Naprawiliśmy 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 niepowodzenie występowało 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. - Zezwalanie 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)zDefaultHttpDataSource,OkHttpDataSourceiCronetDataSource. Zamiast tego użyj odpowiedniej metody w 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ń
DefaultHttpDataSourcekonstruktory. 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
PreloadMediaPeriodnie zachowywał strumieni po ponownym wstępnym załadowaniu. - Zastosuj prawidłowy
TrackSelectionResultdo okresu odtwarzania podczas ponownego wyboru ścieżki. - Rozpoczynanie renderowania z wcześniejszym włączeniem 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
- 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) zamiast tych 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, Chromecastem 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 przetwarzanie informacji o kolorach HDR powodowało nieprawidłowe działanie kodeka i uniemożliwiało adaptacyjne przełączanie formatów w przypadku ścieżek wideo SDR (#1158).
- Tekst:
- WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie napisy nieprawidłowych dodatkowych instancji
CuesWithTimingzWebvttParser.parse(#1177).
- WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie napisy nieprawidłowych 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:
- Ulepszyliśmy mapowanie tonów PQ na SDR przez konwersję przestrzeni barw.
- Sesja:
- UI:
- Jeśli
Localenie może zidentyfikować wyświetlanej nazwy, jako rozwiązanie zastępcze 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. Zgodnie z dokumentacją ta funkcja powinna działać, ale do tej pory nie była prawidłowo zaimplementowana. - 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 multimediów treści 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ącPreloadMediaSource.PreloadControli ustawiając wstępnie wczytane źródło w odtwarzaczu. - Dodaj
ExoPlayer.setImageOutput, który umożliwia aplikacjom ustawianieImageRenderer.ImageOutput. DefaultRenderersFactorydomyślnie udostępnia teraz odtwarzaczowiImageRendererz wartościami null dlaImageOutputiImageDecoder.Factory.DEFAULT.- Emitowanie zdarzenia
Player.Listener.onPositionDiscontinuity, gdy cisza jest pomijana (#765). - Dodaj 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, używając 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. - Naprawiono błąd, który powodował, że powtórzenie tego samego czasu powodowało usunięcie metadanych z tego elementu (#1007).
- Zmień nazwy metod
experimentalSetSubtitleParserFactorywBundledChunkExtractor.FactoryiDefaultHlsExtractorFactorynasetSubtitleParserFactoryi nie zezwalaj 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 aż 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 ścieżka obrazu ma zostać wybrana, 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 stałej szybkości transmisji bitów (CBR) do wyszukiwania plików z nagłówkiem
Info(odpowiednik CBR nagłówkaXing). Wcześniej używaliśmy tabeli przewijania 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 bitmapy, 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ć traktowane jako prawda, niezależnie od wartości obecnych w strumieniu (obsługacolumnLocknie jest zaimplementowana, więc w praktyce zawsze przyjmuje się, że jest to fałsz).
- Naprawiono serializację wskazówek bitmapy, aby rozwiązać błąd
- Obraz:
- Dodaliśmy obsługę miniatur DASH. Obrazy siatki są przycinane, a poszczególne miniatury są dostarczane do
ImageOutputw czasie zbliżonym do czasu ich prezentacji.
- Dodaliśmy 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 nie rozpoczęłoby się w ogóle w tym momencie). 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 nie rozpoczęłoby się w ogóle w tym momencie). 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ść
HlsMediaPerioddo 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ść
- Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
- Dekoder MIDI: ignorowanie komunikatów o zdarzeniach SysEx (#710).
- Narzędzia testowe:
- Nie wstrzymuj odtwarzania w:
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:
- Aplikacja demonstracyjna:
- Dodaj moduł demonstracyjny dotyczący krótkich treści, aby pokazać, jak korzystać z
PreloadMediaSourcew przypadku krótkich treści.
- Dodaj moduł demonstracyjny dotyczący krótkich treści, aby pokazać, jak korzystać z
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:
- Obejście problemu, 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 w przypadku
SilenceSkippingAudioProcessor, gdy jest wywoływany wielokrotnie (#712).
- Poprawiono obsługę EOS w przypadku
- 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 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 dołączona 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
MediaMetadataCompatdoMediaMetadata.extrasiMediaMetadata.extrasdoMediaMetadataCompat(#756, #802). - 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
- 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 w razie potrzeby implementacje będą musiały ręcznie dołączyć te informacje (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 metod
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 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 za pomocą
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Jeśli spróbujesz odtworzyć dźwięk, gdy nie są dostępne odpowiednie wyjścia audio, lub jeśli wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania, przyczyna blokady 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
MediaItemdla wszystkich klasMediaSourceudostępnianych przez bibliotekę za pośrednictwemPlayer.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 dotychczasowychplaybackPositionUs. - 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). - Dodano funkcję przesyłania danych Common Media Client Data (CMCD) za pomocą parametrów zapytania (#553).
- Rozwiązanie problemu z
ConcurrentModificationExceptionwExperimentalBandwidthMeter(#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:
- Analizuj 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
frameRateidurationUselementuSampleConsumer.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 ustawienie pozostanie na poziomietrue.
- Dodaj
- Ekstraktory:
- MPEG-TS: zapewniliśmy 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 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 ustawione preferencje są włączone, urządzenie obsługuje odciążanie dla danego formatu, a wybrana ścieżka jest pojedynczą ścieżką 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 niższym 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. - Dodanie obsługi 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 odciążonego 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 dźwięku DTS Express (#650).
- Naprawiono błąd, który powodował, że sprawdzanie możliwości E-AC3-JOC powodował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:
- Zezwól 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).
- Zezwól usłudze
- Tekst:
- Usuń
ExoplayerCuesDecoder. Ścieżki tekstowe zsampleMimeType = 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ćVideoFrameProcessor.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). - Aby uniknąć problemów z wycofanym interfejsem API na urządzeniach Samsung, używaj tylko
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()powyżej interfejsu API 31 (#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. - Naprawiliśmy błąd, który powodował, że
MediaController.getCurrentPosition()nie przechodzi dalej po połączeniu ze starszą wersjąMediaSessionCompat. - 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ę uda, 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 pliki:
- 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.
- Dodaj eksperymentalną obsługę analizowania napisów podczas wyodrębniania. Zapewnia to 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 do zawieszania się odtwarzania w niektórych sytuacjach. - Sprawdź stan w konfiguracji RTSP podczas zwracania stanu wczytywania
RtspMediaPeriod(#577). - Ignorowanie niestandardowych metod żądań 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.):
- Udostępnienie 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 oznaczyć 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 pomijanie próbek przeznaczonych tylko do dekodowania przed czasem rozpoczęcia. Należy używać tej metody zamiast metodyBuffer.isDecodeOnly, która zostanie wycofana. - Naprawiono błąd związany z publikowaniem artefaktu dekodera MIDI w repozytorium Maven. Zmieniono nazwę artefaktu na
media3-exoplayer-midi(#734).
- Rozszerzenie Leanback:
- Naprawiono błąd, który powodował, że wyłączenie platformy mogło powodować błąd
ArithmeticExceptionw kodzie Leanback (#617).
- Naprawiono błąd, który powodował, że wyłączenie platformy mogło powodować błąd
- 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), najwyższa 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:
- Naprawiliśmy błąd, który powodował, że podczas odtwarzania bardzo krótkich plików stan
Player.getState()nigdy nie zmieniał się naSTATE_ENDED(#538).
- Naprawiliśmy 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 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 przy ograniczaniu 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ę getter, 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ę getter, 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 pozwalają użytkownikom określać flagi 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 w tej samej pozycji (#8046).
- ExoPlayer:
- Zezwalaj ExoPlayerowi na kontrolowanie metod głośności urządzenia tylko wtedy, gdy wyraźnie wyrazisz 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 w przypadku 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(), aby używaćEffectpodczas 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 kontrolowanie metod głośności urządzenia tylko wtedy, gdy wyraźnie wyrazisz 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). - Naprawiliśmy 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ą
MediaCodecList, a nie 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:
- Naprawiono 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). - Kapsułkowanie klatek Opus w pakietach Ogg podczas bezpośredniego odtwarzania (odciążanie).
- Ekstrapoluj bieżącą pozycję podczas uśpienia z harmonogramem odciążania.
- Dodaj
Renderer.release()iAudioSink.release(), aby zwolnić zasoby na końcu cyklu życia odtwarzacza. - Sprawdzanie zmian w możliwościach 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. - Propagowanie 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ść int
DISCARD_REASON_AUDIO_BYPASS_POSSIBLEdoDecoderDiscardReasons, aby odrzucić dekoder dźwięku, gdy po zmianie możliwości dźwiękowych możliwy jest tryb obejścia. - Dodaliśmy obsługę bezpośredniego odtwarzania DTS Express i DTS:X (#335).
- Naprawiono 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, gdy zmienia sięPlayer.getVideoSize(). W wyniku tej zmiany rozmiar filmu w ExoPlayerze zMediaCodecVideoRendererma szerokość i wysokość równą 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łącz transmisje na żywo DASH z wieloma przedziałami czasu na potrzeby dynamicznego wstawiania reklam. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania transmisji na żywo (#10912).
- Naprawiono błąd, 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 wznowienia 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). - Domyślnie dodaj przyciski poleceń „przewiń do poprzedniego” i „przewiń do następnego” w widoku kompaktowego powiadomienia o multimediach na 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 dodaj przyciski poleceń „przewiń do poprzedniego” i „przewiń do następnego” w widoku kompaktowego powiadomienia o multimediach na Androidzie 12 i starszych (#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ć limit czasu, przez który wątek wczytywania ma czekać na zainicjowanieTimestampAdjuster. Jeśli inicjowanie nie zakończy się przed upływem limitu czasu, zostanie zgłoszony 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ń polecenie
HlsMasterPlaylisti użyj w zamian poleceniaHlsMultivariantPlaylist. - Usuń
Player.stop(boolean). Zamiast niej użyj zasadPlayer.stop()iPlayer.clearMediaItems()(jeśliresettotrue). - Usuń 2 wycofane konstruktory
SimpleCachei użyj niewycofanego konstruktora, 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 niewycofanego konstruktora, który 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, a zamiast nich użyj metodyFormat.buildUpon()i metod ustawiających. - Usuń wycofaną metodę
ExoPlayer.retry()i użyj zamiast niej metodyprepare(). - Usuń wycofany konstruktor
DefaultTrackSelectorz argumentem zero i zamiast niego użyjDefaultTrackSelector(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ł zwracanie wartości null przez
MediaLibraryServicew przypadku wywołania z interfejsu systemu doCallback.onGetLibraryRootzparams.isRecent == truew interfejsie API 30 (#355). - Naprawiono wyciek pamięci w
MediaSessionServicelubMediaLibraryService(#346). - Naprawiliśmy błąd, który powodował, że połączona aktualizacja
Timelinei pozycji wMediaSessionmogła powodować, żeMediaControllerzgłaszał błądIllegalStateException.
- 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 2.18.6 ExoPlayera.
- Biblioteka podstawowa:
- Resetowanie 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:
- Naprawiono błąd, który powodował, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję
MediaSessionCompatpowodowało wyjątek wMediaController(#290). - Dodano brakujące przekierowanie z
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ązano 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. - Rozwiązaliśmy problem, 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).
- Naprawiono błąd, który powodował, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję
- DASH:
- Poprawiono obsługę pustych osi czasu segmentów (#11014).
- RTSP:
- Ponów próbę z TCP, jeśli konfiguracja RTSP z UDP nie powiedzie się z błędem RTSP 461 UnsupportedTransport (#11069).
Wersja 1.0.0
22 marca 2023 r.
Publikacja androidx.media3:media3-*:1.0.0 Wersja 1.0.0 zawiera te zatwierdzenia.
Ta wersja odpowiada wersji 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 pliki:
- 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 Opisanie komunikatów odpowiedzi (#10971).
- Sesja:
- Naprawiliśmy błąd, który powodował, że przycisk odtwarzania/wstrzymania w powiadomieniu nie aktualizował się zgodnie 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 wersji 2.18.3 ExoPlayera.
- 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 wątek odtwarzania dla nowej instancji ExoPlayer. - Zezwalanie na czyszczenie obiektów pomocniczych menedżera pobierania (#10776).
- Dodaj parametr do
BasePlayer.seekTo, aby wskazać polecenie używane do przewijania. - Używanie motywu podczas wczytywania obiektów rysowalnych w interfejsie API 21 lub nowszym (#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 odtwarzania bezpośredniego (przekazywania).
- Użyj szybkości transmisji bitów skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora dla
- Tekst:
- Naprawiono błąd polegający na tym, że
TextRendererprzekazywał nieprawidłowy (ujemny) indeks doSubtitle.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 polegający na tym, że
- Metadane:
- Analizowanie wielu wartości rozdzielonych wartościami null z klatek 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 środku 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()elementuDefaultMediaNotificationProvideri użyj niezmiennych list w celu uniknięcia wątpliwości (#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 klatek 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 skupienie uwagi 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 jednym elementem (#10667). - Dodaj
Player.getSurfaceSize, który zwraca rozmiar powierzchni, na której jest renderowany film. - Naprawiono błąd, który powodował, że usunięcie detektorów podczas udostępniania odtwarzacza mogło powodować błąd
IllegalStateException(#10758).
- Dodaj
- Utwórz:
- Aby uniknąć błędów kompilacji, wymuś minimalną wersję
compileSdkVersion(#10684). - Unikaj publikowania bloku, gdy jest on uwzględniony w innym procesie kompilacji Gradle.
- Aby uniknąć błędów kompilacji, wymuś minimalną wersję
- Wybór ścieżki:
- Jeśli wyświetlacz nie obsługuje Dolby Vision, preferuj inne ścieżki. (#8944).
- Pobrane pliki:
- 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 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 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 moduł renderujący 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:
- Zapewnienie, ż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żywanego przez dostawcę. Dodaj też metodęDefaultMediaNotificationProvider.setSmallIcon(int), aby ustawić małą ikonę powiadomień. (#104). - Zapewnienie, że polecenia wysłane przed
MediaController.release()nie zostaną 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 API 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 zawiesza 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
ShuffleOrdernaExoPlayer.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:
- Słuchaj zmian w
playWhenReadywLeanbackAdapter(10420).
- Sł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 ExoPlayer 2.18.0.
- 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). - Naprawiono 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 wybranego napisu 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
nulldo:MediaSource.Factory.setDrmSessionManagerProvideriMediaSource.Factory.setLoadErrorHandlingPolicy. W razie potrzeby można jawnie przekazać instancjeDefaultDrmSessionManagerProvideriDefaultLoadErrorHandlingPolicy. - Dodaj
MediaItem.RequestMetadata, aby reprezentować metadane potrzebne do odtwarzania multimediów, gdy dokładnyLocalConfigurationnie jest znany. Usuń teżMediaMetadata.mediaUrl, ponieważ jest teraz uwzględniony wRequestMetadata. - 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:
- Spłaszcz klasę
TrackSelectionOverridesdoTrackSelectionParametersi przenieśTrackSelectionOverridedo klasy najwyższego poziomu. - Zmień nazwę
TracksInfonaTracksiTracksInfo.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óry jest domyślnie włączony. 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 formatów 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 monitorować zmiany we właściwościach uprzestrzenniania i na ich podstawie uruchamiać nowy wybór ścieżki. Urządzenia ztelevisiontrybem UI są wyłączone z tych ograniczeń, a preferowany będzie format z największą liczbą kanałów. Aby włączyć tę funkcję, instancjaDefaultTrackSelectormusi zostać utworzona z użyciemContext.
- Spłaszcz klasę
- Film:
- Zmień nazwę
DummySurfacenaPlaceholderSurface. - Dodaj obsługę AV1 do
MediaCodecVideoRenderer.getCodecMaxInputSize.
- Zmień nazwę
- Dźwięk:
- Użyj dekodera audio LG AC3, który reklamuje 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 przyjmowanie 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. - Naprawiono 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 UI od modułu ExoPlayer. Jest to zmiana powodująca niezgodność. - Nie wyświetlaj wymuszonych ścieżek tekstowych w selektorze ścieżek
PlayerViewi zachowaj wybraną odpowiednią wymuszoną ścieżkę tekstową, jeśli wybrano „Brak” (#9432).
- Naprawiono dostarczanie zdarzeń do
- DASH:
- 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 instancjeDefaultCompositeSequenceableLoaderFactorymożna przekazywać bezpośrednio.
- Analizuj liczbę kanałów z elementów DTS
- HLS:
- Jeśli atrybut CODECS playlisty nie zawiera kodeka audio, następuje powrót do przygotowania z podziałem na fragmenty (#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).
- Zatrzymano sprawdzanie obowiązkowych pól SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
- Zgłaszanie wyjątku kontrolowanego podczas analizowania czasu RTSP (#10165).
- Dodano czytnik RTP dla VP9 (#47).
- Dodano czytnik RTP dla OPUS (#53).
- Źródła danych:
- Zmień nazwę
DummyDataSourcenaPlaceholderDataSource. - Obejście obsługi przerwań OkHttp.
- Zmień nazwę
- Sesja:
- Zastąp
MediaSession.MediaItemFillerciągiemMediaSession.Callback.onAddMediaItems, aby 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 pobierać obrazy grafiki. - 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 (zmiana 51).
- Naprawiono błąd NPE w
MediaControllerImplBasepo zwolnieniu kontrolera (#74).
- Zastąp
- Odtwarzanie reklam / IMA:
- Zmniejsz częstotliwość odpytywania o reklamy ze 100 ms do 200 ms, aby dostosować ją do zaleceń organizacji Media Rating Council (MRC).
- Rozszerzenie FFmpeg:
- Zaktualizuj wersję CMake do
3.21.0+, aby uniknąć błędu CMake, 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 przeciwnym razieDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT. - Usuń konstruktor
DefaultTrackSelector(ExoTrackSelection.Factory). Użyj w zamian zasadyDefaultTrackSelector(Context, ExoTrackSelection.Factory). - Usuń
Transformer.Builder.setContext. Zamiast tegoContextnależy przekazać do 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:
- Naprawiono błąd sprawdzania możliwości dźwiękowych Dolby Atmos (E-AC3-JOC) w HLS.
- Ekstraktory:
- FMP4: rozwiązaliśmy problem, który mógł powodować, że metadane próbek emsg były generowane w niewłaściwej kolejności w przypadku strumieni zawierających atomy emsg zarówno w wersji 0, jak i 1 (#9996).
- Tekst:
- Poprawiono interakcję między
SingleSampleMediaSource.Factory.setTrackIdiMediaItem.SubtitleConfiguration.Builder.setId, aby nadać priorytet poluSubtitleConfigurationi użyć wartościFactory, jeśli nie jest ustawiona (#10016).
- Poprawiono interakcję między
- Odtwarzanie reklamy:
- Naprawiono niedobory danych audio 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ń klucze o wartości null z pola
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. - Podziel
AnalyticsCollectorna interfejs i domyślną implementację, aby umożliwić usunięcie przez R8, jeśli aplikacja tego nie potrzebuje.
- Dodaj chronioną metodę
- Wybór ścieżki:
- Dodano obsługę flag preferowanych ról wideo podczas wyboru ścieżki (#9402).
- thought Zaktualizowaliśmy logikę wyboru ścieżki wideo, aby uwzględniała preferowane typy MIME i flagi ról podczas wybierania wielu ścieżek wideo do adaptacji (#9519).
- Zaktualizowano 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. Naprawiliśmy błąd powodujący 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:
- Naprawiono 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 o rozmiarze większym niż zadeklarowany rozmiar 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 IMA (#8213).
- Dodaliśmy 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łowe wypełnianie pola
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 wersje zawierają zmultipleksowane ścieżki napisów, 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łowe wypełnianie pola
- RTSP:
- Udostępniliśmy interfejs API klienta, który umożliwia zastąpienie
SocketFactoryużywanego w przypadku dowolnego połączenia z serwerem (#9606). - Jeśli dostępne są obie metody uwierzytelniania, preferowana jest metoda DIGEST, a nie 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ępniliśmy interfejs API klienta, który umożliwia zastąpienie
- 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.getProgress, gdy zwalnianie multipleksera powoduje wyjątek. - 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ćsetClearMediaItemsOnStop(false)w oprogramowaniu sprzęgającym.
- Domyślnie
- Rozszerzenie Cast:
- Rozszerzenie FFmpeg:
- Zależność
build_ffmpeg.shod narzędzi binarnych LLVM zamiast GNU (#9933).
- Zależność
- 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 usługDashMediaSource,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ń narzędzia
ActionFileiActionFileUpgradeUtil. Użyj ExoPlayera w wersji 2.16.1 lub starszej, aby za pomocąActionFileUpgradeUtilscalić starsze pliki 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ń
IntDefsna@Target(TYPE_USE). Może to spowodować błąd kompilacji użycia w Kotlinie, który można naprawić, przenosząc adnotację do adnotacji 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ługujących multimedia, 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 UI 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.