Media3

Biblioteki obsługujące przypadki użycia multimediów.
Najnowsza aktualizacja Wersja stabilna Wersja kandydująca do publikacji Wersja beta Wersja alfa
21 października 2026 r. 1.11.1 - - 1.12.0-alpha01

Deklarowanie zależności

Aby dodać zależność od Media3, musisz dodać do projektu repozytorium Maven Google. Więcej informacji znajdziesz w repozytorium Maven Google.

Dodaj zależności dla artefaktów, których potrzebujesz, w pliku build.gradle aplikacji lub modułu:

Groovy

dependencies {
    def media3_version = "1.11.1"

    // For media playback using ExoPlayer
    implementation "androidx.media3:media3-exoplayer:$media3_version"

    // For DASH playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
    // For HLS playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
    // For SmoothStreaming playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
    // For RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation "androidx.media3:media3-exoplayer-midi:$media3_version"
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-ima:$media3_version"

    // For loading data using the Cronet network stack
    implementation "androidx.media3:media3-datasource-cronet:$media3_version"
    // For loading data using the OkHttp network stack
    implementation "androidx.media3:media3-datasource-okhttp:$media3_version"
    // For loading data using librtmp
    implementation "androidx.media3:media3-datasource-rtmp:$media3_version"

    // For building media playback UIs using Jetpack Compose
    implementation "androidx.media3:media3-ui-compose:$media3_version"
    // For building media playback UIs using Jetpack Compose with Material Design 3
    implementation "androidx.media3:media3-ui-compose-material3:$media3_version"
    // For building media playback UIs using Views
    implementation "androidx.media3:media3-ui:$media3_version"
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation "androidx.media3:media3-ui-leanback:$media3_version"

    // For exposing and controlling media sessions
    implementation "androidx.media3:media3-session:$media3_version"

    // For extracting data from media containers
    implementation "androidx.media3:media3-extractor:$media3_version"

    // For inspecting media files
    implementation "androidx.media3:media3-inspector:$media3_version"
    // For extracting and processing video frames
    implementation "androidx.media3:media3-inspector-frame:$media3_version"

    // For integrating with Cast
    implementation "androidx.media3:media3-cast:$media3_version"

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version"

    // For transforming media files
    implementation "androidx.media3:media3-transformer:$media3_version"

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"
    // For applying Lottie effects on video frames
    implementation "androidx.media3:media3-effect-lottie:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
    // Common Kotlin-specific functionality
    implementation "androidx.media3:media3-common-ktx:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.11.1"

    // For media playback using ExoPlayer
    implementation("androidx.media3:media3-exoplayer:$media3_version")

    // For DASH playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-dash:$media3_version")
    // For HLS playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-hls:$media3_version")
    // For SmoothStreaming playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version")
    // For RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version")
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation("androidx.media3:media3-exoplayer-midi:$media3_version")
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-ima:$media3_version")

    // For loading data using the Cronet network stack
    implementation("androidx.media3:media3-datasource-cronet:$media3_version")
    // For loading data using the OkHttp network stack
    implementation("androidx.media3:media3-datasource-okhttp:$media3_version")
    // For loading data using librtmp
    implementation("androidx.media3:media3-datasource-rtmp:$media3_version")

    // For building media playback UIs using Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs using Views
    implementation("androidx.media3:media3-ui:$media3_version")
    // For building media playback UIs using Jetpack Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation("androidx.media3:media3-ui-leanback:$media3_version")

    // For exposing and controlling media sessions
    implementation("androidx.media3:media3-session:$media3_version")

    // For extracting data from media containers
    implementation("androidx.media3:media3-extractor:$media3_version")

    // For inspecting media files
    implementation("androidx.media3:media3-inspector:$media3_version")
    // For extracting and processing video frames
    implementation("androidx.media3:media3-inspector-frame:$media3_version")

    // For integrating with Cast
    implementation("androidx.media3:media3-cast:$media3_version")

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version")

    // For transforming media files
    implementation("androidx.media3:media3-transformer:$media3_version")

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")
    // For applying Lottie effects on video frames
    implementation("androidx.media3:media3-effect-lottie:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
    // Common Kotlin-specific functionality
    implementation("androidx.media3:media3-common-ktx:$media3_version")
}

Więcej informacji o zależnościach znajdziesz w artykule Dodawanie zależności kompilacji.

Prześlij opinię

Twoja opinia pomoże nam ulepszyć Jetpacka. Możesz użyć narzędzia Issue Tracker Media3, aby znaleźć odpowiedzi na pytania, znane problemy i prośby o dodanie funkcji oraz zgłosić nowe problemy.

Wersja 1.12.0

Wersja 1.12.0-alpha01

21 października 2026 r.

Wersja 1.12.0-alpha01 zawiera te zatwierdzenia.

  • Biblioteka wspólna:
    • Dodaj C.COLOR_SPACE_DISPLAY_P3 i obsługę przestrzeni 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 adnotacjami 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ę wczytać pierwszego fragmentu następnego okresu (#3396).
    • Zgłoś 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 umożliwia dokładniejsze obliczanie przydziału 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.
    • Rozwiązaliśmy problem, który powodował, że funkcja Player.getCurrentPosition() mogła zwracać nieaktualne wartości (aktualizowane tylko kilka razy na sekundę), gdy włączone było dynamiczne planowanie (#3286).
    • Rozwiązaliśmy problem, który powodował, że nieoczekiwany spadek lub reset pozycji głowicy odtwarzania 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 w przypadku nadchodzącego elementu playlisty mógł przedwcześnie przerywać bieżące odtwarzanie, gdy włączona była opcja Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION.
    • Naprawiliśmy błąd (NullPointerException), który mógł wystąpić, gdy ExoPlayer przełączał renderery na nieprzygotowany okres multimedialny przy włączonej opcji 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 występujący podczas zatrzymywania odtwarzania w trakcie reklamy w transmisji na żywo (#3423).
    • Rozwiązaliśmy problem, który powodował, że PreloadMediaSource mógł nieoczekiwanie opublikować zdarzenie wstępnego ładowania, gdy preload() nie został wywołany (#3408).
    • Rozwiązaliśmy problem, który powodował, że parametr Format.subsampleOffsetUs był ignorowany w przypadku ścieżek metadanych, co powodowało nieprawidłowe sygnatury czasowe odtwarzania w zdekodowanych poleceniach podziału SCTE-35 (#3413).
    • Naprawiono wyciek pamięci w PreloadMediaSource i DefaultPreloadManager, gdy metoda preload() jest wywoływana wielokrotnie w tym samym źródle (#3445).
    • Naprawiliśmy błąd NullPointerException, który występował 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 rozpoczęcie odtwarzania w pozycji innej niż zero) nie powiodło się i zostało ponowione (#3440).
    • Dodano obejście problemu z dekoderem H.264 w Xiaomi TV Stick 4K (MiTV-AYFR0), który zawieszał się podczas płynnych zmian rozdzielczości (#3457).
    • Naprawiono błąd 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 wolno się przygotowywały, 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.
    • Naprawiono problem z pomijaniem klatek w kompozycjach z wieloma sekwencjami, który był spowodowany niedopasowaniem kwantyzacji lub zaokrąglania sygnatury czasowej. Teraz podczas agregacji klatek wybierana jest klatka z najbliższą sygnaturą czasową. Ta funkcja jest dostępna tylko od interfejsu API 29, ponieważ wymaga przechowywania 1 dodatkowej klatki w locie na sekwencję wideo.
  • Transformator:
    • Obsługa konfigurowania liczby klatek na potrzeby agregacji klatek wideo za pomocą Composition.Builder.setVideoFrameAggregationParameters w przypadku przepływów pracy związanych z eksportem.
    • Naprawiono gubienie klatek w kompozycjach z wieloma sekwencjami spowodowane niedopasowaniem kwantyzacji lub zaokrąglania sygnatury czasowej przez wybór klatki z najbliższą sygnaturą czasową podczas agregacji klatek. Ta funkcja jest dostępna tylko od interfejsu API 29, ponieważ wymaga przechowywania 1 dodatkowej klatki w locie na sekwencję wideo.
    • Uwzględniaj Transformer#setAudioMimeType(AUDIO_RAW), gdy używane są AudioProcessors. Przed wprowadzeniem tej poprawki żądanie MimeTypes.AUDIO_RAW i zastosowanie AudioProcessor powodowało kompresję 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ć Mp4LocationData.
    • Dodaliśmy ExtractorUtil.getFramesPerEncodedSample, aby umożliwić obliczanie liczby klatek audio na próbkę w przypadku zakodowanych formatów audio (#3367).
    • Dodaj FLAG_READ_XMP_METADATA do Mp4Extractor, aby wyodrębnić metadane XMP z boksów UUID najwyższego poziomu.
    • Naprawiono uszkodzony dźwięk AC-3, DTS i LPCM podczas odtwarzania treści MPEG-PS w stylu DVD przez usunięcie nagłówka podstrumienia private_stream_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 wiadomości SEI dotyczących układu pakowania klatek H.264 i H.265 w celu wypełnienia Format.stereoMode (#3419).
    • Analizowanie danych konfiguracji Dolby Vision Profile 20 i odrzucanie nieobsługiwanych profili Dolby Vision zamiast odtwarzania ich jako standardowych plików HEVC z nieprawidłowymi kolorami (#3427).
    • MP3: cofnięto dostosowanie metadanych opóźnienia i dopełnienia kodera LAME/Xing, ponieważ jest ono niezgodne z wieloma dekoderami MP3 MediaCodec (#3425).
    • Matroska: naprawiono błąd 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: analizuj ścieżki metadanych z kodowaniem 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 poprawiono sygnatury czasowe próbek po przejściu do strony, która zaczyna się od kontynuowanego pakietu.
    • Ogg: naprawiono błędy dekodowania i skoki sygnatury czasowej o około 1 sekundę w połączonych strumieniach Ogg Opus przez ignorowanie pakietów nagłówka komentarza i identyfikatora Opus w środku strumienia.
  • Inspektor:
    • Obsługa pobierania metadanych XMP z plików MP4 za pomocą MetadataRetriever.
    • Obsługa wyodrębniania ścieżek metadanych z ramkami czasowymi 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 w formatach Ogg i WebM/Matroska Opus (#2576).
    • Naprawiliśmy błąd, który powodował, że aktualizacje opóźnienia i dopełnienia podczas przejść między utworami były stosowane do odtwarzanego utworu, a nie do następnego.
    • Przycinanie dopełnienia końcowego kodera w przypadku pojedynczych strumieni i ostatniego strumienia na playliście, a także przejścia bez przerw w środku playlisty (#2576).
    • Unikaj niepotrzebnych kopii bufora audio w 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, dzięki czemu są one raportowane jako porzucone, a nie pominięte.
  • Tekst:
    • Dodaj MediaItem.SubtitleConfiguration.timeOffsetUs, aby przesunąć sygnatury czasowe napisów z nieoficjalnych źródeł względem multimediów. Przesunięcie można zmienić podczas odtwarzania za pomocą Player.replaceMediaItem(int, MediaItem) bez przerywania odtwarzania (#1976).
    • SubRip: dodano obsługę wstrzykiwania 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 StudioSound GMSCore.
  • Multipleksery:
    • Naprawiono zapisywanie pola dOps dla kodeka 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).
    • Odrzucaj nieobsługiwane profile 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 języku 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.
    • Naprawiliśmy problem, który powodował, że podczas żądań odtwarzania na Androidzie 12 (API 31 i 32) zwracany był błąd MediaSession.getControllerForCurrentRequest() null, gdy 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ść.
    • Naprawiliśmy błąd, 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 ponownej inicjalizacji żą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 elemencie Bundle.
    • Połączenie wychodzące MediaControllerCompat.TransportControls wywołuje połączenia wykonane 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 dwukierunkowe zawijanie tekstu (#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 czyszczenia 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 pomiaru czasu renderowania podanego opcjonalnego elementu kompozycyjnego artwork w ContentFrame i Player. Dodaj funkcję kompozycyjną Artwork, która będzie używana 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ąć zawartość 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 strumieniowania 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 (urn:mpeg:dash:event:alternativeMPD:insert:2025) i zastępowania (urn:mpeg:dash:event:alternativeMPD:replace:2025) alternatywnego pliku MPD w DashManifestParser oraz udostępnianie ich jako instancji AlternativeMpdEvent w Period.alternativeMpdEvents. Jest to zmiana powodująca niezgodność w aplikacjach, które są podklasą 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 zostanie oznaczona jako 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 podstępu (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ścią DASH (#1689).
    • Naprawiono błąd NullPointerException, który mógł wystąpić podczas analizowania pliku manifestu DASH z brakującym atrybutem w elemencie <UTCTiming> (#3436).
  • 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 mógł wystąpić podczas przetwarzania opóźnionych odpowiedzi sieciowych po zresetowaniu stanu klienta RTSP podczas ponownego wyboru ścieżki, zakończenia sesji lub przekierowania URI.
    • Rozwiązaliśmy problem, który powodował, że ponowne przewijanie przed wznowieniem odtwarzania mogło powodować awarię IllegalStateException.
    • Rozwiązaliśmy problem, który powodował, że przewijanie do tyłu, gdy przewijanie było już w toku, mogło powodować zaniki dźwięku i zatrzymanie odtwarzania filmu.
    • Rozwiązaliśmy problem, który powodował, że jednostki dostępu do klatek kluczowych H.264 i H.265 kończące się pakietem agregacji lub pakietem innym niż IDR nie były oznaczane jako klatki kluczowe, co powodowało, że odtwarzanie zatrzymywało się na buforowaniu (#3434).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Rozszerzenie Opus: naprawiono awarię JNI podczas dekodowania nieprawidłowych danych Opus.
    • Rozszerzenie Opus: naprawiono błąd, który powodował ignorowanie dopełnienia odrzucenia, gdy dopełnienie przed pominięciem i dopełnienie odrzucenia znajdowały się w tym samym pakiecie (#2576).
  • Rozszerzenie Cast:
    • Wprowadź SessionAvailabilityListener.SessionUnavailableReason, aby przedstawić przyczynę niedostępności sesji, i podaj przeciążoną metodę 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 niezawodnie w odpowiedniej kolejności (#2639, #3272).
    • Naprawiliśmy błąd, 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 parametry playWhenReady, repeatMode i playbackParameters nie były przenoszone ani stosowane, gdy zostały ustawione w RemoteCastPlayer przed wczytaniem elementów multimedialnych (np. podczas przenoszenia odtwarzania z 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 za pomocą 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>).
  • Kompilacja:
    • 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) mechanizmu renderowania dodatkowego.
    • Rozwiązaliśmy problem z wstępnym rozgrzewaniem, który powodował, że Surface powinien zostać zwrócony do głównego renderera, gdy przewijanie resetowało i wyłączało oba renderery.
    • Naprawiliśmy błąd ArrayIndexOutOfBoundsException, który powodował, że odświeżenie osi czasu na żywo przesuwało domyślną pozycję za reklamę wstawioną po stronie serwera, która jest obecnie odtwarzana (#3348).
    • Rozwiązaliśmy problem z trybem przewijania, który powodował, że podczas przewijania z włączoną funkcją ScrubbingModeParameters.allowSkippingMediaCodecFlush mogły być przez chwilę wyświetlane nieaktualne klatki wideo.
  • Ekstraktory:
    • Matroska: rozwiązaliśmy problem, który powodował, że ścieżki umieszczone po klastrach nie powodowały wyświetlenia osi czasu z możliwością przewijania (#3377).
  • Dźwięk:
    • Naprawiono obliczanie rozmiaru bufora w SilenceSkippingAudioProcessor, dzięki czemu minimalny czas trwania ciszy nie jest nieprawidłowo skalowany w dół przez rozmiar klatki (#3271).
    • Naprawiono obsługę 8-bitowego PCM w PcmAudioUtil, aby traktować próbki jako niepodpisane, zgodnie z definicją Androida (#3271).
    • Rozwiązaliśmy problem z odciążaniem, który powodował, że odtwarzanie mogło się zatrzymywać podczas reklam przed filmem lub przejść bez przerw z powodu ograniczonego rozmiaru bufora sprzętowego.
    • Naprawiliśmy błąd w DefaultAudioSink, który powodował, że liczba wydań nie zmniejszała się, gdy wątek odtwarzania nie był już aktywny (#3338).
  • Sesja:
    • Naprawiono błąd NullPointerException, który występował, gdy przetwarzany obiekt MediaController 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:
    • Poprawiliśmy obliczanie przesunięcia wznowienia treści, gdy segment docelowy do przyciągania nie znajduje się jeszcze na playliście (#3322).
    • Rozwiązaliśmy problem, który powodował, że w pełni wykorzystany obiekt HlsMediaChunk ponawiał próbę wczytania po otrzymaniu obiektu EOFException z ekstraktora (#3350).
  • Rozszerzenie DASH:
    • Naprawiliśmy 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.
    • Złagodzenie kontroli liczby grup reklam w AdsMediaSource, aby umożliwić zmniejszenie liczby grup reklam po pełnym przetworzeniu grupy reklam (hasUnplayedAds() to false), co pozwoli na dynamiczną zmianę rozmiaru grupy reklam podczas przepływów pracy 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.
    • Wróć do estymatora liczby klatek w MediaCodecVideoRenderer i do formatu wyjściowego kodeka w MediaCodecAudioRenderer, aby obliczyć szybkość działania kodeka, gdy formaty strumienia nie zapewniają prawidłowej wartości, i uniknąć niepotrzebnych resetów kodeka.
    • Usunięcie przycinania treści w przypadku reklam wstawianych po stronie klienta w głównym odtwarzaczu. Zamiast tego AdsMediaSource zajmuje się logiką przycinania. Niestandardowe źródła reklam wstawianych po stronie klienta muszą zostać zaktualizowane, aby można było wdrożyć przycinanie treści wewnętrznie.
    • Ścieżki z prawidłowo sformułowanym, ale nierozpoznanym profilem lub poziomem kodeka są oznaczane jako supported=NO_EXCEEDS_CAPABILITIES, a 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 obiekt 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.
    • Ujednoliciliśmy sposób obsługi obrazów, gdy nie jest ustawiona wartość MediaItem.imageDurationUs: obrazy JPEG i HEIC są teraz „odtwarzane” z bardzo krótkim domyślnym czasem trwania (tak samo jak wcześniej obrazy PNG i inne).
    • Dodaj MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter), aby połączyć BandwidthMeter z MediaSource. Wycofana metoda z niestandardową implementacją będzie jednak nadal domyślnie wywoływana. Zalecamy 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ęcie niepotrzebnego resetowania, które może wystąpić podczas dołączania ścieżek z próbkami reklam przed filmem do aktywnego odtwarzania.
    • W pliku DefaultBandwidthMeter zoptymalizuj funkcję getInitialBitrateCountryGroupAssignment, aby zwracała przypisania grup krajów spakowane w 32-bitową liczbę całkowitą zamiast tablicy, co zmniejszy rozmiar kodu i pozwoli uniknąć alokacji.
    • Naprawiono błędy inicjowania 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).
    • Dodaliśmy eksperymentalną obsługę odtwarzania metadanych z sygnałami czasowymi HAGC (ST 2094-50) w przypadku multimediów progresywnych (np. MP4, Matroska). Odtwarzacz automatycznie scala ścieżki metadanych HAGC z powiązaną ścieżką wideo i dostarcza metadane poza pasmem do dekodera na urządzeniach z interfejsem API 37 lub nowszym. To działanie można wyłączyć za pomocą DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false).
    • Dodano Format.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 wartości 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 prowadzić do utraty lub zastąpienia 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: dodano obsługę wyodrębniania metadanych rozdziałów (zarówno w formacie Nero, jak i QuickTime). Jeśli dostępne są oba rodzaje, preferowane są rozdziały QuickTime. Wyodrębnione informacje o rozdziałach są widoczne jako wpisy 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żyj metadanych strumienia bitów kodeka, aby wypełnić dokładne dane ColorInfo.
    • MP4: dodano obsługę wyszukiwania we fragmentowanych plikach MP4 za pomocą pola mfra, gdy nie ma 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 podstrumieni Core i Extension w jedną próbkę, co rozwiązało problemy z odtwarzaniem, gdy te 2 podstrumienie były wcześniej wyodrębniane jako osobne próbki (#3147).
    • MP4: zapobieganie nieskończonym pętlom i odczytom poza zakresem podczas analizowania pustych elementów tagów metadanych ilst (#3191).
    • MPEG-TS: zapewniono renderowanie ostatniej klatki w przypadku strumieni, w których ostatni pakiet PES ma znaną długość (#3206).
    • MP3: poprawiono raportowanie szybkości transmisji bitów w przypadku plików z nagłówkiem Xing i VBRI.
    • Matroska: obsługa ścieżek zdefiniowanych w ostatnim klastrze (#3250).
    • Matroska: dodano obsługę ALAC (#3268).
    • MP4: zezwalanie na pola 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 uniknąć przejściowych niedomiarów i nieoczekiwanych stanów buforowania podczas aktywnego odtwarzania (#3210).
    • Zmieniono domyślną logikę rozmiaru bufora PCM w DefaultAudioTrackBufferSizeProvider, aby używać stałego bufora 500 ms i zmniejszyć zależność od urządzenia.
    • Zaktualizuj MediaCodecAudioRenderer, aby wyodrębnić przestrzenną maskę channelMask z dekodera platformy, co 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 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-bitowego i 64-bitowego formatu PCM z reprezentacją zmiennoprzecinkową w formacie big endian.
    • Usunięto ścieżkę zastępczą EAC3-JOC do EAC3 na potrzeby odtwarzania na urządzeniach Google Pixel, ponieważ ich standardowe dekodery EAC3 nie mogą dekodować strumieni EAC3-JOC (#3257).
  • Film:
    • Poprawiono logikę dołączania do filmu, aby porzucone bufory podczas dołączania były liczone jako pominięte, a nie porzucone.
    • Naprawiono problem z natychmiastową decyzją o renderowaniu podczas ustawiania nowej powierzchni, aby uniknąć pomijania klatek na urządzeniach, które nie obsługują powierzchni zastępczych.
    • Poprawiliśmy szacowanie liczby klatek w MediaCodecVideoRenderer, aby było dokładniejsze dzięki uwzględnianiu pominiętych klatek.
    • Zezwalaj na konfigurowanie progu używanego do wcześniejszego planowania klatek. Wartość domyślna to 50 ms, ale można ją dostosować za pomocą MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold().
    • Naprawiono błąd w VideoFrameReleaseHelper, który powodował, że zmiany wyświetlania mogły wywoływać nadmiarowe wywołania 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 na podstawie 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 odtwarzać 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 awarie 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 na kontroler 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, element 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.
    • Rozwiązaliśmy problem polegający na tym, że przeglądanie Bluetooth AVRCP nie rozpoznawało MediaLibraryService w interfejsach API 36 i 37.
    • Naprawiono podwójne zmniejszanie grafiki w MediaSession, gdy rozmiar obrazu jest zbliżony do limitu platformy, co rozwiązuje problem z rozmyciem w powiadomieniach (#3134).
    • Naprawiono błąd 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 propaguje 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 ponownie komponowany w trakcie odtwarzania (#3238).
    • Dodaj klasę CurrentMediaItemState i odpowiadający jej element kompozycyjny rememberCurrentMediaItemState 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 kompozycyjny rememberPlaylistState 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ę, okładkę i postęp odtwarzania bieżącego elementu multimedialnego.
    • Dodaj klasę ErrorState i odpowiadający jej element kompozycyjny rememberErrorState 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 na treści.
    • Opublikuj PlayerPool (common-ktx) i rememberPooledPlayer (ui-compose), aby umożliwić wstępne wczytywanie MediaItems w interfejsach 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 ComposePresentationState, który powodował awarie na osiach czasu nieobsługujących wyszukiwania identyfikatora UID okresu (#3264).
  • Pobrane:
    • 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:
    • Dodano 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 w celu ponownego rozpoznania 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ż główna ani aktywna (#3254).
    • Poprawiono obliczanie przesunięcia wznowienia treści podczas rozwiązywania list komponentów reklam pełnoekranowych (#3322).
    • Naprawiono nieoczekiwaną przerwę w sygnaturze czasowej ścieżki audio podczas wznawiania odtwarzania na żywo z niskim opóźnieniem po nieudanym żądaniu playlisty (#3311).
    • Naprawiono błąd w HlsMediaPeriod.getStreamKeys(), który powodował, że ścieżka ID3 w wersjach audio była traktowana jako napisy (#3333).
  • Rozszerzenie DASH:
    • Podziel napisy CEA na różne elementy TrackGroup na podstawie języka (#3113).
    • Dodano 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 powodujący awarię (IndexOutOfBoundsException) podczas otwierania plików manifestu z pustym elementem <SegmentTimeline/> (#3326).
  • Rozszerzenie RTSP:
    • Naprawiono przejściowe problemy z odtwarzaniem lub błędy podczas przygotowywania odtwarzania RTSP spowodowane błędami powiązania portu UDP.
  • Rozszerzenie Cast:
    • Dodaj nową klasę CastParams, aby umożliwić konfigurację Cast przez wywołanie Cast.initialize(CastParams).
    • Dodaj nową opcję CastParams.getShowSystemOutputSwitcherOnCastIconClick(), która powoduje użycie przełącznika wyjścia SystemUI zamiast selektora urządzenia przesyłającego w aplikacji, gdy jest on dostępny.
    • Dodano 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).
    • Naprawiliśmy 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 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.
  • Budowanie
    • Zaktualizowaliśmy instrukcje README.md dotyczące lokalnego korzystania z 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 kodeków do preferencji dotyczących 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:
    • Naprawiliśmy błąd, który mógł powodować nieprawidłowe przekierowywanie zdarzeń audio, jeśli do odtwarzacza dodano kilka modułów renderowania dźwięku.
  • Film:
    • Dostosowano logikę ponownego użycia kodeka przy zmianach liczby klatek w interfejsie API poniżej 30, aby uniknąć resetowania kodeka, gdy nie jest to korzystne (#3120).
    • Wyłącz obejście wymuszonej synchronizacji w queueSecureInputBuffer w przypadku interfejsu API 31 lub nowszego. Obejście było sztucznym wąskim gardłem, które wymuszało szeregowe odszyfrowywanie, co zapobiegało zniekształcaniu obrazu z powodu problemu z platformą występującego przed interfejsem API 31.
  • Obraz:
    • Rozwiązaliśmy problem w trybie przewijania, w którym aktualizacje obrazu były wprowadzane tylko wtedy, gdy użytkownik „przestał przewijać” (#2815).
  • Sesja:
    • Naprawiliśmy błąd, który powodował, że 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:
    • Naprawiliśmy błąd, który powodował, że podczas przełączania na strumień zastępczy był zgłaszany wyjątek ArrayIndexOutOfBoundsException, jeśli wybór ścieżki był podzbiorem dostępnych ścieżek (#3161).
    • Rozwiązaliśmy problem, który powodował, że segment inicjowania nie był przenoszony między aktualizacjami playlisty multimediów, jeśli tag #EXT-X-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. Zasadniczo nie zaleca się tworzenia makiety tego złożonego interfejsu, chyba że jest on używany w minimalnym, prostym lub przypadkowym zakresie (#2985).
      • Wymagało to przeniesienia DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_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 odtwarzanie było żądane podczas połączeń telefonicznych.
    • Naprawiliśmy błąd, który powodował, że przejścia z treści na żądanie do treści na żywo mogły powodować ponowne buforowanie pod koniec treści na żądanie (#3052).
    • Dodano obsługę Dolby Vision Profile 10 (#2830).
    • Naprawiliśmy błąd, który powodował, że niezainicjowana reklama przed filmem generowała błąd ArrayIndexOutOfBoundsException (#3125).
  • CompositionPlayer:
    • Dodaj obsługę EditedMediaItem.removeVideo.
  • Transformator:
    • EditedMediaItem.Builder.setFrameRate() może teraz ustawić maksymalną liczbę klatek na sekundę w filmie, co jest szczególnie przydatne, gdy zwiększasz szybkość multimediów za pomocą setSpeed().
  • Wybór ścieżki:
    • Zmień sygnaturę funkcji DefaultTrackSelector.selectAllTracks, aby uwzględnić tablicę wyjściową jako parametr, wstępnie wypełniony zastąpieniami ścieżek.
    • Rozwiązano problem polegający na tym, że wbudowane ścieżki metadanych były wybierane niezależnie od tego, czy wybrana była odpowiednia ścieżka podstawowa (#294).
    • Opcje stabilizacji 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.
    • Wprowadzamy 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 obuuszne przez dekoder (w przypadku korzystania z rozszerzenia dekodera IAMF) lub przez Android Spatializer.
    • Prawidłowo usuwamy obsługę 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 wskazówki 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 rendery 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 Ad Media Info API.
    • Naprawiliśmy błąd, który powodował, że typ MIME reklamy nie pasował do typu MIME podanego w zdarzeniu IMA LOADED. Poprawka mapuje teraz typ MIME reklamy, korzystając z informacji o multimediach reklamy dostarczonych przez IMA.
    • Dodaj 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. konta.
  • 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 nieaktualnych 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 aplikacji, które implementują niestandardowy element MediaNotification.Provider, ponieważ pojawiła się nowa wymagana metoda.
    • Dodano kreatory instancji PendingIntent do użycia z widżetami na ekranie głównym (#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 polegający na tym, że obejście dotyczące umieszczania przycisków interfejsu systemu negatywnie wpływało na inne interfejsy, takie jak Android Auto, lub na producentów, którzy nie potrzebują tego obejścia (#3041).
    • Rozwiązaliśmy problem, który powodował, że dostęp do subskrypcji nie był synchronizowany (#3056).
    • Obejście błędu SysUI w interfejsie API 29, w przypadku którego grafika sesji multimedialnej o określonym rozmiarze może spowodować awarię SysUI i wymusić ponowne uruchomienie urządzenia (#3118).
    • Naprawiono skalowanie ikony grafiki powiadomienia na Androidzie Q (#3084).
  • 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 umożliwić przewijanie za pomocą przeciągania i klikania (#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 komunikatów, 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 playlisty HLS przez buforowanie dopasowań wyrażeń regularnych (#3008).
    • Udostępnianie ścieżki metadanych ID3 (EMSG) w wersjach audio (#3043).
    • Zezwalanie na użycie lokalizacji zastępczej w przypadku wystąpienia błędów wczytywania, jeśli dostępne są nadmiarowe strumienie z różnych lokalizacji (#1988).
    • Naprawiliśmy działanie X-SNAP w przypadku reklam pełnoekranowych HLS, aby prawidłowo obliczać pozycję początkową i pozycję wznowienia (#3013).
  • Rozszerzenie DASH:
    • 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).
    • Naprawiliśmy 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óre obejmowały wiele pakietów RTP. Powodowało to artefakty wizualne i uszkodzenia filmu (#3121).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Dodano obsługę menedżera interfejsu MPEG-H do rozszerzenia dekodera MPEG-H (#3066).
  • Rozszerzenie Cast:
    • Dodaj metodę RemoteCastPlayer.Builder#setTrackSelector, która umożliwia implementację wyboru ścieżki podczas odtwarzania na urządzeniu Cast.
  • 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 polegający na tym, że obejście dotyczące umieszczania przycisków interfejsu systemu negatywnie wpływało na inne interfejsy, takie jak Android Auto, lub na producentów, którzy nie potrzebują tego obejścia (#3041).
  • Rozszerzenie Cast:
    • Naprawiliśmy błąd, który powodował, że przenoszenie z Cast do odtwarzania lokalnego nie działało.

1.9.1

26 stycznia 2026 r.

Wersja 1.9.1 zawiera te zatwierdzenia.

  • Biblioteka wspólna:
    • Obsługa ciągów znaków daty i godziny z tylko godzinami w przesunięciu strefy czasowej (#2929).
  • ExoPlayer:
    • Zezwalaj na dynamiczne planowanie, aby spowolnić interwał 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 wyjątki FileNotFoundException i podobne były wielokrotnie ponawiane.
    • Naprawiono błąd związany z dynamicznym planowaniem, w przypadku 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 odtworzenia plików Dolby Vision kończyły się niepowodzeniem podczas próby użycia zastępczego kodeka AVC lub HEVC.
    • Naprawiono błąd, który powodował, że po usunięciu aktualnie odtwarzanego elementu z playlisty wczytywanie było kontynuowane po zakończeniu odtwarzania (#2873).
    • Unikaj wycieku instancji 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łowo usuwamy obsługę 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 na poziomie niższym niż 30, gdy zmienia się liczba klatek treści, aby uniknąć zacinania się odtwarzania (#2941).
  • Tekst:
    • VobSub: rozwiązaliśmy problem z brakującymi napisami przez prawidłową obsługę SPU, które zawierają tylko jedną sekwencję sterującą lub mają kluczowe informacje podzielone na kilka sekwencji sterujących (#2935).
  • Rozszerzenie IMA:
    • Poprawka błędu: rozwiązaliśmy problem polegający na tym, że typ MIME reklamy nie pasował do typu MIME podanego w zdarzeniu IMA LOADED. Poprawka mapuje teraz typ MIME reklamy, korzystając z indeksu bloku reklamowego i pozycji reklamy.
    • Dodaj sprawdzenie wartości null przed uzyskaniem dostępu do wyniku getAdsManager() 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 w instancjach 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 multimedialnych systemu (#2976).
    • Przeniesienie skalowania bitmapy ikony powiadomienia poza wątek główny (#2829).
    • Naprawiliśmy błąd, który powodował, że autor, autor tekstu i kompozytor nie byli używani jako zastępczy podczas konwersji ze starszych wersji MediaMetadataCompat i MediaDescriptionCompat (#3018).
  • Pobrane:
    • 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:
    • Naprawiliśmy 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, który 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 innych odtwarzaczach (#1893).
    • Naprawiono obsługę detektora ForwardingPlayer, gdy odtwarzacz delegowany używa równości referencyjnej do porównywania instancji detektora (#2675).
    • Dodaj funkcję rozszerzenia zawieszającego Player.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 nieprawdopodobnie 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 po upływie zadeklarowanego czasu trwania bez osiągnięcia końca elementu.
      • Po 10 minutach od wystąpienia przyczyny wstrzymania odtwarzania podczas próby odtworzenia.
    • Domyślnie włącz obsługę blokady uśpienia, aby rozwiązać problemy z buforowaniem podczas odtwarzania w tle. 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, który został pierwotnie przekazany 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 do 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 zbiorczo dodają elementy multimedialne lub źródła multimediów, a następnie automatycznie wywołują metodę invalidate().
      • Dodaj metody removeMediaItems((List<MediaItem>) i removeMediaSources(List<MediaSource>), które zbiorczo usuwają elementy multimedialne lub źródła multimediów, i upewnij się, że po usunięciu menedżer wstępnego wczytywania nie rozpoczyna ani nie kontynuuje wstępnego wczytywania żadnego z nich.
      • Zezwalaj na automatyczne unieważnianie DefaultPreloadManager.setCurrentPlayingIndex(int). Po zaktualizowaniu indeksu aktualnie odtwarzanego utworu aplikacje nie muszą już bezpośrednio wywoływać metody invalidate().
    • Dodano możliwość pomijania resetowania klatek kluczowych podczas przewijania do przodu w tej samej grupie obrazów w trybie przewijania.
    • Dodaj DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int), aby aplikacje mogły ustawić wartość docelowych bajtów bufora dla odtwarzacza z okreś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 parametr 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).
    • Dodanie interfejsu API do ustawiania i obserwowania parametrów kodeków ścieżek audio i wideo. Ta funkcja jest zaimplementowana w przypadku mechanizmów renderowania opartych na 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 specyficznych dla 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 przewijanie do innych elementów multimedialnych w trybie przewijania mogło powodować IllegalStateException.
    • Naprawiono potencjalny błąd NullPointerException w DefaultPlaybackSessionManager (#2885).
    • Włącz ulepszenia wydajności przewijania w kwalifikujących się filmach.
    • Ponownie włączono deszyfrowanie asynchroniczne w MediaCodec na poziomie API 36 lub wyższym, gdzie rozwiązano problemy z przekroczeniem limitu czasu w tym interfejsie API platformy (#1641).
    • Zmień domyślną wartość MediaCodecVideoRenderer.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 mieć miejsce tylko wtedy, gdy zostanie wybrana zbyt duża liczba ścieżek (#2860).
    • Naprawiliśmy błąd, który powodował, że podczas odtwarzania w trybie playlisty lub powtarzania przewijanie w trybie przewijania blisko końca mogło powodować przejście do następnego elementu multimedialnego.
  • CompositionPlayer:
    • Opublikuj CompositionPlayer z nową adnotacją @ExperimentalApi, aby wskazać, że jest dostępny do eksperymentowania, ale nadal jest rozwijany. Niektóre interfejsy API mogą ulec znacznym zmianom w przyszłych wersjach. Istnieją też znane problemy i ograniczenia związane z niektórymi przypadkami użycia (niektóre z nich nie są udokumentowane).
    • Dodaj obsługę COMMAND_SET_AUDIO_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. odczytywanych 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ł wyraźnych nagłówków. Poprawia to natychmiastową możliwość wyszukiwania plików bez metadanych kosztem potencjalnej dokładności plików VBR bez nagłówków. Wyszukiwanie indeksu jest teraz używane jako rozwiązanie zastępcze, jeśli założenie CBR nie jest możliwe do wyszukania (np. w przypadku strumieni o nieznanej długości) (#2848).
    • MP4: rozróżniaj typy MIME audio/mpeg (MP3), audio/mpeg-L1 i audio/mpeg-L2, sprawdzając wartość warstwy pierwszej próbki przed wyemitowaniem formatu ścieżki z ekstraktora (#2683).
    • MP4: poprawiono wydajność wykrywania bardzo dużych plików przez założenie, że pole 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 umieszczone ścieżki wideo i audio.
  • Inspektor:
    • Wprowadziliśmy nowy moduł :media3-inspector, który służy jako dedykowane miejsce na narzędzia do sprawdzania multimediów. Ten moduł zawiera teraz nowy interfejs androidx.media3.inspector.MetadataRetriever, który zapewnia 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ługa przewijania w aplikacji GainProcessor.
    • Wykorzystanie możliwości profilu i poziomu dekodera AC-4 w ocenie obsługi formatu ścieżki (#2580).
    • Unikaj potencjalnych opóźnień spowodowanych obsługą wywołań zwrotnych dotyczących zmiany routingu na początku odtwarzania (#2646).
    • Zezwoliliśmy na ponowne używanie kodeków w przypadku formatów EAC3, EAC3-JOC i AC-4 (#1346).
    • Dodaj obsługę próbek PCM typu float w Sonic.
    • Dodaj obsługę 16-bitowych próbek PCM w ToFloatPcmAudioProcessor.
  • Film:
    • Wyłącz ponowne używanie kodeka w przypadku treści Dolby Vision z różnymi profilami.
    • Ponownie włączono obejście problemu z błędnie zgłaszanymi punktami wydajności w przypadku bezpiecznych kodeków (#2856).
  • Tekst:
    • Naprawiono analizowanie napisów CEA-6/708 w treściach Dolby Vision (#2775).
  • Obraz:
    • Rozwiązaliśmy problem ze ScrubbingMode, który powodował, że odtwarzacz zawieszał się podczas przewijania ścieżki miniatury DASH (#2815).
  • DRM:
    • Zmień zwracany typ metod MediaDrmCallback z byte[] na nowy typ MediaDrmCallback.Response, aby umożliwić zwracanie dodatkowych opcjonalnych informacji. Jest to zmiana powodująca niezgodność w kodzie źródłowym, ale można je łatwo rozwiązać, opakowując poprzednią wartość zwracaną byte[] 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.
  • Multipleksery:
    • 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, dzięki czemu aplikacje mogą używać reguł opublikowanych w archiwum IMA na Androida.
    • Dodaliśmy ImaServerSideAdInsertionUriBuilder.setNetworkCode, nowy interfejs API do ustawiania kodu sieci Google Ad Managera dla pakietu IMA SDK, aby obsługiwać identyfikatory reklam zgodnie z ustawieniami Google Ad Managera. Kody sieci są opcjonalne, ale zalecane w przypadku żądań strumienia Full Service. Aby dowiedzieć się, jak znaleźć kod sieci, przeczytaj ten artykuł.
    • Zaktualizowano zależność IMA do wersji 3.37.0, która wymaga włączenia odlukrzania biblioteki podstawowej. Ta funkcja musi być też włączona w aplikacjach zależnych. Zapoznaj się z uwagami dotyczącymi konfiguracji IMA. * Obsługa opcji niestandardowego interfejsu IMA DAI w narzędziu do tworzenia identyfikatorów URI SSAI. Opcje niestandardowego interfejsu użytkownika w przypadku wstawiania reklam po stronie serwera obejmują obsługę renderowania opcji „Możliwa do pominięcia” i „O tej reklamie”. Ta funkcja jest obecnie dostępna dla wybranych wydawców na liście dozwolonych. Ta zmiana powoduje też uaktualnienie pakietu IMA SDK do wersji 3.38.0 (informacje o wersji), aby umożliwić dostęp do interfejsu API opcji niestandardowego interfejsu.
    • Rozwiązaliśmy problem, który powodował, że błąd przygotowania treści po reklamie był błędnie zgłaszany jako błąd odtwarzania reklamy (#2656).
  • Sesja:
    • Dodaj nowy parametr do MediaSession.Callback.onPlaybackResumption, aby wskazać, czy wywołanie ma na celu tylko zebranie informacji, czy rozpoczęcie odtwarzania (#1764).
    • Zaktualizowano MediaSession.ControllerInfo.isTrusted, aby kontrolery z własnej aplikacji były również deklarowane jako zaufane (#2542).
    • Dodaj MediaSessionService.triggerNotificationUpdate, aby ręcznie aktywować aktualizację powiadomienia (#1833).
    • Dodaj 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.
    • Naprawiliśmy 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 tym, co robi media1 i platforma (#2637).
    • Naprawiono błąd, który powodował, że getCurrentTimeline() był wywoływany przez PlayerWrapper, nawet gdy polecenie było niedostępne (#2665).
    • Naprawiliśmy błąd, który powodował, że wiadomość pozostawała w kolejce wiadomości głównej pętli, co po zakończeniu usługi powodowało wyciek pamięci (#2692).
    • Po połączeniu ze starszą aplikacją sesji za pomocą 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 identyfikator sesji audio jest ustawiany przez sesję (#244).
    • Naprawiliśmy błąd, który powodował, że KEYCODE_HEADSETHOOK nie uruchamiało odtwarzacza, gdy zdarzenie klawisza multimedialnego Intent docierało do onStartCommand(). Problem został rozwiązany przez obsługę „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 obsługuje 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ł wielokrotnie kompresowany podczas łączenia 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 MuteButtonState do ui-compose, 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 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.
    • Naprawiliśmy błąd, który powodował, że czas rozpoczęcia playlisty był pomijany, gdy tag EXT-X-PROGRAM-START-DATE definiujący czas rozpoczęcia został usunięty z playlisty (#2760).
    • Używanie wyszukiwania binarnego do znajdowania indeksu segmentu danej pozycji na playliście (#2826).
    • Dodaj HlsInterstitialsAdsLoader.skipCurrentAd() 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 występujący podczas odtwarzania strumieni DASH z niehierarchicznym identyfikatorem URI pliku manifestu 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ązano 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 zachowanie CastPlayer, które obsługuje tylko odtwarzanie Cast, możesz użyć RemoteCastPlayer. Dotychczasowe konstruktory CastPlayer zachowują swoje stare działanie, ale zostały wycofane na rzecz kreatorów CastPlayer lub RemoteCastPlayer.
    • Przestań wymuszać typ MIME inny niż null w DefaultMediaItemConverter.
    • Użyj MediaItem.mediaMetadata.mediaType, aby określić parametr MEDIA_TYPE przesyłania, który ma być używany w DefaultCastOptionsProvider#toMediaQueueItem, gdy jest dostępny.
    • Włącz przesyłanie z urządzenia zdalnego na lokalne w DefaultCastOptionsProvider.
    • Dodaj obsługę Cast w wersji demonstracyjnej sesji.
    • Dodaj obsługę wyświetlania przycisku trasy multimediów w interfejsie Composable.
    • Dodaj obsługę wyświetlania przycisku trasy multimediów w menu paska działań.
    • Dodaj obsługę wyświetlania przycisku trasy multimediów jako interfejsu widoku.
  • Narzędzia testowe:
    • Dodaj maksymalną różnicę czasu dla automatycznego przechodzenia do następnego elementu w przypadku FakeClock. Domyślna wartość to 1 sekunda, ale można ją skonfigurować za pomocą FakeClock.Builder.
    • Dodaj maksymalną różnicę czasu między wiadomościami dla RobolectricUtil.runMainLooperUntil (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 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 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 przewijania do końca elementu.
    • Domyślnie używaj MediaCodec.BUFFER_FLAG_DECODE_ONLY w trybie czyszczenia.
    • Zgłaszanie błędu IllegalStateException, gdy PreloadMediaSource jest odtwarzany przez ExoPlayer z wątkiem odtwarzania innym niż wątek wstępnego wczytywania (#2495).
    • Dodaj cloneAndMove do ShuffleMode z domyślną implementacją (#2226).
    • Zmień domyślne działanie funkcji Renderer.getMinDurationToProgressUs, aby zwracała większą wartość, jeśli nie jest wymagane wywołanie 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 flaga ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled.
    • Dodaj metodę ExoPlayer.setScrubbingModeEnabled(boolean). Dzięki temu odtwarzacz jest zoptymalizowany pod kątem częstego przewijania (np. gdy użytkownik przeciąga pasek przewijania). Działanie trybu przewijania można dostosować za pomocą setScrubbingModeParameters(..) w ExoPlayer i ExoPlayer.Builder.
    • Zezwalaj na dostosowywanie tolerancji ułamkowej podczas przewijania w trybie przewijania.
    • Zwiększ szybkość działania kodeka w trybie przewijania.
    • Naprawiono błąd, który powodował, że błędy przygotowania w treści 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, aby metoda CmcdConfiguration.Factory zwracała wartość null w celu wyłączenia logowania CMCD w przypadku określonych elementów multimedialnych (#2386).
    • Zwiększono domyślny rozmiar bufora obrazu ze 128 kB (błąd kopiowania i wklejania ze ścieżek tekstowych) do 26 MB, co wystarcza na obrazy Ultra HDR o rozdzielczości 50 Mpix (#2417).
    • Dodaj PreCacheHelper, który umożliwia aplikacjom wstępne buforowanie pojedynczego pliku multimedialnego z określoną pozycją początkową i czasem trwania.
    • Dodaj obsługę wstępnego wczytywania z określonej pozycji w DefaultPreloadManager.
  • 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()) ciszą 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, aby ignorowały próbki między klatką kluczową przed punktem początkowym przycięcia a punktem początkowym przycięcia.
    • Zaktualizuj aplikację Composition Demo, aby używała Kotlina i Jetpack Compose, i dodaj niestandardowy element VideoCompositorSettings, aby ułożyć sekwencje w układzie 2 x 2 lub PiP.
  • Ekstraktory:
    • Analizowanie metadanych z pofragmentowanych plików MP4 (#2084).
    • JPEG: obsługa zdjęć ruchomych, które nie mają segmentu Exif na początku (#2552).
    • Dodano obsługę przewijania we fragmentowanych plikach MP4 z wieloma atomami sidx. To zachowanie można włączyć za pomocą 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).
    • Naprawiliśmy błąd związany z analizowaniem jednostek H.265 SEI, aby całkowicie pomijać nierozpoznane typy SEI (#2456).
    • Zaktualizuj WavExtractor, aby podczas analizowania pliku 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-bitowa zmiennoprzecinkowa modulacja PCM nie jest obsługiwana).
    • MP4: obsługa części obrotu macierzy przekształceń tkhd, które zarówno obracają, jak i odzwierciedlają film. Dzięki temu filmy nagrane przednim aparatem iPhone'a są wyświetlane prawidłowo, ale nieprawidłowo odzwierciedlone na osi Y (#2012).
    • MP3: używanie czasu trwania i rozmiaru danych z nieobsługujących przewijania metadanych Xing, VBRI i podobnych metadanych o zmiennej szybkości transmisji bitów podczas przełączania się na przewijanie ze stałą szybkością transmisji bitów z powodu FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194).
  • Dźwięk:
    • Naprawiono błąd, który powodował, że metoda AnalyticsListener.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 liniowego PCM w ChannelMappingAudioProcessor i TrimmingAudioProcessor.
    • Dodano obsługę przerw w dźwięku w CompositionPlayer.
    • Usuń nieprawidłowe wywołanie funkcji BaseAudioProcessor#flush() z pliku BaseAudioProcessor#reset().
    • Zezwalaj na stałe zwiększanie/zmniejszanie liczby kanałów w DefaultAudioMixer.
    • Ustawienie ChannelMappingAudioProcessor, TrimmingAudioProcessor i ToFloatPcmAudioProcessor jako publicznych (#2339).
    • Użyj AudioTrack#getUnderrunCount() w AudioTrackPositionTracker, aby wykrywać niedomogi w DefaultAudioSink zamiast szacowania na podstawie najlepszych starań.
    • Ulepszyliśmy wygładzanie sygnatur czasowych dźwięku w przypadku nieoczekiwanego przesunięcia pozycji z urządzenia wyjściowego audio.
    • Naprawiono błąd, który powodował, że synchronizacja audio-wideo była uszkodzona przez pierwsze 10 sekund po wznowieniu odtwarzania po wstrzymaniu, gdy urządzenie było połączone z urządzeniami Bluetooth.
    • Naprawiono błąd, który powodował, że AnalyticsListener.onAudioPositionAdvancing nie raportował czasu rozpoczęcia odtwarzania dźwięku, ale czas pierwszego pomiaru.
    • Naprawiono przywracanie dźwięku wielokanałowego po przełączeniu na dźwięk stereo na niektórych urządzeniach (#2258).
  • Film:
    • Rozszerzono obejście problemu z odłączoną powierzchnią na urządzenia „lenovo” i „motorola” (#2059).
    • Poprawiono płynność wyświetlania klatek wideo podczas uruchamiania, gdy próbki audio nie zaczynają się dokładnie w żądanej pozycji.
    • Rozszerzono obejście problemu z odłączoną powierzchnią na urządzenia „realme” (#2059).
    • Dodaj eksperymentalny interfejs API ExoPlayer, aby uwzględnić flagę MediaCodec.BUFFER_FLAG_DECODE_ONLY podczas kolejkowania buforów wejściowych tylko do dekodowania. Ta flaga sygnalizuje dekoderowi, aby pominął bufory tylko do dekodowania, co przyspiesza wyszukiwanie. Włącz ją za pomocą DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Ulepszyliśmy sprawdzanie wydajności kodeków w przypadku programowych kodeków wideo. Może to spowodować, że niektóre dodatkowe ścieżki zostaną oznaczone 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 wczytywał się, a później wczytywał się prawidłowo, po czym następowało kilka pustych segmentów napisów (#2517).
    • Naprawiono błąd, który powodował, że podczas włączania napisów w formatach SSA i SubRip wyświetlał się komunikat o trwającym procesie (#2309).
    • Rozwiązaliśmy problem z zawieszaniem się odtwarzania podczas przełączania ze strumienia z błędem napisów na transmisję na żywo z pustą ścieżką napisów (#2328).
    • Naprawiliśmy problem ze zniekształconymi napisami CEA-608 podczas odtwarzania strumieni H.262 zawierających klatki B (#2372).
    • Dodaliśmy obsługę napisów SSA z CodecId = S_TEXT/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).
    • Dodanie obsługi 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ę 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.
  • Multipleksery:
    • Naprawiliśmy błąd, który powodował, że w przypadku próbek audio we fragmencie MP4 nie były ustawiane prawidłowe flagi próbek.
    • Interfejs API writeSampleData() używa teraz klasy BufferInfo powiązanej 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 w MediaPeriodQueue (#2215).
  • Sesja:
    • Naprawiono błąd, który powodował ignorowanie połączeń z zewnętrznych kontrolerów Media3 bez uprawnień.
    • Usunięto sprawdzanie dostępnych poleceń podczas wysyłania poleceń niestandardowych do starszej wersji MediaBrowserServiceCompat. Jest to zgodne z zachowaniem starszych kontrolerów i przeglądarek po połączeniu ze starszą aplikacją.
    • Naprawiliśmy błąd, który powodował, że pierwszy błąd odtwarzania był nieprawidłowo traktowany jako trwały wyjątek niestandardowy. Uniemożliwia to przywrócenie aplikacji.
    • Naprawiono błąd, który powodował, że niektóre zmiany kontrolera nieobsługiwane przez sesję mogły powodować błąd IllegalStateExceptions.
    • Naprawiliśmy błąd, który powodował, że działania kontrolera nieobsługiwane przez sesję mogły pozostawiać kontroler w nieprawidłowym stanie.
    • Naprawiono ostrzeżenie o naruszeniu zasad dotyczących niebezpiecznego uruchamiania StrictMode (#2330).
    • Naprawiliśmy błąd, który powodował, że wywołanie 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 wersji aplikacji sesji z błędem ClassNotFoundException.
    • Naprawiono 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 obserwowaniem zmiany stanu (np. kształtu ikony lub włączenia). Wszystkie zmiany wprowadzone w odtwarzaczu poza okresem obserwacji są teraz uwzględniane (#2313).
    • Dodaj zmienne stanu i funkcje kompozycyjne do modułu media3-ui-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, aby akceptował argument Player, który może mieć wartość null.
  • Pobrane:
    • 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óry zastąpi 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 rozwiązany 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 zmiana wyboru ścieżki po wczytaniu części o małym opóźnieniu i wskazówek dotyczących wstępnego wczytywania mogła powodować zablokowanie lub zawieszenie odtwarzania (#2299).
    • Zapobieganie nadmiernemu ponownemu wczytywaniu przez oczekiwanie przez połowę docelowego czasu trwania, gdy serwer nie uwzględnia CAN-BLOCK-RELOAD=YES (#2317).
    • Naprawiliśmy błąd, który powodował zatrzymanie odtwarzania podczas uruchamiania strumienia reklam pełnoekranowych przed reklamą w trakcie filmu i próby rozpoznania listy zasobów dla nieprawidłowej reklamy (#2558).
    • Naprawiono analizowanie playlisty, aby akceptować \f (znak wysuwu strony) w wartościach atrybutów ciągów znaków w cudzysłowie (#2420).
    • Dodano obsługę aktualizowania reklam pełnoekranowych o tym samym identyfikatorze (#2427).
    • Naprawiliśmy błąd, który powodował, że błędy wczytywania playlisty czasami nie były przekazywane, gdy w transmisji na żywo kończyły się segmenty do wczytania (#2401https://github.com/androidx/media/issues/2401).
    • Grupowanie wersji napisów według tagu NAME, podobnie jak w przypadku wersji audio (#1666).
    • Obsługa X-ASSET-LIST i transmisji na żywo za pomocą HlsInterstitialsAdsLoader.
  • 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 z końcowymi znakami odstępu (#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 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 MediaCodecVideoRenderer MediaCodecVideoRenderer(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 być oznaczona jako 1.7.0-alpha01, ale została przypadkowo oznaczona jako 1.7.0 (czyli stabilna) na maven.google.com. Nie używaj jej. Pozostań przy wersji 1.6.1 lub przejdź na wersję 1.7.1 (która ma ten sam kod co wersja 1.6.1).

Wersja 1.6.0

1.6.1

14 kwietnia 2025 r.

Publikacja androidx.media3:media3-*:1.6.1 Wersja 1.6.1 zawiera te zatwierdzenia.

  • Biblioteka wspólna:
    • Dodano metodę PlaybackParameters.withPitch(float), która ułatwia 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).
    • Naprawiono błąd, 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 parametru 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ązano problem z odciążaniem, który powodował, że pozycja mogła się zacinać podczas odtwarzania playlisty z krótkimi treściami (#1920).
  • Sesja:
    • Zmniejsz limit czasu oczekiwania na agregację w przypadku wywołań zwrotnych platformy 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 miał dostępną metodę COMMAND_GET_CURRENT_MEDIA_ITEM i 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 korzystać 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 do obsługi kompilatora Compose. Uaktualniono bibliotekę KotlinX Coroutines z wersji 1.8.1 do 1.9.0.
    • Usuń metodę Format.toBundle(boolean excludeMetadata) i użyj 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).
    • Zmień 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.
    • Dodano eksperymentalną obsługę wstępnego rozgrzewania ExoPlayera na potrzeby odtwarzania za pomocą MediaCodecVideoRenderer. Możesz skonfigurować DefaultRenderersFactory za pomocą experimentalSetEnableMediaCodecVideoRendererPrewarming, aby udostępnić dodatkowy MediaCodecVideoRenderer dla ExoPlayer. Jeśli ta opcja jest włączona, ExoPlayer wstępnie przetwarza filmy z kolejnych elementów multimedialnych podczas odtwarzania, aby skrócić czas oczekiwania na przejście między elementami multimedialnymi.
    • Zmniejsz domyślne wartości 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 odpowiednich 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ń pliku 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 w szybkich odstępach czasu dodatkowe klatki tylko do dekodowania.
    • Spraw, aby DefaultRenderersFactory dodawał 2 instancje MetadataRenderer, aby aplikacje mogły domyślnie otrzymywać 2 różne schematy metadanych.
    • Ponowna ocena, czy trwające wczytywanie fragmentu powinno zostać anulowane, gdy odtwarzanie jest wstrzymane (#1785).
    • Dodaj opcję do ClippingMediaSource, aby umożliwić przycinanie w nieprzeszukiwalnych multimediach.
    • Naprawiliśmy błąd, który powodował, że przewijanie z wstępnym rozgrzewaniem mogło blokować przejście do następnego elementu multimedialnego.
    • Naprawiono błąd, który powodował, że ExoPlayer.isLoading() pozostawał w 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 niesfragmentowanego pliku MP4, a InAppFragmentedMp4Muxer – do tworzenia pliku sfragmentowanego.
    • 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).
    • Naprawiono 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ć z powodu błędu IllegalStateException: Playback stuck buffering and not loading (#2197).
  • Dźwięk:
    • Poprawiono wywołanie onAudioPositionAdvancing, aby następowało po wznowieniu odtwarzania (wcześniej było wywoływane po wstrzymaniu odtwarzania).
    • Nie pomijaj SonicAudioProcessor, 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 PCM do ChannelMappingAudioProcessor i TrimmingAudioProcessor.
  • Film:
    • Zmieniono MediaCodecVideoRenderer.shouldUsePlaceholderSurface na chronione, aby aplikacje mogły zastępować blokowanie użycia powierzchni zastępczych (#1905).
    • Dodano eksperymentalną analizę zależności próbek AV1 ExoPlayer, aby przyspieszyć przewijanie. Włącz go za pomocą nowego interfejsu 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:
    • Dodano 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 po przecinku, ale zawsze zakładaliśmy, że wartość jest podana w milisekundach, co prowadziło do nieprawidłowych sygnatur czasowych (#1997).
    • Naprawiono problem z zawieszaniem się odtwarzania, gdy playlista zawierała przycięte elementy z napisami CEA-608 lub CEA-708.
    • Naprawiono błąd IllegalStateException, który występował, gdy plik SSA zawierał sygnał o zerowym czasie trwania (czas rozpoczęcia i zakończenia był taki sam) (#2052).
    • Pomijanie (i rejestrowanie) błędów analizy napisów, gdy napisy są multipleksowane w tym samym kontenerze co dźwięk i obraz (#2052).
    • Naprawiono obsługę wielobajtowych znaków UTF-8 w plikach WebVTT z zakończeniami wierszy CR (#2167).
  • DRM:
    • Naprawiono błąd MediaCodec$CryptoException: Operation not supported in this 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. Klasa OverlaySettings może być podklasą, aby umożliwić dynamiczne ustawienia nakładki.
  • Multipleksery:
    • 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.
    • Napraw błąd w FragmentedMp4Muxer, który powoduje tworzenie wielu fragmentów, gdy zapisywana jest tylko ścieżka audio.
  • Sesja:
    • Utrzymuj stan usługi na pierwszym planie przez dodatkowe 10 minut, gdy odtwarzanie zostanie wstrzymane, zatrzymane lub nie powiedzie się. Dzięki temu użytkownicy mogą wznowić odtwarzanie w tym czasie bez ryzyka ograniczeń usług na pierwszym planie na różnych urządzeniach. Pamiętaj, że nie można już używać samego wywołania player.pause() do zatrzymania usługi na pierwszym planie 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:
    • Naprawiono błąd w CacheWriter, który powodował, że źródła danych pozostawały otwarte, a obszary pamięci podręcznej zablokowane, gdy źródło danych zgłaszało błąd 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 w celu synchronizacji pozycji w strumieniu HLS (#2209).
  • Rozszerzenie DASH:
    • Dodano obsługę formatu AC-4 Level-4 w DASH (#1898).
    • Rozwiązaliśmy problem z obliczaniem interwału aktualizacji na potrzeby wstawiania reklam w transmisjach na żywo z wieloma okresami (#1698).
    • Analizowanie atrybutu scte214:supplementalCodecs z pliku manifestu DASH w celu wykrywania formatów Dolby Vision (#1785).
    • Ulepszona obsługa przejść między okresami w transmisjach na żywo, w których okres zawiera próbki multimediów wykraczające poza zadeklarowany czas trwania okresu (#1698).
    • Rozwiązaliśmy problem, który powodował, że zestawy adaptacyjne oznaczone jako adaptation-set-switching, ale z różnymi językami lub flagami ról, były scalane (#2222).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Dodano moduł dekodera MPEG-H, który używa wbudowanego dekodera MPEG-H do dekodowania dźwięku MPEG-H (#1826).
  • Rozszerzenie MIDI:
    • Połącz niestandardowe instancje AudioSink i AudioRendererEventListener z MidiRenderer.
  • Rozszerzenie Cast:
    • Zwiększ 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 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 przypadku 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 deszyfrowania asynchronicznego w MediaCodec, aby uniknąć zgłaszanych problemów z przekroczeniem limitu czasu kodeka w przypadku tego interfejsu API platformy (#1641).
  • Ekstraktory:
    • MP3: nie zatrzymuj odtwarzania przedwcześnie, gdy spis treści ramki VBRI nie obejmuje wszystkich danych MP3 w pliku (#1904).
  • Film:
    • Wycofanie używania wartości formatu obrazu piksela podanych w MediaCodecAdapter, gdy są one podane podczas przetwarzania onOutputFormatChanged (#1371).
  • Tekst:
    • Naprawiliśmy błąd w ReplacingCuesResolver.discardCuesBeforeTimeUs, który powodował, że wskazówka aktywna o timeUs (rozpoczęta wcześniej, ale jeszcze niezakończona) była nieprawidłowo odrzucana (#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ę słuchaczy (#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 funkcję rozszerzenia zawieszającego Player.listen, aby uruchomić współprogram do nasłuchiwania Player.Events w bibliotece media3-common-ktx.
    • 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 wyodrębniają takie wywołania, aby uniknąć błędów w czasie działania (dzięki czemu ręczne wyodrębnianie nie jest już wymagane). Wszyscy użytkownicy Gradle korzystający z biblioteki muszą już używać wersji wtyczki Androida do obsługi Gradle, która korzysta z wersji R8, która to robi, ze względu 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:
    • Funkcję MediaCodecRenderer.onProcessedStreamChange() można teraz wywołać w przypadku każdego elementu multimedialnego. Wcześniej nie było wywoływane w przypadku pierwszego. Aby włączyć tę funkcję, uż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 rozpowszechniać zdarzenia wstępnego ładowania w aplikacjach.
    • Zezwalaj na zmianę limitu czasu klienta SNTP i ponowne próby połączenia z alternatywnymi adresami po przekroczeniu limitu czasu (#1540).
    • Usunięto pole MediaCodecAdapter.Configuration.flags, ponieważ zawsze miało wartość 0.
    • Zezwalaj użytkownikowi na wybieranie wbudowanego głośnika do odtwarzania na Wear OS API 35 lub nowszym (jeśli urządzenie obsługuje tę funkcję).
    • Odrocz wywołanie blokujące do Context.getSystemService(Context.AUDIO_SERVICE), dopóki nie zostanie włączona obsługa fokusu audio. Dzięki temu wywołanie blokujące nie jest wykonywane, jeśli obsługa fokusu audio nie jest włączona (#1616).
    • Zezwalanie na odtwarzanie niezależnie od czasu buforowania, gdy wczytywanie się nie powiedzie (#1571).
    • Dodaj AnalyticsListener.onRendererReadyChanged(), aby sygnalizować, kiedy poszczególne mechanizmy renderowania zezwalają na odtwarzanie.
    • Naprawiono błąd, który powodował, że MediaCodec.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ójnymi konfiguracjami udostępnionymi.
    • 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 przez 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 błędy wczytywania (np. HTTP 404) są emitowane przez wywołania zwrotne onLoadError.
      • W przypadku starszego sposobu obsługi napisów (podczas renderowania) tylko powiązane błędy wczytywania są emitowane przez wywołania zwrotne onLoadError, a błędy analizy są ignorowane (jest to dotychczasowe zachowanie).
    • 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:
    • Dodaj 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.
    • Ustawienie czasu trwania obrazu za pomocą MediaItem.Builder.setImageDurationMs jest wymagane 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 identyfikowanie przez Mp4Extractor i FragmentedMp4Extractor 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 aplikacji AmrExtractor.
    • Traktuj pliki MP3 z ponad 128 kB między prawidłowymi klatkami jako obcięte (zamiast nieprawidłowych). Oznacza to, że pliki z danymi innymi niż MP3 na końcu, które nie mają innych metadanych wskazujących długość bajtów MP3, zatrzymują teraz odtwarzanie na końcu danych MP3, zamiast kończyć się błędem ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • Rozwiązaliśmy problem z obsługą próbek reklam przed filmem w przypadku pozycji początkowych multimediów innych niż klatki kluczowe podczas przetwarzania list edycji w plikach MP4 (#1659).
    • Ulepszono obliczanie liczby klatek przez użycie czasu trwania multimediów z pola 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 czasu filmu, a teraz wartość media_time jest prawidłowo skalowana przy użyciu skali czasu ś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ę identyfikacji pola h263 w plikach MP4 w przypadku filmów H.263 (#1821).
    • Dodaliśmy obsługę formatu pliku multimedialnego AC-4 Level-4 ISO base (#1265).
  • Źródło danych:
    • Zaktualizowano HttpEngineDataSource, aby umożliwić korzystanie z rozszerzenia 7 od wersji S zamiast 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 identyfikatora URI żądania, 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 wszelkich oczekiwanych nagłówków. Pozwala to odróżnić błąd HTTP 404 (z nagłówkami) od błędu „Nie znaleziono serwera” (bez nagłówków).
  • Dźwięk:
    • Automatycznie konfiguruj metadane głośności CTA-2075 w kodeku, jeśli są obecne w multimediach.
    • Zapewnij płynne zmniejszanie głośności podczas przewijania.
    • Naprawiliśmy problem z trzaskami, które mogły występować podczas przewijania.
    • Naprawiono błąd akumulacji obcinania w algorytmie rozciągania czasu i zmiany wysokości dźwięku Sonic.
    • Naprawiono błąd w SpeedChangingAudioProcessor, który powodował pomijanie klatek wyjściowych.
  • Film:
    • MediaCodecVideoRenderer unika dekodowania próbek, które nie są renderowane ani używane jako odniesienie przez inne próbki.
    • W interfejsie API 35 i nowszych MediaCodecAdapter może teraz otrzymywać 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).
    • Zapewniliśmy wyświetlanie napisów WebVTT w HLS z bardzo dużymi sygnaturami czasowymi (które przekraczają 64-bitową wartość long, gdy są reprezentowane jako mikrosekundy i pomnożone przez podstawę czasu MPEG 90,000) (#1763).
    • Obsługa napisów CEA-608 w treściach Dolby Vision (#1820).
    • Naprawiono błąd powodujący zawieszanie się odtwarzania strumieni DASH z wieloma okresami, gdy włączone są napisy CEA-608 (#1863).
  • 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 spowodować 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, które przychodzi w celu wznowienia odtwarzania, przez zastąpienie tej metody. Domyślnie usługa jest zawsze uruchamiana, a odtwarzania nie można pominąć bez awarii usługi i wyświetlenia błędu 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 błędu 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 Wdrażanie niestandardowych działań przeglądania. * Naprawiliśmy błąd, który powodował, że kontroler Media3 czasami nie mógł zezwolić aplikacji sesji na uruchomienie usługi działającej na pierwszym planie po wysłaniu żą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 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 po zasubskrybowaniu przez przeglądarkę parentid MediaBrowser połączony ze starszą usługą przeglądarki nie otrzymywał błędu wysłanego przez usługę.
    • Ulepszyliśmy działanie interoperacyjności, dzięki czemu przeglądarka Media3 połączona ze starszą wersją MediaBrowserService nie żąda dwukrotnie elementów podrzędnych parentId podczas subskrybowania elementu nadrzędnego.
  • UI:
    • Udostępnij rozciągnięty/przycięty film w ramach obejścia PlayerView-in-Compose-AndroidView ze względu na problemy z przejściami udostępnionymi opartymi na XML. 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).
    • Rozwiązaliśmy problem z awarią podczas analizowania pakietów RTP z rozszerzeniami nagłówka (#1225).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Dodaj moduł dekodera IAMF, który zapewnia obsługę odtwarzania plików MP4 zawierających ścieżki IAMF przy użyciu biblioteki natywnej libiamf do syntezy dźwięku.
      • Odtwarzanie jest możliwe w układzie stereo oraz 5.1 z przestrzennym dźwiękiem i opcjonalnym śledzeniem ruchów głowy, ale odtwarzanie obustronne nie jest obecnie obsługiwane.
    • Dodano obsługę stron 16 KB w przypadku rozszerzeń dekodera na Androidzie 15 (#1685).
  • Rozszerzenie Cast:
    • Zatrzymanie czyszczenia osi czasu po rozłączeniu CastSession, co umożliwia aplikacji nadawcy wznowienie odtwarzania lokalnie po rozłączeniu.
    • Wypełnij DeviceInfo CastPlayer, 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 jest stosowany 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 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 lub równy czasowi ostatniego zdarzenia w Subtitle (#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 31 lub nowszym, na których odtwarzane są treści Widevine L1. Ten błąd jest spowodowany niepełną implementacją metody MediaDrm.requiresSecureDecoder platformy (#1603).
  • Efekt:
    • Dodaj metodę release() do GlObjectsProvider.
  • Sesja:
    • Zmień dwukrotne kliknięcie KEYCODE_HEADSETHOOK na działanie „przejdź do następnego”, zgodnie z dokumentacją (#1493).
    • Podczas podejmowania decyzji, czy zignorować KEYCODE_HEADSETHOOK, aby uniknąć ForegroundServiceDidNotStartInTimeException, traktuj to polecenie jako polecenie „odtwórz” w MediaButtonReceiver (#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 przypuszczalne 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 odtwarzaczy.
    • Usuń Buffer.isDecodeOnly() i C.BUFFER_FLAG_DECODE_ONLY. Nie trzeba ustawiać tej flagi, ponieważ mechanizmy renderowania i dekodery decydują o pominięciu buforów na podstawie sygnatury czasowej. Niestandardowe 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 z interfejsu API 35.
    • Rozwiązaliśmy problem z aktualizacją czasu ostatniego ponownego buforowania, który powodował nieprawidłowy klucz bs (brak danych w buforze) w CMCD (#1124).
    • Dodaj PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource), aby wskazać, że źródło zostało wczytane do końca. Dzięki temu implementacje DefaultPreloadManager i niestandardowe implementacje 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łać 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 ExoPlayer 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.
    • Dodaj MediaCodecAdapter#OnBufferAvailableListener, aby otrzymywać alerty, gdy bufory wejściowe i wyjściowe są 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).
    • Naprawiliśmy pewne niespójności związane z fokusem dźwięku, np. brak zgłaszania pełnej lub tymczasowej utraty fokusu, gdy odtwarzacz jest wstrzymany (#1436).
    • Naprawiliśmy potencjalny błąd 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).
    • Naprawiono 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 się między multimediami wejściowymi SDR i HDR w sekwencji.
    • Dodanie obsługi efektów dźwiękowych na poziomie kompozycji.
    • Dodaj obsługę transkodowania obrazów Ultra HDR na filmy HDR.
    • Rozwiązaliśmy problem, który powodował, że po zresetowaniu i ponownym użyciu 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ż dotyczą one tylko 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 ładowaniem obrazów HEIC ze schematów URI treści. (#1373).
    • Dostosuj czas trwania ścieżki audio w aplikacji AudioGraphInput, aby poprawić synchronizację dźwięku i obrazu.
    • Usuń pole ExportResult.processedInputs. Jeśli używasz tego pola do podawania szczegółów kodeka, użyj zamiast niego 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). Wprowadziliśmy poprawki, które rozwiązują problemy występujące w strumieniach HLS tylko z klatkami I(#1150) i strumieniach HLS H.262 (#1126).
    • MP3: preferuj rozmiar danych z ramki 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, co zwiększa dokładność wyszukiwania (#1376).
    • MP3: używanie liczby klatek i innych danych w ramce Info (jeśli jest obecna) do obliczania średniej szybkości transmisji bitów na potrzeby wyszukiwania stałej szybkości transmisji bitów zamiast ekstrapolacji na podstawie szybkości transmisji bitów ramki po ramce Info, która może być sztucznie mała, np. ramka 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 zakoń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:
    • Naprawiono problem, który powodował, że Listener.onRenderedFirstFrame() pojawiało się zbyt wcześnie podczas przełączania powierzchni w trakcie odtwarzania.
    • Naprawiono logikę zastępczą dekodera Dolby Vision, aby w razie potrzeby używał zgodnego dekodera AV1 (#1389).
    • Naprawiono wyjątek kodeka, który mógł być spowodowany włączeniem renderowania wideo w trakcie odtwarzania.
  • 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 wersji 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ć uznawane za prawdziwe, niezależnie od wartości obecnych w strumieniu (obsługa columnLock nie jest zaimplementowana, więc w praktyce zakłada się, że zawsze jest fałszywa).
      • Pierwotnie ta informacja została uwzględniona w informacjach o wersji 1.3.0-alpha01, ale zmiana została przypadkowo cofnięta przed wydaniem 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).
    • Naprawiliśmy 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:
    • Poprawiono mapowanie tagów sortowania MP4 na ID3. Wcześniej tagi MP4 „album sort” (soal), „artist sort” (soar) i „album artist sort” (soaa) były nieprawidłowo mapowane na tagi 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 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ć taki sam.
    • Dodaj obsługę HDR dla: TextOverlay. Luminancję nakładki tekstowej można dostosować za pomocą parametru OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Rozszerzenie IMA:
    • Przenieś interfejs API wymagany do odtwarzania przez aplikacje strumieni reklam DAI do wersji stabilnej.
    • Dodaj replaceAdTagParameters(Map <String, String>) do ImaServerSideAdInsertionMediaSource.AdLoader, aby umożliwić zastępowanie parametrów tagu reklamy w czasie działania.
    • Naprawiliśmy błąd, który powodował, że metoda VideoAdPlayer.VideoAdPlayerCallback.onError() nie była wywoływana, gdy podczas odtwarzania reklamy wystąpił błąd odtwarzacza (#1334).
    • Zaktualizowano pakiet IMA SDK do wersji 3.33.0, aby rozwiązać problem z 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).
    • Dostosuj konwersję MediaMetadata do MediaDescriptionCompat, aby używać tej samej preferowanej kolejności i logiki podczas wybierania właściwości metadanych co w przypadku media1.
    • Dodaj MediaSession.sendError(), który umożliwia wysyłanie błędów niekrytycznych do kontrolera Media3. Gdy używasz kontrolera powiadomień (patrz MediaSession.getMediaNotificationControllerInfo()), błąd niestandardowy jest używany do aktualizowania stanu 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 przekazać więcej informacji o błędzie i sposobie jego rozwiązania, jeśli to możliwe.
    • Opublikuj kod aplikacji testowej kontrolera media3, której można używać do testowania interakcji z aplikacjami publikującymi sesję multimedialną.
    • Przekazywanie dodatkowych informacji przekazanych do MediaSession[Builder].setSessionExtras() Media3 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 aktualizować za pomocą MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • Ulepszanie replikacji błędów wywołań do MediaLibrarySession.Callback. Replikację błędów można teraz skonfigurować za pomocą MediaLibrarySession.Builder.setLibraryErrorReplicationMode(), aby wybrać typ błędu lub zrezygnować z replikacji błędów, która jest domyślnie włączona.
  • 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ć używanie różnych obiektó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:
    • Upewnij się, że DownloadHelper nie powoduje 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. Prowadzi to do nieukończenia wywołania zwrotnego i przekroczenia limitu czasu żądania (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 inicjującymi powodowało błędy Source Error i IllegalArgumentException.
    • Naprawiono błąd, który powodował, że playlisty inne niż główna nie były odświeżane podczas odtwarzania na żywo (#1240).
    • Naprawiliśmy błąd, który powodował, że włączenie CMCD w przypadku transmisji na żywo HLS powodowało ArrayIndexOutOfBoundsException (#1395).
  • 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 nie działały 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.
    • Zezwalaj 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 klas DefaultHttpDataSource, OkHttpDataSource i CronetDataSource. Zamiast tego użyj odpowiedniej metody na 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ń konstruktory DefaultHttpDataSource. 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 usługa PreloadMediaPeriod nie mogła zachować strumieni po ponownym wstępnym załadowaniu.
    • Zastosuj prawidłowy TrackSelectionResult do okresu odtwarzania podczas ponownego wyboru ścieżki.
    • Rozpoczęcie renderowania z włączonym wcześniejszym uruchamianiem tylko po przejściu do okresu odtwarzania podczas przełączania się między elementami multimedialnymi (#1017).
    • Dodano brakujący zwracany typ do reguły proguard -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) nad ścieżkami z mniejszą lub nieustawioną liczbą klatek na sekundę. Dzięki temu odtwarzacz wybiera „prawdziwą” ścieżkę wideo w plikach MP4 wyodrębnionych ze zdjęć ruchomych, które mogą zawierać 2 ścieżki HEVC, z których jedna ma wyższą rozdzielczość, ale bardzo małą liczbę klatek (#1051).
  • Ekstraktory:
    • Rozwiązaliśmy problem polegający na tym, że dopełnienie nie było pomijane podczas odczytywania fragmentów o nietypowym rozmiarze z plików WAV (#1117).
    • MP3: wypełnij pole Format.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, Chromecaście z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie H265 60 kl./s są oznaczane jako nieobsługiwane.
    • Dodano obejście, które zapewnia, że pierwsza klatka jest zawsze renderowana podczas tunelowania, nawet jeśli urządzenie nie robi tego automatycznie zgodnie z wymaganiami interfejsu API (#1169). (#966).
    • Rozwiązaliśmy problem, który powodował, że obsługa informacji o kolorach HDR powodowała nieprawidłowe działanie kodeka i uniemożliwiała adaptacyjne przełączanie formatów w przypadku ścieżek wideo SDR (#1158).
  • Tekst:
    • WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie wskazówki fałszywych dodatkowych instancji 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:
    • Ulepszone mapowanie tonów PQ na SDR dzięki konwersji przestrzeni barw.
  • Sesja:
    • Rozwiązaliśmy problem polegający na tym, że bieżąca pozycja przeskakiwała do tyłu, gdy kontroler zastępował bieżący element (#951).
    • Rozwiązaliśmy problem, który powodował, że obiekt MediaMetadata z samą wartością inną niż null extras nie był przesyłany między kontrolerami multimediów a sesjami (#1176).
  • UI:
    • Jeśli Locale nie może zidentyfikować wyświetlanej nazwy, 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. Zawsze było to udokumentowane jako działające, ale do tej pory nie było prawidłowo zaimplementowane.
    • Normalizuj typy MIME ustawione przez kod aplikacji lub odczytane z multimediów, aby były w całości zapisane małymi literami.
    • Zdefiniuj reklamy za pomocą pełnego elementu 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 treści multimedialnych 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 interfejs PreloadMediaSource.PreloadControl, i ustawiają wstępnie wczytane źródło w odtwarzaczu.
    • Dodaj uprawnienie ExoPlayer.setImageOutput, które umożliwia aplikacjom ustawianie ImageRenderer.ImageOutput.
    • DefaultRenderersFactory teraz domyślnie udostępnia odtwarzaczowi ImageRenderer z wartościami null dla ImageOutput i ImageDecoder.Factory.DEFAULT.
    • Emitowanie zdarzenia Player.Listener.onPositionDiscontinuity, gdy cisza jest pomijana (#765).
    • Dodano eksperymentalną obsługę analizowania napisów podczas wyodrębniania. Możesz to włączyć za pomocą MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Obsługa adaptacyjnych źródeł multimediów za pomocą PreloadMediaSource.
    • Zaimplementuj HttpEngineDataSource, HttpDataSource, korzystając z interfejsu API HttpEngine.
    • Zapobiegaj tworzeniu podklas CompositeSequenceableLoader. Ten komponent został wcześniej rozszerzony, ale nigdy nie utworzono jego podklasy w bibliotece. Dostosowywanie można przeprowadzić, opakowując instancję za pomocą wzorca dekoratora i implementując niestandardowy interfejs CompositeSequenceableLoaderFactory.
    • Rozwiązaliśmy problem polegający na tym, że powtarzanie tego samego czasu powodowało usunięcie metadanych z tego elementu (#1007).
    • Zmieniono nazwy metod experimentalSetSubtitleParserFactory w BundledChunkExtractor.Factory i DefaultHlsExtractorFactory na setSubtitleParserFactory i nie zezwolono 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 do momentu jej sygnatury czasowej (#829).
    • Dodano obsługę optymalizacji operacji przycinania pojedynczego zasobu MP4.
    • Dodaj obsługę, aby klatka wideo miała pierwszą sygnaturę czasową w pliku wyjściowym. Naprawiliśmy błąd powodujący, że pliki wyjściowe zaczynały się od czarnej klatki w odtwarzaczach na iOS (#829).
  • Wybór ścieżki:
    • Dodaj DefaultTrackSelector.selectImageTrack, aby umożliwić wybór ścieżki obrazu.
    • Dodaj TrackSelectionParameters.isPrioritizeImageOverVideoEnabled, aby określić, czy wybrać ścieżkę obrazu, jeśli dostępne są zarówno ścieżka obrazu, jak i ścieżka wideo. Wartością domyślną 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 wyszukiwania ze stałą szybkością transmisji bitów (CBR) w przypadku plików z nagłówkiem Info (odpowiednik CBR nagłówka Xing). Wcześniej używaliśmy tabeli wyszukiwania 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).
    • Zgłaszanie pominiętej ciszy w bardziej deterministyczny sposób (#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 dotyczących bitmap, 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ć uznawane za prawdziwe, niezależnie od wartości obecnych w strumieniu (obsługa columnLock nie jest zaimplementowana, więc w praktyce zakłada się, że zawsze jest fałszywa).
  • Obraz:
    • Dodaj 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 w ogóle by się nie rozpoczęło). 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ść elementu HlsMediaPeriod do poziomu pakietu prywatnego. Ten typ nie powinien być bezpośrednio zależny od elementów spoza pakietu HLS.
    • Bardziej efektywne rozwiązywanie problemów z przewijaniem do początku segmentu (#1031).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Dekoder MIDI: ignorowanie komunikatów o zdarzeniach SysEx (#710).
  • Narzędzia testowe:
    • Nie wstrzymuj odtwarzania w aplikacji TestPlayerRunHelper.playUntilPosition. Test utrzymuje odtwarzanie w stanie odtwarzania, ale zawiesza postęp, dopóki nie będzie można dodać asercji i dalszych działań.
  • Aplikacja demonstracyjna:
    • Dodaj moduł demonstracyjny dotyczący krótkich treści, aby pokazać, jak korzystać z funkcji 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:
    • Rozwiązaliśmy problem, który powodował, że koder zgłaszał błąd podczas konfiguracji z powodu ustawienia wysokiej szybkości działania.
  • Ekstraktory:
    • Oznacz dodatkowe (nieodtwarzalne) ścieżki HEVC w zdjęciach ruchomych JPEG jako ROLE_FLAG_ALTERNATE, aby zapobiec ich automatycznemu wybieraniu do odtwarzania ze względu na wyższą rozdzielczość.
    • Naprawiono błąd wykrywania klatek kluczowych w strumieniach TS H264 (#864).
    • Poprawiono szacowanie czasu trwania strumieni TS dłuższych niż 47 721 sekund (#855).
  • Dźwięk:
    • Poprawiono obsługę EOS dla SilenceSkippingAudioProcessor w przypadku wielokrotnego wywołania (#712).
  • Film:
    • Dodano obejście problemu z urządzeniem na Galaxy Tab S7 FE, Chromecastem z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC 60 kl./s są oznaczane jako nieobsługiwane (#693).
  • Metadane:
    • Naprawiono błąd, który powodował, że pole 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 podłączona żadna powierzchnia. Błąd był spowodowany nieprawidłowym użyciem bezpiecznego dekodera do odtwarzania treści niezaszyfrowanych.
  • Sesja:
    • Umieść niestandardowe klucze i wartości w polach MediaMetadataCompat i MediaMetadata.extras (#756, #802).MediaMetadataCompatMediaMetadata.extras
    • 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ązaliśmy problem, który powodował, że przewijanie do przodu pomijało zdarzenia zmiany programu (#704).
    • Migracja do 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 implementacje będą musiały ręcznie dołączyć te informacje, jeśli jest to wymagane (być może za pomocą Logger.appendThrowableString(String, Throwable)).
    • Rozwiązaliśmy problem ze zgodnością z Kotlinem, który powodował, że parametry typu ogólnego z możliwością wartości null i typy elementów tablicy z możliwością wartości null nie były wykrywane jako takie. Przykłady to parametry metody 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 przeznaczonych tylko do dekodowania (#11000).
    • Dodaj blokowanie odtwarzania na nieodpowiednich urządzeniach wyjściowych audio (np. wbudowanym głośniku na urządzeniach z Wear OS), gdy ta funkcja jest włączona przez ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Jeśli próba odtworzenia zostanie podjęta, gdy nie będą dostępne żadne odpowiednie wyjścia audio, lub jeśli wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania, przyczyna wstrzymania odtwarzania zostanie zaktualizowana 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 wszystkich klas MediaSource udostępnianych przez bibliotekę za pomocą 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 dotychczasowego 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).
    • Dodaliśmy funkcję przesyłania danych CMCD (Common Media Client Data) za pomocą parametrów zapytania (#553).
    • Rozwiąż problem 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:
    • Przeanalizuj 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 urządzenia 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 zachowanie pozostanie takie samo jak w przypadku wartości true.
  • Ekstraktory:
    • MPEG-TS: zapewniono renderowanie ostatniej klatki przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909).
    • Popraw literówkę podczas określania rotationDegrees. 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 formacie MP4.
    • Dodaj AudioSink.getFormatOffloadSupport(Format), który pobiera poziom obsługi odciążania, jaki ujście może zapewnić dla formatu, za pomocą DefaultAudioOffloadSupportProvider. Zwraca nowy 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 ustawiono preferencję włączenia, urządzenie obsługuje odciążanie dla danego formatu, a wybór ścieżki to pojedyncza ścieżka audio, odciążanie dźwięku zostanie włączone.
    • Jeśli zasada 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 starszym 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.
    • Dodaliśmy obsługę metadanych Opus gapless podczas odtwarzania z odciążeniem.
    • Zezwalaj na przywracanie renderera przez wyłączenie odciążania, jeśli nie uda się wykonać pierwszego zapisu (#627).
    • Domyślnie włącz planowanie odciążania w przypadku odtwarzania z odciążaniem tylko dźwięku.
    • Usuń: ExoPlayer.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 audio DTS Express (#650).
    • Naprawiono błąd, który powodował, że sprawdzanie możliwości E-AC3-JOC zgłaszało błąd IllegalArgumentException (#677).
  • Film:
    • Zezwalaj 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 atrybutem 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ć interfejs 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).
    • Używaj tylko android.media.session.MediaSession.setMediaButtonBroadcastReceiver() powyżej interfejsu API 31, aby uniknąć problemów z wycofanym interfejsem API na urządzeniach Samsung (#167).
    • Użyj kontrolera powiadomień o multimediach jako serwera proxy, aby ustawić dostępne polecenia i niestandardowy układ używany do wypełniania powiadomienia i sesji platformy.
    • Konwertuj zdarzenia przycisków multimedialnych odbierane przez MediaSessionService.onStartCommand() w Media3, zamiast kierować je do sesji platformy i z powrotem do Media3. Dzięki temu kontroler rozmówcy jest zawsze kontrolerem powiadomień o multimediach, a aplikacje mogą łatwo rozpoznawać połączenia przychodzące z powiadomienia w ten sam sposób na wszystkich obsługiwanych poziomach interfejsu API.
    • Rozwiązaliśmy problem, który powodował, że MediaController.getCurrentPosition() nie przechodzi dalej po połączeniu ze starszym urządzeniem 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ę powiedzie, 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:
    • 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.
    • Dodano eksperymentalną obsługę analizowania napisów podczas wyodrębniania. Zapewnia on lepszą obsługę scalania nakładających się napisów, w tym rozwiązywanie problemów z migotaniem podczas przechodzenia między segmentami napisów. Możesz to włączyć za pomocą DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Rozszerzenie RTSP:
    • Naprawiono sytuację wyścigu, która mogła prowadzić do błędu IndexOutOfBoundsException podczas przełączania na TCP lub zawieszania odtwarzania w niektórych sytuacjach.
    • Sprawdzanie stanu w konfiguracji RTSP podczas zwracania stanu wczytywania RtspMediaPeriod (#577).
    • Ignorowanie niestandardowych metod żądania Rtsp w nagłówku publicznym odpowiedzi Options (#613).
    • Używanie wartości czasu oczekiwania na odpowiedź konfiguracji RTSP w interwale czasowym wysyłania żądań opcji RTSP utrzymujących połączenie (#662).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Wydanie modułu dekodera MIDI, który umożliwia odtwarzanie standardowych plików MIDI przy użyciu biblioteki Jsyn do syntezy dźwięku.
    • Dodaj DecoderOutputBuffer.shouldBeSkipped, aby bezpośrednio oznaczać bufor wyjściowy, który nie musi być prezentowany. Jest to preferowane rozwiązanie w porównaniu z C.BUFFER_FLAG_DECODE_ONLY, które zostanie wycofane.
    • Dodaj Decoder.setOutputStartTimeUs i SimpleDecoder.isAtLeastOutputStartTimeUs, aby umożliwić dekoderom odrzucanie próbek przeznaczonych tylko do dekodowania przed czasem rozpoczęcia. Zalecamy używanie tej zasady zamiast zasady Buffer.isDecodeOnly, która zostanie wycofana.
    • Naprawiliśmy błąd związany z publikowaniem artefaktu dekodera MIDI w repozytorium Maven. Nazwa artefaktu została zmieniona na media3-exoplayer-midi (#734).
  • Rozszerzenie Leanback:
    • Naprawiono błąd, który powodował, że wyłączenie platformy mogło wywołać 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), maksymalna szybkość transmisji bitów (tb), czas trwania obiektu (d), zmierzona przepustowość (mtp) i typ obiektu (ot) (#8699).
  • Dźwięk:
    • Naprawiono 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 plików Opus zgodnie z RFC 7845.
  • Film:
    • H.265/HEVC: poprawiono analizowanie informacji o krótko- i długoterminowych obrazach referencyjnych SPS.
  • Tekst:
    • CEA-608: zmieniono logikę obcinania wskazówek, aby uwzględniała tylko widoczny tekst. Wcześniej wcięcie i przesunięcie tabulatora były uwzględniane podczas ograniczania długości wskazówki do 32 znaków (co było technicznie poprawne zgodnie ze specyfikacją) (#11019).
  • Rozszerzenie IMA:
    • Zaktualizowano pakiet IMA SDK do wersji 3.30.3.
  • Sesja:
    • Dodaj układ niestandardowy do stanu kontrolera i udostępnij metodę pobierającą, aby uzyskać do niego dostęp. Gdy układ niestandardowy się zmienia, wywoływana jest funkcja MediaController.Listener.onCustomLayoutChanged. Aplikacje, które chcą wysyłać różne układy niestandardowe do różnych kontrolerów Media3, mogą to zrobić w 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 umożliwiają użytkownikom określanie flag głośności:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Dodaj 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 na tej samej pozycji (#8046).
  • ExoPlayer:
    • Zezwalaj ExoPlayerowi na sterowanie głośnością urządzenia tylko wtedy, gdy użytkownik wyraźnie wyrazi na to zgodę. Użyj ExoPlayer.Builder.setDeviceVolumeControlEnabled, aby uzyskać dostęp do:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) 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 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() za korzystanie z 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).
    • Naprawiono błąd, który mógł powodować zawieszanie się przekształcenia (prowadzące do przekroczenia limitu czasu multipleksera), jeśli koniec strumienia wideo został zasygnalizowany w momencie, gdy klatka wejściowa oczekiwała na przetworzenie.
    • Aby rozszerzyć obsługę, wysyłaj zapytania o kodeki za pomocą MediaCodecList zamiast 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:
    • Naprawiliśmy 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).
    • Hermetyzuj ramki Opus w pakietach Ogg podczas bezpośredniego odtwarzania (odciążanie).
    • Ekstrapoluj bieżącą pozycję podczas uśpienia z harmonogramem odciążania.
    • Dodaj metody Renderer.release() i AudioSink.release(), aby zwolnić zasoby na końcu cyklu życia odtwarzacza.
    • Monitorowanie zmian funkcji 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.
    • Przekazywanie 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ść całkowitą DISCARD_REASON_AUDIO_BYPASS_POSSIBLE do DecoderDiscardReasons, aby odrzucić dekoder dźwięku, gdy po zmianie możliwości dźwięku możliwy jest tryb obejścia.
    • Dodano obsługę bezpośredniego odtwarzania DTS Express i DTS:X (#335).
  • 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 odpowiednio, gdy zmienia się Player.getVideoSize(). W wyniku tej zmiany rozmiar filmu w ExoPlayerze z MediaCodecVideoRenderer ma szerokość i wysokość 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łączanie transmisji na żywo DASH z wieloma przedziałami czasu na potrzeby dynamicznego wstawiania reklam. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania w transmisjach na żywo (#10912).
    • Naprawiliśmy błąd, który powodował wstawianie nowej grupy reklam w transmisjach na żywo, ponieważ obliczona pozycja treści na kolejnych osiach czasu nieznacznie się różniła.
  • Sesja:
    • Dodaj metodę pomocniczą MediaSession.getControllerForCurrentRequest, aby uzyskać informacje o kontrolerze, który obecnie wywołuje metodę Player.
    • Dodano androidx.media3.session.MediaButtonReceiver, aby umożliwić aplikacjom implementowanie wznawiania odtwarzania za pomocą zdarzeń przycisku multimediów wysyłanych np. przez zestaw słuchawkowy Bluetooth (#167).
    • Dodaj domyślną implementację do MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądanych MediaItems do Player, jeśli mają LocalConfiguration (np. URI) (#282).
    • Dodanie przycisków poleceń „przewiń do poprzedniego” i „przewiń do następnego” w widoku kompaktowym powiadomienia o multimediach domyślnie w Androidzie 12 i starszych (#410).
    • Dodaj domyślną implementację do MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądanych MediaItems do Player, jeśli mają LocalConfiguration (np. URI) (#282).
    • Domyślnie dodano przyciski poleceń „przewiń do poprzedniego” i „przewiń do następnego” w widoku kompaktowego powiadomienia o multimediach na urządzeniach z Androidem 12 i starszym (#410).
  • 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ć czas oczekiwania wątku wczytywania na zainicjowanie TimestampAdjuster. Jeśli inicjowanie nie zakończy się przed upływem limitu czasu, zostanie wygenerowany 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ń HlsMasterPlaylist i użyj HlsMultivariantPlaylist.
    • Usuń Player.stop(boolean). Zamiast tego użyj zasad Player.stop() i Player.clearMediaItems() (jeśli reset to true).
    • Usuń 2 wycofane konstruktory SimpleCache i użyj konstruktora, który nie został wycofany i 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 konstruktora, który nie został wycofany i 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. Zamiast nich używaj metody Format.buildUpon() i metod ustawiających.
    • Usuń wycofaną metodę ExoPlayer.retry() i użyj metody prepare().
    • Usuń wycofany konstruktor DefaultTrackSelector bez argumentów i użyj zamiast niego 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ł metodzie MediaLibraryService zwracanie wartości null 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ł 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 ExoPlayer 2.18.6.

  • Biblioteka podstawowa:
    • Zresetowanie zastąpienia docelowej transmisji na żywo podczas przewijania do pozycji domyślnej (#11051).
    • Naprawiliśmy błąd, który powodował, że puste strumienie próbek w multimediach mogły powodować zawieszanie się odtwarzania.
  • Sesja:
    • Naprawiliśmy błąd, który powodował, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję MediaSessionCompat powodowało wyjątek w MediaController (#290).
    • Dodaj brakujące przekierowanie 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ązaliśmy 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.
    • Naprawiono błąd, 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:
    • Naprawiono obsługę pustych osi czasu segmentów (#11014).
  • RTSP:
    • Ponów próbę z TCP, jeśli konfiguracja RTSP z UDP nie powiedzie się z błędem RTSP 461 UnsupportedTransport (#11069).

Wersja 1.0.0

22 marca 2023 r.

Publikacja androidx.media3:media3-*:1.0.0 Wersja 1.0.0 zawiera te zatwierdzenia.

Ta wersja odpowiada wersji 2.18.5 ExoPlayera.

Brak zmian od wersji 1.0.0-rc02.

Wersja 1.0.0-rc02

2 marca 2023 r.

Publikacja androidx.media3:media3-*:1.0.0-rc02 Wersja 1.0.0-rc02 zawiera te zmiany.

Ta wersja odpowiada wersji 2.18.4 ExoPlayera.

  • Biblioteka podstawowa:
    • Naprawiono wykrywanie typu sieci w interfejsie API 33 (#10970).
    • Naprawiono błąd NullPointerException podczas wywoływania ExoPlayer.isTunnelingEnabled (#10977).
  • Pobrane:
    • 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).
    • Naprawiono 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 Opis komunikatów odpowiedzi (#10971).
  • Sesja:
    • Naprawiliśmy błąd, który powodował, że przycisk odtwarzania/wstrzymania w powiadomieniu nie aktualizował się wraz ze stanem odtwarzacza (#192).
  • Rozszerzenie IMA:
    • Rozwiązaliśmy problem, który uniemożliwiał rozpoczęcie transmisji DAI bez reklam, ponieważ nie otrzymano pierwszego (i w przypadku braku reklam jedynego) zdarzenia LOADED.

Wersja 1.0.0-rc01

16 lutego 2023 r.

Publikacja androidx.media3:media3-*:1.0.0-rc01 Wersja 1.0.0-rc01 zawiera te zmiany.

Ta wersja odpowiada ExoPlayer 2.18.3.

  • Biblioteka podstawowa:
    • Dostosuj logikę kolejności dekoderów w rendererze, aby zachować preferencje MediaCodecSelector, nawet jeśli dekoder zgłasza, że może nie być w stanie odtworzyć multimediów z odpowiednią wydajnością. Na przykład w przypadku domyślnego selektora dekoder sprzętowy z obsługą tylko funkcjonalną będzie preferowany nad dekoderem programowym, który w pełni obsługuje dany format (#10604).
    • Dodaj ExoPlayer.Builder.setPlaybackLooper, który ustawia istniejący wcześniej wątek odtwarzania dla nowej instancji ExoPlayer.
    • Zezwalanie na czyszczenie pomocników menedżera pobierania (#10776).
    • Dodaj parametr do BasePlayer.seekTo, aby wskazać też polecenie używane do przewijania.
    • Używanie motywu podczas wczytywania obiektów rysowalnych w interfejsie API 21+ (#220).
    • Dodano ConcatenatingMediaSource2, który umożliwia łączenie wielu elementów multimedialnych w jednym oknie (#247).
  • 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 bezpośredniego odtwarzania (przekazywania).
  • Tekst:
    • Naprawiono błąd, który powodował, że funkcja TextRenderer przekazywała nieprawidłowy (ujemny) indeks do funkcji 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 ramek 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 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() w DefaultMediaNotificationProvider i użyj niezmiennych list, aby zachować przejrzystość (#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 ramek 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 ustawienie fokusu 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 1 elementem (#10667).
    • Dodaj Player.getSurfaceSize, który zwraca rozmiar powierzchni, na której jest renderowany film.
    • Naprawiliśmy błąd, który powodował, że usunięcie detektorów podczas udostępniania odtwarzacza mogło wywołać błąd IllegalStateException (#10758).
  • Kompilacja:
    • Wymuszanie minimalnej wersji compileSdkVersion, aby uniknąć błędów kompilacji (#10684).
    • Unikaj publikowania bloku, gdy jest on uwzględniony w innym procesie kompilacji Gradle.
  • Wybór ścieżki:
    • Jeśli wyświetlacz nie obsługuje Dolby Vision, preferuj inne ścieżki. (#8944).
  • Pobrane:
    • Naprawiono potencjalną pętlę nieskończoną w 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 technologii 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 odpowiednio 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 renderer 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:
    • Zapewnij, że polecenia są zawsze wykonywane we właściwej kolejności, nawet jeśli niektóre wymagają asynchronicznego rozwiązania (#85).
    • Dodaj DefaultMediaNotificationProvider.Builder, aby utworzyć DefaultMediaNotificationProvider instancje. Konstruktor może skonfigurować identyfikator powiadomienia, identyfikator kanału powiadomień i nazwę kanału powiadomień używaną przez dostawcę. Dodaj też metodę DefaultMediaNotificationProvider.setSmallIcon(int), aby ustawić małą ikonę powiadomień. (#104).
    • Upewnij się, że polecenia wysłane przed MediaController.release() nie zostały odrzucone (#99).
    • 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 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 zacina się podczas wczytywania reklamy (#10510).
    • Zapobieganie pomijaniu reklam w trakcie filmu podczas przewijania do końca treści (#10685).
    • Prawidłowo obliczaj czas trwania okna w przypadku transmisji na żywo z reklamami wstawianymi po stronie serwera, np. IMA DAI (#10764).
  • Rozszerzenie FFmpeg:
    • Dodano nowe wymagane flagi, aby połączyć biblioteki FFmpeg z NDK 23.1.7779620 i nowszymi (#9933).
  • Rozszerzenie AV1:
    • Zaktualizowano wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Android Studio (#9933).
  • Rozszerzenie Cast:
    • Zaimplementuj getDeviceInfo(), aby móc identyfikować 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 za pomocą 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:
    • Posłuchaj zmian w playWhenReady w LeanbackAdapter (10420).
  • Obsada:
    • Używaj parametru MediaItem, który został przekazany 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 2.18.0 ExoPlayera.

  • Biblioteka podstawowa:
    • Włącz obsługę diagnostyki platformy Androida przez MediaMetricsManager. ExoPlayer będzie przekazywać zdarzenia odtwarzania i dane o skuteczności do platformy, co pomoże dostarczać informacje o wydajności systemu i informacje na potrzeby debugowania na urządzeniu. Te dane mogą być też zbierane przez Google, jeśli użytkownik urządzenia włączył udostępnianie danych o użytkowaniu i diagnostyce. Aplikacje mogą zrezygnować z udostępniania danych diagnostycznych platformy ExoPlayer za pomocą ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Naprawiliśmy błąd, który powodował zbyt częste resetowanie ścieżek podczas korzystania z MergingMediaSource, na przykład podczas wczytywania napisów z boku i zmiany wybranych napisów w trakcie odtwarzania (#10248).
    • Zatrzymanie wykrywania typu sieci 5G-NSA w interfejsach API 29 i 30. Te odtworzenia będą zakładać sieć 4G.
    • Nie zezwalaj na przekazywanie parametru null do usług MediaSource.Factory.setDrmSessionManagerProvider i MediaSource.Factory.setLoadErrorHandlingPolicy. W razie potrzeby instancje DefaultDrmSessionManagerProvider i DefaultLoadErrorHandlingPolicy można przekazywać bezpośrednio.
    • 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 częścią RequestMetadata.
    • Dodaj Player.Command.COMMAND_SET_MEDIA_ITEM, aby umożliwić graczom ustawienie pojedynczego elementu.
  • Wybór ścieżki:
    • Przekształć klasę TrackSelectionOverrides w TrackSelectionParameters i awansuj TrackSelectionOverride do klasy najwyższego poziomu.
    • Zmień nazwę TracksInfo na Tracks, a 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óra jest domyślnie włączona. 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 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 sprawdzać, czy nie nastąpiły zmiany we właściwościach uprzestrzenniania, i na tej podstawie uruchamiać wybór nowej ścieżki. Urządzenia z television trybem interfejsu są wykluczone z tych ograniczeń, a preferowany będzie format z największą liczbą kanałów. Aby włączyć tę funkcję, instancja DefaultTrackSelector musi zostać utworzona za pomocą Context.
  • Film:
    • Zmień nazwę DummySurface na PlaceholderSurface.
    • Dodaj obsługę AV1 do MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Dźwięk:
    • Użyj dekodera dźwięku LG AC3, który rozgłasza 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 zakładanie liczby kanałów kodowania dźwięku na potrzeby przekazywania dźwięku, gdy liczba kanałów dźwiękowych formatu nie jest ustawiona, co ma miejsce w przypadku przygotowywania HLS bez fragmentów (10204).
    • Skonfiguruj 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: przeanalizuj DiscardPadding pod kątem ścieżek Opus.
    • MP4: analizowanie szybkości transmisji bitów z pól esds.
    • Ogg: zezwalanie 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.
    • Naprawiliśmy 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 interfejsu od modułu ExoPlayer. Jest to zmiana powodująca niezgodność.
    • Nie pokazuj 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 można jawnie przekazać instancje DefaultCompositeSequenceableLoaderFactory.
  • HLS:
    • Wycofanie do przygotowania z fragmentami, jeśli atrybut CODECS playlisty nie zawiera kodeka audio (#10065).
    • Nie zezwalaj na przekazywanie danych (null) do tych usług: HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.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).
    • Zatrzymanie sprawdzania obowiązkowych pól SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
    • Zgłaszanie wyjątku podczas analizowania czasu RTSP (#10165).
    • Dodanie czytnika RTP dla VP9 (#47).
    • Dodano czytnik RTP dla OPUS (#53).
  • Źródła danych:
    • Zmień nazwę DummyDataSource na PlaceholderDataSource.
    • Obejście obsługi przerwań OkHttp.
  • Sesja:
    • Zastąp MediaSession.MediaItemFiller elementem 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 pobrać obrazy okładek.
    • Dodaj MediaSession.setCustomLayout(), aby zapewnić zgodność wsteczną ze starszą sesją.
    • Dodaj MediaSession.setSessionExtras(), aby zapewnić równoważność funkcji ze starszą sesją.
    • Zmień nazwę MediaSession.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(#51).
    • Naprawiono błąd NPE w MediaControllerImplBase po zwolnieniu kontrolera (#74).
  • Odtwarzanie reklam / IMA:
    • Zmniejsz częstotliwość sprawdzania reklam z co 100 ms do co 200 ms, aby dostosować ją do zaleceń organizacji Media Rating Council (MRC).
  • Rozszerzenie FFmpeg:
    • Zaktualizuj wersję CMake do 3.21.0+, aby uniknąć błędu CMake, który powoduje niepowodzenie synchronizacji Gradle w Android Studio (#9933).
  • 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 pozostałych przypadkach – DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Usuń konstruktora DefaultTrackSelector(ExoTrackSelection.Factory). Użyj w zamian zasady DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Usuń Transformer.Builder.setContext. Zamiast tego należy przekazać Context 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:
    • Naprawiliśmy błąd sprawdzania możliwości dźwiękowych Dolby Atmos (E-AC3-JOC) w HLS.
  • Ekstraktory:
    • FMP4: rozwiązaliśmy problem, który powodował, że metadane próbek emsg mogły być wyświetlane w niewłaściwej kolejności w przypadku strumieni zawierających atomy emsg v0 i v1 (#9996).
  • Tekst:
    • Naprawiono interakcję między SingleSampleMediaSource.Factory.setTrackId i MediaItem.SubtitleConfiguration.Builder.setId, aby nadać priorytet polu SubtitleConfiguration i wrócić do wartości Factory, jeśli nie jest ustawiona (#10016).
  • Odtwarzanie reklamy:
    • Naprawiono błędy niedomiaru dźwięku między okresami reklamowymi w transmisjach na żywo HLS SSAI.

Wersja 1.0.0-alpha02

2 marca 2022 r.

Publikacja androidx.media3:media3-*:1.0.0-alpha02 Wersja 1.0.0-alpha02 zawiera te zatwierdzenia.

Odpowiada to wersji 2.17.0 ExoPlayera.

  • Biblioteka podstawowa:
    • Dodaj chronioną metodę DefaultRenderersFactory.getCodecAdapterFactory(), aby 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ń puste klucze z aplikacji DefaultHttpDataSource#getResponseHeaders.
    • Jeśli nie uda się utworzyć instancji MediaCodec, odczekaj i spróbuj ponownie. Rozwiązuje to problem, który występuje na niektórych urządzeniach podczas przełączania powierzchni z bezpiecznego kodeka na inny kodek (#8696).
    • Dodaj MediaCodecAdapter.getMetrics(), aby umożliwić użytkownikom uzyskiwanie danych o wskaźnikach 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.
    • Podzielono AnalyticsCollector na interfejs i domyślną implementację, aby umożliwić usunięcie przez R8, jeśli aplikacja nie potrzebuje tej funkcji.
  • Wybór ścieżki:
    • Dodaliśmy obsługę flag preferowanych ról wideo podczas wyboru ścieżki (#9402).
    • Zaktualizowaliśmy logikę wyboru ścieżki wideo, aby podczas wybierania wielu ścieżek wideo do adaptacji uwzględniała preferowane typy MIME i flagi ról (#9519).
    • Zaktualizowaliśmy logikę wyboru ścieżki wideo i audio, aby wybierać tylko formaty do wyboru adaptacyjnego, które mają ten sam poziom obsługi dekodera i sprzętu (#9565).
    • Zaktualizowano logikę wyboru ścieżki wideo, aby preferować bardziej wydajne kodeki, jeśli podstawowe dekodery z akceleracją sprzętową obsługują wiele kodeków (#4835).
    • Preferuj ustawienia treści audio (np. „domyślną” ścieżkę audio lub ścieżkę pasującą do języka systemu) nad technicznymi ograniczeniami wyboru ścieżki (np. preferowanym typem MIME lub maksymalną liczbą kanałów).
    • Rozwiązaliśmy problem z wyborem ścieżki, który polegał na tym, że zastąpienie jednej grupy ścieżek nie powodowało wyłączenia innych grup ścieżek tego samego typu (#9675).
    • Rozwiązaliśmy problem z wyborem ścieżki, który powodował, że kombinacja niepustych i pustych zastąpień ścieżki nie była prawidłowo stosowana (#9649).
    • Zabroń duplikowania TrackGroup w: TrackGroupArray. TrackGroup można zawsze odróżnić, ustawiając id w konstruktorze TrackGroup. Rozwiązaliśmy problem z awarią podczas wznawiania odtwarzania po przełączeniu aplikacji w tło z aktywnym zastąpieniem ścieżki (#9718).
    • Zmieniono logikę w AdaptiveTrackSelection, aby umożliwić zwiększenie jakości przy wystarczającej przepustowości sieci, nawet jeśli odtwarzanie jest bardzo blisko krawędzi transmisji na żywo (#9784).
  • Film:
    • Poprawiono logikę zastępczą dekodera Dolby Vision, aby w razie potrzeby używać zgodnego dekodera H264/H265.
  • Dźwięk:
    • Poprawiono logikę zastępczą dekodera Dolby Atmos (E-AC3-JOC), aby w razie potrzeby używać zgodnego dekodera E-AC3.
    • Zmień interfejsy API AudioCapabilities, aby wymagały jawnego 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 poza zadeklarowanym rozmiarem 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 pakiecie IMA (#8213).
    • Dodano metodę do AdPlaybackState, aby umożliwić resetowanie grupy reklam, dzięki czemu można ją odtworzyć ponownie (#9615).
    • Wymuszanie szybkości odtwarzania 1,0 podczas odtwarzania reklamy (#9018).
    • Rozwiązaliśmy problem, który powodował, że grupa reklam, której nie udało się załadować, powodowała natychmiastowe zresetowanie odtwarzania (#9929).
  • UI:
    • 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łowo wypełniaj parametr 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 Twoje wersje zawierają zmultipleksowane ścieżki z napisami, które nie są zadeklarowane na playliście reklamy nadrzędnej, dodaj je do playlisty reklamy nadrzędnej, aby były dostępne do odtwarzania, lub wyłącz przygotowywanie bez fragmentów za pomocą parametru HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • Obsługa dokładnego wyszukiwania klatek kluczowych w HLS (#2882).
  • RTSP:
    • Udostępnienie interfejsu API klienta, który zastępuje SocketFactory używany w przypadku dowolnego połączenia z serwerem (#9606).
    • Jeśli dostępne są obie metody uwierzytelniania, preferuj metodę DIGEST zamiast BASIC (#9800).
    • Obsługa sytuacji, gdy czas ścieżki RTSP jest niedostępny (#9775).
    • Ignorowanie nieprawidłowych wartości nagłówka RTP-Info (#9619).
  • 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 podczas zwalniania muxera.
    • 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ć funkcję 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:
    • Uzależnienie build_ffmpeg.sh od binarnych narzędzi 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 witryn 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ń ActionFile i ActionFileUpgradeUtil. Użyj ExoPlayera w wersji 2.16.1 lub starszej, aby użyć ActionFileUpgradeUtil do scalenia starszych plików 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ń te ustawienia: IntDefs na @Target(TYPE_USE). Może to spowodować błąd kompilacji użyć w Kotlinie, który można naprawić, przenosząc adnotację, aby dodać adnotację do typu (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags (w 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ługi multimediów, w tym ExoPlayer. Pierwsza wersja alfa zawiera wczesne, funkcjonalne implementacje bibliotek do implementowania przypadków użycia multimediów, w tym:

  • ExoPlayer, odtwarzacz multimedialny na poziomie aplikacji na Androida, który można łatwo dostosowywać i rozszerzać.
  • funkcje sesji multimedialnej do wyświetlania odtwarzania i sterowania nim; Ten nowy moduł sesji używa tego samego interfejsu Player co ExoPlayer.
  • Komponenty interfejsu do tworzenia interfejsów odtwarzania multimediów.
  • Moduły opakowujące funkcje w innych bibliotekach do użycia z ExoPlayerem, np. wstawianie reklam za pomocą pakietu IMA SDK.

Więcej informacji znajdziesz w projekcie Media3 na GitHubie.

ExoPlayer był wcześniej hostowany w osobnym projekcie ExoPlayer na GitHubie. W Media3 nazwa pakietu to androidx.media3.exoplayer. Planujemy przez jakiś czas utrzymywać i publikować projekt ExoPlayer na GitHubie, aby dać aplikacjom czas na przejście na Media3. Media3 zawiera zamienniki wszystkich modułów ExoPlayer z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session. Zapewnia to bezpośrednią integrację odtwarzaczy i sesji multimedialnych bez konieczności używania klasy adaptera/konektora.