Media3

Biblioteki obsługujące przypadki użycia multimediów.
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_SIZE z 65536 do 65520, aby każda alokacja bufora (w tym nagłówek obiektu byte[]) 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.NullableType adnotacją JSpecify org.jspecify.annotations.Nullable.
    • Usuń androidx.media3.common.util.UnknownNull na rzecz adnotacji JSpecify nullness. Podklasy Kotlin RunnableFutureTask z 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 wideo View, którego rozmiar można zmieniać podczas odtwarzania reklamy.
    • Zmapowano ciąg kodeka RFC 6381 mlpa na MimeTypes.AUDIO_TRUEHD w MimeTypes.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ę, i AdPlaybackState.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 metoda Player.listen lub Player.listenTo była anulowana z wątku innego niż wątek aplikacji odtwarzacza (np. podczas usuwania testu interfejsu Compose) (#3005).
  • 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 jak Void?), muszą określać argument typu z możliwością wartości null (np. CompositeMediaSource<Void?>).
    • Sprawdź w AdsMediaSource, czy wartość AdPlaybackState.removedAdGroupCount nie zmniejsza się w przypadku aktualizacji AdPlaybackState.
    • 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 opcja Flags.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ślnie false), aby niestandardowe implementacje MediaPeriod mogły raportować początkowe przerwy za pomocą SampleStream.getFlags(), przechodząc na MediaPeriod.readDiscontinuity(), gdy nie jest to obsługiwane i włączona jest opcja Flags.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_TRANSITION zamiast DISCONTINUITY_REASON_SKIP lub nie było zgłaszane wcale, gdy AdsMediaSource uż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.
  • 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 ArrayIndexOutOfBoundsException w FragmentedMp4Extractor, gdy fragment zawiera pole trun bez próbek (#3471).
    • ADTS: dodaj FLAG_DISABLE_ID3_METADATA do AdtsExtractor, aby zatrzymać dane ID3 w strumieniu przed ich wyjściem jako ścieżka application/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 edycji elst i był odtwarzany koniec ostatniej klatki (#3489).
    • Naprawiono duże początkowe przydziały bufora podglądu i OutOfMemoryError podczas wykrywania uszkodzonych lub innych niż multimedialne plików, które zaczynają się od ID3 (#3502).
  • Inspektor:
    • Naprawiliśmy błąd, który powodował, że anulowanie obiektu Future zwracanego przez MetadataRetriever.retrieveDurationUs() uniemożliwiało close() zwolnienie powiązanego obiektu MediaSource (#3468).
    • Popraw MediaExtractorCompat, aby zwracać MediaFormat.KEY_FRAME_RATE jako liczbę całkowitą, zgodnie z platformą MediaExtractor.
  • 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.setCodecProvenance w 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).
  • 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ą.
  • Efekt:
    • Naprawiliśmy błąd NullPointerException w DefaultVideoFrameProcessor podczas czyszczenia (np. podczas przewijania lub przesuwania w CompositionPlayer) (#3470).
    • Naprawiono błąd, który powodował, że DefaultGlObjectsProvider.release zgłaszał GlException, gdy dostawca był ponownie używany po wydaniu (#2016).
  • Muksery:
    • Sprawdź ścieżkę Format podczas dodawania ścieżki do Mp4Muxer lub FragmentedMp4Muxer, 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 biblioteki Muxer i traktuj multiplekser jako zamknięty, nawet jeśli close() zgłasza wyjątek. Wywołanie dowolnej innej metody po close() powoduje teraz zgłoszenie błędu IllegalStateException.
  • Rozszerzenie IMA:
    • Obsługuj interfejs ResizablePlayer pakietu IMA SDK, aby umożliwić reklamom interaktywnym zmianę rozmiaru i pozycji widoku odtwarzacza wideo w kontenerze reklamy, oraz dodaj ImaAdsLoader.requestAds(DataSpec, Object, AdViewProvider) (wycofując ImaAdsLoader.requestAds(DataSpec, Object, ViewGroup)).
  • 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. gdy Player.COMMAND_GET_TIMELINE jest niedostępny).
    • Rozwiązaliśmy problem, który powodował, że MediaSessionService nie 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_UPDATE zamiast Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED, gdy starsza aktualizacja metadanych MediaSessionCompat modyfikuje metadane lub czas trwania aktywnego elementu kolejki bez zmiany kolejki.
    • Naprawiono brakującą grafikę w starszych sesjach, które ustawiają null METADATA_KEY_DISPLAY_ICON (lub identyfikator URI grafiki) obok prawidłowego METADATA_KEY_ALBUM_ART: wartości null grafiki są teraz pomijane podczas konwertowania starszych metadanych.
  • UI:
    • Dodaj slot subtitles Composable do ContentFrame i Player z domyślną obsługą w media3-ui-compose-material3 renderowania 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 Player w media3-ui-compose-material3, w tym niestandardowe, i usuń parametr visible z PlayerDefaults.TopControls, CenterControls i BottomControls. Jest to zmiana powodująca niezgodność w niestabilnym interfejsie API.
    • Obsługuj AdViewProvider.getAdVideoView() w PlayerView, opakowując exo_content_frame w exo_content_frame_container.
    • Zmniejszono wykorzystanie pamięci w SubtitleView przez 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.
  • 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 IllegalStateException wystę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 RemoteCastPlayer były odrzucane przez odbiorniki Android TV (#3462).
    • Zaktualizuj zależność com.google.android.gms:play-services-cast-framework do wersji 23.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 deklarowania MediaTransferReceiver w AndroidManifest.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 MediaMetadata w DefaultMediaItemConverter, mapując pola bez dedykowanej właściwości MediaItem.mediaMetadata do i z MediaItem.mediaMetadata.extras, oraz zachowuj niestandardowe dodatki w MediaInfo.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 czasu CastPlayer w 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 w CastPlayer.
    • Wypełniaj MediaInfo i czas trwania na osi czasu z MediaMetadata.durationMs w przypadku elementów innych niż na żywo w DefaultMediaItemConverter i RemoteCastPlayer oraz zachowuj czas trwania określony przez odbiornik i stan transmisji na żywo podczas wyszukiwania w kolejce.
  • 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 zasady androidx.media3.transformer.RawAssetLoader.
    • Usuń publiczne konstruktory DefaultDecoderFactory. Użyj w zamian zasady DefaultDecoderFactory.Builder.
    • Usuń DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_BLACKLIST_MS. Użyj w zamian zasady DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_EXCLUSION_MS.
    • Usuń DefaultVideoFrameProcessor.Factory.Builder.setRequireRegisteringAllInputFrames(boolean). Użyj w zamian zasady VideoFrameProcessor.INPUT_TYPE_SURFACE_AUTOMATIC_FRAME_REGISTRATION.
    • Usuń EditedMediaItemSequence.Builder.experimentalSetForceAudioTrack(boolean) i EditedMediaItemSequence.Builder.experimentalSetForceVideoTrack(boolean). Użyj w zamian zasady EditedMediaItemSequence.Builder(Set).
    • Usuń EditedMediaItemSequence.forceAudioTrack. Użyj w zamian zasady trackTypes.contains(C.TRACK_TYPE_AUDIO).
    • Usuń EditedMediaItemSequence.forceVideoTrack. Użyj w zamian zasady trackTypes.contains(C.TRACK_TYPE_VIDEO).
    • Usuń narzędzia ExportResult.durationMs i ExportResult.Builder.setDurationMs. Zamiast niej użyj zasad ExportResult.approximateDurationMs i ExportResult.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 zasady Timeline.getPeriodPositionUs(Window, Period, int, long, long).

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 tym EnhancementSessionDecorator do ulepszania filmów i StudioSoundAudioProcessor do separacji źródeł dźwięku.

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_P3 i obsługuj przestrzeń barw Display P3 w mapowaniu kolorów ISO MediaFormatUtil i ColorInfo.
    • Dodano centralny rejestr Flags do 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.categories i MediaMetadata.Builder.setCategories(List<String>).
    • Zastąp androidx.media3.common.util.NonNullApi adnotacją JSpecify org.jspecify.annotations.NullMarked.
  • 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 = true w AnalyticsListener.onLoadError i MediaSourceEventListener.onLoadError, gdy wyczerpią się próby wczytania.
    • Obsługa rejestrowania wielu instancji VideoFrameMetadataListener za pomocą ExoPlayer.addVideoFrameMetadataListener i ExoPlayer.removeVideoFrameMetadataListener, wycofanie ExoPlayer.setVideoFrameMetadataListener i ExoPlayer.clearVideoFrameMetadataListener.
    • Dodaj obsługę reklam w treściach z wieloma przedziałami czasu (np. DASH), dzieląc i przesuwając AdPlaybackState dla 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) w ProgressiveMediaSource i DefaultMediaSourceFactory, 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ądzeniach ProgressiveMediaSource i DefaultMediaSourceFactory. Pozwala to zaoszczędzić pamięć i dokładniej obliczać przydział bufora DefaultLoadControl, 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 AudioTrack mó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ć, gdy ExoPlayer przełączał renderery na nieprzygotowany okres multimedialny, gdy włączona była opcja Flags.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 ArrayIndexOutOfBoundsException w detektorach statystyk, który występował podczas zatrzymywania odtwarzania reklamy w transmisji na żywo (#3423).
    • Rozwiązaliśmy problem, który powodował, że PreloadMediaSource mogło nieoczekiwanie opublikować zdarzenie wstępnego ładowania, gdy preload() nie zostało wywołane (#3408).
    • Rozwiązaliśmy problem, który powodował, że wartość Format.subsampleOffsetUs był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 PreloadMediaSource i DefaultPreloadManager, gdy metoda preload() jest wywoływana wielokrotnie w tym samym źródle (#3445).
    • Naprawiono błąd NullPointerException podczas zwalniania AdsMediaSource, 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 NullPointerException w SteeringManifestTracker, 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 mebx w 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.setVideoFrameAggregationParameters w 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.
  • Transformator:
    • Obsługa konfigurowania liczby klatek na potrzeby agregacji klatek wideo za pomocą Composition.Builder.setVideoFrameAggregationParameters w 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 żądanie MimeTypes.AUDIO_RAW i zastosowanie AudioProcessor powodowało kompresowanie danych wyjściowych.
  • 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 dOps w przypadku formatu Opus w MP4, gdzie wartości PreSkip, InputSampleRate i OutputGain nie 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_DEPENDENCIES i FragmentedMp4Extractor.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 xyz zawierających współrzędne wysokości, aby wypełnić pole Mp4LocationData.
    • Dodaliśmy ExtractorUtil.getFramesPerEncodedSample, aby obliczać liczbę klatek audio na próbkę w przypadku zakodowanych formatów audio (#3367).
    • Dodaj FLAG_READ_XMP_METADATA do Mp4Extractor, 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_1 z każdego pakietu PES w PsExtractor, zanim ładunek zostanie przekazany do czytnika dźwięku (#3327).
    • Naprawiono błąd w FragmentedMp4Extractor, gdy pole tfdt w 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 NullPointerException podczas analizowania zagnieżdżonych elementów ChapterAtom (#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 mebx w Mp4Extractor i FragmentedMp4Extractor. Ścieżki z kluczem it35 są widoczne jako MimeTypes.APPLICATION_ITUT_T35 (co umożliwia odtwarzanie HAGC). Inne ścieżki mebx są ignorowane, chyba że ustawiono FLAG_EMIT_RAW_MEBX_DATA. W takim przypadku wszystkie ścieżki mebx są emitowane jako nieprzetworzone MimeTypes.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.
  • 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 mebx w MediaExtractorCompat jako MimeTypes.APPLICATION_MEBX.
  • 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.
  • Dźwięk:
    • Dodano obejście problemu z urządzeniami, które wywołują android.media.AudioDeviceCallback w 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 TrimmingAudioProcessor po zakończeniu przycinania opóźnienia kodera na początku strumienia i gdy nie trzeba przycinać dopełnienia na końcu strumienia.
  • 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 CharsetDetector do DefaultSubtitleParserFactory w celu wykrywania kodowania znaków samodzielnych napisów SubRip bez znacznika kolejności bajtów (#2247).
  • Efekt:
    • Zaimplementuj SoundSeparationAudioProcessor do separacji źródeł dźwięku za pomocą modułu GMSCore dźwięku studyjnego.
  • Muksery:
    • Naprawiono zapisywanie pola dOps dla Opus w Mp4Muxer i FragmentedMp4Muxer, gdzie PreSkip, InputSampleRate i OutputGain były zapisywane w formacie little-endian zamiast big-endian (#3431).
    • Obsługa zapisywania wysokości GPS w Mp4LocationData za pomocą Mp4Muxer.
    • Dodaj Muxer.Factory.create(ParcelFileDescriptor), aby umożliwić multipleksowanie bezpośrednio do ParcelFileDescriptor.
    • Domyślnie zapisuj pole tfdt (Track Fragment Base Media Decode Time) w polach traf we 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) dec3 w Mp4Muxer.
    • 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 w FragmentedMp4Extractor za pomocą FLAG_READ_MFRA_FOR_SEEK_MAP.
    • Naprawiono błąd powodujący awarię w Mp4Writer i FragmentedMp4Writer podczas 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 dby1 w nagłówku kontenera (#3369).
    • Obsługa 32-bitowych ścieżek audio PCM w formatach Mp4Muxer i FragmentedMp4Muxer (#3389).
    • Odrzucanie nieobsługiwanych profili Dolby Vision w Mp4Muxer i FragmentedMp4Muxer podczas dodawania ścieżek.
    • Obsługa 24- i 32-bitowych ścieżek audio PCM w formatach Mp4Muxer i FragmentedMp4Muxer.
  • Rozszerzenie IMA:
    • Przekaż zdarzenia wstrzymania i wznowienia odtwarzacza do pakietu IMA SDK w ImaServerSideAdInsertionMediaSource.
  • Sesja:
    • Dodaj MediaConstants.EXTRAS_KEY_PLAYLIST_ID, MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE, MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI i MediaConstants.EXTRAS_KEY_CATEGORIES, aby wypełnić metadane playlisty i elementu na podstawie starszych metadanych i opisów, oraz MediaConstants.EXTRAS_KEY_SUGGESTED_TYPE i MediaConstants.EXTRAS_KEY_TTL_SECONDS, aby uzyskać sugestię LibraryParams.extras.
    • Naprawiono błąd powodujący awarię SecurityException podczas tworzenia lub zwalniania MediaSession na urządzeniach, na których obowiązują rygorystyczne limity PendingIntent.
    • 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 aplikacja MediaSessionService nie była jeszcze na pierwszym planie.
    • Naprawiono błąd powodujący awarię IllegalArgumentException, gdy MediaController łą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.setMediaItem lub setMediaItems, a następnie play() w przypadku wstrzymanego starszego elementu MediaSessionCompat mogło wysyłać nieobsługiwane wywołanie zwrotne onPrepareFrom* zamiast onPlayFrom* lub wysyłać onPlay() bez ponownego inicjowania żądanego elementu multimedialnego.
    • Naprawiono błąd NullPointerException w starszej wersji MediaBrowser podczas otrzymywania odpowiedzi na polecenie niestandardowe (#3432).
    • Naprawiono błąd powodujący awarię IllegalArgumentException podczas odbierania starszych metadanych ze zduplikowanymi kluczami w powiązanym Bundle.
    • Połączenie wychodzące MediaControllerCompat.TransportControls wywołuje się w ramach tej samej iteracji Looper podczas kontrolowania starszej wersji MediaSessionCompat (na przykład wywołanie setMediaItem, prepare i play razem wysyła teraz pojedyncze wywołanie zwrotne onPlayFrom*).
  • 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 TrackSelectionState i TrackSelectionParametersState oraz odpowiadające im funkcje zapamiętywania stanu funkcji typu „composable” do modułu media3-ui-compose.
    • Wprowadź PresentationState.videoAspectRatio i spraw, aby Modifier.resizeWithContentScale przyjmował aspectRatio: Float? zamiast sourceSizeDp: Size?.
    • Dodaj klasę CuesState i funkcję kompozycyjną rememberCuesState do modułu media3-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ądzeniu ExoPlayer lub CompositionPlayer.
    • Dodaj obsługę showArtwork do PresentationState i używaj jej do mierzenia czasu renderowania podanego opcjonalnego elementu kompozycyjnego artwork w ContentFrame i Player. Dodaj element kompozycyjny Artwork, który będzie używany jako wartość domyślna dla boksu artwork.
    • Dodaj nowe pola do PlayPauseButtonState (showBuffering, showRetry, showReplay) i użyj ich w PlayPauseButton, aby renderować więcej ikon i wskaźnik buforowania.
    • Dodaj klasę PlaybackState, aby umożliwić niestandardową obserwację stanu odtwarzania, i wprowadź BufferingIndicator jako komponent niezależny od przycisku.
    • Rozwiązaliśmy problem, który powodował, że PlayerView i PlayerControlView wyś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, PlayerDefaults i MiniController nie otrzymują już odtwarzacza ani widoczności elementów sterujących jako parametrów. Zamiast tego przechwyć je z zakresu wywołania (np. topControls to teraz @Composable BoxScope.() -> Unit). To zmiana powodująca niezgodność w niestabilnym interfejsie API.
    • Dodaj parametr alignment do ContentFrame, Player i Modifier.resizeWithContentScale, aby umieścić przeskalowaną treść w kontenerze i przyciąć treść ContentFrame do jej granic, dzięki czemu film przeskalowany za pomocą ContentScale.Crop nie będzie już wyświetlany poza nią.
    • Dodaj obsługę interfejsu transmisji na żywo do ProgressSlider, ProgressStateWithTickCount i ProgressStateWithTickInterval, udostępniając isLive i liveOffsetMs. Dodanie funkcji kompozycyjnej LiveButton do media3-ui-compose-material3 (#2213).
  • Rozszerzenie Ktor:
    • Rozwiązaliśmy problem, który powodował, że KtorDataSource mógł traktować błędy połączenia w trakcie strumienia jako koniec danych wejściowych, zamiast zgłaszać błąd HttpDataSourceException (#3460).
  • Rozszerzenie HLS:
    • Analizuj VIDEO-RANGE (PQ i HLG) w EXT-X-STREAM-INF i EXT-X-I-FRAME-STREAM-INF do Format.colorInfo (#3441).
    • Naprawiono błąd NullPointerException podczas analizowania segmentów inicjowania MPEG-TS EXT-X-MAP, które zawierają próbki multimediów PES (#3456).
    • Naprawiono regresję, w której Format.id i Format.metadata były null w przypadku udostępnionych ścieżek HLS (#3402).
    • Przycinaj reklamy z listy zasobów do X-PLAYOUT-LIMIT i pomijaj te, które całkowicie przekraczają limit. Ustaw domyślne przesunięcie wznowienia treści na 0, gdy reklama pełnoekranowa pomija X-RESUME-OFFSET, a jej czas trwania jest nieznany, nawet jeśli ustawiono X-PLAYOUT-LIMIT.
    • Rozwiązaliśmy problem, który powodował, że rozwiązanie reklamy pełnoekranowej X-ASSET-LIST zastępowało przesunięcie wznowienia treści innych reklam pełnoekranowych w tej samej grupie reklam.
  • 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) w DashManifestParser oraz udostępnianie ich jako instancji AlternativeMpdEvent w Period.alternativeMpdEvents. Jest to zmiana powodująca niezgodność w aplikacjach, które są podklasami DashManifestParser: DashManifestParser.buildPeriod przyjmuje teraz dodatkowy parametr List<AlternativeMpdEvent>, a poprzednie przeciążenie zostało usunięte. Aplikacje zastępujące DashManifestParser.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, MatrixCoefficients i VideoFullRangeFlag) z deskryptorów EssentialProperty i SupplementalProperty do Format.colorInfo (#3426).
    • Obsługa list wartości @id rozdzielonych spacjami w atrybutach @value deskryptora trybu podglądu (http://dashif.org/guidelines/trickmode) (#3315).
    • Obsługa analizowania <ProducerReferenceTime> w DashManifestParser, udostępniania w AdaptationSet.producerReferenceTimes i używania do wypełniania Timeline.Window.presentationStartTimeMs i Timeline.Window.windowStartTimeMs w 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).
  • Rozszerzenie RTSP:
    • Naprawiono błąd powodujący awarię IllegalStateException podczas 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).
  • 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ę dla SessionAvailabilityListener.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ę w RemoteCastPlayer (#3373).
    • Naprawiono błąd ArrayIndexOutOfBoundsException w RemoteCastPlayer, 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 w RemoteCastPlayer oraz 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 addMediaItems w pustej kolejce w RemoteCastPlayer nie 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, repeatMode i playbackParameters nie były przenoszone ani stosowane, gdy ustawiono je w RemoteCastPlayer przed wczytaniem elementów multimedialnych (np. podczas przenoszenia odtwarzania z urządzenia lokalnego na zdalne w CastPlayer) (#889).
  • Aplikacja demonstracyjna:
    • Dodaj obsługę elementów multimedialnych chronionych przez DRM i dodatkowy przykładowy strumień HLS do katalogu aplikacji demonstracyjnej sesji.
    • Skonfiguruj RemoteCastPlayer z CastTrackSelector w 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) i DashUtil.buildDataSpec(Representation, String, RangedUri, int). Użyj w zamian zasady DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>).
  • Utwórz:
    • Zwiększ Gradle minSdk do 24.

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.Factory na ExtractorsFactory. Poprzednia metoda setExperimentalEnableHagcPlayback została usunięta i zastąpiona przez ExtractorsFactory.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 Surface powinien 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.allowSkippingMediaCodecFlush mogły być przez chwilę wyświetlane nieaktualne klatki filmu.
  • 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).
  • Sesja:
    • Naprawiono błąd NullPointerException, który występował, gdy MediaController w trakcie przetwarzania był zwalniany z wywołania zwrotnego Player.Listener (#3375).
    • Naprawiono blokadę w głównym wątku, gdy starsza wersja MediaBrowser łączy się z usługą zwracającą wynik asynchroniczny z onGetLibraryRoot() lub onConnectAsync() (#3393).
  • Rozszerzenie HLS:
    • Naprawiliśmy obliczanie przesunięcia wznowienia treści, gdy segment docelowy przyciągania nie znajduje się jeszcze na playliście (#3322).
    • Rozwiązaliśmy problem, który powodował, że w pełni wykorzystany obiekt HlsMediaChunk ponawiał próbę wczytania po otrzymaniu EOFException z ekstraktora (#3350).
  • Rozszerzenie DASH:
    • Naprawiliśmy błąd powodujący nieprawidłowe obliczanie sygnatury czasowej próbki w przypadku ścieżek obrazu z presentationTimeOffset (#3334).
  • 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).

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ążenie Util.getAudioTrackChannelConfig(Format), aby bezpiecznie ją rozwiązać.
    • Uaktualnij Kotlin z wersji 2.0.20 do 2.2.0.
  • ExoPlayer:
    • Naprawiliśmy błąd równoczesności zależny od czasu, który mógł powodować błąd IllegalStateException lub IndexOutOfBoundsException w ExoPlayerze.
    • Zmniejszono rygorystyczność sprawdzania liczby grup reklam w AdsMediaSource, aby umożliwić zmniejszenie liczby grup reklam po pełnym przetworzeniu grupy reklam (hasUnplayedAds() to false), co pozwala na dynamiczne zmienianie rozmiaru grup reklam podczas procesów resetowania.
    • Dodaj getFlags() i FLAG_STRICT_DURATION do SampleStream, 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 MediaCodecVideoRenderer i formatu wyjściowego kodeka w MediaCodecAudioRenderer. 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 nie supported=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, czyli RankingDataComparator, 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 element SimpleRankingDataComparator można wstrzyknąć za pomocą nowego konstruktora DefaultPreloadManager.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ć BandwidthMeter do MediaSource. Domyślnie nadal będzie wywoływana wycofana metoda z niestandardową implementacją. Zalecamy jednak wdrożenie nowej metody i użycie BandwidthMeter.getTransferListener(), aby uzyskać zgodność ze starą metodą.
    • W DefaultBandwidthMeter dodaj obsługę niestandardowego elementu InitialBitrateSupplier. 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 tworzenia DefaultBandwidthMeter i przy zmianach typu sieci. Dostawcę można ustawić za pomocą DefaultBandwidthMeter.Builder.setInitialBitrateSupplier().
    • Domyślnie włącz planowanie dynamiczne. Pętla robocza odtwarzania ExoPlayer bę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 DefaultBandwidthMeter zoptymalizuj getInitialBitrateCountryGroupAssignment, 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 AudioTrack na 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 setAudioSessionId używany był początkowy identyfikator sesji audio wygenerowany automatycznie przez ExoPlayer (#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.selectionPriority reprezentujący względne preferencje Format podczas 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.
  • CompositionPlayer:
    • Rozwiązaliśmy problem, który powodował, że instancje TrackSelector nie były zwalniane.
  • Transformator:
    • Rozwiązaliśmy problem, który mógł powodować zawyżanie liczby zdarzeń ExportResult.fileSizeBytes.
  • Wybór ścieżki:
    • Udostępnij BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR i dodaj AdaptiveTrackSelection.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.
  • 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 Chapter w Metadata ś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 pola sidx. Aby to umożliwić, podaj FLAG_READ_MFRA_FOR_SEEK_MAP w FragmentedMp4Extractor, co jest teraz domyślnie wykonywane w DefaultExtractorsFactory (#3088).
    • Ignoruję dane av1C z nieobsługiwaną wersją.
    • MP4: dodano obsługę reprezentacji zmiennoprzecinkowej PCM big endian w polach fpcm.
    • Matroska: analizuj informacje o rozdziałach do wpisów Chapter w Metadata ś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 sgpd o 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).
  • 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 pozwoli DefaultAudioSink na użycie tej jawnej maski zamiast wnioskowania na podstawie liczby kanałów.
    • Przekształć parametry AudioSink.configure w klasę danych. Niestandardowe zastąpienia metody ForwardingAudioSink.configure muszą 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.getChannelMapping na ImmutableIntArray.
    • 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 Timeline i okresu do AudioSink.configure i AudioProcessor.StreamMetadata w 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 zwrotne Choreographer i nadmierne wybudzanie procesora w głównym wątku.
  • Tekst:
    • TTML: powrót do displayAlign z style w przypadku regionów (#2559).
    • TTML: dziedziczenie czasu rozpoczęcia wskazówki z elementu nadrzędnego elementów <p> (#3246).
  • Metadane:
    • Dodaj pole MediaMetadata.discSubtitle i przeanalizuj je z danych ID3v2.4 TSST i Vorbis DISCSUBTITLE.
    • Analizuj numer i liczbę płyt z ramki ID3 TPOS.
  • Efekt:
    • Wyczyść stan ponownego rysowania w FinalShaderProgramWrapper podczas opróżniania, aby zapobiec zawieszaniu się odtwarzacza podczas przewijania.
  • Muksery:
    • Dodaj obsługę odniesień do ścieżek (pole tref) w Mp4Muxer za pomocą nowego interfejsu API addTrackReference. 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 multimedialnych OPUS lub VORBIS do formatu pliku ogg.
    • Dodaj WavMuxer, aby wygenerować plik WAV (obsługuje liczby całkowite i reprezentację zmiennoprzecinkową PCM).
    • Dodaj setAttemptStreamableOutputEnabled do InAppMp4Muxer.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 Mp4Muxer i FragmentedMp4Muxer.
  • 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).
  • Sesja:
    • Naprawiono potencjalne blokady i błędy IllegalStateException w MediaNotificationManager podczas 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łąd IllegalStateException, 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 (IllegalStateException w MediaUtils.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 Media3 SessionToken.
    • 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 MediaSession za pomocą nowego interfejsu API MediaSession.Builder#setPackageNameOverride. Aby zastąpić nazwę pakietu sesji, wywołujący musi mieć uprawnienie android.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ć Future z Futures.immediateFuture(ConnectionResult), aby uzyskać poprzednie działanie. Zalecamy przejście na nową metodę, ponieważ Callback.onConnect może zostać wycofana.
    • Naprawiliśmy problem, który powodował, że przeglądanie Bluetooth AVRCP nie rozpoznawało MediaLibraryService w 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 ForegroundServiceStartNotAllowedException powodujący awarię w MediaNotificationManager, 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 PositionInfo otrzymane przez MediaController nie miały oryginalnych identyfikatorów UID Timeline. Sesja teraz niezawodnie tłumaczy i rozpowszechnia te identyfikatory UID podczas aktualizacji stanu.
    • Naprawiono awarię przez przechwytywanie ForegroundServiceStartNotAllowedException w MediaSessionService.stopSelfSafely() (#3310).
    • Naprawiono nieoczekiwane wywołanie zwrotne onMediaItemTransition() w MediaController podczas przewijania w obrębie tego samego elementu multimedialnego (#3248).
  • UI:
    • Naprawiono błąd powodujący renderowanie pierwszej klatki w nieprawidłowym rozmiarze, gdy ContentFrame jest rekomponowany w trakcie odtwarzania (#3238).
    • Dodaj klasę CurrentMediaItemState i odpowiadający jej element rememberCurrentMediaItemState Composable do modułu media3-ui-compose. Ta zmienna stanu jest używana w demo-compose do wyświetlania różnych metadanych dotyczących aktualnie odtwarzanego elementu MediaItem.
    • Dodaj klasę PlaylistState i odpowiadający jej element rememberPlaylistState Composable do modułu media3-ui-compose. Ta zmienna stanu jest używana w demo-compose do wyświetlania różnych metadanych dotyczących MediaItems ustawionego w odtwarzaczu.
    • Dodaj interfejs API przyspieszania/zwolnionego tempa do PlaybackSpeedState. Użyj tej funkcji w demo-compose, aby pokazać przewijanie do przodu przez przytrzymanie.
    • Dodaj element kompozycyjny MiniController do modułu media3-ui-compose-material3. Zapewnia kompaktowy interfejs do sterowania Player, wyświetlając tytuł, wykonawcę, grafikę i postęp bieżącego elementu multimedialnego.
    • Dodaj klasę ErrorState i odpowiadający jej element rememberErrorState Composable do modułu media3-ui-compose. Dodaj ErrorText funkcję kompozycyjną do media3-ui-compose-material3 i ustaw ją jako domyślną nakładkę na Player.
    • Opublikuj obiekt PlayerDefaults z elementami kompozycyjnymi dla TopControls, CenterControls, BottomControls i ErrorOverlay.
    • Dodaj FocusRequester do funkcji kompozycyjnej Player i jej boksów treści.
    • Opublikuj PlayerPool (common-ktx) i rememberPooledPlayer (ui-compose), aby umożliwić wstępne wczytywanie MediaItems w środowiskach interfejsu z oknem przesuwnym. Zaprezentuj tę funkcję w demo-compose za pomocą nowego ShortFormPlayerScreen.
    • Naprawiliśmy błąd związany z blokowaniem migawki w PlayerView i Compose PresentationState, który powodował awarie na osiach czasu nieobsługujących wyszukiwania identyfikatora UID okresu (#3264).
  • Pobrane pliki:
    • Rozwiązywanie zmiennych HLS na playliście multimediów podczas pobierania (#3258).
  • Rozszerzenie Ktor:
    • Dodaj nowy moduł rozszerzenia media3-datasource-ktor, który udostępnia KtorDataSource obsługiwany przez stos HTTP Ktor.
    • Naprawiono błąd KtorDataSource polegający na wczytywaniu całej treści odpowiedzi HTTP do pamięci podczas otwierania połączenia (#3305).
  • Rozszerzenie HLS:
    • Dodaliśmy obsługę sterowania treściami HLS i klonowania ścieżek (#1689).
    • Dodaj setWithAssetListReset do HlsInterstitialsAdsLoader, 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 SCORE w EXT-X-STREAM-INF i EXT-X-I-FRAME-STREAM-INF, a następnie wypełnij nim Format.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 TrackGroup na podstawie języka (#3113).
    • Dodaj obsługę analizowania wielu elementów Location z pliku manifestu (MPD) i wykonywania zastępczej lokalizacji w DashMediaSource, gdy nie uda się wczytać pliku manifestu.
    • Naprawiono błąd (IndexOutOfBoundsException) powodujący awarię podczas otwierania plików manifestu z pustym elementem <SegmentTimeline/> (#3326).
  • 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łanie Cast.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 MediaRouteButtonState i rememberMediaRouteButtonState, aby umożliwić obserwowanie stanu widoczności selektora trasy multimediów, oraz dodano parametr state do MediaRouteButton (#3172).
    • Naprawiliśmy błąd, który powodował, że po wybraniu ścieżki RemoteCastPlayer mogł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 DefaultMediaItemConverter zgłaszał błąd NullPointerException podczas próby dołączenia do sesji przesyłania rozpoczętej przez nadawcę innego niż Media3.
    • Zapobieganie przesyłaniu przez CastPlayer elementów MediaItems, 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 jako STREAM_TYPE_BUFFERED (#3318).
  • Narzędzia testowe:
    • Rozszerz DataSourceContractTest, aby uwzględnić obsługę żądań POST z nagłówkami i treścią, dodaj zasoby POST do HttpDataSourceTestEnv i dodaj asercje dla oczekiwanej metody HTTP, nagłówków i treści w WebServerDispatcher.
    • Zaostrz asercje w DataSourceContractTest dla długości zwracanych z DataSource.open(). Zasoby, które mogą powodować C.LENGTH_UNSET, powinny to wskazywać za pomocą TestResource.Builder.setMayResolveToUnknownLength(boolean).
    • Dodano setPlaybackLooper do TestExoPlayerBuilder.
  • Usuń wycofane symbole:
    • Usuń androidx.media3.exoplayer.MetadataRetriever. Użyj w zamian zasady androidx.media3.inspector.MetadataRetriever.
    • Usuń androidx.media3.exoplayer.MediaExtractorCompat. Użyj w zamian zasady androidx.media3.inspector.MediaExtractorCompat.
    • Usuń Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA. Zamiast tego użyj HeifExtractor, aby wyodrębnić metadane zdjęć ruchomych z plików HEIC.
    • Usuń androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata. Użyj w zamian zasady androidx.media3.extractor.metadata.MotionPhotoMetadata.
    • Usuń androidx.media3.extractor.DummyTrackOutput. Użyj w zamian zasady androidx.media3.extractor.DiscardingTrackOutput.
    • Usuń androidx.media3.extractor.DummyExtractorOutput. Użyj w zamian zasady androidx.media3.extractor.NoOpExtractorOutput.
    • Usuń androidx.media3.common.C.generateAudioSessionIdV21. Użyj w zamian zasady androidx.media3.common.util.Util.generateAudioSessionId.
  • Tworzenie
    • Zaktualizowaliśmy instrukcje README.md dotyczące lokalnego polegania na Media3, aby używać kompilacji wieloprojektowych Gradle (includeBuild). Skrypt core_settings.gradle został usunięty, a właściwości androidxMediaModulePrefix i androidxMediaEnableMidiModule nie są już używane.

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ę onAudioSessionIdChanged w SimpleBasePlayer i ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Naprawiono sytuację wyścigu związaną z generowaniem identyfikatora sesji audio, która mogła prowadzić do błędu IllegalStateException w 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).
  • 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).
  • Ekstraktory:
    • MP3: ignorowanie długości danych Xing, jeśli jest ona większa niż znana długość strumienia (#3117).
    • Naprawiono błąd ArrayIndexOutOfBoundsException w Mp4Extractor, gdy ustawiono FLAG_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 queueSecureInputBuffer dla 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 ForegroundServiceStartNotAllowedException nie 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_ITEM nie był dostępny w MediaController podczas łą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 MediaController nie może ustawiać elementów multimedialnych w sesjach multimedialnych na platformie, które nie zezwalają na działania PREPARE_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.
  • Rozszerzenie HLS:
    • Naprawiono błąd, który powodował zgłaszanie wyjątku ArrayIndexOutOfBoundsException podczas 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-MAP nie był powtarzany w kolejnych aktualizacjach (#3105).
  • Rozszerzenie DASH:
    • Naprawiono błąd powodujący awarię w SampleQueue podczas przechodzenia do fragmentu, który jest obecnie anulowany.

1.10.0

26 marca 2026 r.

  • Biblioteka wspólna:
    • Przenieś Player.mute() i Player.unmute() z: UnstableApi do wersji stabilnej.
    • Przenieś Format.pcmEncoding i C.PcmEncoding z: UnstableApi do wersji stabilnej.
    • Dodaj Format.primaryTrackGroupId, aby zidentyfikować główną grupę umieszczonych instancji Format (#294).
  • 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() w DefaultRenderersFactory.
    • Zezwalaj na ustawianie niestandardowego DataSource.Factory w DefaultPreloadManager.Builder.
    • Zezwalaj na pozorowanie ExoPlayer bez Robolectric przez przeniesienie niektórych domyślnych stałych do ExoPlayer.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_MS z ExoPlayer do ExoPlayer.Builder (bez wycofania).
    • Naprawiliśmy błąd, który powodował, że ProgressiveMediaSource przekazywał 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).
  • CompositionPlayer:
    • Dodaj obsługę EditedMediaItem.removeVideo.
  • 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 TrackSelectionParameters dla: preferredVideoLanguages, preferredVideoLabels, preferredAudioLabels, preferredTextLabels i selectTextByDefault.
  • Ekstraktory:
    • MP4: obsługa plików z dużymi polami uuid przed innymi polami, takimi jak moov (#3046).
    • MP4: dodaliśmy obsługę ścieżek Versatile Video Coding (VVC) w kontenerach MP4.
  • Inspektor:
    • Zmiana powodująca niezgodność: usuń FrameExtractor. Użytkownicy powinni teraz korzystać z nowego modułu :media3-inspector-frame i zaktualizować importy do androidx.media3.inspector.frame.FrameExtractor.
    • Wprowadź nowy moduł do wyodrębniania i przetwarzania zdekodowanych klatek wideo.
  • Dźwięk:
    • Zmieniono podstawową bibliotekę dekodowania rozszerzenia dekodera IAMF z libiamf na iamf_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 AC4Profile22 i innych starszych profili podczas oceny obsługi dekodera AC-4 w scenariuszach motoryzacyjnych (#2609).
    • Ulepszono logikę ponawiania inicjowania AudioOutput w DefaultAudioSink (#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.
  • Tekst:
    • VobSub: używanie poleceń sterujących SPU START i STOP do określania czasu trwania podpowiedzi zamiast domyślnego ustawienia 5 sekund (#2935).
  • 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ś LottieOverlay do nowego modułu :media3-effect-lottie (co wiąże się też ze zmianą nazwy z androidx.media3.effect.LottieOverlay na androidx.media3.effect.lottie.LottieOverlay).
  • Efekt Lottie:
    • Wprowadzamy nowy moduł :media3-effect-lottie, który umożliwia stosowanie efektów Lottie do klatek wideo.
  • 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 setEnableCustomTabs do ImaAdsLoader i ImaServerSideAdInsertionMediaSource, 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 tworzenia adTagUri. Zawiera interfejs API setPreferredLinearOrientation. 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.artworkData mogły powodować awarię aplikacji.
    • Użyj typu int dla argumentu @Player.Command w interfejsie ActionFactory (#2933).
    • Ustaw MediaSessionService i MediaLibraryService jako LifecycleService, 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 MediaController i MediaBrowser w 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 API AudioManager.
    • Wykrywanie nieaktywnych instancji Intent, które uruchomiły usługę jako usługę na pierwszym planie. Zapobiega to zgłaszaniu przez system błędu ForegroundServiceDidNotStartInTimeException. Jest to zmiana powodująca niezgodność w niestabilnym interfejsie API w przypadku programów, które implementują niestandardowy element MediaNotification.Provider, ponieważ pojawiła się nowa wymagana metoda.
    • Dodaj kreatory instancji PendingIntent do użycia z widżetami ekranu głównego (#2933).
    • Dodano metody statyczne do tworzenia instancji Intent dla 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).
  • UI:
    • Dodaj element kompozycyjny PlaybackSpeedControl do media3-ui-compose, aby wyświetlać i modyfikować szybkość odtwarzania.
    • Dodaj element kompozycyjny PlaybackSpeedToggleButton do media3-ui-compose-material3, aby kontrolować szybkość odtwarzania.
    • Dodano element kompozycyjny ProgressSlider do media3-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 Player do media3-ui-compose-material3, który łączy ContentFrame z 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.
  • Rozszerzenie HLS:
    • Obsługa X-PLAYOUT-LIMIT z reklamami pełnoekranowymi HLS (#2484).
    • Obsługa atrybutu QUERYPARAM za 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:
    • Rozwiązaliśmy problem, który powodował, że ścieżki z niedopasowanymi czasami rozpoczęcia segmentów powodowały opóźnienia lub pominięcie próbek na początku odtwarzania (#3057).
    • Naprawiono błąd, który powodował, że sygnatury czasowe metadanych EMSG v0 w paśmie nie były prawidłowo ustawiane (#3024).
  • 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.
  • Usuń wycofane symbole:
    • Usuń ExperimentalFrameExtractor. Użyj w zamian zasady androidx.media3.inspector.frame.FrameExtractor.
    • Usuń ChannelMixingMatrix.create(). Użyj w zamian zasady ChannelMixingMatrix.createForConstantGain().
    • Usuń androidx.media3.extractor.metadata.flac.VorbisComment. Użyj w zamian zasady androidx.media3.extractor.metadata.vorbis.VorbisComment.
    • Usuń MediaSource.prepareSource(MediaSourceCaller, TransferListener). Użyj w zamian zasady MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId).

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_BUFFER i GL_READ_BUFFER.

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 ProgressiveMediaSource przekazywał do odtwarzacza nieaktualne informacje o osi czasu, a okresy w kolejce były nieoczekiwanie usuwane (#3016).
  • 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ł doSomeWork dopiero po rozpoczęciu odtwarzania dźwięku, co pozwoli na płynniejszą synchronizację audio-wideo na początku odtwarzania.
    • Naprawiono błąd w DefaultLoadErrorHandlingPolicy, który powodował, że FileNotFoundException i 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 doSomeWork był błędnie skracany o czas, który upłynął od bieżącej iteracji doSomeWork. 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 MediaItem podczas wielokrotnego używania ExoPlayer.replaceMediaItem na tym samym elemencie (#2993).
    • Zapobieganie potencjalnym błędom ANR spowodowanym przez awaryjne zwolnienia blokady uśpienia (#2979).
  • Ekstraktory:
    • MP3: analizowanie danych LAME ReplayGain (#2840).
  • Dźwięk:
    • Prawidłowe usuwanie obsługi AC4Profile22 i innych starszych profili podczas oceny obsługi dekodera AC-4 w scenariuszach motoryzacyjnych (#2609).
  • 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() i AdEvent.getAd().
  • Sesja:
    • Naprawiliśmy błąd, który powodował awarię aplikacji, gdy zatrzymanie sesji MediaController połączonej z platformą nastąpiło podczas odtwarzania reklamy (#2948).
    • Dodaj dodatkowe weryfikacje instancji extras Bundle w różnych klasach, aby chronić przed nieprawidłowymi instancjami Bundle wysyłanymi z innych procesów.
    • Rozwiązaliśmy problem, który powodował, że brakujące polecenia dla COMMAND_SEEK_NEXT lub COMMAND_SEEK_BACK mogł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 MediaMetadataCompat i MediaDescriptionCompat (#3018).
  • Pobrane pliki:
    • Naprawiliśmy potencjalne nieskończone pętle, gdy PriorityTooLowException jest obsługiwany przez SegmentDownloader (w przypadku DASH, HLS i SmoothStreaming). Niestandardowe zastąpienia SegmentDownloader przy użyciu chronionej metody execute muszą udostępniać zadanie opakowane w Supplier, aby można było je odtworzyć (#2931).
  • 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 typu JSONObject (#2950).
  • 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).
  • Rozszerzenie Cast:
    • Naprawiono błąd, który uniemożliwiał prawidłowe aktualizowanie osi czasu RemoteCastPlayer podczas zastępowania playlisty.

1.9.0

17 grudnia 2025 r.

  • Biblioteka wspólna:
    • Zaktualizowano minSdk do 23 zgodnie z innymi bibliotekami AndroidX.
    • Dodaj PlayerTransferState, co ułatwia przenoszenie stanu odtwarzania między instancjami Player.
    • Dodaj do klasy Player metody void mute() i void 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, AudioBecomingNoisyManager i StuckPlayerDetector, które były wcześniej używane wewnętrznie przez ExoPlayer, 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.listenTo w bibliotece media3-common-ktx, która określa konkretny element Player.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 TrackGroup przez nieignorowanie niestandardowego typu MIME próbki i używanie potencjalnie nieprawidłowego typu ścieżki z typu MIME kontenera (#2860).
  • 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ć w ExoPlayer.Builder:
      • Po 10 minutach STATE_BUFFERING podczas próby odtworzenia i braku postępu buforowania.
      • Po 10 sekundach STATE_READY podczas próby odtworzenia i braku postępu odtwarzania.
      • Po minucie STATE_READY przekraczającej zadeklarowany czas trwania bez osiągnięcia końca elementu.
      • Po 10 minutach od wystąpienia przyczyny wstrzymania odtwarzania podczas próby odtworzenia.
    • 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.setWakeMode na C.WAKE_MODE_LOCAL.
    • Dodaj logikę nasłuchiwania, aby automatycznie aktualizować identyfikator urządzenia wirtualnego, gdy zostanie zgłoszona zmiana w obiekcie Context pierwotnie przekazanym do metody ExoPlayer.Builder.
    • Dodaj ExoPlayer.setVirtualDeviceId, aby ręcznie zaktualizować identyfikator urządzenia wirtualnego uzyskany z Context przekazanego do ExoPlayer.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, setSeekForwardIncrementMs i setMaxSeekToPreviousPositionMs do ExoPlayer, aby zaktualizować te ustawienia po utworzeniu (#2736).
    • Dodaj funkcję wstępnego buforowania w DefaultPreloadManager. Aplikacje mogą teraz zwracać DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) lub DefaultPreloadManager.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 DefaultPreloadManager w aplikacji demonstracyjnej do krótkich filmów.
    • Dodaj metody ustawiające DefaultLoadControl.Builder na potrzeby odtwarzania lokalnego i dostosuj domyślne wartości DefaultLoadControl, 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_READY lub STATE_BUFFERING.
    • Ulepsz interfejsy API menedżera wstępnego wczytywania:
      • Dodaj metody addMediaItems(List<MediaItem>, List<T>) i addMediaSources(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>) i removeMediaSources(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ć metody invalidate().
    • 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ślonym playerName. DefaultLoadControl może teraz podejmować decyzje dotyczące każdego odtwarzacza osobno na podstawie przydzielonych mu bajtów i docelowych bajtów bufora.
    • Dodaj SkipInfo do AdPlaybackState.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) dla playerName o wartości PlayerId.Preload.name („preload”) i wstrzyknąć utworzony DefaultLoadControl za pomocą DefaultPreloadManager.Builder.setLoadControl(LoadControl).
    • Dodano cloneAndSet(int, int) do ShuffleOrder z 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 MediaCodec i wymaga interfejsu API w wersji 29 lub nowszej.
      • Aby zastosować parametry, użyj ExoPlayer.setAudioCodecParameters() i ExoPlayer.setVideoCodecParameters().
      • Aby nasłuchiwać zmian, użyj ExoPlayer.addAudioCodecParametersChangeListener() i ExoPlayer.addVideoCodecParametersChangeListener(). Obserwowanie kluczy dostawcy wymaga interfejsu API w wersji 31 lub nowszej.
    • Naprawiono błąd IllegalStateException spowodowany 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 NullPointerException w DefaultPlaybackSessionManager (#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.experimentalSetLateThresholdToDropDecoderInputUs na 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.
  • CompositionPlayer:
    • Opublikuj CompositionPlayer z 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_ATTRIBUTES i obsługę fokusu audio w CompositionPlayer.
    • Dodaj obsługę zmiany szybkości w sekwencjach dodatkowych w CompositionPlayer.
    • Dodaj obsługę EditedMediaItem.removeVideo.
  • Transformator:
    • Użyj InAppMp4Muxer jako domyślnego multipleksera.
    • Dodaj EditedMediaItem.Builder#setSpeed() i wycofaj Effects#createExperimentalSpeedChangingEffects().
    • Zastąp forceAudioTrack i forceVideoTrack wartością trackTypes w EditedMediaItemSequence.
  • 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, preferredAudioLabels i preferredTextLabels w TrackSelectionParameters, aby określić preferencje dotyczące ścieżek z konkretną etykietą, np. odczytanych z tagów HLS NAME (#1666).
  • 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 ustawiono FLAG_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-L1 i audio/mpeg-L2 przez 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 stbl wię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 obiekty TextInformationFrame w Format.metadata z identyfikatorami odpowiednio MVNM i MVIN (#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 IllegalArgumentException z ReorderingBufferQueue spowodowany przez pakiety PES bez sygnatury czasowej (#2764).
    • Dodano obsługę wyodrębniania zdjęć ruchomych HEIC. HeifExtractor moż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 interfejs androidx.media3.inspector.MetadataRetriever, który będzie udostępniać ujednolicony interfejs API do wyodrębniania metadanych i klatek. Dotychczasowa wersja androidx.media3.exoplayer.MetadataRetriever została wycofana na rzecz nowej.
    • Wprowadziliśmy androidx.media3.inspector.FrameExtractor, nowy publiczny interfejs API do wyodrębniania klatek. Ta klasa AutoCloseable umożliwia wyodrębnianie klatek z obsługą filmów HDR, efektów wideo i niestandardowego wyboru dekodera. Należy go utworzyć za pomocą Builder dla konkretnego elementu MediaItem.
    • 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ępuje android.media.MediaExtractor platformy i umożliwia wyodrębnianie nieprzetworzonych, zakodowanych próbek multimediów z pliku multimedialnego. Dotychczasowa klasa androidx.media3.exoplayer.MediaExtractorCompat została wycofana na rzecz tej nowej klasy.
  • Dźwięk:
    • Powiadom instancje AudioProcessor o przewijaniu.
    • Zezwalaj na wstrzykiwanie nowego interfejsu AudioOutputProvider do DefaultAudioSink.Builder, aby obsługiwać niestandardowe ścieżki wyjścia audio. Wartość domyślna to AudioTrackAudioOutputProvider.
    • 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.
  • 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 MediaDrmCallback z byte[] na nowy typ MediaDrmCallback.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[] w new Response przed zwróceniem.
    • Dodaj do AnalyticsListener.onDrmKeysLoaded kluczowe 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.
  • Efekt:
    • Dodaj Presentation.copyWithUnsetSideRoundedTo, aby zaokrąglić nieustawioną stronę wyjściową, gdy Presentation jest tworzony z jedną długością boku.
  • Muksery:
    • Dodaj MediaMuxerCompat, który jest bezpośrednim zamiennikiem platformy MediaMuxer.
    • Dodaj MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo(), aby umożliwić tworzenie zdjęć ruchomych.
    • Dodaj WebmMuxer, aby umożliwić multipleksowanie strumieni multimedialnych OPUS, VORBIS, VP8 i VP9 do formatu pliku webm.
  • 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 ProgressListener do metod poleceń niestandardowych.
    • Zmień domyślną wartość MediaLibrarySession.Builder.setLibraryErrorReplicationMode na niekrytyczną.
    • Dodaj parametr Context do MediaButtonReceiver.onForegroundServiceStartNotAllowedException (#2625).
    • Odczytaj identyfikator sterowania głośnością z platformy PlaybackInfo zamiast 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_UP przed 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 przez PlayerWrapper, 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ą MediaBrowser polecenia niestandardowe są wysyłane do sesji tylko wtedy, gdy działanie niestandardowe jest reklamowane jako działanie niestandardowe w PlaybackStateCompat starszej 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_HEADSETHOOK nie uruchamiało odtwarzacza, gdy zdarzenie klawisza multimedialnego Intent docierało do onStartCommand(). Rozwiązaliśmy ten problem, obsługując „KEYCODE_HEADSETHOOK” tak samo jak KEYCODE_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ż String CharSequence, 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ąc Player.Command lub niestandardowego SessionCommand, 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 Bitmap był kompresowany wielokrotnie podczas łączenia elementu MediaController z sesją multimedialną platformy.
  • UI:
    • Dodaj klasę ProgressStateWithTickInterval i odpowiadający jej element kompozycyjny rememberProgressStateWithTickInterval do modułu media3-ui-compose. Ta zmienna stanu jest używana w demo-compose do wyświetlania bieżącej pozycji i czasu trwania w formie tekstowej.
    • Dodaj do ui-compose element MuteButtonState, który obsługuje wyciszanie głośności Player. Ta zmienna stanu jest używana w demo-compose do wyświetlania przycisku przełączania wyciszenia/wyłączenia wyciszenia.
    • Dodaj klasy ProgressStateWithTickCount i odpowiadający im element rememberProgressStateWithTickCount Composable do modułu media3-ui-compose. Ta zmienna stanu jest używana w funkcji demo-compose do wyświetlania postępu w postaci poziomego paska postępu tylko do odczytu.
    • Dodaj element kompozycyjny ContentFrame do media3-ui-compose, który łączy zarządzanie PlayerSurface ze 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 SurfaceView w Compose AndroidView, co wpływa na elementy kompozycyjne ContentFrame i PlayerSurface z SURFACE_TYPE_SURFACE_VIEW (#1237, #2811).
    • Utwórz nowy moduł media3-ui-compose-material3 i dodaj do niego elementy kompozycyjne z motywem Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton).
    • Dodaj element kompozycyjny TimeText do media3-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).
  • 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() i skipCurrentAdGroup() 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 HlsMediaPlaylist bez segmentów (#2821).
    • Użyj domyślnej pozycji początkowej w przypadku reklam przed filmem w transmisjach na żywo.
  • Rozszerzenie DASH:
    • Naprawiono błąd UnsupportedOperationException podczas odtwarzania strumieni DASH z niehierarchicznym plikiem manifestu URI data: (#2688).
    • Zresetuj LiveConfiguration do wartości podanej przez MediaItem elementu DashMediaSource po 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).
  • 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 STREAMINFO i przekazywania go do dekodera (#2887).
  • Rozszerzenie Cast:
    • Dodaj CastPlayer.Builder, co umożliwi CastPlayer odtwarzanie lokalne i przesyłanie. Aby zachować stare działanie CastPlayer, które obsługuje tylko odtwarzanie Cast, możesz użyć RemoteCastPlayer. Dotychczasowe konstruktory CastPlayer zachowują swoje stare działanie, ale są wycofywane na rzecz kreatorów CastPlayer lub RemoteCastPlayer.
    • 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 w DefaultCastOptionsProvider#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.
  • 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 (i runLooperUntil). Domyślnie jest to 1 sekunda, ale można to skonfigurować za pomocą nowych przeciążeń tych metod.
    • Przenieś CapturingRenderersFactory z kampanii test-utils do kampanii test-utils-robolectric.
  • Usuń wycofane symbole:
    • Usuń wycofany konstruktor DefaultPreloadManager. Użyj w zamian zasady DefaultPreloadManager.Builder.
    • Usunięto wycofane konstruktory EditedMediaItemSequence. Użyj w zamian zasady EditedMediaItemSequence.Builder.
    • Usuń BitmapFactoryImageDecoder.BitmapDecoder. Użyj w zamian zasady ExternallyLoadedImageDecoder.
    • Usuń wycofany element ShadowMediaCodecConfig.forAllSupportedMimeTypes(). Użyj w zamian zasady ShadowMediaCodecConfig.withAllDefaultSupportedCodecs().
    • Usuń wycofane ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes(). Użyj w zamian zasady ShadowMediaCodecConfig.withNoDefaultSupportedCodecs().

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_BUFFER i GL_READ_BUFFER.

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.
  • ExoPlayer:
    • Dodano metodę pobierającą dla trybu odtwarzania losowego do interfejsu ExoPlayer (#2522).
    • Wyraźniej zgłaszaj wyjątek, jeśli dostęp do DefaultAudioSink jest uzyskiwany z wielu wątków. Jeśli dzieje się tak z powodu wywołania metody RendererCapabilities.getFormatSupport poza 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 DefaultTrackSelector jako nieobsługiwane.
    • Sprawdź, czy ostatnia klatka jest prawidłowo renderowana, gdy używasz flagi DECODE_ONLY MediaCodec (która jest domyślnie włączona w trybie przewijania).
    • Dodaj obsługę korzystania z identyfikatora urządzenia wirtualnego z Context przekazanego do ExoPlayer.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_ONLY w trybie przewijania.
    • Zgłaszanie błędu IllegalStateException, gdy PreloadMediaSource jest odtwarzany przez ExoPlayer z wątkiem odtwarzania innym niż wątek wstępnego wczytywania (#2495).
    • Dodano cloneAndMove do ShuffleMode z 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 funkcji render.
    • 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(..) na ExoPlayer i ExoPlayer.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 AdsMediaSource mogł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.Factory na zwracanie wartości null, 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.
  • Transformator:
    • Dodaj CodecDbLite, który umożliwia optymalizację ustawień kodowania wideo pod kątem konkretnego chipsetu.
    • Dodaj flagę setEnableCodecDbLite do DefaultEncoderFactory, 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 ustawienia experimentalSetForceAudioTrack(true) w EditedMediaItemSequence.Builder. Jeśli luka znajduje się w środku sekwencji, ta flaga nie jest wymagana.
    • Przenieś interfejs Muxer z media3-transformer do media3-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.
  • 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ą flagi FLAG_MERGE_FRAGMENTED_SIDX na FragmentedMp4Extractor (#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 typu WAVE_FORMAT_EXTENSIBLE używać danych SubFormat rozszerzenia nagłówka dla formatu audio.
    • MP4: dodano obsługę boksów ipcm i fpcm definiują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.onAudioPositionAdvancing nie 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 ChannelMappingAudioProcessor i TrimmingAudioProcessor.
    • Dodaliśmy obsługę przerw w dźwięku w CompositionPlayer.
    • Usuń nieprawidłowe wywołanie funkcji BaseAudioProcessor#flush() z pliku BaseAudioProcessor#reset().
    • Zezwalaj na miksowanie w górę i w dół ze stałą mocą w DefaultAudioMixer.
    • Ustaw ChannelMappingAudioProcessor, TrimmingAudioProcessor i ToFloatPcmAudioProcessor jako publiczne (#2339).
    • Użyj AudioTrack#getUnderrunCount() w AudioTrackPositionTracker, aby wykrywać niedopełnienia w DefaultAudioSink zamiast 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.onAudioPositionAdvancing nie 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).
  • 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_ONLY podczas 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 jako EXCEEDS_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/SSA w plikach Matroska. Wcześniej MatroskaExtractor obsługiwał tylko CodecId = 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 layer w 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 Timeline do MetadataRetriever oraz przeniesiono ją do interfejsu API AutoCloseable opartego na instancjach. Użyj nowego Builder, aby utworzyć instancję dla MediaItem, a następnie wywołaj retrieveTrackGroups(), retrieveTimeline() i retrieveDurationUs(), aby uzyskać ListenableFuture dla metadanych. Poprzednie metody statyczne zostały wycofane (#2462).
  • Obraz:
    • Ogranicz zdekodowane bitmapy do rozmiaru wyświetlania w BitmapFactoryImageDecoder, aby uniknąć awarii aplikacji z Canvas: trying to draw too large bitmap. z PlayerView podczas próby wyświetlenia bardzo dużych obrazów (np. 50 MP).
    • Zmień sygnaturę funkcji DefaultRenderersFactory.getImageDecoderFactory(), aby przyjmowała parametr Context.
    • Dopasuj maksymalny rozmiar wyjściowy bitmapy używany w CompositionPlayer do rozmiaru używanego już w Transformer (co oznacza, że w przeciwieństwie do ExoPlayer CompositionPlayer nie uwzględnia rozmiaru wyświetlacza podczas dekodowania bitmap).
  • DRM:
    • Dodano nowe przeciążenie OfflineLicenseHelper.newWidevineInstance akceptujące MediaItem.DrmConfiguration, aby nagłówki żądań HTTP mogły być prawidłowo stosowane (#2169).
  • Efekt:
    • Dodaj Presentation.createForShortSide(int), który tworzy Presentation, aby najkrótszy bok zawsze odpowiadał podanej wartości, niezależnie od orientacji wejściowej.
  • 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 klasy BufferInfo, która jest powiązana z multiplekserem, zamiast klasy MediaCodec.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 setSessionExtras z głównego wątku, gdy odtwarzacz był uruchamiany z innego wątku aplikacji niż główny, powodowało błąd IllegalStateException (#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 PlaybackException dla wszystkich lub wybranych kontrolerów.
    • Naprawiono błąd, który powodował, że przewijanie transmisji na żywo na urządzeniu MediaController mogło powodować błąd IllegalArgumentException.
    • 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 getLibraryRoot w MediaBrowser połączonym ze starszą wersją MediaBrowserServiceCompat powodowało błąd NullPointerException.
    • 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.uri był udostępniany w MediaMetadata sesji platformy. Aby celowo udostępnić identyfikator URI i umożliwić kontrolerom ponowne żądanie multimediów, ustaw MediaItem.RequestMetadata.mediaUri.
  • UI:
    • Naprawiliśmy błąd, który powodował, że PlayerSurface w komponentach wielokrotnego użytku, takich jak LazyColumn, 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-compose dla SeekBackButtonState i SeekForwardButtonState.
    • 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łuje player.seekTo przy 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 = true w pliku XML lub metody setTimeBarScrubbingEnabled(boolean) w języku Java/Kotlin.
    • Zmień PlayerSurface tak, aby akceptował argument Player, który może mieć wartość null.
  • Pobrane pliki:
    • Dodaj obsługę częściowego pobierania strumieni progresywnych. Aplikacje mogą przygotować strumień progresywny za pomocą DownloadHelper i poprosić o DownloadRequest z pomocnika, określając pozycje początkowe i końcowe multimediów, które powinny zostać pobrane. Zwrócony obiekt DownloadRequest zawiera rozpoznany zakres bajtów, za pomocą którego można utworzyć obiekt ProgressiveDownloader i pobrać odpowiednie treści.
    • Dodaj DownloadHelper.Factory, którym zastąpione zostaną metody statyczne DownloadHelper.forMediaItem().
    • Dodaj Factory w przypadku implementacji SegmentDownloader.
    • Dodaj obsługę częściowego pobierania strumieni adaptacyjnych. Aplikacje mogą przygotować strumień adaptacyjny za pomocą DownloadHelper i poprosić o DownloadRequest z pomocnika, określając pozycje początkowe i końcowe multimediów, które mają zostać pobrane. Zwrócony obiekt DownloadRequest zawiera określony zakres czasu, za pomocą którego można utworzyć konkretny obiekt SegmentDownloader i odpowiednio pobrać zawartość.
  • Rozszerzenie Cronet:
    • Dodano automatyczną obsługę plików cookie (#5975).
  • Rozszerzenie HLS:
    • Naprawiono błąd, który powodował, że HlsSampleStreamWrapper pró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.
  • 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).
  • 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.setAllowInvalidateSelectionsOnRendererCapabilitiesChange nie działała w przypadku rozszerzeń dekodera dźwięku (#2258).
  • Rozszerzenie Cast:
    • Dodano obsługę setVolume() i getVolume() (#2279).
    • Zapobiegaj przechodzeniu CastPlayer w stan STATE_BUFFERING, gdy oś czasu jest pusta.
    • Dodano obsługę getDeviceVolume(), setDeviceVolume(), getDeviceMuted() i setDeviceMuted() (#2089).
  • Narzędzia testowe:
    • Dodaj advance(player).untilPositionAtLeast i untilMediaItemIndex do TestPlayerRunHelper, aby odtwarzacz przechodził do przodu, aż osiągnie określoną pozycję. W większości przypadków te metody są bardziej niezawodne niż dotychczasowe metody untilPosition i untilStartOfMediaItem.
    • Przenieś FakeDownloader do modułu test-utils-robolectric, aby użyć go ponownie w innych testach.
    • Usunięto: transformer.TestUtil.addAudioDecoders(String...), transformer.TestUtil.addAudioEncoders(String...) i transformer.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.
  • Usuń wycofane symbole:
    • Usunięto wycofany konstruktor SegmentDownloader SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) i odpowiadające mu konstruktory w jego podklasach DashDownloader, HlsDownloader i SsDownloader.
    • Usunięto wycofane: Player.hasNext(), Player.hasNextWindow(). Użyj w zamian zasady Player.hasNextMediaItem().
    • Usunięto wycofaną funkcję Player.next(). Użyj w zamian zasady Player.seekToNextMediaItem().
    • Usunięto wycofaną funkcję Player.seekToPreviousWindow(). Użyj w zamian zasady Player.seekToPreviousMediaItem().
    • Usunięto wycofaną funkcję Player.seekToNextWindow(). Użyj w zamian zasady Player.seekToNextMediaItem().
    • Usunięto wycofany element BaseAudioProcessor w module exoplayer. Użyj BaseAudioProcessor w module common.
    • Usuń wycofany konstruktor MediaCodecVideoRendererMediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider).

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 kopiowanie PlaybackParameters z nową wartością pitch (#2257).
  • 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 ProgressiveMediaPeriod zgłaszał błąd IllegalStateException, gdy PreloadMediaSource próbował wywołać getBufferedDurationUs(), zanim był on gotowy (#2315).
    • Naprawiono wysyłanie CmcdData w żą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_group z pola tkhd i udostępniaj jako wpis Mp4AlternateGroupData w Format.metadata każdej ścieżki (#2242).
  • 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 MediaSession z 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 metoda COMMAND_GET_CURRENT_MEDIA_ITEM była dostępna, a odtwarzacz był pusty (#2320).
    • Naprawiono błąd, który powodował, że wywołanie MediaSessionService.setMediaNotificationProvider było ignorowane bez powiadomienia po innych interakcjach z usługą, takich jak setForegroundServiceTimeoutMs (#2305).
  • UI:
    • Włącz PlayerSurface, aby współpracować z ExoPlayer.setVideoEffects i CompositionPlayer.
    • Naprawiono błąd, który uniemożliwiał ponowne utworzenie PlayerSurface z nowym Player.
  • Rozszerzenie HLS:
    • Rozwiązaliśmy problem, który powodował, że czas trwania fragmentu nie był ustawiany w CmcdData w przypadku multimediów HLS, co powodowało błąd asercji podczas przetwarzania zaszyfrowanych segmentów multimediów (#2312).
  • 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 AudioManagerCompat i AudioFocusRequestCompat, aby zastąpić odpowiednie klasy w androidx.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 metody Format.toBundle().
    • Naprawiono błąd w SimpleBasePlayer, który powodował, że ustawienie nowego currentMediaItemIndex w State po setPlaylist z null MediaMetadata nie powodowało ponownej oceny metadanych (#1940).
    • Zmieniono dostęp do SimpleBasePlayer.State z chronionego na publiczny, aby ułatwić obsługę aktualizacji w innych klasach (#2128).
  • 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ć DefaultRenderersFactory za pomocą experimentalSetEnableMediaCodecVideoRendererPrewarming, aby zapewnić dodatkowy MediaCodecVideoRenderer dla ExoPlayer. Jeśli ta opcja jest włączona, ExoPlayer wstę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 bufferForPlaybackMs i bufferForPlaybackAfterRebufferMs w DefaultLoadControl odpowiednio do 1000 i 2000 ms.
    • Asynchronicznie inicjuj DeviceInfo i głośność urządzenia (jeśli włączono za pomocą setDeviceVolumeControlEnabled). Te wartości nie są dostępne natychmiast po ExoPlayer.Builder.build(), a Player.Listener powiadamia o zmianach za pomocą onDeviceInfoChanged i onDeviceVolumeChanged.
    • 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 selectedAudioLanguage do metody DefaultTrackSelector.selectVideoTrack().
    • Dodaj parametr retryCount do metod MediaSourceEventListener.onLoadStarted i odpowiadających im metod MediaSourceEventListener.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.Listener na najwyższy poziom PreloadManagerListener.
    • 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 CmcdData w przypadku żądań plików manifestu w formatach strumieniowania adaptacyjnego DASH, HLS i SmoothStreaming (#1951).
    • Podaj MediaCodecInfo kodeka, który zostanie zainicjowany w MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • Zmień AdsMediaSource, aby umożliwić rozwój AdPlaybackStates przez 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 DefaultRenderersFactory dodawał 2 instancje MetadataRenderer, 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 stanie true, mimo że przeszedł do stanu STATE_IDLE lub STATE_ENDED (#2133).
    • Dodaj lastRebufferRealtimeMs do LoadControl.Parameter (#2113).
  • 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.registerInputStream i VideoFrameProcessor.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 InAppMuxer na InAppMp4Muxer i InAppFragmentedMp4Muxer. InAppMp4Muxer służy do tworzenia niepofragmentowanego pliku MP4, a InAppFragmentedMp4Muxer – do tworzenia pofragmentowanego pliku MP4.
    • Przenieś interfejs Muxer z media3-muxer do media3-transformer.
    • Dodaj MediaProjectionAssetLoader, który udostępnia multimedia z MediaProjection do nagrywania ekranu, i dodaj obsługę nagrywania ekranu do aplikacji demonstracyjnej Transformer.
    • Dodaj #getInputFormat() do interfejsu Codec.
    • Jeśli to możliwe, przenieś odpowiedzialność za zwolnienie GlObjectsProvider na element wywołujący w DefaultVideoFrameProcessor i DefaultVideoCompositor.
  • 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 ArrayIndexOutOfBoundsException na 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, gdy SpeedChangingAudioProcessor jest skonfigurowany z parametrami domyślnymi.
    • Naprawiono niedomiar w Sonic#getOutputSize(), który mógł powodować zawieszanie się DefaultAudioSink.
    • Popraw MediaCodecAudioRenderer.getDurationToProgressUs() i DecoderAudioRenderer.getDurationToProgressUs(), aby przewijanie prawidłowo resetowało podane czasy trwania.
    • Ustaw androidx.media3.common.audio.SonicAudioProcessor jako ostateczną.
    • Dodaj obsługę zmiennoprzecinkowego formatu PCM do ChannelMappingAudioProcessor i TrimmingAudioProcessor.
  • Film:
    • Zmieniono MediaCodecVideoRenderer.shouldUsePlaceholderSurface na 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 API DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies.
    • Dodano eksperymentalny interfejs API ExoPlayer, który umożliwia odrzucanie opóźnionych buforów wejściowych dekodera MediaCodecVideoRenderer, 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).
  • Tekst:
    • Dodaliśmy obsługę napisów VobSub (#8260).
    • Zatrzymanie niecierpliwego wczytywania wszystkich plików napisów skonfigurowanych za pomocą MediaItem.Builder.setSubtitleConfigurations i wczytywanie tylko jednego, jeśli został wybrany przez wybór ścieżki (#1721).
    • TTML: dodano obsługę odwoływania się do tts:origin i tts:extent za 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 configuration występujący podczas odtwarzania treści ClearKey na urządzeniach z interfejsem API < 27 (#1732).
  • Efekt:
    • Przenieśliśmy funkcje OverlaySettings do StaticOverlaySettings. Można utworzyć podklasę OverlaySettings, aby umożliwić dynamiczne ustawienia nakładki.
  • Muksery:
    • Przeniesiono MuxerException poza interfejs Muxer, aby uniknąć bardzo długiej pełnej i jednoznacznej nazwy.
    • Zmieniono nazwę metody setSampleCopyEnabled() na setSampleCopyingEnabled() w Mp4Muxer.Builder i FragmentedMp4Muxer.Builder.
    • Mp4Muxer.addTrack() i FragmentedMp4Muxer.addTrack() zwracają teraz identyfikator śledzenia int zamiast TrackToken.
    • Mp4Muxer i FragmentedMp4Muxer nie implementują już interfejsu Muxer.
    • 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.
  • 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 przed stopSelf(). Podczas zastępowania onTaskRemoved użyj MediaSessionService.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 Context jako parametr do MediaButtonReceiver.shouldStartForegroundService (#1887).
    • Naprawiono błąd, który powodował, że wywołanie metody Player w obiekcie MediaController połą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).
  • UI:
    • Dodaj zmienne stanu i funkcje kompozycyjne do modułu media3-ui-compose dla: PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState i PlaybackSpeedState.
  • 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ątek Exception inny niż IOException (#9760).
  • Rozszerzenie HLS:
    • Dodaj pierwszą wersję: HlsInterstitialsAdsLoader. Moduł ładowania reklam odczytuje reklamy pełnoekranowe HLS z playlisty multimediów HLS i mapuje je na obiekt AdPlaybackState, który jest przekazywany do obiektu AdsMediaSource. Ta początkowa wersja obsługuje tylko strumienie HLS VOD z atrybutami X-ASSET-URI.
    • Dodaj HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Aplikacje mogą go używać do tworzenia instancji AdsMediaSource, które korzystają z HlsInterstitialsAdsLoader w wygodny i bezpieczny sposób.
    • Analizuj tag SUPPLEMENTAL-CODECS z playlisty HLS, aby wykrywać formaty Dolby Vision (#1785).
    • Złagodzono warunek przewijania do pozycji synchronizacji w strumieniu HLS (#2209).
  • 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:supplementalCodecs z 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 AudioSink i AudioRendererEventListener do MidiRenderer.
  • Rozszerzenie Cast:
    • Zaktualizuj zależność play-services-cast-framework do wersji 21.5.0, aby naprawić błąd FLAG_MUTABLE powodujący awarię aplikacji kierowanych na interfejs API 34 lub nowszy na urządzeniach z zainstalowanymi, ale wyłączonymi usługami Google Play (#2178).
  • Aplikacja demonstracyjna:
    • Rozszerz możliwości demo-compose o dodatkowe przyciski i ulepsz integrację z PlayerSurface dzięki obsłudze skalowania i migawki.
  • Usuń wycofane symbole:
    • Usuń wycofaną metodę AudioMixer.create(). Użyj w zamian zasady DefaultAudioMixer.Factory().create().
    • Usuń te wycofane metody Transformer.Builder:
      • setTransformationRequest(), użyj zasad setAudioMimeType(), setVideoMimeType() i setHdrMode().
      • setAudioProcessors(), ustaw procesor dźwięku w EditedMediaItem.Builder.setEffects() i przekaż go do Transformer.start().
      • setVideoEffects(), ustaw efekt wideo w EditedMediaItem.Builder.setEffects() i przekaż go do Transformer.start().
      • setRemoveAudio(), użyj EditedMediaItem.Builder.setRemoveAudio(), aby usunąć dźwięk z EditedMediaItem przekazanego do Transformer.start().
      • setRemoveVideo(), użyj EditedMediaItem.Builder.setRemoveVideo(), aby usunąć film z EditedMediaItem przekazanego do Transformer.start().
      • setFlattenForSlowMotion(), użyj EditedMediaItem.Builder.setFlattenForSlowMotion(), aby spłaszczyć EditedMediaItem przekazywane do Transformer.start().
      • setListener(), użyj addListener(), removeListener() lub removeAllListeners().
    • Usuń te wycofane metody Transformer.Listener:
      • onTransformationCompleted(MediaItem), użyj onCompleted(Composition, ExportResult).
      • onTransformationCompleted(MediaItem, TransformationResult), użyj onCompleted(Composition, ExportResult).
      • onTransformationError(MediaItem, Exception), użyj onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationException), użyj onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationResult, TransformationException), użyj onError(Composition, ExportResult, ExportException).
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), użyj onFallbackApplied(Composition, TransformationRequest, TransformationRequest).
    • Usuń wycofaną klasę TransformationResult. Użyj w zamian zasady ExportResult.
    • Usuń wycofaną klasę TransformationException. Użyj w zamian zasady ExportException.
    • Usuń wycofany element Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Użyj w zamian zasady Transformer.PROGRESS_STATE_NOT_STARTED.
    • Usuń wycofany element Transformer.setListener(). Użyj w zamian zasady Transformer.addListener(), Transformer.removeListener() lub Transformer.removeAllListeners().
    • Usuń wycofany element Transformer.startTransformation(). Użyj w zamian zasady Transformer.start(MediaItem, String).
    • Usuń wycofany element SingleFrameGlShaderProgram. Użyj w zamian zasady BaseGlShaderProgram.
    • Usuń Transformer.flattenForSlowMotion. Użyj w zamian zasady EditedMediaItem.flattenForSlowMotion.
    • Usunięto: ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent i ExoPlayer.DeviceComponent.
    • Kontakt androidx.media3.exoplayer.audio.SonicAudioProcessor został usunięty.
    • Usunęliśmy te wycofane metody DownloadHelper:
      • Konstruktor DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), użyj zamiast niego DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList).
      • W getRendererCapabilities(RenderersFactory) równoważną funkcjonalność można uzyskać, tworząc DefaultRendererCapabilitiesList z RenderersFactory i wywołując DefaultRendererCapabilitiesList.getRendererCapabilities().
      • Usunęliśmy metodę PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat). Zamiast tego użyj PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) i przekaż (MediaSession.Token) compatToken.getToken().

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 VBRI nie obejmuje wszystkich danych MP3 w pliku (#1904).
  • Film:
    • Wycofanie używania MediaCodecAdapter podanych wartości formatu obrazu piksela, gdy są one podane podczas przetwarzania onOutputFormatChanged (#1371).
  • Tekst:
    • Naprawiliśmy błąd w ReplacingCuesResolver.discardCuesBeforeTimeUs, który powodował, że sygnał aktywny w timeUs (rozpoczęty wcześniej, ale jeszcze niezakończony) był nieprawidłowo odrzucany (#1939).
  • Metadane:
    • Wyodrębnianie numeracji płyt/ścieżek i gatunku z komentarzy Vorbis do MediaMetadata (#1958).

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.playlist metodą getPlaylist().
    • Dodaj zastąpienie dla SimpleBasePlayer.State.Builder.setPlaylist(), aby bezpośrednio określić Timeline oraz bieżące Tracks i Metadata zamiast tworzyć strukturę playlisty.
    • Zwiększ minSdk do 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-ktx funkcję rozszerzenia zawieszenia Player.listen, aby uruchomić współprogram do nasłuchiwania Player.Events.
    • Usuń adnotacje @DoNotInline z 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 na compileSdk = 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.
  • 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żyj MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart().
    • Dodaj PreloadMediaSource.PreloadControl.onPreloadError, aby umożliwić implementacjom PreloadMediaSource.PreloadControl podejmowanie 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.CryptoException był czasami zgłaszany jako „nieoczekiwany błąd środowiska wykonawczego”, gdy MediaCodec działał w trybie asynchronicznym (działanie domyślne w przypadku interfejsu API 31 lub nowszego).
    • Przekaż bufferedDurationUs zamiast bufferedPositionUs za pomocą PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Zmienia też DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS na DefaultPreloadManager.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, DefaultLoadControl ogranicza 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ąc LoadControl.shouldContinuePreloading() (np. zastępując tę metodę w DefaultLoadControl). Domyślna implementacja LoadControl wyłącza wstępne wczytywanie, jeśli aplikacja używa niestandardowej implementacji LoadControl.
    • Dodano metodę MediaSourceEventListener.EventDispatcher.dispatchEvent(), aby umożliwić wywoływanie zdarzeń detektorów podklas (1736).
    • Dodaj DefaultPreloadManager.Builder, który tworzy instancje DefaultPreloadManager i ExoPlayer ze spójnie udostępnianymi konfiguracjami.
    • Usuń parametr Renderer[] z LoadControl.onTracksSelected(), ponieważ implementacja DefaultLoadControl może pobierać typy strumieni z ExoTrackSelection[].
    • Wycofano DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) i oznaczono metodę jako final, aby zapobiec zastępowaniu. Zamiast tego należy użyć nowego elementu DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • Raportuj zdarzenia MediaSourceEventListener ze ź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 z AnalyticsListener.
    • 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).
    • 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).
  • Transformator:
    • Dodano SurfaceAssetLoader, który obsługuje kolejkowanie danych wideo do Transformer za pomocą Surface.
    • ImageAssetLoader zgłasza nieobsługiwane dane wejściowe przez AssetLoader.onError zamiast 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.
  • 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 Mp4Extractor i FragmentedMp4Extractor do 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 mdhd w Mp4Extractor i FragmentedMp4Extractor (#1531).
    • Naprawiono nieprawidłowe skalowanie media_time na listach edycji MP4. Wartość segment_duration była już prawidłowo skalowana przy użyciu skali czasowej filmu, a teraz wartość media_time jest prawidłowo skalowana przy użyciu skali czasowej ścieżki, zgodnie ze standardem formatu MP4 (#1792).
    • Obsługa klatek poza kolejnością w obliczeniach endIndices dla MP4 z listą edycji (#1797).
    • Naprawiono analizowanie czasu trwania multimediów w polu mdhd plików MP4, aby obsługiwać wartości -1 (#1819).
    • Dodano obsługę identyfikowania pola h263 w plikach MP4 w przypadku filmów H.263 (#1821).
    • Dodano obsługę formatu pliku multimedialnego ISO AC-4 Level-4 (#1265).
  • Ź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ź, czy DataSource.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 metody DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: potwierdź, że DataSource.getUri() i getResponseHeaders() zwracają wartość „open” po nieudanym wywołaniu open() (z powodu zasobu „nie znaleziono”) i przed kolejnym wywołaniem close().
      • 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).
  • 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:
    • MediaCodecVideoRenderer unika 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 MediaCodecAdapter może teraz otrzymać null Surface w configure i wywołania nowej metody detachOutputSurface, aby usunąć wcześniej ustawiony Surface, jeśli kodek to obsługuje (MediaCodecInfo.detachedSurfaceSupported).
    • Używanie podanych wartości formatu obrazu piksela MediaCodecAdapter, jeśli zostały podane, podczas przetwarzania onOutputFormatChanged (#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 VoiceSpan i 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 MPEG 90,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).
  • Metadane:
    • Przypisz typ C.TRACK_TYPE_METADATA do ścieżek zawierających treści icy lub vnd.dvb.ait.
  • Obraz:
    • Dodaj ExternallyLoadedImageDecoder, aby uprościć integrację z zewnętrznymi bibliotekami do wczytywania obrazów, takimi jak Glide czy Coil.
  • Źródło danych:
    • Dodano FileDescriptorDataSource, nowy DataSource, którego można używać do odczytu z FileDescriptor (#3757).
  • Efekt:
    • Dodaj obejście DefaultVideoFrameProcessor dla drobnego skalowania SurfaceTexture. SurfaceTexture moż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ą Transformer jest szybsze.
  • Rozszerzenie IMA:
    • Naprawiono błąd, który powodował, że wyczyszczenie playlisty mogło wywołać błąd ArrayIndexOutOfBoundsException w ImaServerSideAdInsertionMediaSource.
    • Naprawiliśmy błąd, który powodował, że strumienie DAI wstawiane po stronie serwera bez reklamy przed filmem mogły powodować błąd ArrayIndexOutOfBoundsException podczas odtwarzania po ostatniej reklamie w trakcie filmu (#1741).
  • 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łędem ForegroundServiceDidNotStartInTimeException (#1528).
    • Naprawiliśmy błąd, który powodował, że polecenia niestandardowe wysyłane z MediaBrowser były wysyłane do wariantu metody MediaSessionCompat.Callback zamiast MediaBrowserServiceCompat, gdy urządzenie było połączone ze starszą usługą. Uniemożliwiało to MediaBrowser otrzymanie rzeczywistej wartości zwracanej przez starszą usługę (#1474).
    • Obsługa wyjątku IllegalArgumentException zgł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, z MediaBrowserCompat. Pamiętaj, że w Media3 przyciski poleceń dla elementów multimedialnych są dostępne zarówno w MediaBrowser, jak i w MediaController. 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 żądania play().
    • 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 MediaBrowserCompat podczas 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 metody onGetRoot().
    • Naprawiliśmy błąd, który powodował, że przeglądarka MediaBrowser połączona ze starszą usługą przeglądarki nie otrzymywała błędu wysłanego przez usługę po zasubskrybowaniu parentid.
    • Ulepszyliśmy interoperacyjność, dzięki czemu przeglądarka Media3 połączona ze starszą wersją MediaBrowserService nie żąda dwukrotnie elementów podrzędnych parentId podczas subskrybowania elementu nadrzędnego.
  • 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-AndroidView jest opcjonalne. Aplikacje używające PlayerView wewnątrz AndroidView muszą wywołać PlayerView.setEnableComposeSurfaceSyncWorkaround, aby wyrazić zgodę (#1237, #1594).
    • Dodaj setFullscreenButtonState do PlayerView, 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ę.
  • Rozszerzenie DASH:
    • Dodano obsługę okresów rozpoczynających się w środku segmentu (#1440).
  • Rozszerzenie Smooth Streaming:
    • Naprawiono błąd Bad magic number for Bundle występujący podczas odtwarzania strumieni SmoothStreaming ze ścieżkami tekstowymi (#1779).
  • Rozszerzenie RTSP:
    • Naprawiono usuwanie informacji o użytkowniku w przypadku adresów URL zawierających zakodowane znaki @ (#1138).
    • Naprawiliśmy błąd powodujący awarię podczas analizowania pakietów RTP z rozszerzeniami nagłówka (#1225).
  • 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).
  • Rozszerzenie Cast:
    • Zatrzymanie czyszczenia osi czasu po rozłączeniu CastSession, co umożliwia aplikacji nadawcy wznowienie odtwarzania lokalnie po rozłączeniu.
    • Wypełnij DeviceInfo CastPlayera, gdy podany jest Context. Umożliwia to połączenie MediaSession z RoutingSession, co jest niezbędne do integracji przełącznika wyjścia (#1056).
  • Narzędzia testowe:
    • DataSourceContractTest zawiera teraz testy, które sprawdzają:
      • Strumień wejściowy read position został zaktualizowany.
      • Bufor wyjściowy offset został zastosowany prawidłowo.
  • 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 zasady Player.hasPreviousMediaItem().
    • Usuń wycofaną metodę Player.previous(). Użyj w zamian zasady Player.seekToPreviousMediaItem().
    • Usuń wycofaną metodę DrmSessionEventListener.onDrmSessionAcquired.
    • Usuń wycofane konstruktory DefaultEncoderFactory. Użyj w zamian zasady DefaultEncoderFactory.Builder.

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:
    • Asynchroniczna obsługa wywołań zwrotnych wstępnego wczytywania w PreloadMediaSource (#1568).
    • Zezwalanie na odtwarzanie niezależnie od czasu trwania buforowania, gdy wczytywanie się nie powiedzie (#1571).
  • Ekstraktory:
    • MP3: naprawiono błąd Searched too many bytes przez prawidłowe ignorowanie końcowych danych innych niż MP3 na podstawie pola długości w ramce Info (#1480).
  • 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 procentowymi tts:fontSize.
    • Naprawiono błąd IndexOutOfBoundsException w LegacySubtitleUtil spowodowany nieprawidłową obsługą przypadku, gdy żądany czas rozpoczęcia danych wyjściowych jest większy niż czas ostatniego zdarzenia w Subtitle lub mu równy (#1516).
  • DRM:
    • Napraw błąd android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE na 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ą metody MediaDrm.requiresSecureDecoder platformy (#1603).
  • Efekt:
    • Dodaj metodę release() do GlObjectsProvider.
  • Sesja:
    • Przekształć dwukrotne kliknięcie KEYCODE_HEADSETHOOK w działanie „przejdź do następnego”, zgodnie z dokumentacją (#1493).
    • Traktuj KEYCODE_HEADSETHOOK jako polecenie „odtwarzaj” w MediaButtonReceiver podczas podejmowania decyzji, czy je zignorować, aby uniknąć ForegroundServiceDidNotStartInTimeException (#1581).
  • 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() i SimpleBasePlayer.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 elementu MediaItem, który nie jest obrazem (zgodnie z dokumentacją).
    • Dodaj Format.customData, aby przechowywać niestandardowe informacje o instancjach Format dostarczane przez aplikację.
  • ExoPlayer:
    • Dodaj BasePreloadManager, który koordynuje wstępne wczytywanie wielu źródeł na podstawie priorytetów określonych przez ich rankingData. Dostosowywanie jest możliwe przez rozszerzenie tej klasy. Dodaj DefaultPreloadManager, który używa PreloadMediaSource do 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 PlayerId do większości metod LoadControl, aby umożliwić implementacjom LoadControl obsługę wielu graczy.
    • Usuń narzędzia Buffer.isDecodeOnly() i C.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 implementacje Renderer powinny sprawdzać, czy dodany czas wynosi co najmniej BaseRenderer.getLastResetPositionUs(), aby zdecydować, czy próbka powinna zostać wyświetlona. Niestandardowe implementacje SimpleDecoder mogą 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ć MediaSource z danym rankingData.
    • Dodano remove(MediaSource) do BasePreloadManager.
    • Dodaj reset() do BasePreloadManager, aby zwolnić wszystkie źródła, zachowując instancję menedżera wstępnego wczytywania.
    • Dodaj ExoPlayer.setPriority() (i Builder.setPriority()), aby zdefiniować wartość priorytetu używaną w PriorityTaskManager i 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 implementacje DefaultPreloadManager i niestandardowe PreloadMediaSource.PreloadControl mogą 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 clear do PreloadMediaSource, 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 AdsMediaSource na 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_ENDED podczas ponownego przygotowywania transmisji na żywo DASH z wieloma przedziałami czasu po usunięciu pierwotnego przedziału czasu z pliku manifestu.
    • Zmień nazwę onTimelineRefreshed() na onSourcePrepared() i onPrepared() na onTracksSelected() w PreloadMediaSource.PreloadControl. Zmień też odpowiednio nazwy IntDefs w pliku DefaultPreloadManager.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(). Renderer może implementować tę metodę, aby zwracać do ExoPlayera czas, o który odtwarzanie musi się przesunąć, aby renderer mógł kontynuować. Jeśli ExoPlayer jest ustawiony na experimentalSetDynamicSchedulingEnabled(), ExoPlayer wywoł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 przez MediaCodecRenderer. MediaCodecRenderer będzie sygnalizować ExoPlayer, gdy otrzyma te wywołania zwrotne, a jeśli ExoPlayer jest ustawione na experimentalSetDynamicSchedulingEnabled(), ExoPlayer zaplanuje 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łano Exoplayer.release().
    • Dodaj ExoPlayer.Builder.setMaxSeekToPreviousPositionMs(), aby skonfigurować maksymalną pozycję, do której seekToPrevious() 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 IndexOutOfBoundsException spowodowany przez ekstraktory zgłaszające dodatkowe ścieżki po początkowym kroku przygotowania (#1476).
    • Effects w ExoPlayer.setVideoEffect() będzie otrzymywać sygnatury czasowe z usuniętym przesunięciem renderowania (#1098).
    • Naprawiliśmy potencjalny błąd IllegalArgumentException podczas obsługi błędu odtwarzacza, który wystąpił podczas odczytywania z wyprzedzeniem innego elementu playlisty (#1483).
  • Transformator:
    • Dodaj audioConversionProcess i videoConversionProcess do ExportResult, 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 DefaultAudioMixer nie 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: ExoPlayerAssetLoader ignoruj ograniczenia dotyczące liczby kanałów audio, ponieważ mają one zastosowanie tylko do odtwarzania.
    • Zastąp interfejs androidx.media3.transformer.Muxer interfejsem androidx.media3.muxer.Muxer i 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 pola DefaultDecoderFactory.listener. W przypadku wyjątku dotyczącego kodeka szczegóły kodeka będą dostępne w ExportException.codecInfo.
  • 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 Info zamiast rozmiaru zgłaszanego przez strumień bazowy (np. rozmiar pliku lub nagłówek HTTP Content-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 klatce Info, która może być sztucznie mała, np. klatka PCUT (#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 DefaultAudioSink przed wywołaniem AudioTrack.stop(), aby AudioTrack.StreamEventCallback#onPresentationEnded prawidł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.
  • 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 i TextRenderer.experimentalSetLegacyDecodingEnabled(true). Aby dowiedzieć się, jak podłączyć te komponenty do instancji ExoPlayer, 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 SubtitleDecoder muszą je zaktualizować, aby zamiast nich wdrożyć SubtitleParser (oraz SubtitleParser.Factory zamiast SubtitleDecoderFactory).
    • PGS: poprawiono dekodowanie długości serii, aby 0 był 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ówno rowLock, jak i columnLock powinny być traktowane jako prawda, niezależnie od wartości obecnych w strumieniu (obsługa columnLock nie 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 wersji 1.3.0-rc01. Problem został już rozwiązany, więc zmiana jest ponownie widoczna.
    • 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 IllegalArgumentException z LegacySubtitleUtil, 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 ID3 TSO2, TSOA i TSOP (#1302).
    • Naprawiono odczytywanie numerycznych tagów MP4 (/iTunes) gnre (gatunek) i tmpo (tempo), gdy wartość jest dłuższa niż 1 bajt.
    • Propagowanie ramki ID3 TCON do MediaMetadata.genre (#1305).
  • 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 null jako parametru dla ExoPlayer.setImageOutput(), aby wyczyścić wcześniej ustawiony ImageOutput.
  • Źródło danych:
    • Zaimplementuj obsługę identyfikatorów URI zasobów niezdefiniowanych android.resource://package/id, gdzie package róż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 url nie ma wartości null w konstruktorach DataSpec. Ten parametr został już oznaczony jako niepusty.
    • Zezwalaj ByteArrayDataSource na rozpoznawanie identyfikatora URI jako tablicy bajtów podczas open(), zamiast kodowania na stałe podczas tworzenia (#1405).
  • DRM:
    • Zezwalaj na ustawianie LoadErrorHandlingPolicy na DefaultDrmSessionManagerProvider (#1271).
  • Efekt:
    • Obsługa wielu zmian prędkości w tym samym elemencie EditedMediaItem lub Composition w SpeedChangeEffect.
    • 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żywasz OverlaySettings.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 z ExoPlayer#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 SeparableConvolution przed 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ą opcji OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Rozszerzenie IMA:
    • Przenieś interfejs API wymagany do odtwarzania strumieni reklam DAI w aplikacjach do wersji stabilnej.
    • Dodaj do ImaServerSideAdInsertionMediaSource.AdLoader parametr replaceAdTagParameters(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 NullPointerException podczas używania identyfikatorów URI tagów reklamy data:// (#700).
  • Sesja:
    • Zmień domyślną wartość CommandButton.enabled na true i 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 w onTaskRemoved() (#1219).
    • Dodaj MediaSessionService.pauseAllPlayersAndStopSelf(), który umożliwia wygodne wstrzymywanie odtwarzania wszystkich sesji, i wywołaj stopSelf(), aby zakończyć cykl życia MediaSessionService.
    • 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ę MediaMetadata do MediaDescriptionCompat, 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ń (patrz MediaSession.getMediaNotificationControllerInfo()), błąd niestandardowy jest używany do aktualizowania PlaybackState sesji 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 SessionError i użyj go w SessionResult i LibraryResult zamiast 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 do PlaybackStateCompat.getExtras() kontrolera media1.
    • Mapowanie błędów krytycznych i niekrytycznych na sesję platformy i z niej. PlaybackException jest mapowany na stan błędu krytycznego PlaybackStateCompat. Błąd SessionError wysłany do kontrolera powiadomień o multimediach z MediaSession.sendError(ControllerInfo, SessionError) jest mapowany na błąd niekrytyczny w PlaybackStateCompat, 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 ConnectionResult za pomocą metody AcceptedResultBuilder.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.
  • UI:
    • Dodano obsługę wyświetlania obrazów w PlayerView po połączeniu z ExoPlayer (#1144).
    • Dodano możliwość dostosowywania różnych ikon w PlayerControlView za pomocą atrybutów XML, aby umożliwić stosowanie różnych elementów rysowalnych w poszczególnych instancjach PlayerView zamiast globalnych zastąpień (#1200).
    • Obejście błędu platformy powodującego rozciąganie lub przycinanie filmu podczas używania SurfaceView w Compose AndroidView w interfejsie API 34 (#1237).
  • Pobrane pliki:
    • Zadbaj o to, aby obiekt DownloadHelper nie powodował wycieku niezwolnionych instancji Renderer, co może ostatecznie doprowadzić do awarii aplikacji z błędem IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Rozszerzenie Cronet:
    • Rozwiąż problem SocketTimeoutException w: 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).
  • Rozszerzenie HLS:
    • Naprawiliśmy błąd, który powodował, że oczekujące próbki EMSG czekające na przerwę były przekazywane w HlsSampleStreamWrapper z nieprawidłowym przesunięciem, co powodowało błąd IndexOutOfBoundsException lub IllegalArgumentException (#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 Error i IllegalArgumentException.
    • 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).
  • Rozszerzenie DASH:
    • Naprawiono błąd, który powodował, że ponowne przygotowanie wielookresowej transmisji na żywo mogło wywołać błąd IndexOutOfBoundsException (#1329).
    • Dodano obsługę adresów URL licencji dashif:Laurl (#1345).
  • Rozszerzenie Cast:
    • Naprawiliśmy błąd, który powodował, że tytuł albumu MediaQueueItem był konwertowany na wykonawcę w elemencie multimedialnym Media3 (#1255).
  • Narzędzia testowe:
    • Zaimplementuj onInit() i onRelease() w FakeRenderer.
    • Zmień metody TestPlayerRunHelper.runUntil()/playUntil(), aby niepowodzenie występowało w przypadku błędów niekrytycznych (np. zgłaszanych do AnalyticsListener.onVideoCodecError()). Aby wyłączyć to zachowanie, użyj nowego łańcucha metod TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX().
  • Aplikacja demonstracyjna:
    • Użyj DefaultPreloadManager w aplikacji demonstracyjnej z krótkimi filmami.
    • Zezwalanie na ustawianie trybu powtarzania za pomocą argumentów Intent z wiersza poleceń (#1266).
    • Używaj HttpEngineDataSource jako HttpDataSource, gdy urządzenie to obsługuje.
  • Usuń wycofane symbole:
    • Usuń CronetDataSourceFactory. Użyj w zamian zasady CronetDataSource.Factory.
    • Usuń niektóre konstruktory DataSpec. Użyj w zamian zasady DataSpec.Builder.
    • Usunęliśmy metodę setContentTypePredicate(Predicate) z DefaultHttpDataSource, OkHttpDataSource i CronetDataSource. Zamiast tego użyj odpowiedniej metody w każdym elemencie XXXDataSource.Factory.
    • Usuń konstruktory OkHttpDataSource i OkHttpDataSourceFactory. Użyj w zamian zasady OkHttpDataSource.Factory.
    • Usuń PlayerMessage.setHandler(Handler). Użyj w zamian zasady setLooper(Looper).
    • Usuń pole Timeline.Window.isLive. Zamiast tego użyj metody isLive().
    • Usuń DefaultHttpDataSource konstruktory. Użyj w zamian zasady DefaultHttpDataSource.Factory.
    • Usuń DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Użyj w zamian zasady DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS.
    • Usuń MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Użyj w zamian zasady MediaCodecInfo.canReuseCodec(Format, Format).
    • Usuń metodę DrmSessionManager.DUMMY i getDummyDrmSessionManager(). Użyj w zamian zasady DrmSessionManager.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.FormatSupport IntDef i stałe FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE, FORMAT_UNSUPPORTED_TYPE. Zamiast tego użyj odpowiednika IntDef i stałych w androidx.media3.common.C (np. C.FORMAT_HANDLED).
    • Usuń interfejs Bundleable. Obejmuje to usunięcie wszystkich pól stałych Bundleable.Creator<Foo> CREATOR. Zamiast tego wywołujący powinni używać metod Bundle toBundle() i static Foo fromBundle(Bundle) w przypadku każdego typu.

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.
  • ExoPlayer:
    • Rozwiązaliśmy problem, który powodował, że PreloadMediaPeriod nie zachowywał strumieni po ponownym wstępnym załadowaniu.
    • Zastosuj prawidłowy TrackSelectionResult do 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 -keepclasseswithmembers dla DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformator:
    • Dodano obejście problemu z wyjątkiem zgłaszanym, ponieważ MediaMuxer nie obsługuje ujemnych sygnatur czasowych prezentacji przed interfejsem API 30.
  • 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.averageBitrate na podstawie ramek metadanych, takich jak XING i VBRI.
    • 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 CuesWithTiming z WebvttParser.parse (#1177).
  • DRM:
    • Obejście problemu z wyjątkiem NoSuchMethodError, który może być zgłaszany przez platformę MediaDrm zamiast ResourceBusyException lub NotProvisionedException na niektórych urządzeniach z Androidem 14 (#1145).
  • Efekt:
    • Ulepszyliśmy mapowanie tonów PQ na SDR przez konwersję przestrzeni barw.
  • Sesja:
    • Rozwiązaliśmy problem polegający na tym, że bieżąca pozycja przeskakiwała do tyłu, gdy kontroler zastępował bieżący element (#951).
    • Rozwiązaliśmy problem, który powodował, że obiekt MediaMetadata z wartością extras inną niż null nie był przesyłany między kontrolerami multimediów a sesjami (#1176).
  • UI:
    • Jeśli Locale nie może zidentyfikować wyświetlanej nazwy, jako rozwiązanie zastępcze używana jest nazwa języka ścieżki audio (#988).
  • Rozszerzenie DASH:
    • Wypełnij wszystkie elementy Label z pliku manifestu w Format.labels (#1054).
  • 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, gdzie package róż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 MediaItem zamiast pojedynczego elementu Uri w AdPlaybackState.
    • Zwiększ wartość minSdk do 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 artworkUri i artworkData w MediaMetadata.Builder.populate(MediaMetadata), gdy co najmniej jedno z nich nie ma wartości null (#964).
  • ExoPlayer:
    • Dodaj PreloadMediaSource i PreloadMediaPeriod, które umożliwiają aplikacjom wstępne wczytywanie źródła multimediów treści w określonej pozycji początkowej przed odtworzeniem. PreloadMediaSource zajmuje się przygotowaniem źródła multimediów treści do odbioru Timeline, przygotowaniem i buforowaniem okresu w danej pozycji początkowej, wyborem ścieżek i wczytywaniem danych multimedialnych dla danego okresu. Aplikacje kontrolują postęp wstępnego wczytywania, implementując PreloadMediaSource.PreloadControl i ustawiając wstępnie wczytane źródło w odtwarzaczu.
    • Dodaj ExoPlayer.setImageOutput, który umożliwia aplikacjom ustawianie ImageRenderer.ImageOutput.
    • DefaultRenderersFactory domyślnie udostępnia teraz odtwarzaczowi ImageRenderer z wartościami null dla ImageOutput i ImageDecoder.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 interfejs CompositeSequenceableLoaderFactory.
    • Naprawiono błąd, który powodował, że powtórzenie tego samego czasu powodowało usunięcie metadanych z tego elementu (#1007).
    • Zmień nazwy metod experimentalSetSubtitleParserFactory w BundledChunkExtractor.Factory i DefaultHlsExtractorFactory na setSubtitleParserFactory i nie zezwalaj na przekazywanie null. Użyj nowych metod experimentalParseSubtitlesDuringExtraction(boolean), aby kontrolować zachowanie podczas analizowania.
    • Dodaj obsługę dostosowywania SubtitleParser.Factory używanego podczas wyodrębniania. Można to zrobić za pomocą MediaSource.Factory.setSubtitleParserFactory().
    • Dodaj prefiks źródła do wszystkich pól Format.id wygenerowanych z MergingMediaSource. Ułatwia to określenie, które źródło wygenerowało błąd Format (#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).
  • 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ą jest false, co oznacza, że priorytet ma wybór ścieżki wideo.
  • Ekstraktory:
    • Dodano dodatkowe analizowanie AV1C do ekstraktora MP4, aby pobierać wartości ColorInfo.colorSpace, ColorInfo.colorTransfer i ColorInfo.colorRange (#692).
    • MP3: używaj stałej szybkości transmisji bitów (CBR) do wyszukiwania plików z nagłówkiem Info (odpowiednik CBR nagłówka Xing). Wcześniej używaliśmy tabeli przewijania z nagłówka Info, 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).
  • Dźwięk:
    • Ulepszono algorytm pomijania ciszy dzięki płynnemu zwiększaniu głośności; zachowano minimalną ciszę i bardziej naturalny czas trwania ciszy (#7423).
    • Bardziej deterministyczne raportowanie pominiętej ciszy (#1035).
  • Film:
    • Zmień konstruktor MediaCodecVideoRenderer, który przyjmuje argument VideoFrameProcessor.Factory, i zastąp go konstruktorem, który przyjmuje argument VideoSinkProvider. Aplikacje, które chcą wstrzyknąć niestandardowy obiekt VideoFrameProcessor.Factory, mogą utworzyć instancję obiektu CompositingVideoSinkProvider, który używa niestandardowego obiektu VideoFrameProcessor.Factory, i przekazać dostawcę ujścia wideo do obiektu MediaCodecVideoRenderer.
  • Tekst:
    • Naprawiono serializację wskazówek bitmapy, aby rozwiązać błąd Tried to marshall a Parcel that contained Binder objects podczas korzystania z DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • CEA-708: ignoruj wartość rowLock. Specyfikacja CEA-708-E S-2023 określa, że zarówno rowLock, jak i columnLock powinny być traktowane jako prawda, niezależnie od wartości obecnych w strumieniu (obsługa columnLock nie jest zaimplementowana, więc w praktyce zawsze przyjmuje się, że jest to fałsz).
  • Obraz:
    • Dodaliśmy obsługę miniatur DASH. Obrazy siatki są przycinane, a poszczególne miniatury są dostarczane do ImageOutput w czasie zbliżonym do czasu ich prezentacji.
  • 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.setPlayClearContentWithoutKey lub DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
      • Rozszerzenie IMA:
    • Rozwiązaliśmy problem, który uniemożliwiał odtwarzanie reklam DASH i HLS bez odpowiedniego rozszerzenia pliku.
  • Sesja:
    • Wyłączono wykrywanie dwukrotnego kliknięcia w aplikacjach TV (#962).
    • Rozwiązaliśmy problem, który powodował, że obiekt MediaItem.RequestMetadata z dodatkami innymi niż null nie był przesyłany między kontrolerami multimediów a sesjami.
    • Dodaj do MediaLibrarySession.Builder konstruktor, który przyjmuje tylko Context zamiast MediaLibraryService.
  • Rozszerzenie HLS:
    • Zmniejsz widoczność HlsMediaPeriod do 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).
  • 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ń.
  • Aplikacja demonstracyjna:
    • Dodaj moduł demonstracyjny dotyczący krótkich treści, aby pokazać, jak korzystać z PreloadMediaSource w przypadku krótkich treści.

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/maxOffset powodowało ciągłe przywracanie przesunięcia do wartości min/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.Factory otrzymywały ujemne wartości bufferedDurationUs ze źródeł fragmentów, co skutkowało błędem IllegalArgumentException (#888).
  • 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).
  • Dźwięk:
    • Poprawiono obsługę EOS w przypadku SilenceSkippingAudioProcessor, gdy jest wywoływany wielokrotnie (#712).
  • 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 MediaMetadata było wypełniane tylko z komentarzy Vorbis z kluczami pisanymi wielkimi literami (#876).
    • Przechwytywanie błędu OutOfMemoryError podczas analizowania bardzo dużych ramek ID3, co oznacza, że odtwarzanie może być kontynuowane bez informacji o tagu, zamiast całkowicie się nie powieść.
  • DRM:
    • Rozszerzono obejście problemu z fałszywym adresem URL licencji ClearKey https://default.url na 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_OPENED wystę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.
  • Sesja:
    • Umieść niestandardowe klucze i wartości w MediaMetadataCompat do MediaMetadata.extras i MediaMetadata.extras do MediaMetadataCompat (#756, #802).
    • Naprawiono rozgłaszanie notifyChildrenChanged w przypadku starszych kontrolerów (#644).
    • Naprawiliśmy błąd, który powodował, że ustawienie ujemnego czasu dla wyłączonego minutnika setWhen powiadomienia 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).
  • 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 PlayerControlView był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.):
    • MIDI: rozwiązano problem, który powodował, że przewijanie do przodu pomijało zdarzenia zmiany programu (#704).
    • Przejście na FFmpeg 6.0 i aktualizacja obsługiwanego NDK do wersji r26b (#707, #867).
  • Rozszerzenie Cast:
    • Oczyszczanie tworzenia Timeline, aby nie powodować awarii aplikacji, gdy nie uda się wczytać multimediów na urządzeniu przesyłającym (#708).

Wersja 1.2.0

15 listopada 2023 r.

  • Biblioteka wspólna:
    • Dodaj parametr @Nullable Throwable do metod w interfejsie Log.Logger. Parametr message tych metod nie zawiera już żadnych informacji o obiekcie Throwable przekazanym do metod Log.{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 TrackSelectorResult i SimpleDecoder (#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ąc PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) lub MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Aby rozwiązać problem, uaktualnij androidx.annotation:annotation-experimental do wersji 1.3.1: https://issuetracker.google.com/251172715.
    • Przenieś ExoPlayer.setAudioAttributes do interfejsu Player.
  • 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 jako Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT. Przyczyna wyciszenia zostanie usunięta po podłączeniu odpowiedniego urządzenia wyjściowego.
    • Dodaj MediaSource.canUpdateMediaItem i MediaSource.updateMediaItem, aby akceptować aktualizacje MediaItem po utworzeniu za pomocą Player.replaceMediaItem(s).
    • Zezwalaj na aktualizacje MediaItem dla wszystkich klas MediaSource udostępnianych przez bibliotekę za pośrednictwem Player.replaceMediaItem(s) (#33, #9978).
    • Zmień nazwę MimeTypes.TEXT_EXOPLAYER_CUES na MimeTypes.APPLICATION_MEDIA3_CUES.
    • Dodaj PngExtractor, który wysyła i odczytuje cały plik PNG do TrackOutput jako jedną próbkę.
    • Ulepsz metodę SequenceableLoader.continueLoading(long) w interfejsie SequenceableLoader, aby SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo zawiera dodatkowe parametry, w tym playbackSpeed i lastRebufferRealtimeMs, oprócz dotychczasowych playbackPositionUs.
    • Ulepsz metodę ChunkSource.getNextChunk(long, long, List, ChunkHolder) w interfejsie ChunkSource, aby ChunkSource.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 ConcurrentModificationException w ExperimentalBandwidthMeter (#612).
    • Dodaj parametr MediaPeriodId do CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Obsługa ClippingMediaSource (i innych źródeł z przesunięciami czasu okresu/okna) w ConcatenatingMediaSource2 (#11226).
    • Zmień BaseRenderer.onStreamChanged(), aby otrzymywać też argument MediaPeriodId.
  • Transformator:
    • Analizuj dane EXIF dotyczące obrotu obrazów wejściowych.
    • Usunięcie typu adnotacji TransformationRequest.HdrMode i powiązanych z nim stałych. Zamiast tego użyj Composition.HdrMode i powiązanych z nim stałych.
    • Uprość OverlaySettings, aby rozwiązać problemy z obracaniem.
    • Zmieniono parametry frameRate i durationUs elementu SampleConsumer.queueInputBitmap na TimestampIterator.
  • 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 poziomie true.
  • 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. Zmieniono projectionPosePitch na projectionPoseRoll (#461).
    • Usuń założenie, że instancje Extractor można sprawdzać bezpośrednio za pomocą instanceof. Jeśli chcesz uzyskać dostęp do szczegółów implementacji Extractor w 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 lpcm w 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 obiekt AudioOffloadSupport, który zawiera isFormatSupported, isGaplessSupported i isSpeedChangeSupported.
    • Dodaj AudioSink.setOffloadMode(), za pomocą którego konfigurowane jest odciążanie na ujściu audio. Wartość domyślna to AudioSink.OFFLOAD_MODE_DISABLED.
    • Odciążanie można włączyć za pomocą setAudioOffloadPreference w TrackSelectionParameters. 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 audioOffloadModePreference ma wartość AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, DefaultTrackSelector wybierze 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 enableOffload z sygnatury metody DefaultRenderersFactory.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.experimentalSetOffloadSchedulingEnabled i AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Zmieniono nazwę onExperimentalSleepingForOffloadChanged na onSleepingForOffloadChanged, a onExperimentalOffloadedPlayback na onOffloadedPlayback.
    • Przenieś interfejsy i definicje TrackSelectionParameters związane z trybem odciążania dźwięku do klasy wewnętrznej AudioOffloadPreferences.
    • Dodaj wywołania zwrotne onAudioTrackInitialized i onAudioTrackReleased do AnalyticsListener, AudioRendererEventListener i AudioSink.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).
  • Film:
    • Zezwól usłudze MediaCodecVideoRenderer na używanie niestandardowego VideoFrameProcessor.Factory.
    • Naprawiono błąd, który uniemożliwiał renderowanie pierwszej klatki, jeśli strumień audio zaczynał się od ujemnych sygnatur czasowych (#291).
  • Tekst:
    • Usuń ExoplayerCuesDecoder. Ścieżki tekstowe z sampleMimeType = application/x-media3-cues są teraz obsługiwane bezpośrednio przez TextRenderer bez konieczności używania instancji SubtitleDecoder.
  • Metadane:
    • Metoda MetadataDecoder.decode nie będzie już wywoływana w przypadku próbek „tylko do dekodowania”, ponieważ implementacja i tak musi zwracać wartość null.
  • 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 frameRate i durationUs elementu VideoFrameProcessor.queueInputBitmap na TimestampIterator.
  • 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_IMMEDIATE w DefaultMediaNotificationProvider (#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 funkcja notifyChildrenChanged(), 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_TIMELINE jest niedostępny dla kontrolera powiadomień o multimediach. Gdy Android Auto jest kontrolerem klienta odczytującym dane z sesji platformy, przycisk queue w interfejsie Androida Auto nie jest wyświetlany (#339).
    • Domyślne używanie DataSourceBitmapLoader zamiast SimpleBitmapLoader (#271, #327).
    • Dodaj MediaSession.Callback.onMediaButtonEvent(Intent), który umożliwia aplikacjom zastępowanie domyślnej obsługi zdarzeń przycisków multimedialnych.
  • UI:
    • Dodaj implementację Player.Listener na urządzeniach z Wear OS, która obsługuje blokowanie odtwarzania z powodu Player.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.
  • 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ć dataSync jako foregroundServiceType w pliku manifestu oraz uprawnienie FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • 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 IndexOutOfBoundsException podczas 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).
  • 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 z C.BUFFER_FLAG_DECODE_ONLY, które zostanie wycofane.
    • Dodaj Decoder.setOutputStartTimeUs i SimpleDecoder.isAtLeastOutputStartTimeUs, aby umożliwić dekoderom pomijanie próbek przeznaczonych tylko do dekodowania przed czasem rozpoczęcia. Należy używać tej metody zamiast metody Buffer.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 ArithmeticException w kodzie Leanback (#617).
  • Narzędzia testowe:
    • Zapewnij zgodność TestExoPlayerBuilder i FakeClock z 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.
  • Usuń wycofane symbole:
    • Usuń TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) i TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Zamiast tego użyj Composition.Builder.setHdrMode(int) i przekaż Composition do Transformer.start(Composition, String).
    • Usuń wycofaną metodę DownloadNotificationHelper.buildProgressNotification i użyj metody, która nie została wycofana i przyjmuje parametr notMetRequirements.

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ść multidex ze wszystkich modułów (#499).
  • ExoPlayer:
    • Rozwiązaliśmy problem w aplikacji PlaybackStatsListener, który powodował, że po wyczyszczeniu playlisty tworzone były nieprawidłowe elementy PlaybackStats.
    • 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).
  • 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ę na STATE_ENDED (#538).
  • 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 metodzie MediaSession.Callback.onConnect, używając AcceptedResultBuilder, aby upewnić się, że układ niestandardowy jest dostępny dla kontrolera po nawiązaniu połączenia.
    • Naprawiono przypadki, w których MediaLibraryServiceLegacyStub wysyłał błąd do Result, który nie obsługiwał tej funkcji, co powodowało UnsupportedOperationException (#78).
    • Poprawiono sposób, w jaki PlayerWrapper tworzy VolumeProviderCompat, przez określenie volumeControlType za pomocą starszych poleceń (COMMAND_ADJUST_DEVICE_VOLUME i COMMAND_SET_DEVICE_VOLUME) oraz nowych poleceń (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS i COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

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_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_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 Builder dla DeviceInfo i 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) i setDeviceVolume(int, int)
      • increaseDeviceVolume(int) i increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) i decreaseDeviceVolume(int, int)
    • Dodaj FilteringMediaSource, który umożliwia filtrowanie dostępnych typów ścieżek z MediaSource.
    • 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, rtp i sid (#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.
    • 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ć Effect podczas odtwarzania filmu.
    • Zaktualizuj SampleQueue, aby przechowywać sourceId jako long, a nie int. Zmienia to sygnatury metod publicznych SampleQueue.sourceId i SampleQueue.peekSourceId.
    • Dodaj parametry do metod LoadControl shouldStartPlayback i onTracksSelected, które umożliwiają powiązanie tych metod z odpowiednim MediaPeriod.
    • 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) i BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Zamiast tego można wywołać wariant metod bez mediaTimeOffsetUs. Pamiętaj, że nawet w przypadku wycofanych wariantów przesunięcie nie jest już dodawane do właściwości startTimeUs i endTimeUs obiektów MediaLoadData wysyłanych przez dyspozytora.
    • Zmień nazwę ExoTrackSelection.blacklist na excludeTrack i isBlacklisted na isTrackExcluded.
    • Naprawiono niespójne działanie metod ExoPlayer.setMediaItem(s) i addMediaItem(s), gdy są wywoływane na pustej playliście.
  • Transformator:
    • Usuń Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Zamiast niej użyj zasad ExoPlayerAssetLoader.Factory(MediaSource.Factory) i Transformer.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ędzi findDecoder/EncoderForFormat.
    • Usuń konfigurację klatek B w: DefaultEncoderFactory, ponieważ nie działa ona na niektórych urządzeniach.
  • Wybór ścieżki:
    • Dodaj DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange, który jest domyślnie wyłączony. Gdy ta opcja jest włączona, DefaultTrackSelector wywoła nowy wybór ścieżki, gdy zmienią się możliwości renderowania.
  • Ekstraktory:
    • Ogg: naprawiono błąd podczas wyszukiwania w plikach o długim czasie trwania (#391).
    • FMP4: rozwiązaliśmy problem, który powodował, że TimestampAdjuster inicjował nieprawidłowe przesunięcie sygnatury czasowej z czasem próbki metadanych z atomu emsg (#356).
  • 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 AudioProcessors był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() i AudioSink.release(), aby zwolnić zasoby na końcu cyklu życia odtwarzacza.
    • Sprawdzanie zmian w możliwościach audio w DefaultAudioSink. Dodaj wymagany parametr context w konstruktorze DefaultAudioSink, za pomocą którego DefaultAudioSink zarejestruje się jako odbiorca AudioCapabilitiesReceiver i zaktualizuje swoją właściwość audioCapabilities, gdy otrzyma informację o zmianie możliwości.
    • Propagowanie zmian możliwości audio za pomocą nowego zdarzenia onAudioCapabilitiesChanged w interfejsie AudioSink.Listener i nowego interfejsu RendererCapabilities.Listener, który wywołuje zdarzenia onRendererCapabilitiesChanged.
    • Dodaj ChannelMixingAudioProcessor, aby zastosować skalowanie/miksowanie do kanałów audio.
    • Dodaj nową wartość int DISCARD_REASON_AUDIO_BYPASS_POSSIBLE do DecoderDiscardReasons, 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).
  • Film:
    • Spraw, aby MediaCodecVideoRenderer zgłaszał VideoSize o szerokości i wysokości 0, gdy renderer jest wyłączony. Funkcja Player.Listener.onVideoSizeChanged jest wywoływana, gdy zmienia się Player.getVideoSize(). W wyniku tej zmiany rozmiar filmu w ExoPlayerze z MediaCodecVideoRenderer ma szerokość i wysokość równą 0, gdy Player.getCurrentTracks nie obsługuje filmu lub rozmiar obsługiwanej ścieżki wideo nie został jeszcze określony.
  • 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)
  • 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 żądanych MediaItems do Player, 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 żądanych MediaItems do Player, 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).
  • UI:
    • Dodaj metody Util shouldShowPlayButton i handlePlayPauseButtonAction, aby utworzyć niestandardowe elementy interfejsu z przyciskiem odtwarzania/wstrzymania.
  • Rozszerzenie RTSP:
    • W przypadku MPEG4-LATM użyj domyślnej wartości profile-level-id, jeśli nie ma jej w komunikacie SDP odpowiedzi Describe (#302).
    • Używanie podstawowego identyfikatora URI do rozpoznawania ścieżki względnej z sesji RTSP, jeśli jest on obecny w nagłówku odpowiedzi DESCRIBE (#11160).
  • Rozszerzenie DASH:
    • Usuń przesunięcie czasu multimediów z MediaLoadData.startTimeMs i MediaLoadData.endTimeMs w 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).
  • Rozszerzenie HLS:
    • Dodaj HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long), aby ustawić limit czasu, przez który wątek wczytywania ma czekać na zainicjowanie TimestampAdjuster. Jeśli inicjowanie nie zakończy się przed upływem limitu czasu, zostanie zgłoszony błąd PlaybackException, aby uniknąć niekończącego się zatrzymywania odtwarzania. Domyślnie limit czasu jest ustawiony na 0 (#323).
  • Narzędzia testowe:
    • Sprawdź, czy w DataSourceContractTest wielkość liter w schemacie URI nie jest rozróżniana.
  • Usuń wycofane symbole:
    • Usuń konstruktory DefaultAudioSink i użyj zamiast nich DefaultAudioSink.Builder.
    • Usuń polecenie HlsMasterPlaylist i użyj w zamian polecenia HlsMultivariantPlaylist.
    • Usuń Player.stop(boolean). Zamiast niej użyj zasad Player.stop() i Player.clearMediaItems() (jeśli reset to true).
    • Usuń 2 wycofane konstruktory SimpleCache i użyj niewycofanego konstruktora, który przyjmuje DatabaseProvider, aby uzyskać lepszą wydajność.
    • Usuń konstruktor DefaultBandwidthMeter i użyj zamiast niego DefaultBandwidthMeter.Builder.
    • Usuń konstruktory DefaultDrmSessionManager i użyj zamiast nich DefaultDrmSessionManager.Builder.
    • Usuń 2 wycofane konstruktory HttpDataSource.InvalidResponseCodeException i użyj niewycofanego konstruktora, który akceptuje dodatkowe pola (cause, responseBody), aby ulepszyć rejestrowanie błędów.
    • Usuń DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash i DownloadHelper.forSmoothStreaming, a zamiast nich użyj DownloadHelper.forMediaItem.
    • Usuń wycofany konstruktor DownloadService i użyj niewycofanej wersji, która zawiera opcję podania parametru channelDescriptionResourceId.
    • Usuń wycofane stałe typu String dla zestawów znaków (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME i UTF16LE_NAME). Zamiast tego użyj zestawów znaków Kotlin z pakietu kotlin.text, java.nio.charset.StandardCharsets lub com.google.common.base.Charsets.
    • Usuń wycofany konstruktor WorkManagerScheduler i użyj niewycofanego konstruktora, który zawiera opcję podania parametru Context.
    • Usuń wycofane metody createVideoSampleFormat, createAudioSampleFormat, createContainerFormat i createSampleFormat, które były używane do tworzenia instancji klasy Format. Zamiast tego użyj Format.Builder, aby utworzyć instancje Format.
    • Usuń wycofane metody copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate i copyWithVideoSize, a zamiast nich użyj metody Format.buildUpon() i metod ustawiających.
    • Usuń wycofaną metodę ExoPlayer.retry() i użyj zamiast niej metody prepare().
    • Usuń wycofany konstruktor DefaultTrackSelector z argumentem zero i zamiast niego użyj DefaultTrackSelector(Context).
    • Usuń wycofany konstruktor OfflineLicenseHelper i użyj zamiast niego OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń wycofany konstruktor DownloadManager i użyj konstruktora, który przyjmuje Executor.
    • Usuń wycofane konstruktory Cue i użyj zamiast nich Cue.Builder.
    • Usuń wycofany konstruktor OfflineLicenseHelper i użyj zamiast niego OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń 4 wycofane metody AnalyticsListener:
      • onDecoderEnabled, użyj onAudioEnabled lub onVideoEnabled.
      • onDecoderInitialized, użyj zasad onAudioDecoderInitialized lub onVideoDecoderInitialized.
      • onDecoderInputFormatChanged, użyj zamiast tego onAudioInputFormatChanged lub onVideoInputFormatChanged.
      • onDecoderDisabled, użyj onAudioDisabled lub onVideoDisabled.
    • Usuń wycofane polecenia Player.Listener.onSeekProcessed i AnalyticsListener.onSeekProcessed, a zamiast nich użyj polecenia onPositionDiscontinuity z DISCONTINUITY_REASON_SEEK.
    • Usuń ExoPlayer.setHandleWakeLock(boolean), użyj setWakeMode(int).
    • Usuń wycofaną metodę DefaultLoadControl.Builder.createDefaultLoadControl() i użyj zamiast niej metody build().
    • Usuń wycofaną metodę MediaItem.PlaybackProperties i użyj zamiast niej metody MediaItem.LocalConfiguration. Wycofane pole MediaItem.playbackProperties jest teraz typu MediaItem.LocalConfiguration.

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, czy Buffer zawiera 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).
  • 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 MediaController nie 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 MediaLibraryService w przypadku wywołania z interfejsu systemu do Callback.onGetLibraryRoot z params.isRecent == true w interfejsie API 30 (#355).
    • Naprawiono wyciek pamięci w MediaSessionService lub MediaLibraryService (#346).
    • Naprawiliśmy błąd, który powodował, że połączona aktualizacja Timeline i pozycji w MediaSession mogła powodować, że MediaController zgłaszał błąd IllegalStateException.

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ę MediaSessionCompat powodowało wyjątek w MediaController (#290).
    • Dodano brakujące przekierowanie z MediaSession.broadcastCustomCommand do starszej wersji MediaControllerCompat.Callback.onSessionEvent (#293).
    • Naprawiono błąd, który powodował, że wywołanie MediaSession.setPlayer nie aktualizowało dostępnych poleceń.
    • Rozwiązaliśmy problem, który powodował, że instancje TrackSelectionOverride wysyłane z MediaController były ignorowane, jeśli odwoływały się do grupy z Format.metadata (#296).
    • Rozwiązano problem, który powodował, że usługa Player.COMMAND_GET_CURRENT_MEDIA_ITEM musiała być dostępna, aby można było uzyskać dostęp do metadanych za pomocą starszej wersji MediaSessionCompat.
    • Rozwiązaliśmy problem, który powodował, że instancje MediaSession w wątku w tle powodowały awarie, gdy były używane w MediaSessionService (#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).
  • 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:
    • Naprawiono wykrywanie typu sieci w interfejsie API 33 (#10970).
    • Naprawiono błąd NullPointerException podczas wywoływania ExoPlayer.isTunnelingEnabled (#10977).
  • Pobrane pliki:
    • Umożliwienie konfigurowania maksymalnej różnicy czasu rozpoczęcia 2 segmentów, które mają zostać scalone, w klasie SegmentDownloader i jej podklasach (#248).
  • Dźwięk:
    • Naprawiono błąd odtwarzania plików MP3 bez przerw na urządzeniach Samsung (#8594).
    • Naprawiliśmy błąd, który powodował, że szybkości odtwarzania ustawione natychmiast po wyłączeniu dźwięku mogły zostać zastąpione przez poprzednią zmianę szybkości (#10882).
  • Film:
    • Mapuj format HEVC HDR10 na HEVCProfileMain10HDR10 zamiast HEVCProfileMain10.
    • 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.
  • Obsada:
    • Naprawiono błąd przejściowy STATE_IDLE podczas przechodzenia między elementami multimedialnymi (#245).
  • 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.

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).
  • Ekstraktory:
    • Jeśli podczas analizowania atomów trak w tabeli próbek (stbl) brakuje wymaganego opisu próbki (stsd), zgłaszany jest błąd ParserException zamiast NullPointerException.
    • Prawidłowe pomijanie próbek podczas przechodzenia bezpośrednio do klatki synchronizacji w fMP4 (#10941).
  • Dźwięk:
    • Użyj szybkości transmisji bitów skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora dla AudioTrack w przypadku odtwarzania bezpośredniego (przekazywania).
  • Tekst:
    • Naprawiono błąd polegający na tym, że TextRenderer przekazywał nieprawidłowy (ujemny) indeks do Subtitle.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.
  • 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.isBrowsable jako 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 PlayerView podczas korzystania z układu od prawej do lewej (#227).
  • Sesja:
    • Dodaj abstrakcyjną klasę SimpleBasePlayer, aby ułatwić implementację interfejsu Player w przypadku odtwarzaczy niestandardowych.
    • Dodanie metody pomocniczej do konwertowania tokena sesji platformy na Media3 SessionToken (#171).
    • Używaj onMediaMetadataChanged do wywoływania aktualizacji sesji multimedialnej platformy (#219).
    • Dodaj sesję multimediów jako argument getMediaButtons() elementu DefaultMediaNotificationProvider i użyj niezmiennych list w celu uniknięcia wątpliwości (#216).
    • Dodaj detektor wywołania zwrotnego onSetMediaItems, aby umożliwić modyfikowanie/ustawianie listy MediaItem, 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ść QueueTimeline w przypadku podejrzanego stanu sesji starszej wersji (#241).
  • 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.isBrowsable jako 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 ImaServerSideAdInsertionMediaSource z wątku aplikacji.
    • Dodaj właściwość focusSkipButtonWhenAvailable do ImaServerSideAdInsertionMediaSource.AdsLoader.Builder, aby poprosić o ustawienie zaznaczenia na przycisku pominięcia na telewizorach, i domyślnie ustaw jej wartość na „true”.
    • Dodaj metodę focusSkipButton() do ImaServerSideAdInsertionMediaSource.AdsLoader, aby automatycznie prosić o skupienie uwagi na przycisku pomijania.
    • Zaktualizowano pakiet IMA SDK do wersji 3.29.0.
  • 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 elementu MediaSource (#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 onMediaItemTransition podczas wywoływania seekToNext lub seekToPrevious na 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).
  • 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.
  • 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 ProgressiveDownloader spowodowaną jednoczesnym pobieraniem i odtwarzaniem z tym samym PriorityTaskManager (#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).
  • Film:
    • Jeśli wyświetlacz nie obsługuje Dolby Vision, wypróbuj alternatywny dekoder. (#9794).
  • Dźwięk:
    • Używaj SingleThreadExecutor do zwalniania instancji AudioTrack, aby uniknąć błędów OutOfMemory podczas zwalniania wielu odtwarzaczy jednocześnie (#10057).
    • Dodaje AudioOffloadListener.onExperimentalOffloadedPlayback dla stanu odciążenia AudioTrack. (#134).
    • Ustaw AudioTrackBufferSizeProvider jako interfejs publiczny.
    • Dodaj ExoPlayer.setPreferredAudioDevice, aby ustawić preferowane urządzenie wyjściowe audio (#135).
    • Zmień nazwę androidx.media3.exoplayer.audio.AudioProcessor na androidx.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).
  • Metadane:
    • Teraz można skonfigurować MetadataRenderer tak, 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.
  • 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 opened wystę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.presentationTimeOffset z plików manifestu (#10460).
  • UI:
    • Użyj bieżących zastąpień odtwarzacza jako gotowych ustawień w TrackSelectionDialogBuilder (#10429).
  • 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ć DefaultMediaNotificationProvider instancje. 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).
    • SimpleBitmapLoader może wczytywać bitmapę z identyfikatorów URI file:// (#108).
    • Naprawiono asercję, która uniemożliwiała MediaController przewijanie reklamy w okresie (#122).
    • Po zakończeniu odtwarzania MediaSessionService jest 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 DefaultNotificationProvider w 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:
    • Dodano obsługę pofragmentowanych pakietów H263 (#119).
    • Dodano obsługę MP4A-LATM (#162).
  • 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ć CastPlayer podczas sterowania odtwarzaniem za pomocą MediaController (#142).
  • 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.

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 ShuffleOrder na ExoPlayer.setShuffleOrder powoduje wywołanie Player.Listener#onTimelineChanged z reason=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ę setDataSourceFactory w DefaultMediaSourceFactory, która w niektórych przypadkach nie działała (#116).
  • Ekstraktory:
    • Naprawiliśmy błąd związany z analizowaniem krótkoterminowych zestawów obrazów referencyjnych H265 (#10316).
    • Naprawiono analizowanie szybkości transmisji bitów z pól esds (#10381).
  • 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 playWhenReady w LeanbackAdapter (10420).
  • Obsada:
    • Używaj parametru MediaItem przekazanego do metod playlisty jako Window.mediaItem w CastTimeline (#25, #8212).
    • Obsługa Player.getMetadata() i Listener.onMediaMetadataChanged() za pomocą CastPlayer (#25).

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 null do: MediaSource.Factory.setDrmSessionManagerProvider i MediaSource.Factory.setLoadErrorHandlingPolicy. W razie potrzeby można jawnie przekazać instancje DefaultDrmSessionManagerProvider i DefaultLoadErrorHandlingPolicy.
    • Dodaj MediaItem.RequestMetadata, aby reprezentować metadane potrzebne do odtwarzania multimediów, gdy dokładny LocalConfiguration nie jest znany. Usuń też MediaMetadata.mediaUrl, ponieważ jest teraz uwzględniony w RequestMetadata.
    • Dodaj Player.Command.COMMAND_SET_MEDIA_ITEM, aby umożliwić graczom ustawienie pojedynczego elementu.
  • Wybór ścieżki:
    • Spłaszcz klasę TrackSelectionOverrides do TrackSelectionParameters i przenieś TrackSelectionOverride do klasy najwyższego poziomu.
    • Zmień nazwę TracksInfo na Tracks i TracksInfo.TrackGroupInfo na Tracks.Group. Zmieniono też nazwy Player.getCurrentTracksInfo i Player.Listener.onTracksInfoChanged na Player.getCurrentTracks i Player.Listener.onTracksChanged. Obejmuje to „cofnięcie wycofania” nazwy metody Player.Listener.onTracksChanged, ale z innymi typami parametrów.
    • Zmień DefaultTrackSelector.buildUponParameters i DefaultTrackSelector.Parameters.buildUpon, aby zwracały DefaultTrackSelector.Parameters.Builder zamiast wycofanego DefaultTrackSelector.ParametersBuilder.
    • Dodaj DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities, który jest domyślnie włączony. Gdy ta opcja jest włączona, DefaultTrackSelector preferuje ścieżki audio, których liczba kanałów nie przekracza możliwości wyjściowych urządzenia. Na urządzeniach przenośnych DefaultTrackSelector bę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ęku DefaultTrackSelector będzie monitorować zmiany we właściwościach uprzestrzenniania i na ich podstawie uruchamiać nowy wybór ścieżki. Urządzenia z television trybem UI są wyłączone z tych ograniczeń, a preferowany będzie format z największą liczbą kanałów. Aby włączyć tę funkcję, instancja DefaultTrackSelector musi zostać utworzona z użyciem Context.
  • Film:
    • Zmień nazwę DummySurface na PlaceholderSurface.
    • Dodaj obsługę AV1 do MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Dźwięk:
    • Użyj dekodera audio LG AC3, który reklamuje niestandardowy typ MIME.
    • Zmień zwracany typ AudioAttributes.getAudioAttributesV21() z android.media.AudioAttributes na nową klasę otoki AudioAttributesV21, 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 AudioTrack z maską kanału AudioFormat.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ć CueGroup zamiast List<Cue>.
    • SSA: obsługa ustawienia stylu OutlineColour, gdy BorderStyle == 3 (czyli OutlineColour ustawia 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.
  • Ekstraktory:
    • Dodano obsługę formatu AVI (#2092).
    • Matroska: analizowanie DiscardPadding pod kątem ścieżek Opus.
    • MP4: analizowanie szybkości transmisji bitów z pól esds.
    • Ogg: zezwolono na zduplikowane nagłówki komentarzy i identyfikatorów Opus (#10038).
  • UI:
    • Naprawiono dostarczanie zdarzeń do OnClickListener ustawionych na PlayerView w przypadku, gdy useController=false (#9605). Napraw też dostarczanie zdarzeń do OnLongClickListener we wszystkich konfiguracjach widoku.
    • Naprawiono błąd, który powodował, że sekwencja zdarzeń dotknięcia, które wychodzą poza granice PlayerView przed ACTION_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 TrackSelectionView i TrackSelectionDialogBuilder, aby działały z interfejsem Player, a nie ExoPlayer. Dzięki temu widoki mogą być używane z innymi implementacjami Player i 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 PlayerView i zachowaj wybraną odpowiednią wymuszoną ścieżkę tekstową, jeśli wybrano „Brak” (#9432).
  • 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 null do: DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby instancje DefaultCompositeSequenceableLoaderFactory można przekazywać bezpośrednio.
  • 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.setPlaylistParserFactory i HlsMediaSource.Factory.setPlaylistTrackerFactory. W razie potrzeby można jawnie przekazać instancje DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory lub odwołanie do DefaultHlsPlaylistTracker.FACTORY.
  • Smooth Streaming:
    • Nie zezwalaj na przekazywanie parametru null do: SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby instancje DefaultCompositeSequenceableLoaderFactory można przekazywać bezpośrednio.
  • 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ę DummyDataSource na PlaceholderDataSource.
    • Obejście obsługi przerwań OkHttp.
  • Sesja:
    • Zastąp MediaSession.MediaItemFiller ciągiem MediaSession.Callback.onAddMediaItems, aby umożliwić asynchroniczne rozwiązywanie żądań.
    • Obsługuj metody setMediaItems(s), gdy MediaController łączy się ze starszą sesją multimedialną.
    • Usuń narzędzia MediaController.setMediaUri i MediaSession.Callback.onSetMediaUri. Tę samą funkcję można uzyskać, używając MediaController.setMediaItem i MediaSession.Callback.onAddMediaItems.
    • Przekieruj połączenia starszego typu MediaController do odtwarzania multimediów na MediaSession.Callback.onAddMediaItems zamiast na onSetMediaUri.
    • Dodaj MediaNotification.Provider i DefaultMediaNotificationProvider, aby umożliwić dostosowywanie powiadomienia.
    • Dodaj BitmapLoader i SimpleBitmapLoader, 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.MediaSessionCallback na MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback na MediaLibrarySession.Callback i MediaSession.Builder.setSessionCallback na setCallback.
    • Naprawiono błąd NPE w MediaControllerImplLegacy (#59).
    • Zaktualizuj informacje o pozycji sesji na osi czasu (zmiana 51).
    • Naprawiono błąd NPE w MediaControllerImplBase po zwolnieniu kontrolera (#74).
  • 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).
  • Usuń wycofane symbole:
    • Usuń Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Użyj w zamian zasady Player.Listener.onTracksChanged(Tracks).
    • Usuń narzędzia Player.getCurrentTrackGroups i Player.getCurrentTrackSelections. Użyj w zamian zasady Player.getCurrentTracks. Możesz też nadal używać metod ExoPlayer.getCurrentTrackGroups i ExoPlayer.getCurrentTrackSelections, chociaż są one wycofane.
    • Usuń stałe DownloadHelper, DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT i DEFAULT_TRACK_SELECTOR_PARAMETERS. W miarę możliwości używaj getDefaultTrackSelectorParameters(Context), a w przeciwnym razie DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Usuń konstruktor DefaultTrackSelector(ExoTrackSelection.Factory). Użyj w zamian zasady DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Usuń Transformer.Builder.setContext. Zamiast tego Context należy przekazać do konstruktora Transformer.Builder.

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.setTrackId i MediaItem.SubtitleConfiguration.Builder.setId, aby nadać priorytet polu SubtitleConfiguration i użyć wartości Factory, jeśli nie jest ustawiona (#10016).
  • 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 podklasy DefaultRenderersFactory, które zastępują buildVideoRenderers() lub buildAudioRenderers(), mogły uzyskać dostęp do fabryki adapterów kodeków i przekazać ją do tworzonych przez siebie instancji MediaCodecRenderer.
    • Przekazywanie pól nagłówka ICY name i genre odpowiednio do MediaMetadata.station i MediaMetadata.genre, aby docierały do aplikacji przez Player.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 z MediaCodec. (#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#inputBufferCount na queuedInputBufferCount.
    • Ustaw SimpleExoPlayer.renderers jako 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 w Player.EventFlags.
    • Podziel AnalyticsCollector na interfejs i domyślną implementację, aby umożliwić usunięcie przez R8, jeśli aplikacja tego nie potrzebuje.
  • 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 TrackGroup w: TrackGroupArray. TrackGroup można zawsze odróżnić, ustawiając id w konstruktorze TrackGroup. 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 przekazywania AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES zamiast null.
    • Zezwalaj na dostosowywanie obliczania rozmiaru bufora AudioTrack przez wstrzyknięcie AudioTrackBufferSizeProvider do DefaultAudioSink. (#8891).
    • Ponów próbę utworzenia AudioTrack, jeśli żądany rozmiar bufora był większy niż 1 MB. (#9712).
  • Ekstraktory:
    • WAV: dodano obsługę strumieni RF64 (#9543).
    • Naprawiono nieprawidłowe analizowanie jednostek NAL SPS H.265 (#9719).
    • Analizuj komentarze Vorbis (w tym METADATA_BLOCK_PICTURE) w plikach Ogg Opus i Ogg Vorbis.
  • Tekst:
    • Dodano pole MediaItem.SubtitleConfiguration.id, które jest propagowane do pola Format.id ścieżki napisów utworzonej na podstawie konfiguracji (#9673).
    • Dodano podstawową obsługę napisów WebVTT w kontenerach Matroska (#9886).
    • Uniemożliwia Cea708Decoder odczytywanie danych o rozmiarze większym niż zadeklarowany rozmiar bloku usługi.
  • DRM:
    • Usuń urządzenie playbackLooper z konta DrmSessionManager.(pre)acquireSession. Gdy DrmSessionManager jest używany przez aplikację w niestandardowym MediaSource, playbackLooper musi zostać przekazany do DrmSessionManager.setPlayer.
  • 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:
    • Poprawiliśmy kolor cyfr na przyciskach przewijania do tyłu i do przodu o StyledPlayerView sekund podczas korzystania z niektórych motywów (#9765).
    • Poprawne tłumaczenie ciągów znaków dotyczących szybkości odtwarzania (#9811).
  • DASH:
    • Dodanie do Representation przeanalizowanych właściwości podstawowych i dodatkowych (#9579).
    • Obsługa roli ścieżki forced-subtitle (#9727).
    • Przestań interpretować rolę ścieżki main jako C.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).
  • HLS:
    • Prawidłowe wypełnianie pola Format.label w 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).
  • RTSP:
    • Udostępniliśmy interfejs API klienta, który umożliwia zastąpienie SocketFactory uż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).
  • Transformator:
    • Zwiększ wymagany minimalny poziom API do 21.
    • TransformationException jest 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 MediaSessionConnector czyści teraz playlistę po zatrzymaniu. Aplikacje, które chcą zachować playlistę, mogą wywołać setClearMediaItemsOnStop(false) w oprogramowaniu sprzęgającym.
  • Rozszerzenie Cast:
    • Naprawiono błąd, który uniemożliwiał prawidłowe wywoływanie onIsPlayingChanged przez CastPlayer (#9792).
    • Obsługa metadanych audio, w tym grafiki, za pomocą DefaultMediaItemConverter (#9663).
  • Rozszerzenie FFmpeg:
    • Zależność build_ffmpeg.sh od narzędzi binarnych LLVM zamiast GNU (#9933).
  • 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 wersje play-services-cast-framework nie są zgodne z aplikacjami kierowanymi na Androida 12 i będą ulegać awarii z błędem IllegalArgumentException podczas tworzenia PendingIntent (#9528).
  • Usuń wycofane symbole:
    • Usuń Player.EventListener. Użyj w zamian zasady Player.Listener.
    • Usuń MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory i MediaSourceFactory#setDrmUserAgent. Użyj w zamian zasady MediaSourceFactory#setDrmSessionManagerProvider.
    • Usuń MediaSourceFactory#setStreamKeys. Użyj w zamian zasady MediaItem.Builder#setStreamKeys.
    • Usuń MediaSourceFactory#createMediaSource(Uri). Użyj w zamian zasady MediaSourceFactory#createMediaSource(MediaItem).
    • Usuń setTag z usług DashMediaSource, HlsMediaSource i SsMediaSource. Użyj w zamian zasady MediaItem.Builder#setTag.
    • Usuń DashMediaSource#setLivePresentationDelayMs(long, boolean). Użyj MediaItem.Builder#setLiveConfiguration i MediaItem.LiveConfiguration.Builder#setTargetOffsetMs, aby zastąpić plik manifestu, lub DashMediaSource#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 ActionFile i ActionFileUpgradeUtil. Użyj ExoPlayera w wersji 2.16.1 lub starszej, aby za pomocą ActionFileUpgradeUtil scalić starsze pliki działań z DefaultDownloadIndex.
    • Usuń ProgressiveMediaSource#setExtractorsFactory. Zamiast tego użyj konstruktora ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • Usuń narzędzia ProgressiveMediaSource.Factory#setTag i ProgressiveMediaSource.Factory#setCustomCacheKey. Zamiast niej użyj zasad MediaItem.Builder#setTag i MediaItem.Builder#setCustomCacheKey.
    • Usuń konstruktory DefaultRenderersFactory(Context, @ExtensionRendererMode int) i DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Zamiast tego użyj konstruktora DefaultRenderersFactory(Context), DefaultRenderersFactory#setExtensionRendererMode i DefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Usuń wszystkie publiczne konstruktory CronetDataSource. Użyj w zamian zasady CronetDataSource.Factory.
  • Zmień IntDefs na @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 pakiecie com.google.android.exoplayer2.ext.flac)
    • @FlacExtractor.Flags (w pakiecie com.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 Player co 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.