Media3

Biblioteki pomocy w przypadku zastosowań multimedialnych.
Najnowsza aktualizacja Wersja stabilna Wersja kandydująca do publikacji Wersja beta Wersja alfa
24 czerwca 2026 r. 1.10.1 - - 1.11.0-alpha01

Deklarowanie zależności

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

Dodaj zależności dotyczące potrzebnych artefaktów w pliku build.gradle aplikacji lub modułu:

Odlotowe

dependencies {
    def media3_version = "1.10.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.10.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 do śledzenia problemów z Media3, aby znaleźć odpowiedzi na pytania, poznać znane problemy i prośby o funkcje oraz zgłaszać nowe problemy.

Wersja 1.11.0

1.11.0-alpha01

  • 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 język Kotlin z wersji 2.0.20 do 2.2.0.
  • ExoPlayer:
    • Naprawiliśmy błąd współbieżności zależny od czasu, który mógł powodować błędy IllegalStateException lub IndexOutOfBoundsException w ExoPlayerze.
    • Zrelaksuj sprawdzanie 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 resetowania.
    • 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.
    • Dodaj getFlags()FLAG_STRICT_DURATION do SampleStream, aby umożliwić strumieniom zgłaszanie oznaczeń, i zaktualizuj moduły renderujące, aby dynamicznie sprawdzać te oznaczenia.
    • W przypadku, gdy formaty strumienia nie podają prawidłowej wartości, użyj estymatora liczby klatek w MediaCodecVideoRenderer i formatu wyjściowego kodeka w MediaCodecAudioRenderer, aby obliczyć szybkość działania kodeka, i unikaj niepotrzebnych resetów kodeka.
    • Usuwanie przycinania treści w przypadku reklam wstawianych po stronie klienta w głównym odtwarzaczu. Zamiast tego AdsMediaSource zajmuje się logiką wycinania. Niestandardowe źródła reklam wstawianych po stronie klienta wymagają aktualizacji, aby wewnętrznie implementować przycinanie treści.
    • Oznaczaj ścieżki z prawidłowym, ale nierozpoznanym profilem lub poziomem kodeka jako supported=NO_EXCEEDS_CAPABILITIES zamiast supported=YES (w ten sposób oznaczane są ścieżki z brakującymi lub nieprawidłowymi informacjami o profilu lub poziomie). Dzięki temu te ścieżki (które prawdopodobnie nie są obsługiwane przez urządzenie) nie będą 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 wstawić za pomocą nowego konstruktora obiektu DefaultPreloadManager.Builder.
    • Zmniejsz ryzyko błędu braku pamięci (OOM) w przypadku DefaultLoadControl.prioritizeTimeOverSizeThresholds, wracając do limitów rozmiaru bufora w bajtach, jeśli dostępna pamięć sterty wydaje się niewystarczająca.
    • Ujednolicenie obsługi obrazów statycznych, gdy parametr MediaItem.imageDurationUs nie jest ustawiony: obrazy statyczne 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) do pionu BandwidthMeter do MediaSource. Wycofana metoda z niestandardową implementacją będzie nadal wywoływana domyślnie, ale zalecamy wdrożenie nowej metody i użycie BandwidthMeter.getTransferListener(), aby uzyskać równoważność ze starą metodą.
    • DefaultBandwidthMeter dodaj obsługę niestandardowegoInitialBitrateSupplier. Umożliwia to aplikacjom dostarczanie własnej logiki do określania początkowego szacunkowego bitrate’u, który będzie używany podczas tworzenia DefaultBandwidthMeter i przy zmianach typu sieci. Dostawcę można ustawić za pomocą parametru DefaultBandwidthMeter.Builder.setInitialBitrateSupplier().
    • Domyślnie włącz dynamiczne planowanie. ExoPlayer pętla odtwarzania będzie działać dynamicznie, a nie w statycznym odstępie czasu.
    • Usuń niepotrzebne resetowanie, które może wystąpić podczas łączenia ścieżek z próbkami reklamy przed filmem z aktywnym odtwarzaniem.
    • DefaultBandwidthMeter zoptymalizujgetInitialBitrateCountryGroupAssignment zwracanie przypisań grup krajów spakowanych w 32-bitową liczbę całkowitą zamiast w tablicę, co zmniejszy rozmiar kodu i uniknie alokacji.
    • Naprawiono błędy inicjowania AudioTrack na niektórych urządzeniach, zapewniając, że logika ponawiania zawsze próbuje użyć minimalnego rozmiaru bufora wynoszącego 1 sekundę, jeśli inne ponowienia (przez zmniejszenie rozmiaru bufora o połowę) nie powiodą się (#3207).
    • Rozwiązanie problemu z kodekiem na niektórych urządzeniach, który powodował, że kodek odrzucał wszystkie próbki, jeśli wcześniej opróżniono bufor przed otrzymaniem buforów wejściowych.
    • Dodaj eksperymentalny parametr ExoPlayer.Builder.enablePerStreamMediaProgression(), aby umożliwić zaawansowane przetwarzanie multimediów w przypadku poszczególnych strumieni. Pozwala to zmniejszyć opóźnienie uruchamiania 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żywaniem identyfikatora sesji audio, w którym zamiast wartości ustawionej przez setAudioSessionId używany byłby identyfikator sesji audio wygenerowany automatycznie przez ExoPlayer (#3241).
    • Dodano eksperymentalną obsługę odtwarzania metadanych czasowych HAGC (ST 2094-50) w przypadku mediów progresywnych (np. MP4, Matroska). Odtwarzacz automatycznie łączy ścieżki metadanych HAGC z powiązaną ścieżką wideo i dostarcza metadane poza pasmem do dekodera na urządzeniach z interfejsem API w wersji 37 lub nowszej. To działanie można wyłączyć w sekcji DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false).
  • CompositionPlayer:
    • Rozwiązaliśmy problem polegający na tym, że instancje TrackSelector nie były zwalniane.
  • Transformer:
    • Rozwiązaliśmy problem, w którym wartość ExportResult.fileSizeBytes mogła być zawyżona.
  • Wybór ścieżki:
    • Udostępnij BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR i dodaj AdaptiveTrackSelection.Factory.setTrackFormatComparator, aby umożliwić niestandardowe kolejkowanie formatów i priorytet wyboru ABR poza kolejkowaniem opartym tylko na szybkości transmisji.
  • Ekstraktory:
    • MP4, MP3 i FLAC: dodano FLAG_DISABLE_ARTWORK_METADATA, aby umożliwić odrzucanie dołączonych zdjęć i metadanych okładki podczas analizowania kontenera w celu zmniejszenia zużycia pamięci w czasie działania (#2077). Możesz też włączyć tę funkcję centralnie za pomocą DefaultExtractorsFactory.setDisableArtworkMetadata.
    • MP4: dodaliśmy obsługę wyodrębniania ścieżek metadanych czasowych ITU-T T.35 (it35).
    • MP4: dodaliśmy obsługę wyodrębniania metadanych rozdziałów (w formatach Nero i QuickTime). Jeśli oba są obecne, preferowane są rozdziały QuickTime. Wyodrębnione informacje o rozdziałach są udostępniane jako wpisy w Chapterścieżce Metadata, 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 zmiennoprzecinkowego (#3090).
    • Matroska: używaj metadanych strumienia bitów kodeka, aby wypełnić dokładne ColorInfo.
    • MP4: dodaliśmy obsługę przewijania we fragmentowanych plikach MP4 za pomocą pola mfra, gdy nie ma pola sidx. Aby to włączyć, podaj FLAG_READ_MFRA_FOR_SEEK_MAP do FragmentedMp4Extractor, co jest teraz domyślnie wykonywane w DefaultExtractorsFactory (#3088).
    • Ignoruj dane av1C z nieobsługiwaną wersją.
    • MP4: dodano obsługę big endian zmiennoprzecinkowych PCM w polach fpcm.
    • Matroska: analizowanie informacji o rozdziałach w celu utworzenia Chapter wpisów w Metadata utworu.
    • MPEG-TS: ulepszono wyodrębnianie strumieni DTS-HD i DTS Express przez połączenie strumienia podstawowego i strumienia rozszerzającego w jedną próbkę, co rozwiązuje problemy z odtwarzaniem, które występowały, gdy były one wcześniej wyjściowe jako oddzielne próbki (#3147).
    • MP4: zapobieganie nieskończonym pętlom i odczytom spoza zakresu podczas analizowania pustych elementów tagu metadanychilst (#3191).
    • MPEG-TS: upewnij się, że ostatnia klatka jest renderowana w przypadku strumieni, w których ostatni pakiet PES ma znaną długość (#3206).
    • MP3: poprawiono raportowanie szybkości transmisji w przypadku plików z nagłówkami Xing i VBRI.
    • Matroska: obsługa ścieżek zdefiniowanych w ostatnim klastrze (#3250).
    • Matroska: dodano obsługę ALAC (#3268).
    • MP4: zezwalaj na pola o zmiennej długości w plikach MP4 podzielonych na fragmenty (#3243).sgpd
  • Dźwięk:
    • Dodano 100-milisekundowy okres przejściowy w programach renderujących dźwięk ExoPlayera podczas przechodzenia ze stanu gotowości do stanu niegotowości, aby zapobiec przejściowym niedoborom i uniknąć nieoczekiwanych stanów buforowania podczas aktywnej emisji (#3210).
    • Zmień domyślną logikę rozmiaru bufora PCM w DefaultAudioTrackBufferSizeProvider, aby używać stałego bufora 500 ms, co zmniejszy zależność od urządzenia.
    • Zaktualizuj MediaCodecAudioRenderer, aby wyodrębniać maskę kanału przestrzennego z dekodera platformy, co umożliwi DefaultAudioSink używanie tej maski zamiast wnioskowania jej na podstawie liczby kanałów.
    • Przekształć parametry AudioSink.configure w klasę danych. Niestandardowe zastąpienia funkcji ForwardingAudioSink.configure muszą zostać przeniesione do nowego podpisu metody.
    • Dodaliśmy obsługę zachowywania wysokości dźwięku podczas rozciągania w czasie strumienia audio za pomocą EditedMediaItem.Builder#setSpeed(SpeedParameters).
    • Ulepsz ToFloatPcmAudioProcessor, aby obsługiwać konwersję 8-bitowego PCM, 16-bitowego PCM w formacie big-endian i 64-bitowego PCM zmiennoprzecinkowego na 32-bitowy PCM zmiennoprzecinkowy (#3090).
    • Zmień wartość zwracaną funkcji DecoderAudioRenderer.getChannelMapping na ImmutableIntArray.
    • Usunięto błąd, który powodował zawieszanie się odtwarzania playlisty z bezprzerwowym dźwiękiem w trybie odciążania skompresowanego.
    • Przekaż identyfikator UID Timeline i okresu do AudioSink.configureAudioProcessor.StreamMetadata, aby zapewnić kontekst playlisty procesorom dźwięku (#418).
    • Ustaw prawidłową wartość AudioProcessor.StreamMetadata.positionOffsetUs, aby zezwolić na przetwarzanie dźwięku na podstawie czasu (#418).
    • Dodano obsługę 32-bitowych i 64-bitowych liczb zmiennoprzecinkowych PCM w formacie big endian.
  • Film:
    • Poprawiliśmy logikę dołączania do filmu, aby buforowane dane pominięte podczas dołączania były liczone jako pominięte, a nie utracone.
    • Naprawiono natychmiastowe renderowanie po ustawieniu nowej powierzchni, aby uniknąć utraty klatek na urządzeniach, które nie obsługują powierzchni zastępczych.
    • Poprawiliśmy szacowanie liczby klatek na sekundę 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. Domyślna wartość to 50 ms, ale można ją dostosować za pomocą parametru MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold().
  • Tekst:
    • TTML: powrót do displayAlign z style w przypadku regionów (#2559).
    • TTML: dziedziczenie czasu rozpoczęcia napisów 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.
    • Analizowanie numeru i liczby dysków z ramki ID3 TPOS.
  • Skutek:
    • Wyczyść stan ponownego rysowania w FinalShaderProgramWrapper podczas opróżniania bufora, aby zapobiec zawieszaniu się odtwarzacza podczas przewijania.
  • Muxers:
    • Dodanie obsługi odwołań do ścieżek (pola tref) w Mp4Muxer za pomocą nowego interfejsu addTrackReference API. Umożliwia to tworzenie relacji między ścieżkami, np. łą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 PCM w formacie liczb całkowitych i reprezentacji zmiennoprzecinkowej).
    • Dodaj setAttemptStreamableOutputEnabled do InAppMp4Muxer.Factory, aby umożliwić zapisywanie mniejszych plików, których nie można przesyłać strumieniowo, bez zarezerwowanego miejsca.
    • Dodaliśmy obsługę dźwięku IAMF w elementach Mp4MuxerFragmentedMp4Muxer.
  • Rozszerzenie IMA:
    • Dodaj ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot , aby umożliwić udostępnianie boksu reklamowego na potrzeby reklam w trakcie pauzy.
    • Naprawiono błąd, w którym przy wyświetlaniu kolejnych reklam VAST możliwych do pominięcia przycisk pominięcia pojawiał się od razu przy drugiej reklamie (#3165).
  • Sesja:
    • Naprawiono potencjalne zakleszczenia i IllegalStateException awarie wewnątrzMediaNotificationManager podczas korzystania z sesji z wątkiem w tle odtwarzacza.
    • 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) jawnie zgłaszają wyjątek IllegalStateException, jeśli są wywoływane z wątku innego niż pętla aplikacji.
    • Naprawiono awarię podczas scalania osi czasu poza zakresem (IllegalStateExceptionMediaUtils.mergePlayerInfo) przez śledzenie spójności stanu na poziomie kontrolera po stronie sesji.
    • Dodano androidx.media3.session.MediaSessionManager, aby umożliwić wysyłanie zapytań o aktywne sesje multimedialne i zwracanie instancji SessionToken Media3.
    • Zmień domyślne działanie funkcji MediaSession.Callback.onConnect, jeśli metoda nie jest zastąpiona, aby zapewnić dostęp do odczytu tylko niezaufanym kontrolerom.
    • Dodano obsługę zastępowania nazwy pakietu podczas tworzenia aplikacji MediaSession za pomocą nowego interfejsu API MediaSession.Builder#setPackageNameOverride. Osoba dzwoniąca musi mieć android.permission.OVERRIDE_MEDIA_SESSION_OWNER uprawnienia do zastąpienia nazwy pakietu sesji.
    • Dodaj MediaSession.Callback.onConnectAsync(). Nowa metoda umożliwia asynchroniczne przetwarzanie próby połączenia kontrolera. Aplikacje mogą zwracać natychmiastową wartość Future z wartością Futures.immediateFuture(ConnectionResult), aby uzyskać poprzednie zachowanie. Zalecamy przejście na nową metodę, ponieważ funkcja Callback.onConnect może zostać wycofana.
    • Rozwiązaliśmy problem, który powodował, że przeglądanie AVRCP Bluetooth nie rozpoznawało znaku MediaLibraryService w przypadku interfejsów API 36 i 37.
  • UI:
    • Naprawiono renderowanie pierwszej klatki w nieprawidłowym rozmiarze, gdy element ContentFrame jest ponownie komponowany w trakcie odtwarzania (#3238).
    • Dodaj klasę CurrentMediaItemState i odpowiedni komponent rememberCurrentMediaItemState do modułu media3-ui-compose. Ta zmienna stanu jest używana w demo-compose do wyświetlania różnych informacji o metadanych aktualnie odtwarzanego MediaItem.
    • Dodaj klasę PlaylistState i odpowiedni komponent rememberPlaylistState Composable do modułu media3-ui-compose. Ta zmienna stanu jest używana w demo-compose do wyświetlania różnych informacji o metadanychMediaItems ustawionych w odtwarzaczu.
    • Dodano interfejs API przewijania do przodu i zwolnionego tempa do PlaybackSpeedState. Użyj tej funkcji w demo-compose, aby zademonstrować przewijanie do przodu za pomocą długiego naciśnięcia.
    • Dodaj funkcję MiniController do modułu media3-ui-compose-material3. Zapewnia kompaktowy interfejs do sterowania Player, wyświetlając jednocześnie tytuł, wykonawcę, okładkę i postęp odtwarzania bieżącego elementu multimedialnego.
    • Dodaj klasę ErrorState i odpowiedni komponent rememberErrorState Composable do modułu media3-ui-compose. Dodaj komponent ErrorText do media3-ui-compose-material3 i ustaw go jako domyślną nakładkę na Player.
    • Opublikuj obiekt PlayerDefaults z funkcjami kompozycyjnymi dla TopControls, CenterControls, BottomControlsErrorOverlay.
    • Dodaj FocusRequester do Player elementu kompozycyjnego i jego miejsc na treści.
    • Opublikuj PlayerPool (common-ktx) i rememberPooledPlayer (ui-compose), aby obsługiwać wstępne wczytywanie MediaItems w środowiskach interfejsu użytkownika z oknem przesuwnym. Zaprezentuj tę funkcję w demo-compose za pomocą nowego ShortFormPlayerScreen.
  • Rozszerzenie Ktor:
    • Dodaj nowy moduł rozszerzenia media3-datasource-ktor, który zapewnia KtorDataSource oparty na stosie HTTP Ktor.
  • Rozszerzenie HLS:
    • Dodano obsługę kierowania treści HLS i klonowania ścieżek (#1689).
    • Dodaj setWithAssetListReset do HlsInterstitialsAdsLoader, aby umożliwić aplikacjom przywracanie w przypadku pełnego przetworzenia list zasobów do stanu niedostępności w przypadku reklam pełnoekranowych, co umożliwi ponowne rozwiązywanie na żądanie.
  • Rozszerzenie DASH:
    • Rozdziel napisy CEA na różne TrackGroup na podstawie języka (#3113).
  • Rozszerzenie RTSP:
    • Rozwiązaliśmy problem z przejściowymi przerwami lub niepowodzeniami odtwarzania podczas przygotowywania odtwarzania RTSP spowodowanymi błędami wiązania portu UDP.
  • Rozszerzenie Cast:
    • Dodaj nową klasę CastParams, aby umożliwić konfigurację przesyłania przez wywołanieCast.initialize(CastParams).
    • Dodano nową opcję CastParams.getShowSystemOutputSwitcherOnCastIconClick(), która w razie dostępności powoduje użycie przełącznika wyjścia interfejsu SystemUI zamiast selektora urządzeń przesyłających w aplikacji.
  • Narzędzia testowe:
    • Rozwiń DataSourceContractTest, aby uwzględnić obsługę żądań POST z nagłówkami i treściami, dodaj do HttpDataSourceTestEnv kilka zasobów POST i dodaj w WebServerDispatcher asercje dotyczące oczekiwanej metody HTTP, nagłówków i treści.
    • Zaostrzenie asercji w DataSourceContractTest w przypadku długości zwracanych z DataSource.open(). Zasoby, które mogą powodować C.LENGTH_UNSET, powinny wskazywać na to za pomocą TestResource.Builder.setMayResolveToUnknownLength(boolean).
  • Usuń wycofane symbole:
    • Usuń androidx.media3.exoplayer.MetadataRetriever. Zamiast niej używaj zasady androidx.media3.inspector.MetadataRetriever.
    • Usuń androidx.media3.exoplayer.MediaExtractorCompat. Zamiast niej używaj zasady androidx.media3.inspector.MediaExtractorCompat.
    • Usuń Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA. Użyj HeifExtractor do wyodrębniania metadanych zdjęć ruchomych z plików HEIC zamiast tego.
    • Usuń androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata. Zamiast niej używaj zasady androidx.media3.extractor.metadata.MotionPhotoMetadata.
    • Usuń androidx.media3.extractor.DummyTrackOutput. Zamiast niej używaj zasady androidx.media3.extractor.DiscardingTrackOutput.
    • Usuń androidx.media3.extractor.DummyExtractorOutput. Zamiast niej używaj zasady androidx.media3.extractor.NoOpExtractorOutput.
  • Budowanie
    • Zaktualizowaliśmy instrukcje README.md dotyczące lokalnego korzystania z Media3, aby używać kompilacji złożonych Gradle (includeBuild). Skrypt core_settings.gradle został usunięty, a właściwości androidxMediaModulePrefixandroidxMediaEnableMidiModule nie są już używane.

Wersja 1.10.0

1.10.1

12 maja 2026 r.

  • Biblioteka wspólna:
    • Naprawiono obsługę onAudioSessionIdChangedSimpleBasePlayerForwardingSimpleBasePlayer.
  • 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).
    • Rozwiązano problem z możliwymi awariami aplikacji podczas przywracania po błędach dekodera w przypadku wstępnego rozgrzewania renderera.
    • Rozwiązano problem z artefaktami wideo spowodowanymi dostarczaniem danych inicjujących podczas korzystania z kodeka Dolby Vision opartego na AV1 (#3153).
  • Wybór ścieżki:
    • Dostosuj logikę wyboru ścieżki w VideoTrackInfo, aby rozwiązać problem z zastępczymi typami MIME i przenieść preferencje dotyczące HDR i oceny kodeka do preferencji jakości (#3135).
  • Ekstraktory:
    • MP3: ignorowanie długości danych Xing, jeśli jest dłuższa niż znana długość strumienia (#3117).
    • Naprawiono ArrayIndexOutOfBoundsException w Mp4Extractor, gdy ustawiono FLAG_OMIT_TRACK_SAMPLE_TABLE, a ścieżka nie zawiera próbki synchronizacji (stss).
  • Dźwięk:
    • Usunięto błąd, który mógł powodować nieprawidłowe kierowanie zdarzeń audio, jeśli do odtwarzacza dodano wiele modułów renderowania dźwięku.
  • Film:
    • Dostosowaliśmy logikę ponownego wykorzystania kodeka przy zmianach liczby klatek na sekundę w interfejsie API poniżej 30, aby uniknąć resetowania kodeka w sytuacjach, w których nie jest to korzystne (#3120).
    • Wyłączyliśmy obejście wymuszonej synchronizacji w queueSecureInputBuffer w przypadku interfejsu API w wersji 31 lub nowszej. Obejściem był sztuczny wąskie gardło, które wymuszało seryjne odszyfrowywanie, co zapobiegało zniekształceniu obrazu wideo z powodu problemu z platformą występującego przed interfejsem API w wersji 31.
  • Obraz:
    • Rozwiązano problem w trybie przewijania, który powodował, że aktualizacje obrazu były wprowadzane tylko wtedy, gdy użytkownik „przestał przewijać” (#2815).
  • Sesja:
    • Rozwiązaliśmy problem, który powodował, że w przypadku, gdy wątek aplikacji nie był wątkiem głównym, wartość ForegroundServiceStartNotAllowedException nie była propagowana między granicami wątków (#2499).
    • Naprawiono błąd, w którym COMMAND_SEEK_TO_MEDIA_ITEM nie jest dostępny w MediaController podczas łączenia się z sesją tylko na platformie, która obsługuje wyszukiwanie innych elementów, ale nie modyfikacje playlisty.
    • Rozwiązaliśmy problem, który uniemożliwiał MediaController ustawianie elementów multimedialnych w sesjach multimedialnych na platformie, które nie zezwalają na działania PREPARE_FROM.
    • Naprawiono błąd, w którym własny proces nie był oznaczony symbolem Controller.isTrusted() na API 27 lub starszym podczas łączenia za pomocą kontrolerów platformy.
  • Rozszerzenie HLS:
    • Usunęliśmy błąd, w którym podczas powrotu do strumienia rezerwowego w przypadku, gdy wybór ścieżki jest podzbiorem dostępnych ścieżek, zgłaszany jest wyjątek ArrayIndexOutOfBoundsException (#3161).
    • Rozwiązaliśmy problem, który powodował, że segment inicjujący nie był przenoszony między aktualizacjami listy odtwarzania multimediów, jeśli tag #EXT-X-MAP nie był powtarzany w kolejnych aktualizacjach (#3105).
  • Rozszerzenie DASH:
    • Naprawiono awarię w SampleQueue podczas przewijania do fragmentu, który jest obecnie anulowany.

1.10.0

26 marca 2026 r.

  • Biblioteka wspólna:
    • Promuj wersje Player.mute()Player.unmute()UnstableApi do stabilnej.
    • Promuj wersje Format.pcmEncodingC.PcmEncodingUnstableApi do stabilnej.
    • Dodaj Format.primaryTrackGroupId, aby zidentyfikować główną grupę osadzonych instancji Format (#294).
  • ExoPlayer:
    • Dodaj funkcje wycinania do AdsMediaSource.
    • Dodaliśmy obsługę dynamicznego planowania w MediaCodecVideoRenderer, aby lepiej dopasować planowanie pracy i cykle wybudzania procesora do momentów, w których można przetwarzać klatki wideo. Możesz to zrobić za pomocą experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() w DefaultRenderersFactory.
    • Zezwalaj na ustawianie niestandardowego DataSource.FactoryDefaultPreloadManager.Builder.
    • Zezwól na wyśmiewanie ExoPlayer bez Robolectric, przenosząc niektóre stałe domyślne do ExoPlayer.Builder. Mockowanie tego złożonego interfejsu nie jest zwykle zalecane – tylko wtedy, gdy jego użycie jest minimalne, proste lub przypadkowe (#2985).
      • Wymagało to przeniesienia DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MSExoPlayer do ExoPlayer.Builder (bez wycofywania).
    • Naprawiliśmy błąd, który powodował, że ProgressiveMediaSource przekazywał do odtwarzacza 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óźnionej aktywności audio, gdy odtwarzanie było żądane podczas połączeń telefonicznych.
    • Naprawiono błąd, w którym przejścia z treści na żądanie do treści na żywo mogły powodować ponowne buforowanie na końcu treści na żądanie (#3052).
    • Dodano obsługę profilu Dolby Vision 10 (#2830).
    • Naprawiono błąd, w którym niezainicjowana reklama przed filmem powodowała wystąpienie błędu ArrayIndexOutOfBoundsException (#3125).
  • CompositionPlayer:
    • Dodaliśmy obsługę EditedMediaItem.removeVideo.
  • Transformer:
    • EditedMediaItem.Builder.setFrameRate() może teraz ustawić maksymalną liczbę klatek wyjściowych dla filmu, co jest szczególnie przydatne podczas zwiększania szybkości multimediów za pomocą parametru setSpeed().
  • Wybór ścieżki:
    • Zmień sygnaturę funkcji DefaultTrackSelector.selectAllTracks, aby zawierała tablicę wyjściową jako parametr wstępnie wypełniony zastąpieniami ścieżek.
    • Rozwiązanie problemu polegającego na tym, że osadzone ścieżki metadanych są wybierane niezależnie od tego, czy odpowiednia ścieżka podstawowa jest wybrana (#294).
    • Stabilizuj opcje TrackSelectionParameters dla preferredVideoLanguages, preferredVideoLabels, preferredAudioLabels, preferredTextLabelsselectTextByDefault.
  • Ekstraktory:
    • MP4: obsługa plików z dużymi polami uuid przed innymi polami, np. moov (#3046).
    • MP4: dodaliśmy obsługę ścieżek Versatile Video Coding (VVC) w kontenerach MP4.
  • Inspektor:
    • Zmiana powodująca niezgodność: usunięcie FrameExtractor. Użytkownicy powinni teraz korzystać z nowego modułu :media3-inspector-frame i zaktualizować importy do androidx.media3.inspector.frame.FrameExtractor.
    • Wprowadź nowy moduł do wyodrębniania i przetwarzania dekodowanych klatek wideo.
  • Dźwięk:
    • Zmień podstawową bibliotekę dekodowania dla rozszerzenia dekodera IAMF z libiamf na iamf_tools.
    • Dekodowanie IAMF obsługuje wyjście binauralne za pomocą dekodera (w przypadku korzystania z rozszerzenia dekodera IAMF) lub przestrzennego dźwięku Androida.
    • Prawidłowe usuwanie obsługi AC4Profile22 i innych starszych profili podczas oceny obsługi dekodera AC-4 w scenariuszach motoryzacyjnych (#2609).
    • Ulepszono logikę ponawiania inicjowania AudioOutputDefaultAudioSink (#2905).
    • Podczas dekodowania IAMF spróbuj dopasować układ wyjściowy głośników (lub przestrzennego procesora dźwięku, jeśli ma to zastosowanie), zarówno za pomocą rozszerzenia IAMF, jak i dekoderów kodeków multimedialnych, obsługiwanych przez nowe pola i logikę w AudioCapabilities i AudioCapabilitiesReceiver.
    • Usunięto błąd, który powodował zawieszanie się odtwarzania playlisty z bezprzerwowym dźwiękiem w trybie odciążania skompresowanego.
  • Tekst:
    • VobSub: używaj poleceń sterujących SPU STARTSTOP, aby określać czas trwania wskazówki, zamiast zawsze ustawiać domyślnie 5 sekund (#2935).
  • Metadane:
    • Zwiększ domyślną liczbę modułów renderujących metadane do 4, aby uwzględnić wszystkie potencjalne ścieżki metadanych opublikowane przez warianty i wersje HLS (#3043).
  • Skutek:
    • Przenieś LottieOverlay do nowego modułu :media3-effect-lottie (co wiązało 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 polegający na tym, że typ MIME reklamy nie pasował do typu MIME podanego w zdarzeniu IMA LOADED. Poprawka mapuje teraz typ MIME reklamy za pomocą informacji o mediach reklamy podanych przez IMA.
    • Dodaj setEnableCustomTabs do ImaAdsLoaderImaServerSideAdInsertionMediaSource, aby umożliwić użytkownikom kontrolowanie, czy adresy URL kliknięć reklam są otwierane za pomocą kart niestandardowych.
    • Dodaj ImaAdTagUriBuilder, czyli klasę, która oferuje alternatywny sposób tworzenia adTagUri. Zawiera interfejs API setPreferredLinearOrientation. Jest to interfejs API w fazie testów alfa, który umożliwia ustawienie preferowanej orientacji reklam wideo typu linear. Jeśli chcesz dołączyć do grupy testów alfa, skontaktuj się z partnerem ds. kont.
  • Sesja:
    • Usunęliś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 MediaSessionServiceMediaLibraryService jako LifecycleService, co umożliwi dołączanie operacji uwzględniających cykl życia do cyklu życia usługi (#187).
    • Przestań obsługiwać polecenia zmiany głośności urządzenia z MediaControllerMediaBrowser w przypadku odtwarzania lokalnego. Aplikacje nie powinny zmieniać głośności urządzenia lokalnego. W razie potrzeby mogą w tym celu używać interfejsów API AudioManager.
    • Wykrywanie nieaktywnych instancji Intent, które uruchomiły usługę jako usługę na pierwszym planie. Zapobiega to zgłaszaniu przez system błędu ForegroundServiceDidNotStartInTimeException. Jest to zmiana powodująca niezgodność wsteczną w niestabilnym interfejsie API w przypadku aplikacji implementujących niestandardowy MediaNotification.Provider, ponieważ pojawiła się nowa wymagana metoda.
    • Dodano konstruktory instancji PendingIntent do użycia z widżetami ekranu głównego (#2933).
    • Dodano metody statyczne do tworzenia instancji Intent w przypadku widżetów ekranu głównego opartych na Compose (#2933).
    • Naprawiono błąd, w którym przejście elementu multimedialnego nie było zgłaszane do kontrolerów, gdy odtwarzanie przechodziło z danego indeksu elementu multimedialnego do innego z tym samym elementem multimedialnym z powodu przerwy „AUTO” i „SEEK” (#2997).
    • Rozwiązaliśmy problem polegający na tym, że obejście dotyczące umiejscowienia przycisku interfejsu systemu negatywnie wpływało na inne elementy interfejsu, takie jak Android Auto, lub na producentów, którzy nie potrzebowali tego obejścia (#3041).
    • Rozwiązaliśmy problem, który powodował, że dostęp do subskrypcji nie był synchronizowany (#3056).
    • Obejście błędu interfejsu SysUI w API 29, w którym grafika sesji multimedialnej o określonym rozmiarze może powodować awarię interfejsu SysUI i wymuszać ponowne uruchomienie urządzenia (#3118).
    • Naprawiono skalowanie ikony grafiki powiadomienia na Androidzie Q (#3084).
  • UI:
    • Dodaj element PlaybackSpeedControl Composable do media3-ui-compose, aby wyświetlać i modyfikować szybkość odtwarzania.
    • Dodaj element PlaybackSpeedToggleButtonComposablemedia3-ui-compose-material3, aby sterować szybkością odtwarzania.
    • Dodanie komponentu ProgressSlider Composable do media3-ui-compose-material3 w celu wyświetlania postępów odtwarzania i wykonywania przewijania za pomocą przeciągania i klikania (#2288).
    • Unikaj dużego bufora poza ekranem podczas animowania elementu PlayerControlView.
    • Dodaj element Player Composable do elementu media3-ui-compose-material3, który łączy ContentFrame z dostosowywanymi elementami sterującymi ułożonymi u góry, na środku i u 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 w przypadku reklam pełnoekranowych HLS (#2484).
    • Obsługuj atrybut QUERYPARAM z #EXT-X-DEFINE (#1854).
    • Zoptymalizowano parsowanie playlisty HLS przez buforowanie dopasowań wyrażeń regularnych (#3008).
    • Udostępnianie ścieżki metadanych ID3 (EMSG) w wersjach audio (#3043).
    • Zezwalaj na powrót do lokalizacji w przypadku napotkania błędów ładowania, jeśli dostępne są nadmiarowe strumienie z różnych lokalizacji (#1988).
    • Poprawiono działanie X-SNAP w przypadku reklam pełnoekranowych HLS, aby prawidłowo obliczać pozycję rozpoczęcia i wznowienia (#3013).
  • Rozszerzenie DASH:
    • Rozwiązaliśmy problem, który powodował, że ścieżki z niezgodnymi czasami rozpoczęcia segmentów powodowały opóźnienia lub brakujące próbki na początku odtwarzania (#3057).
    • Rozwiązaliśmy błąd polegający na tym, że sygnatury czasowe metadanych EMSG v0 w paśmie nie były ustawiane prawidłowo (#3024).
  • Rozszerzenie RTSP:
    • Naprawiliśmy regresję w strumieniowaniu H.264 i H.265, która powodowała nieprawidłowe parsowanie próbek z tej samej jednostki dostępu obejmującej wiele pakietów RTP. Powodowało to artefakty wizualne i uszkodzenia w filmie (#3121).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Dodanie obsługi menedżera interfejsu MPEG-H do rozszerzenia dekodera MPEG-H (#3066).
  • Rozszerzenie Cast:
    • Dodano metodę RemoteCastPlayer.Builder#setTrackSelector, która umożliwia implementację wyboru ścieżki w przypadku odtwarzania za pomocą Cast.
  • Usuń wycofane symbole:
    • Usuń ExperimentalFrameExtractor. Zamiast niej używaj zasady androidx.media3.inspector.frame.FrameExtractor.
    • Usuń ChannelMixingMatrix.create(). Zamiast niej używaj zasady ChannelMixingMatrix.createForConstantGain().
    • Usuń androidx.media3.extractor.metadata.flac.VorbisComment. Zamiast niej używaj 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 stabilnej wersji 1.10.0.

1.10.0-rc02

16 marca 2026 r.

Użyj stabilnej wersji 1.10.0.

1.10.0-rc01

10 marca 2026 r.

Użyj stabilnej wersji 1.10.0.

1.10.0-beta01

25 lutego 2026 r.

Użyj stabilnej wersji 1.10.0.

1.10.0-alpha01

6 lutego 2026 r.

Użyj stabilnej wersji 1.10.0.

Wersja 1.9.0

1.9.4

16 maja 2026 r.

Wersja 1.9.4 zawiera te zatwierdzenia.

  • Skutek:
    • Podczas przechodzenia z kontekstu bez powierzchni wyraźnie ustaw wartości GL_DRAW_BUFFERGL_READ_BUFFER.

1.9.3

16 marca 2026 r.

Wersja 1.9.3 zawiera te zatwierdzenia.

  • Dźwięk:
    • Usunięto błąd, który powodował zawieszanie się odtwarzania playlisty z bezprzerwowym dźwiękiem w trybie odciążania skompresowanego.

1.9.2

6 lutego 2026 r.

Wersja 1.9.2 zawiera te zatwierdzenia.

  • ExoPlayer:
    • Naprawiliśmy 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 umiejscowienia przycisku interfejsu systemu negatywnie wpływało na inne elementy interfejsu, takie jak Android Auto, lub na producentów, którzy nie potrzebowali tego obejścia (#3041).
  • Rozszerzenie Cast:
    • Usunęliśmy błąd, który powodował, że przenoszenie odtwarzania z Casta 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 godzinami w przesunięciu strefy czasowej (#2929).
  • ExoPlayer:
    • Zezwalaj na dynamiczne planowanie zwalniania interwału doSomeWork dopiero po rozpoczęciu odtwarzania dźwięku, aby zapewnić płynniejszą synchronizację audio i wideo na początku odtwarzania.
    • Naprawiono błąd w DefaultLoadErrorHandlingPolicy, który powodował, że FileNotFoundException i podobne typy wyjątków były ponawiane wielokrotnie.
    • Naprawiono błąd dynamicznego harmonogramowania polegający na tym, że obliczony czas następnego doSomeWork był błędnie skracany o czas, który upłynął od rozpoczęcia bieżącej iteracji doSomeWork. Mamy nadzieję, że dzięki temu wydłuży się czas bezczynności procesora i zmniejszy zużycie energii.
    • Rozwiązaliśmy problem, który powodował, że niektóre odtwarzania plików Dolby Vision kończyły się niepowodzeniem podczas próby użycia kodeka zastępczego AVC lub HEVC.
    • Naprawiono błąd, w wyniku którego po zakończeniu odtwarzania wciąż trwało wczytywanie, gdy usuwano aktualnie odtwarzany element z playlisty (#2873).
    • Unikaj wycieków MediaItem instancji podczas wielokrotnego używania ExoPlayer.replaceMediaItem na tym samym elemencie (#2993).
    • Zapobieganie potencjalnym błędom ANR spowodowanym przez zwalnianie blokad uśpienia w sytuacjach awaryjnych (#2979).
  • Ekstraktory:
    • MP3: Parse LAME ReplayGain data (#2840).
  • Dźwięk:
    • Prawidłowe usuwanie obsługi AC4Profile22 i innych starszych profili podczas oceny obsługi dekodera AC-4 w scenariuszach motoryzacyjnych (#2609).
  • Film:
    • Odrzucanie kodeków wideo na urządzeniach z interfejsem API w wersji starszej niż 30, gdy zmienia się liczba klatek na sekundę, aby uniknąć zacinania się odtwarzania (#2941).
  • Tekst:
    • VobSub: naprawiono brakujące napisy przez prawidłowe obsługiwanie jednostek SPU, które zawierają tylko jedną sekwencję sterującą lub mają krytyczne informacje podzielone na kilka sekwencji sterujących (#2935).
  • Rozszerzenie IMA:
    • Poprawka: rozwiązano problem polegający na tym, że typ MIME reklamy nie pasował do typu MIME podanego w zdarzeniu IMA LOADED. Poprawka mapuje teraz typ MIME reklamy za pomocą indeksu bloku reklamowego i pozycji reklamy.
    • Przed uzyskaniem dostępu do wyniku getAdsManager()AdEvent.getAd() dodaj sprawdzanie wartości null.
  • Sesja:
    • Naprawiliśmy błąd, który powodował awarię aplikacji, gdy zatrzymywano sesję MediaController połączoną z platformą, jeśli zatrzymanie następowało podczas odtwarzania reklamy (#2948).
    • Dodaj dodatkowe weryfikacje instancji extras Bundle w różnych klasach, aby chronić się przed nieprawidłowo sformułowanymi instancjami Bundle wysyłanymi z innych procesów.
    • Rozwiązanie problemu polegającego na tym, że brakujące polecenia dla COMMAND_SEEK_NEXT lub COMMAND_SEEK_BACK mogą powodować luki w powiadomieniu systemowym o multimediach (#2976).
    • Przeniesienie skalowania mapy bitowej dla ikony powiadomienia poza główny wątek (#2829).
    • Rozwiązanie problemu polegającego na tym, że autor, pisarz i kompozytor nie byli używani jako rezerwa podczas konwersji ze starszych formatów MediaMetadataCompatMediaDescriptionCompat (#3018).
  • Pobrane:
    • Naprawianie potencjalnych nieskończonych pętli, gdy PriorityTooLowException jest obsługiwany przez SegmentDownloader (w przypadku DASH, HLS i SmoothStreaming). Niestandardowe zastąpienia SegmentDownloader za pomocą chronionej metody execute muszą zawierać zadanie w obiekcie Supplier, aby można było je odtworzyć (#2931).
  • Rozszerzenie HLS:
    • Przekaż dokument JSON z listą nieprzetworzonych zasobów do wywołania zwrotnego Listener.onAssetListLoadCompleted. Jest to zmiana powodująca niezgodność wsteczną w niestabilnym interfejsie API, która wymaga od aplikacji implementujących to wywołanie zwrotne dodania dodatkowego argumentu typu JSONObject (#2950).
  • Rozszerzenie RTSP:
    • Prawidłowe przetwarzanie pakietów RTP z sygnaturami czasowymi, które się zawijają (#2930).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Naprawiono potencjalne NullPointerException, które mogą wystąpić podczas przewijania przed przetworzeniem pierwszej klatki filmu (#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:
    • Zaktualizuj 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()void unmute(), które zachowują, a następnie przywracają głośność odtwarzacza przed i po ustawieniu jej na zero.
    • Opublikowano klasy narzędziowe WakeLockManager, WifiLockManager,AudioFocusManager, AudioBecomingNoisyManagerStuckPlayerDetector, które były wcześniej używane wewnętrznie przez ExoPlayer, aby umożliwić ponowne wykorzystanie przez innych graczy (#1893).
    • Naprawiono obsługę słuchaczy ForwardingPlayer, gdy podstawowy odtwarzacz delegowany używa porównania referencyjnego do porównywania instancji słuchaczy (#2675).
    • Dodaj w bibliotece media3-common-ktx funkcję zawieszania rozszerzenia Player.listenTo, która określa konkretny Player.Events, na którym ma zostać wykonana akcja.
    • Naprawiono błąd w BasePlayer.getBufferedPercentage spowodowany przepełnieniem liczby całkowitej, gdy zgłoszona pozycja buforowana jest nieprawdopodobnie większa niż zgłoszony czas trwania (#2750).
    • Naprawiono automatyczne wykrywanie TrackGroup typu ścieżki przez nieignorowanie niestandardowego typu MIME próbki i powracanie do używania potencjalnie nieprawidłowego typu ścieżki z typu MIME kontenera (#2860).
  • ExoPlayer:
    • Dodaj wykrywanie zablokowanego odtwarzacza, które w przypadku zablokowania odtwarzacza wywołuje StuckPlayerExceptionbłąd odtwarzacza. Dzieje się tak w tych przypadkach, przy czym każdy domyślny limit czasu można w razie potrzeby skonfigurować w ExoPlayer.Builder:
      • Po 10 minutach STATE_BUFFERING podczas próby odtwarzania bez buforowania.
      • Po 10 sekundach STATE_READY podczas próby odtwarzania i braku postępu odtwarzania.
      • Po minucie STATE_READY poza zadeklarowanym czasem trwania bez osiągnięcia końca elementu.
      • Po 10 minutach z powodem wstrzymania odtwarzania podczas próby odtworzenia.
    • Domyślnie włącz obsługę blokady uśpienia, aby rozwiązać problemy z buforowaniem podczas odtwarzania w tle. Jest to odpowiednik ustawienia wartości ExoPlayer.Builder.setWakeMode na C.WAKE_MODE_LOCAL.
    • Dodaj logikę nasłuchiwania, aby automatycznie aktualizować identyfikator urządzenia wirtualnego, gdy zmiana zostanie zgłoszona do Context pierwotnie przekazanego do ExoPlayer.Builder.
    • Dodaj ExoPlayer.setVirtualDeviceId, aby ręcznie zaktualizować identyfikator urządzenia wirtualnego uzyskany z Context przekazanego do ExoPlayer.Builder.
    • Upewnij się, że renderery nie pobierają danych z następnego elementu na liście odtwarzania na więcej niż 10 sekund przed końcem bieżącego elementu.
    • Dodaj setSeekBackIncrementMs, setSeekForwardIncrementMssetMaxSeekToPreviousPositionMs do ExoPlayer, aby zaktualizować te ustawienia po utworzeniu (#2736).
    • Dodano 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 zapisany w pamięci podręcznej.
    • Użyj funkcji wstępnego buforowania DefaultPreloadManager w krótkiej aplikacji w wersji demonstracyjnej.
    • Dodaj ustawienia DefaultLoadControl.Builder dla odtwarzania lokalnego i dostosuj wartości domyślne DefaultLoadControl, aby dobrze współpracowały z szeroką gamą plików lokalnych.
    • Naprawiono błąd, w którym ustawienie pustej playlisty może pozostawić odtwarzacz w stanie STATE_READY lub STATE_BUFFERING.
    • Ulepsz interfejsy API menedżera wstępnego wczytywania:
      • Dodaj addMediaItems(List<MediaItem>, List<T>)addMediaSources(List<MediaSource>, List<T>), które dodają elementy multimedialne lub źródła multimediów w partiach, a następnie automatycznie wywołują invalidate().
      • Dodaj funkcje removeMediaItems((List<MediaItem>)removeMediaSources(List<MediaSource>), które usuwają elementy multimedialne lub źródła multimediów w partiach, i upewnij się, że menedżer wstępnego wczytywania nie rozpoczyna ani nie kontynuuje wstępnego wczytywania żadnego z nich po usunięciu.
      • Zezwól na automatyczne unieważnianie DefaultPreloadManager.setCurrentPlayingIndex(int). Po zaktualizowaniu bieżącego indeksu odtwarzania aplikacje nie muszą już jawnie wywoływać invalidate().
    • Dodanie możliwości pomijania resetowania klatki kluczowej w przypadku przewijania do przodu w ramach tej samej grupy zdjęć w trybie przewijania.
    • Dodaj DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) w przypadku aplikacji, aby ustawić wartość docelowych bajtów bufora dla odtwarzacza z określonym playerName. DefaultLoadControl może teraz podejmować decyzje dotyczące każdego odtwarzacza osobno na podstawie przydzielonych mu bajtów i docelowych bajtów bufora.
    • Dodaj SkipInfo do AdPlaybackState.AdGroup, aby przekazywać informacje o możliwości pominięcia reklamy w przypadku każdej reklamy w grupie reklam.
    • Rozwiązaliśmy problem, który powodował awarię podczas wywoływania funkcji removeMediaItems(List) w trakcie odtwarzania reklamy po filmie (#2746).
    • Naprawiono problem z zacinaniem się podczas odtwarzania playlist, gdy ramki były błędnie ustawiane jako ostatnia próbka i renderowane.
    • Włącz ścieżkę ponawiania, jeśli odtwarzacz nie może wygenerować identyfikatora sesji audio (#2382, #2678).
    • Dodanie obsługi kontroli łącznej liczby bajtów bufora dla źródeł w DefaultPreloadManager, aby uniknąć dowolnego zwiększania łącznej liczby bajtów bufora na potrzeby wstępnego wczytywania. Aby użyć domyślnej logiki sterowania, aplikacje mogą ustawić docelową liczbę bajtów bufora do wstępnego wczytywania za pomocą DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) 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 wyszukiwania lub automatycznym przejściu (#2484).
    • Dodaj interfejs API do ustawiania i obserwowania parametrów kodeka dla ścieżek audio i wideo. Ta funkcja jest zaimplementowana w przypadku modułów renderujących opartych na MediaCodec i wymaga interfejsu API w wersji 29 lub nowszej.
      • Aby zastosować parametry, użyj właściwości ExoPlayer.setAudioCodecParameters()ExoPlayer.setVideoCodecParameters().
      • Użyj właściwości ExoPlayer.addAudioCodecParametersChangeListener()ExoPlayer.addVideoCodecParametersChangeListener(), aby nasłuchiwać zmian. Obserwowanie kluczy konkretnych dostawców wymaga interfejsu API w wersji 31 lub nowszej.
    • Naprawiono błąd IllegalStateException spowodowany ustawieniem pustego źródła multimediów po przesunięciu do pozycji innej niż zero, a następnie przygotowaniem odtwarzacza z niepustym źródłem multimediów.
    • Naprawiliśmy błąd, który powodował, że podczas przewijania w trybie przewijania do innych elementów multimedialnych mogło wystąpić IllegalStateException.
    • Rozwiązano potencjalny problem NullPointerExceptionDefaultPlaybackSessionManager (#2885).
    • Włącz ulepszenia w zakresie skuteczności przewijania w przypadku kwalifikujących się filmów.
    • Ponowne włączenie używania asynchronicznego odszyfrowywania w MediaCodec na API 36 lub nowszym, gdzie rozwiązano problemy z limitem czasu w tym interfejsie API platformy (#1641).
    • Zmień domyślną wartość parametru MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs na 15 ms i włącz bardziej efektywne pomijanie klatek wideo przed dekodowaniem w przypadku kwalifikujących się filmów.
    • Dodaj maksymalny limit pamięci do automatycznego obliczania pamięci w DefaultLoadControl. Powinno to mieć miejsce tylko wtedy, gdy zostanie wybrana nadmierna liczba ścieżek (#2860).
    • Naprawiono błąd, który powodował, że podczas odtwarzania w trybie playlisty lub trybie powtarzania przewijanie w trybie przewijania w pobliżu końca mogło spowodować przejście do następnego elementu multimedialnego.
  • CompositionPlayer:
    • Opublikuj CompositionPlayer pod nową adnotacją @ExperimentalApi, aby wskazać, że jest ona dostępna do eksperymentowania, ale nadal jest w fazie rozwoju. Niektóre interfejsy API prawdopodobnie ulegną znacznym zmianom w przyszłych wersjach. W przypadku niektórych przypadków użycia występują znane problemy i ograniczenia (niektóre nie są udokumentowane).
    • Dodaliśmy obsługę właściwości COMMAND_SET_AUDIO_ATTRIBUTES i zarządzania aktywnością audio w CompositionPlayer.
    • Dodaliśmy obsługę zmiany prędkości w sekwencjach dodatkowych w CompositionPlayer.
    • Dodaliśmy obsługę EditedMediaItem.removeVideo.
  • Transformer:
    • Używaj InAppMp4Muxer jako domyślnego multipleksera.
    • Dodano EditedMediaItem.Builder#setSpeed() i wycofano Effects#createExperimentalSpeedChangingEffects().
    • Zastąp forceAudioTrackforceVideoTrack ciągiem trackTypesEditedMediaItemSequence.
  • Wybór utworu:
    • Dodaj TrackSelectionParameters.selectTextByDefault, aby preferować wybór dowolnej ścieżki tekstowej bez określania innych, bardziej szczegółowych preferencji.
    • Dodaj preferredVideoLabels, preferredAudioLabels ipreferredTextLabels w TrackSelectionParameters, aby określić preferencje dotyczące ścieżek z konkretną etykietą, np. odczytanych z tagów HLS NAME (#1666).
  • Ekstraktory:
    • FLAC: poprawiliśmy wykrywanie nagłówków, aby zmniejszyć prawdopodobieństwo znalezienia fałszywych nagłówków w zakodowanych danych FLAC, co powodowało błędy dekodowania (#558).
    • MP3: zezwalaj na przerwy między tagami ID3 (i przed nimi) na początku plików MP3 (#811, #5718).
    • MP3: zwiększ limit sprawdzania do 128 KB, aby był zgodny z dotychczasowym limitem wyszukiwania bajtu synchronizacji (#2713).
    • MP3: zmiana FLAG_ENABLE_INDEX_SEEKING na preferowanie wyszukiwania informacji z nagłówków metadanych (takich jak Xing i VBRI), gdy są dostępne, z powrotem do wyszukiwania opartego na indeksie, jeśli nie ma innych informacji o wyszukiwaniu. Poprawia to wydajność w przypadku plików z metadanymi wyszukiwania (#2839).
    • MP3: zmiana Mp3Extractor na domyślne założenie stałej szybkości transmisji (CBR), gdy nie znaleziono metadanych wyszukiwania (np. Xing, VBRI), nawet jeśli ustawiono FLAG_ENABLE_INDEX_SEEKING. Wynika to z historii specyfikacji MP3, w której CBR był standardem, a VBR wymagał wyraźnych nagłówków. Zwiększa to możliwość natychmiastowego wyszukiwania plików bez metadanych kosztem potencjalnej dokładności w przypadku plików VBR bez nagłówków. Wyszukiwanie indeksu jest teraz używane jako rozwiązanie awaryjne, 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-L1audio/mpeg-L2, sprawdzając wartość warstwy pierwszej próbki przed wyemitowaniem formatu ścieżki z ekstraktora (#2683).
    • MP4: zwiększenie skuteczności wykrywania bardzo dużych plików przez założenie, że pole a stbl większe niż 1 MB oznacza, że plik nie może być podzielony na fragmenty (#2650).
    • MP4: dodano obsługę metadanych ©mvn (nazwa ruchu) i ©mvi (indeks ruchu), które są teraz emitowane jako obiekty TextInformationFrame w Format.metadata z identyfikatorami MVNM i MVIN (#2754).
    • MP4: ignoruj ścieżki, w których brakuje pola stsd (zamiast nie analizować całego pliku).
    • Matroska: dodano obsługę wykrywania DTS-HD (#6225).
    • Rozwiązaliśmy problem w MatroskaExtractor, który powodował, że w przypadku plików z wieloma ścieżkami przewijanie mogło być niedokładne. Punkty sygnałowe są teraz prawidłowo powiązane z odpowiednimi ścieżkami, co zapewnia precyzyjne przewijanie.
    • MPEG-TS: naprawiono IllegalArgumentException z ReorderingBufferQueue spowodowane przez pakiety PES bez sygnatury czasowej (#2764).
    • Dodano obsługę wyodrębniania zdjęć Live Photo w formacie HEIC. HeifExtractor może teraz analizować pliki HEIC zawierające osadzone ścieżki wideo i audio.
  • Inspektor:
    • Wprowadziliśmy nowy moduł :media3-inspector, który będzie służyć jako dedykowane miejsce na narzędzia do sprawdzania multimediów. Ten moduł zawiera teraz nowy androidx.media3.inspector.MetadataRetriever, który będzie udostępniać ujednolicony interfejs API do wyodrębniania metadanych i klatek. Istniejąca funkcja androidx.media3.exoplayer.MetadataRetriever została wycofana na rzecz tej nowej wersji.
    • Wprowadzono 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 ją utworzyć za pomocą Builder dla konkretnego MediaItem.
    • FrameExtractor: dodano getThumbnail(), aby wyodrębniać reprezentatywną klatkę miniatury z pliku multimedialnego bez konieczności podawania konkretnego znacznika czasu.
    • Dodaj androidx.media3.inspector.MediaExtractorCompat, czyli zamiennik android.media.MediaExtractor na platformie, który umożliwia wyodrębnianie z pliku multimedialnego nieprzetworzonych, zakodowanych próbek multimediów. Istniejąca klasa androidx.media3.exoplayer.MediaExtractorCompat została wycofana na rzecz tej nowej klasy.
  • Dźwięk:
    • Spraw, aby instancje AudioProcessor wiedziały o przewijaniu.
    • Zezwalaj na wstawianie nowego interfejsu AudioOutputProvider do DefaultAudioSink.Builder, aby obsługiwać niestandardowe ścieżki wyjścia audio. Wartość domyślna to AudioTrackAudioOutputProvider.
    • Obsługa przewijania w GainProcessor.
    • Sprawdź, czy format ścieżki obsługuje profil i poziom dekodera AC-4 (#2580).
    • Unikaj potencjalnych opóźnień spowodowanych obsługą wywołań zwrotnych zmiany routingu na początku odtwarzania (#2646).
    • Zezwalaj na ponowne użycie kodeka w przypadku formatów EAC3, EAC3-JOC i AC-4 (#1346).
    • Dodaliśmy obsługę próbek PCM zmiennoprzecinkowych w Sonic.
    • Dodano obsługę 16-bitowych próbek PCM w ToFloatPcmAudioProcessor.
  • Film:
    • Wyłącz ponowne użycie kodeka w przypadku treści Dolby Vision z różnymi profilami.
    • Ponowne włączenie obejścia problemu z nieprawidłowo raportowanymi punktami wydajności w przypadku bezpiecznych kodeków (#2856).
  • Tekst:
    • Naprawiono analizowanie napisów CEA-6/708 w treściach Dolby Vision (#2775).
  • Obraz:
    • Rozwiązanie problemu z trybem przewijania, w którym odtwarzacz zawieszał się podczas przewijania ścieżki miniatur DASH (#2815).
  • DRM:
    • Zmieniono typ zwracany metod MediaDrmCallbackbyte[] na nowy typ MediaDrmCallback.Response, aby umożliwić zwracanie dodatkowych informacji opcjonalnych. Jest to zmiana powodująca niezgodność na poziomie źródła, ale niezgodności można łatwo rozwiązać, opakowując poprzednią wartość zwracaną byte[] za pomocą new Response przed zwróceniem.
    • Dodaj do AnalyticsListener.onDrmKeysLoaded (#1001) informacje o żądaniu klucza, takie jak adres URL i opóźnienie.
    • Przenieś dane żądania obsługi administracyjnej z parametru adresu URL do treści żądania POST.
  • Skutek:
    • Dodaj Presentation.copyWithUnsetSideRoundedTo, aby zaokrąglić nieustawioną stronę wyjściową, gdy Presentation jest tworzony z jedną długością boku.
  • Muxers:
    • Dodaj MediaMuxerCompat, czyli zamiennik frameworka MediaMuxer.
    • Dodaj MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo(), aby zezwolić na tworzenie zdjęć w ruchu.
    • Dodaj WebmMuxer, aby umożliwić multipleksowanie strumieni multimediów OPUS, VORBIS, VP8VP9 do formatu pliku webm.
  • Rozszerzenie IMA:
    • Usunięcie niestandardowych reguł ProGuard, aby aplikacje mogły zamiast nich używać reguł opublikowanych w archiwum IMA na Androida.
    • Dodano ImaServerSideAdInsertionUriBuilder.setNetworkCode, nowy interfejs API do ustawiania kodu sieci Google Ad Managera 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 pełnej usługi. Aby znaleźć kod sieci, zapoznaj się z tym artykułem.
    • Zwiększono zależność IMA do wersji 3.37.0, co wymaga włączenia usuwania zbędnych elementów biblioteki podstawowej. Musi być też włączona w zależnych aplikacjach. Zapoznaj się z uwagami dotyczącymi konfiguracji IMA. * Obsługa niestandardowych opcji interfejsu IMA DAI w narzędziu do tworzenia adresów URI SSAI. Opcje niestandardowego interfejsu wstawiania reklam po stronie serwera obejmują obsługę renderowania reklam, które można pominąć, oraz funkcji „O tej reklamie”. Ta funkcja jest obecnie dostępna dla wybranych wydawców, którzy znajdują się na liście dozwolonych. Ta zmiana powoduje też uaktualnienie pakietu IMA SDK do wersji 3.38.0 (informacje o wersji), aby uzyskać dostęp do interfejsu API opcji niestandardowego interfejsu.
    • Rozwiązaliśmy problem, który powodował błędne zgłaszanie błędu przygotowania treści po reklamie jako błędu odtwarzania reklamy (#2656).
  • Sesja:
    • Dodaj nowy parametr do MediaSession.Callback.onPlaybackResumption, aby wskazać, czy wywołanie służy tylko do zbierania informacji, czy do rozpoczęcia odtwarzania (#1764).
    • Zaktualizuj MediaSession.ControllerInfo.isTrusted, aby deklarować kontrolery z własnej aplikacji jako zaufane (#2542).
    • Dodano MediaSessionService.triggerNotificationUpdate, aby ręcznie wywoływać aktualizację powiadomienia (#1833).
    • Dodaj ProgressListener do metod poleceń niestandardowych.
    • Zmień domyślną wartość parametru MediaLibrarySession.Builder.setLibraryErrorReplicationMode na non fatal.
    • Dodaj parametr Context do MediaButtonReceiver.onForegroundServiceStartNotAllowedException (#2625).
    • Odczytuj identyfikator kontroli głośności z platformy PlaybackInfo zamiast pobierać go za pomocą interfejsu Binder. Dzięki temu typ odtwarzania i identyfikator sterowania głośnością są odczytywane niepodzielnie i pasują do siebie.
    • Naprawiono błąd, który powodował, że kluczowe zdarzenia ACTION_UP były odfiltrowywane przed przekazaniem ich do wywołania zwrotnego w celu niestandardowej obsługi. Dzięki temu zachowamy spójność z działaniem funkcji media1 i platformy (#2637).
    • Usunęliśmy błąd, który powodował, że funkcja getCurrentTimeline() była wywoływana przez funkcję PlayerWrapper nawet wtedy, gdy polecenie było niedostępne (#2665).
    • Naprawiono błąd, który powodował pozostawienie wiadomości w kolejce wiadomości głównego loopera, co po zakończeniu działania usługi powodowało wyciek pamięci (#2692).
    • Po połączeniu ze starszą aplikacją sesji z 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.
    • Wdrożono 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 po nadejściu zdarzenia klawisza multimedialnego IntentonStartCommand(). Problem ten został rozwiązany przez obsługę kodu „KEYCODE_HEADSETHOOK” tak samo jak KEYCODE_MEDIA_PLAY_PAUSE (#2816).
    • Usunięto błąd, w którym rozmiar powierzchni nie był przekazywany między sesją a kontrolerem, co powodowało niepowodzenie zastosowania efektów wideo w sesji demonstracyjnej. Jeśli używasz kontrolera, może to być zmiana powodująca błędy, jeśli odtwarzacz nie obsługuje wywołania setVideoSurfaceHolder.
    • Naprawiono propagację wartości metadanych innych niż 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żliwia też określanie parametrów niektórych poleceń odtwarzacza i sesji, aby zdefiniować, które działanie ma zostać wywołane.
    • Dodano zgodność wsteczną w przypadku instancji CommandButton, które używają Player.Command lub niestandardowego elementu SessionCommand do określania działania. Są one teraz prawidłowo reprezentowane w sesjach multimedialnych platformy, np. w interfejsie systemu lub Androidzie Auto.
    • Rozwiązanie problemu polegającego na tym, że ten sam Bitmap jest kompresowany wielokrotnie podczas łączenia MediaController z sesją multimedialną platformy.
  • UI:
    • Dodaj klasę ProgressStateWithTickInterval i odpowiedni komponent rememberProgressStateWithTickInterval do modułu media3-ui-compose. Ten obiekt stanu jest używany w demo-composedo wyświetlania bieżącej pozycji i czasu trwania w formie tekstowej.
    • Dodaj do ui-compose element MuteButtonState, który obsługuje wyciszanie głośności Player. Ten obiekt stanu jest używany w demo-compose do wyświetlania przycisku przełączania wyciszania/wyłączania wyciszenia.
    • Dodaj klasy ProgressStateWithTickCount i odpowiadający im komponent rememberProgressStateWithTickCount do modułu media3-ui-compose. Ten obiekt stanu jest używany w demo-compose do wyświetlania postępu w postaci poziomego paska postępu tylko do odczytu.
    • Dodaj element ContentFrame Composable do elementu media3-ui-compose, który łączy PlayerSurface zarządzanie ze zmianą rozmiaru proporcji i zasłanianiem za pomocą migawki.
    • Obejście znanego błędu platformy API 34, który powoduje rozciąganie lub przycinanie filmów podczas używania elementu SurfaceView w funkcji kompozycyjnej Compose AndroidView, a tym samym wpływa na funkcje kompozycyjne ContentFramePlayerSurface z elementem SURFACE_TYPE_SURFACE_VIEW (#1237, #2811).
    • Utwórz nowy media3-ui-compose-material3 moduł i dodaj do niego komponenty kompozycyjne z motywem Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton).
    • Dodaj funkcję kompozycyjną TimeText do funkcji media3-ui-compose-material3, aby wyświetlać postępy gracza w formie tekstowej. Można go skonfigurować tak, aby wyświetlał bieżącą pozycję, czas trwania lub pozostały czas.
    • Dodaliśmy obsługę umieszczania przycisku trasy multimediów w PlayerView.
    • Użyj znaku BidiFormatter, aby prawidłowo wyświetlać znaki interpunkcyjne w napisach w językach zapisywanych od prawej do lewej (#11214).
  • Rozszerzenie HLS:
    • Analizuj atrybuty pomijania reklam pełnoekranowych HLS.
    • Mapuj atrybuty sterowania pomijaniem z listy odtwarzania HLS i dokumentu listy zasobów na AdPlaybackState w celu uzyskania dostępu publicznego.
    • Rozwiązaliśmy problem polegający na tym, że czas rozpoczęcia playlisty był pomijany, gdy z playlisty usuwano tag EXT-X-PROGRAM-START-DATE określający czas rozpoczęcia (#2760).
    • Używanie wyszukiwania binarnego do znajdowania indeksu segmentu w danej pozycji na liście odtwarzania (#2826).
    • Dodaj HlsInterstitialsAdsLoader.skipCurrentAd()skipCurrentAdGroup() oraz odpowiednie metody, aby pomijać reklamy i grupy reklam według indeksu.
    • Dodaj HlsInterstitialsAdsLoader.Listener.onAdStarted, aby zgłosić początek okresu wyświetlania reklamy (#2859).
    • Akceptuj spację jako separator daty i godziny w ciągach daty i godziny w formacie ISO 8601.
    • Prawidłowe pobieranie następnego fragmentu dla elementu HlsMediaPlaylist bez segmentów (#2821).
    • Używaj domyślnej pozycji początkowej w przypadku reklam przed filmem w transmisjach na żywo.
  • Rozszerzenie DASH:
    • Naprawiono UnsupportedOperationException podczas odtwarzania strumieni DASH z niehierarchicznym plikiem manifestu URI data: (#2688).
    • Zresetuj LiveConfiguration do wartości podanej przez MediaItem DashMediaSource po opublikowaniu i zaktualizowaniu elementu multimedialnego przez użytkownika (#2606).
    • Unikanie awarii spowodowanych nieprawidłowymi aktualizacjami pliku manifestu, które nie zostały zgłoszone jako błędy odtwarzacza (#2805).
  • Rozszerzenie RTSP:
    • Obsługa błędu braku pakietów RTP podczas przetwarzania podzielonych jednostek NAL dla H264 i H265 (#2613).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Rozszerzenie AV1: dekoder oprogramowania AV1 korzysta teraz z biblioteki dav1d o wysokiej wydajności, która zastępuje poprzednią implementację libgav1, co zwiększa szybkość dekodowania.
    • Rozszerzenie FFmpeg: rozwiązaliśmy problem, który uniemożliwiał odtwarzanie niektórych plików FLAC. Zapewniliśmy prawidłowe parsowanie bloku STREAMINFO i przekazywanie 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 za pomocą Cast, możesz użyć RemoteCastPlayer. Wcześniej istniejące konstruktory CastPlayer zachowują swoje stare działanie, ale są wycofywane na rzecz konstruktorów CastPlayer lub RemoteCastPlayer.
    • Przestań wymuszać typ MIME inny niż null w DefaultMediaItemConverter.
    • Użyj MediaItem.mediaMetadata.mediaType, aby wywnioskować typ multimediów Cast MEDIA_TYPE do użycia w DefaultCastOptionsProvider#toMediaQueueItem, jeśli jest dostępny.
    • Włącz przesyłanie z urządzenia zdalnego na lokalne w DefaultCastOptionsProvider.
    • Dodaj obsługę przesyłania w wersji demonstracyjnej sesji.
    • Dodano obsługę wyświetlania przycisku trasy multimediów w interfejsie Composable.
    • Dodano obsługę wyświetlania przycisku trasy multimediów w menu paska działań.
    • Dodaliśmy obsługę wyświetlania przycisku trasy multimediów jako interfejsu View.
  • Narzędzia testowe:
    • Dodaj maksymalną różnicę czasu dla automatycznego przełączania FakeClock. Domyślnie wynosi 1 sekundę, ale można ją skonfigurować za pomocą parametru FakeClock.Builder.
    • Dodaj maksymalną różnicę czasu między wiadomościami dla RobolectricUtil.runMainLooperUntil (i runLooperUntil). Domyślnie wynosi ona 1 sekundę, ale można ją 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. Zamiast niej używaj zasady DefaultPreloadManager.Builder.
    • Usunięto przestarzałe konstruktory EditedMediaItemSequence. Zamiast niej używaj zasady EditedMediaItemSequence.Builder.
    • Usuń BitmapFactoryImageDecoder.BitmapDecoder. Zamiast niej używaj zasady ExternallyLoadedImageDecoder.
    • Usuń wycofany element ShadowMediaCodecConfig.forAllSupportedMimeTypes(). Użyj w zamian zasady ShadowMediaCodecConfig.withAllDefaultSupportedCodecs().
    • Usuń wycofaneShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes(). Zamiast niej używaj zasady ShadowMediaCodecConfig.withNoDefaultSupportedCodecs().

1.9.0-rc01

1 grudnia 2025 r.

Używaj stabilnej wersji 1.9.0.

1.9.0-beta01

20 listopada 2025 r.

Używaj stabilnej wersji 1.9.0.

1.9.0-alpha01

22 października 2025 r.

Używaj stabilnej wersji 1.9.0.

Wersja 1.8.0

1.8.1

21 maja 2026 r.

Wersja 1.8.1 zawiera te zatwierdzenia.

  • Skutek:
    • Podczas przechodzenia z kontekstu bez powierzchni wyraźnie ustaw wartości GL_DRAW_BUFFERGL_READ_BUFFER.

Wersja 1.8.0

30 lipca 2025 r.

Wersja 1.8.0 zawiera te zatwierdzenia.

  • Biblioteka wspólna:
    • Dodaliśmy obsługę zastępowania odtwarzacza w elemencie ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Dodanie funkcji pobierającej tryb odtwarzania losowego do interfejsu ExoPlayer (#2522).
    • Wyraźniejsze zgłaszanie wyjątku, jeśli do DefaultAudioSink uzyskuje się dostęp z wielu wątków. Jeśli tak się stanie 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, która jest używana do odtwarzania (#1191).
    • Usunięto błąd, który powodował, że formaty dźwięku inne niż stereo na telewizorach mogły być oznaczane przez DefaultTrackSelector jako nieobsługiwane.
    • Sprawdź, czy ostatnia klatka jest prawidłowo renderowana podczas korzystania z flagi MediaCodecDECODE_ONLY (która jest domyślnie włączona w trybie przewijania).
    • Dodano obsługę używania identyfikatora urządzenia wirtualnego z Context przekazywanego do ExoPlayer.Builder.
    • Domyślnie włącz dynamiczne planowanie w trybie przewijania.
    • Unikaj niepotrzebnego ponownego wczytywania źródła podczas przewijania do końca elementu.
    • Domyślnie używaj MediaCodec.BUFFER_FLAG_DECODE_ONLY w trybie przewijania.
    • Wywołaj wyjątek IllegalStateException, gdy element PreloadMediaSource jest odtwarzany przez element ExoPlayer z wątkiem odtwarzania innym niż wątek wstępnego wczytywania (#2495).
    • Dodaj cloneAndMove do ShuffleMode z domyślnym wdrożeniem (#2226).
    • Zmień domyślne działanie funkcji Renderer.getMinDurationToProgressUs, aby zwracała większą wartość, jeśli nie jest wymagane wywołanie funkcji render.
    • Usunięto błąd polegający na tym, że wewnętrzne planowanie opóźniało ostatnią klatkę podczas przewijania do końca w trybie wstrzymania. Obecnie poprawka błędu działa tylko wtedy, gdy włączona jest zasada ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled.
    • Dodaj metodę ExoPlayer.setScrubbingModeEnabled(boolean). Optymalizuje to odtwarzacz pod kątem wielu częstych przewijań (np. gdy użytkownik przeciąga suwak). Działanie trybu przewijania można dostosować za pomocą setScrubbingModeParameters(..) na ExoPlayer i ExoPlayer.Builder.
    • Zezwalaj na dostosowywanie tolerancji ułamkowego 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 elementu AdsMediaSource mogły nigdy nie być zgłaszane (#2337).
    • Naprawiono wyciek pamięci w MergingMediaSource, np. podczas wczytywania napisów z zewnętrznego źródła (#2338).
    • Zezwól CmcdConfiguration.Factory na zwracanie null, aby wyłączyć rejestrowanie CMCD w przypadku określonych elementów multimedialnych (#2386).
    • Zwiększ domyślny rozmiar bufora obrazu ze 128 KB (błąd kopiowania i wklejania ze ścieżek tekstowych) do 26 MB, co wystarczy na obrazy Ultra HDR o rozdzielczości 50 MP (#2417).
    • Dodaj PreCacheHelper, które umożliwia aplikacjom wstępne buforowanie pojedynczego elementu multimedialnego z określonym położeniem początkowym i czasem trwania.
    • Dodano obsługę wstępnego wczytywania od określonej pozycji w DefaultPreloadManager.
  • Transformer:
    • Dodaj CodecDbLite, które 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 false.
    • Wypełnienie początkowej przerwy (dodanej za pomocą addGap()) cichym dźwiękiem wymaga teraz wyraźnego ustawienia experimentalSetForceAudioTrack(true)EditedMediaItemSequence.Builder. Jeśli przerwa występuje w środku sekwencji, ten flag nie jest wymagany.
    • Przenieś interfejs Muxermedia3-transformer do media3-muxer.
    • Ustawienie MediaItem.Builder().setImageDuration(long) musi być obowiązkowe, aby zaimportować element multimedialny jako obraz.
    • Dodaj Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean) zawierający listę edycji MP4 podczas przycinania, aby poinstruować odtwarzacze, aby ignorowały próbki między klatką kluczową przed punktem rozpoczęcia przycinania a punktem rozpoczęcia przycinania.
    • Zaktualizuj aplikację w wersji demonstracyjnej Composition, aby używała Kotlina i Jetpack Compose, i dodaj niestandardowy element VideoCompositorSettings, który będzie układać sekwencje w układzie 2x2 lub PIP.
  • Ekstraktory:
    • Analizowanie metadanych z fragmentowanych plików MP4 (#2084).
    • JPEG: obsługa zdjęć ruchomych, które nie mają segmentu Exif na początku (#2552).
    • Dodano obsługę przewijania w przypadku podzielonych plików MP4 z wieloma atomami sidx. Możesz włączyć to zachowanie za pomocą flagi FLAG_MERGE_FRAGMENTED_SIDXFragmentedMp4Extractor (#9373).
    • Ignoruj puste tabele wyszukiwania w plikach FLAC (w tym te, które zawierają tylko zastępcze punkty wyszukiwania) i w razie potrzeby przełączaj się na wyszukiwanie binarne, jeśli znany jest czas trwania pliku (#2327).
    • Poprawiono analizowanie jednostek SEI H.265, aby w pełni pomijać nierozpoznane typy SEI (#2456).
    • Zaktualizuj WavExtractor, aby podczas analizowania pliku typu WAVE_FORMAT_EXTENSIBLE używać danych SubFormat z rozszerzenia nagłówka w przypadku formatu audio.
    • MP4: dodano obsługę pól ipcmfpcm definiujących ścieżki audio PCM w formacie surowym (64-bitowy PCM zmiennoprzecinkowy nie jest obsługiwany).
    • MP4: obsługa części obrotowej tkhd macierzy przekształceń, które obracają i odbijają film. Dzięki temu odbite filmy nagrane przednim aparatem iPhone’a są wyświetlane w prawidłowej orientacji, ale nieprawidłowo odbite w osi Y (#2012).
    • MP3: używaj czasu trwania i rozmiaru danych z metadanych o zmiennym bitrate Xing, VBRI i podobnych, gdy wracasz do wyszukiwania ze stałym bitrate z powodu FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194).
  • Dźwięk:
    • Rozwiązanie problemu polegającego na tym, że funkcja AnalyticsListener.onAudioPositionAdvancing nie była wywoływana, gdy odtwarzanie dźwięku rozpoczynało się bardzo blisko końca multimediów.
    • Dodanie obsługi wszystkich formatów próbek linear PCM w ChannelMappingAudioProcessorTrimmingAudioProcessor.
    • Dodaliśmy obsługę przerw w dźwięku w CompositionPlayer.
    • Usuń fałszywe połączenie do: BaseAudioProcessor#flush() od: BaseAudioProcessor#reset().
    • Zezwalaj na stałe miksowanie w górę i w dół w DefaultAudioMixer.
    • Udostępnianie publicznie elementów ChannelMappingAudioProcessor, TrimmingAudioProcessorToFloatPcmAudioProcessor (#2339).
    • Użyj AudioTrack#getUnderrunCount()AudioTrackPositionTracker, aby wykrywać niedobory w DefaultAudioSink zamiast szacowania opartego na najlepszych dostępnych danych.
    • Poprawia wygładzanie sygnatur czasowych dźwięku w przypadku nieoczekiwanego dryfu pozycji z urządzenia wyjściowego audio.
    • Naprawiono błąd, w wyniku którego synchronizacja audio-wideo była przerywana przez pierwsze 10 sekund po wznowieniu odtwarzania po wstrzymaniu, gdy urządzenie było połączone z urządzeniami Bluetooth.
    • Rozwiązanie problemu polegającego na tym, że funkcja AnalyticsListener.onAudioPositionAdvancing nie raportowała czasu rozpoczęcia odtwarzania dźwięku, ale czas pierwszego pomiaru.
    • Rozwiązanie problemu z przywracaniem dźwięku wielokanałowego po przełączeniu na dźwięk stereo na niektórych urządzeniach (#2258).
  • Film:
    • Rozszerzenie obejścia problemu z odłączonym urządzeniem Surface na urządzenia „lenovo” i „motorola” (#2059).
    • Poprawiono płynne zwalnianie klatek wideo podczas uruchamiania, gdy próbki audio nie zaczynają się dokładnie w żądanej pozycji.
    • Rozszerzenie obejścia problemu z odłączoną powierzchnią na urządzenia „realme” (#2059).
    • Dodano eksperymentalny interfejs API ExoPlayer, aby uwzględnić flagę MediaCodec.BUFFER_FLAG_DECODE_ONLY podczas kolejkowania buforów wejściowych tylko do dekodowania. Ten flag wskaże dekoderowi, aby pominął bufory tylko do dekodowania, co przyspieszy wyszukiwanie. Włącz ją za pomocą DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Ulepsz sprawdzanie wydajności kodeków wideo w przypadku kodeków programowych. Może to spowodować, że niektóre ścieżki zostaną oznaczone jako EXCEEDS_CAPABILITIES.
    • Naprawiono błędy odtwarzania VP9 Widevine na niektórych urządzeniach (#2408).
  • Tekst:
    • Dodanie obsługi ścieżek VobSub w plikach MP4 (#2510).
    • Naprawiono problem z zatrzymaniem odtwarzania, gdy segment napisów początkowo nie wczytuje się, a później wczytuje się prawidłowo, po czym następuje kilka pustych segmentów napisów (#2517).
    • Poprawiono SSA i SubRip, aby wyświetlać w trakcie włączania napisów wskazówkę o postępie (#2309).
    • Naprawiono problem z zawieszaniem się odtwarzania podczas przełączania ze strumienia z błędem napisów na transmisję na żywo z pustą ścieżką napisów (#2328).
    • Naprawiono zniekształcone napisy CEA-608 podczas odtwarzania strumieni H.262 zawierających klatki B (#2372).
    • Dodaliśmy obsługę napisów SSA z właściwością CodecId = S_TEXT/SSA w plikach Matroska. Wcześniej MatroskaExtractor obsługiwał tylko CodecId = S_TEXT/ASS, który reprezentuje „zaawansowaną” (v4+) odmianę napisów SubStation Alpha (ale logika parsowania ExoPlayera jest taka sama w przypadku obu odmian) (#2384).
    • Dodano obsługę właściwości layer w plikach napisów SubStation Alpha (SSA), która służy do określania kolejności wyświetlania wskazówek, gdy na ekranie pojawia się więcej niż jedna jednocześnie (#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 operatora Builder, aby utworzyć instancję dla MediaItem, a następnie wywołaj funkcje retrieveTrackGroups(), retrieveTimeline()retrieveDurationUs(), aby uzyskać ListenableFuture dla metadanych. Poprzednie metody statyczne zostały wycofane (#2462).
  • Obraz:
    • Ogranicz dekodowane mapy bitowe do rozmiaru wyświetlacza w BitmapFactoryImageDecoder, aby uniknąć awarii aplikacji z Canvas: trying to draw too large bitmap.PlayerView podczas próby wyświetlenia bardzo dużych obrazów (np. 50 MP).
    • Zmień sygnaturę funkcji DefaultRenderersFactory.getImageDecoderFactory(), aby przyjmowała parametr Context.
    • Dopasuj maksymalny rozmiar wyjściowy mapy bitowej używany w CompositionPlayer do rozmiaru używanego już w Transformer (co oznacza, że CompositionPlayer nie uwzględnia rozmiaru wyświetlacza podczas dekodowania map bitowych, w przeciwieństwie do ExoPlayer).
  • DRM:
    • Dodaj nowe przeciążenie funkcji OfflineLicenseHelper.newWidevineInstance akceptujące MediaItem.DrmConfiguration, aby nagłówki żądań HTTP mogły być prawidłowo stosowane (#2169).
  • Skutek:
    • Dodaj Presentation.createForShortSide(int), który tworzy Presentation, aby krótszy bok zawsze pasował do podanej wartości, niezależnie od orientacji danych wejściowych.
  • Muxers:
    • Naprawiliśmy błąd, który powodował, że w przypadku próbek audio w sfragmentowanym formacie MP4 nie były ustawiane prawidłowe flagi próbek.
    • writeSampleData() Interfejs API używa teraz klasy BufferInfo specyficznej dla multipleksera zamiast MediaCodec.BufferInfo.
    • Dodaj wartość Muxer.Factory#supportsWritingNegativeTimestampsInEditList, która domyślnie ma wartość „false”.
  • Rozszerzenie IMA:
    • Naprawiliśmy błąd, który powodował, że błąd ładowania w jednej reklamie mógł przypadkowo unieważnić inną grupę reklam.
    • Naprawiliśmy błąd, który powodował, że grupy reklam po zakończeniu okna VOD wstrzymywały odtwarzanie. Grupy reklam z czasem rozpoczęcia po upływie okresu nie są już umieszczane w kolejceMediaPeriodQueue (#2215).
  • Sesja:
    • Naprawiono błąd, który powodował ignorowanie połączeń z kontrolerów Media3 innych firm bez uprawnień.
    • Usuń sprawdzanie dostępnych poleceń podczas wysyłania poleceń niestandardowych do starszego urządzenia MediaBrowserServiceCompat. Jest to zgodne z działaniem starszych kontrolerów i przeglądarek połączonych ze starszą aplikacją.
    • Naprawiliśmy błąd, który powodował nieprawidłowe traktowanie pierwszego błędu odtwarzania jako trwałego wyjątku niestandardowego. Uniemożliwia to przywrócenie aplikacji.
    • Naprawiliśmy błąd, w którym niektóre zmiany kontrolera, które nie są obsługiwane przez sesję, mogą powodować IllegalStateExceptions.
    • Naprawiono błąd, w którym działania kontrolera nieobsługiwane przez sesję mogły pozostawiać kontroler w nieprawidłowym stanie.
    • Naprawiono ostrzeżenie o naruszeniu bezpieczeństwa podczas uruchamiania w trybie StrictMode (#2330).
    • Naprawiliśmy błąd, który powodował, że wywoływanie funkcji setSessionExtras z wątku głównego podczas odtwarzania z innego wątku aplikacji niż wątek 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 do wszystkich lub wybranych kontrolerów.
    • Naprawiono błąd, w wyniku którego przewijanie transmisji na żywo na urządzeniu MediaController mogło powodować IllegalArgumentException.
    • W przypadku transmisji na żywo zatrzymuje publikowanie pozycji odtwarzania i możliwości przewijania bieżącego elementu w elementach sterujących multimediami na platformie, aby uniknąć artefaktów pozycji w interfejsie Androida Auto (i innych elementach sterujących korzystających z tych informacji z sesji multimedialnej na platformie) (#1758).
    • Naprawiono błąd, który powodował, że przekazanie wartości null do parametru getLibraryRoot w przypadku elementu MediaBrowser połączonego ze starszym elementem MediaBrowserServiceCompat powodowało zwrócenie wartości NullPointerException.
    • Naprawiono błąd, który powodował, że wysyłanie działań niestandardowych, wyniku wyszukiwania lub żądania getItem powodowało awarię starszej aplikacji sesji z błędem ClassNotFoundException.
    • Naprawiliśmy błąd, który powodował, że MediaItem.LocalConfiguration.uri było udostępniane w MediaMetadata sesji platformy. Aby celowo udostępnić identyfikator URI, aby umożliwić kontrolerom ponowne żądanie multimediów, ustaw wartość MediaItem.RequestMetadata.mediaUri.
  • UI:
    • Rozwiązaliśmy błąd, który powodował, że znak PlayerSurface w komponentach wielokrotnego użytku, takich jak LazyColumn, nie działał prawidłowo (#2493).
    • Naprawiono błąd w Compose, który powodował lukę między ustawieniem początkowych stanów przycisków a obserwowaniem zmiany stanu (np. kształtów ikon lub włączenia). Wszystkie zmiany wprowadzone w odtwarzaczu poza okresem obserwacji są teraz uwzględniane (#2313).
    • Dodaj do modułu media3-ui-compose elementy przechowujące stan i funkcje kompozycyjne dla SeekBackButtonStateSeekForwardButtonState.
    • Dodaj obsługę trybu przewijania ExoPlayera do elementu PlayerControlView. Gdy ta opcja jest włączona, odtwarzacz przechodzi w tryb przewijania, gdy użytkownik zaczyna przeciągać pasek przewijania. W przypadku każdego ruchu wysyła wywołanie player.seekTo, a następnie wychodzi z trybu przewijania, gdy użytkownik odsunie palec od ekranu. Tę integrację można włączyć za pomocą elementu time_bar_scrubbing_enabled = true w XML lub metody setTimeBarScrubbingEnabled(boolean) w kodzie Java/Kotlin.
    • Spraw, aby funkcja PlayerSurface akceptowała argument Player, który może mieć wartość null.
  • Pobrane:
    • Dodaliśmy obsługę częściowego pobierania w przypadku strumieni progresywnych. Aplikacje mogą przygotować strumień progresywny za pomocą DownloadHelper i poprosić o DownloadRequest z pomocniczego interfejsu API, określając czasowe pozycje początkowe i końcowe multimediów, które mają być objęte pobieraniem. Zwrócony obiekt DownloadRequest zawiera rozwiązany zakres bajtów, za pomocą którego można utworzyć obiekt ProgressiveDownloader i pobrać odpowiednie treści.
    • Dodaj DownloadHelper.Factory, którym zastąpione zostaną metody statyczneDownloadHelper.forMediaItem().
    • Dodaj Factory w przypadku implementacji SegmentDownloader.
    • Dodaliśmy obsługę częściowego pobierania w przypadku strumieni adaptacyjnych. Aplikacje mogą przygotować strumień adaptacyjny z DownloadHelper i poprosić o DownloadRequest z pomocniczego interfejsu API, określając czasowe pozycje początkowe i końcowe multimediów, które mają być objęte pobieraniem. Zwrócony element DownloadRequestzawiera rozwiązany zakres czasu, na podstawie którego można utworzyć konkretny element SegmentDownloader i pobrać odpowiednie treści.
  • Rozszerzenie Cronet:
    • Dodanie automatycznej obsługi plików cookie (#5975).
  • Rozszerzenie HLS:
    • Naprawiono błąd, w którym HlsSampleStreamWrapper próbuje wyszukać w buforze, gdy nie ma w nim dostępnych fragmentów #2598.
    • Naprawiono błąd, w wyniku którego wybór ścieżki zmieniał się po załadowaniu części o niskim opóźnieniu, a wskazówki dotyczące wstępnego wczytywania mogły powodować zawieszanie się odtwarzania (#2299).
    • Zapobieganie nadmiernemu ponownemu ładowaniu przez oczekiwanie przez połowę docelowego czasu trwania, gdy serwer nie uwzględnia parametru CAN-BLOCK-RELOAD=YES (#2317).
    • Naprawiliśmy błąd, który powodował zatrzymanie odtwarzania podczas uruchamiania strumienia reklam pełnoekranowych przed reklamą w trakcie filmu, a także błąd, który powodował, że lista zasobów była rozwiązywana w przypadku nieprawidłowej reklamy (#2558).
    • Poprawiono analizowanie playlisty, aby akceptować znak \f (form feed) w wartościach atrybutów w cudzysłowie (#2420).
    • Obsługa aktualizowania reklam pełnoekranowych o tym samym identyfikatorze (#2427).
    • Naprawiono błąd, który powodował, że błędy ładowania playlisty nie były czasami propagowane po wyczerpaniu się segmentów do załadowania w transmisji na żywo (#2401https://github.com/androidx/media/issues/2401).
    • Grupowanie wersji napisów według tagu NAME, podobnie jak w przypadku wersji audio (#1666).
    • Obsługa list X-ASSET-LIST i transmisji na żywo z parametrem HlsInterstitialsAdsLoader.
  • Rozszerzenie DASH:
    • Rozwiązanie problemu, w którym zestaw adaptacyjny odtwarzania z przewijaniem jest łączony z głównym zestawem adaptacyjnym, tworząc nieprawidłowy element TrackGroup (#2148).
    • Naprawiono błąd, który powodował, że skracanie okresu DASH mogło wywoływać wyjątek, gdy próbki wykraczające poza nowy czas trwania zostały już odczytane przez potok renderowania (#2440).
    • Rozwiązaliśmy błąd, który powodował, że przekierowanie nie było wykonywane podczas korzystania z parametrów zapytania CMCD (#2475).
  • Rozszerzenie RTSP:
    • Dodano obsługę pakietu agregacji RTP dla H265 zgodnie z RFC 7798#4.4.2 (#2413).
    • Poprawiono RtspClient, aby podczas przetwarzania odpowiedzi HTTP 302 używać identyfikatora URI lokalizacji podanego w odpowiedzi (#2398).
    • Dodano obsługę analizowania opisów sesji zawierających wiersze z białymi znakami na końcu (#2357).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Naprawiono błąd, w wyniku którego DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange nie działało w przypadku rozszerzeń dekodera audio (#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()setDeviceMuted() (#2089).
  • Narzędzia testowe:
    • Dodaj advance(player).untilPositionAtLeastuntilMediaItemIndex do TestPlayerRunHelper, aby przesunąć gracza do określonej pozycji. 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 można było go ponownie użyć w innych testach.
    • Usunięto: transformer.TestUtil.addAudioDecoders(String...), transformer.TestUtil.addAudioEncoders(String...)transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...). Zamiast tego skonfiguruj enkodery i dekodery cieni za pomocą ShadowMediaCodecConfig.
    • W nazwach kodeków zgłaszanych przez ShadowMediaCodecConfig prefiks „exotest” został zastąpiony prefiksem „media3”.
  • Usuń wycofane symbole:
    • Usunięto wycofany konstruktor SegmentDownloader SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) i odpowiednie konstruktory w jego podklasach DashDownloader, HlsDownloaderSsDownloader.
    • Usunięto wycofane funkcje Player.hasNext(), Player.hasNextWindow(). Zamiast niej używaj zasady Player.hasNextMediaItem().
    • Usunięto wycofaną funkcję Player.next(). Zamiast niej używaj zasady Player.seekToNextMediaItem().
    • Usunięto wycofaną funkcję Player.seekToPreviousWindow(). Zamiast niej używaj zasady Player.seekToPreviousMediaItem().
    • Usunięto wycofaną funkcję Player.seekToNextWindow(). Zamiast niej używaj zasady Player.seekToNextMediaItem().
    • Usunięto wycofany element BaseAudioProcessor w module exoplayer. Użyj opcji 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żywaj stabilnej wersji 1.8.0.

Wersja 1.8.0-rc01

16 lipca 2025 r.

Używaj stabilnej wersji 1.8.0.

Wersja 1.8.0-beta01

2 lipca 2025 r.

Używaj stabilnej wersji 1.8.0.

Wersja 1.8.0-alpha01

19 maja 2025 r.

Używaj stabilnej wersji 1.8.0.

Wersja 1.7.0

Wersja 1.7.1

16 maja 2025 r.

Ta wersja ma ten sam kod co wersja 1.6.1 i została opublikowana, aby była traktowana jako „nowsza” niż wersja 1.7.0, która była wersją alfa przypadkowo oznaczoną jako stabilna (patrz poniżej).

Wersja 1.7.0

16 maja 2025 r.

Ta wersja powinna mieć oznaczenie 1.7.0-alpha01, ale na maven.google.com została omyłkowo oznaczona jako 1.7.0 (czyli stabilna). Nie używaj jej. Pozostań przy wersji 1.6.1 lub uaktualnij ją do wersji 1.7.1 (która ma taki sam kod jak wersja 1.6.1).

Wersja 1.6.0

1.6.1

14 kwietnia 2025 r.

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

  • Biblioteka wspólna:
    • Dodano metodę PlaybackParameters.withPitch(float), która umożliwia łatwe kopiowanie elementu a PlaybackParameters z nową wartością pitch (#2257).
  • ExoPlayer:
    • Rozwiązanie problemu polegającego na tym, że przejście między elementami multimedialnymi kończyło się niepowodzeniem z powodu błędu odtwarzacza, który można było naprawić, podczas inicjowania następnego elementu multimedialnego (#2229).
    • Rozwiązanie problemu polegającego na tym, że ProgressiveMediaPeriod zgłasza błąd IllegalStateException, gdy PreloadMediaSource próbuje wywołać getBufferedDurationUs() przed jego przygotowaniem (#2315).
    • Naprawiono wysyłanie CmcdData w żądaniach manifestu w przypadku DASH, HLS i SmoothStreaming (#2253).
    • Upewnij się, że po usunięciu grup reklam możesz nadal używać AdPlaybackState.withAdDurationsUs(long[][]). Użytkownik nadal musi przekazywać tablicę czasów trwania usuniętych grup reklam, która może być pusta lub mieć wartość null (#2267).
  • Ekstraktory:
    • MP4: przeanalizuj alternate_group z pola tkhd i udostępnij go jako wpis Mp4AlternateGroupDataFormat.metadata każdego ścieżki (#2242).
  • Dźwięk:
    • Naprawiono problem z przekazywaniem, w którym pozycja mogła się zablokować podczas odtwarzania playlisty z krótkimi treściami (#1920).
  • Sesja:
    • Zmniejsz limit czasu oczekiwania na wywołania zwrotne platformy MediaSession z 500 ms do 100 ms i dodaj eksperymentalny setter, aby umożliwić aplikacjom konfigurowanie tej wartości.
    • Rozwiązaliśmy problem, który powodował, że powiadomienia pojawiały się ponownie po ich zamknięciu przez użytkownika (#2302).
    • Naprawiliśmy błąd polegający na tym, że sesja zwracała oś czasu z 1 elementem, gdy opakowany odtwarzacz był pusty. Dzieje się tak, gdy w odtwarzaczu opakowanym nie jest dostępna funkcja COMMAND_GET_TIMELINE, a jest dostępna funkcja COMMAND_GET_CURRENT_MEDIA_ITEM, a odtwarzacz opakowany jest pusty (#2320).
    • Rozwiązanie problemu polegającego na tym, że wywołanie funkcji MediaSessionService.setMediaNotificationProvider jest ignorowane po innych interakcjach z usługą, takich jak setForegroundServiceTimeoutMs (#2305).
  • UI:
    • Włącz PlayerSurface, aby korzystać z ExoPlayer.setVideoEffectsCompositionPlayer.
    • Naprawiono błąd, w którym nie można było ponownie skomponować PlayerSurface z nowym Player.
  • Rozszerzenie HLS:
    • Rozwiązanie problemu polegającego na tym, że czas trwania fragmentu nie był ustawiony 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:
    • Dodanie obsługi metadanych playlisty (#2235).

1.6.0

26 marca 2025 r.

Publikacja androidx.media3:media3-*:1.6.0 Wersja 1.6.0 zawiera te zmiany.

  • Biblioteka wspólna:
    • Dodaj AudioManagerCompatAudioFocusRequestCompat, aby zastąpić równoważne klasy w androidx.media.
    • Uaktualnij język Kotlin z wersji 1.9.20 do 2.0.20 i użyj wtyczki Gradle do kompilatora Compose. Uaktualniliśmy bibliotekę KotlinX Coroutines z wersji 1.8.1 do 1.9.0.
    • Usuń metodę Format.toBundle(boolean excludeMetadata). Zamiast niej użyj metody Format.toBundle().
    • Usunęliśmy 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).
    • Zmiana dostępu 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” do odtwarzania za pomocą MediaCodecVideoRenderer. Możesz skonfigurować DefaultRenderersFactory za pomocą experimentalSetEnableMediaCodecVideoRendererPrewarming, aby zapewnić dodatkowy MediaCodecVideoRenderer dla ExoPlayer. Jeśli ta opcja jest włączona, ExoPlayer wstępnie przetwarza film z kolejnych elementów multimedialnych podczas odtwarzania, aby zmniejszyć opóźnienie przejścia między elementami multimedialnymi.
    • Zmniejsz wartości domyślne parametrów bufferForPlaybackMsbufferForPlaybackAfterRebufferMsDefaultLoadControl do odpowiednio 1000 ms i 2000 ms.
    • Asynchroniczne inicjowanie DeviceInfo i głośności urządzenia (jeśli jest włączone za pomocą setDeviceVolumeControlEnabled). Te wartości nie są dostępne od razu po wywołaniu ExoPlayer.Builder.build(), a Player.Listener powiadamia o zmianach za pomocą onDeviceInfoChanged i onDeviceVolumeChanged.
    • Początkowy identyfikator sesji audio nie jest już dostępny od razu po utworzeniu odtwarzacza. W razie potrzeby możesz użyć przycisku AnalyticsListener.onAudioSessionIdChanged, aby odsłuchać początkową aktualizację.
    • Podczas wybierania ścieżki wideo weź pod uwagę język. Domyślnie wybieramy „główną” ścieżkę wideo, która pasuje do języka wybranej ścieżki audio, jeśli jest dostępna. Preferencje dotyczące języka filmu można wyrazić za pomocą parametru TrackSelectionParameters.Builder.setPreferredVideoLanguage(s).
    • Dodaj parametr selectedAudioLanguage do metody DefaultTrackSelector.selectVideoTrack().
    • Dodaj parametr retryCount do metod MediaSourceEventListener.onLoadStarted i odpowiednich metod MediaSourceEventListener.EventDispatcher.
    • Naprawiliśmy błąd, w którym elementy playlisty lub okresy w strumieniach DASH z wieloma okresami o czasie trwania niezgodnym z rzeczywistą treścią mogły powodować zamrożenie klatek na końcu elementu (#1698).
    • Przenieś BasePreloadManager.Listener na najwyższy poziom PreloadManagerListener.
    • RenderersFactory.createSecondaryRenderer można wdrożyć, aby zapewnić dodatkowe mechanizmy renderowania do wstępnego rozgrzewania. Wstępne wczytywanie umożliwia szybsze przełączanie między elementami multimedialnymi podczas odtwarzania.
    • Włącz wysyłanie CmcdData w przypadku żądań manifestu w adaptacyjnym strumieniowym przesyłaniu danych w formatach DASH, HLS i SmoothStreaming (#1951).
    • Podaj MediaCodecInfo kodeka, który zostanie zainicjowany w MediaCodecRenderer.onReadyToInitializeCodec#1963.
    • Zmień AdsMediaSource, aby umożliwić AdPlaybackStates rozwój przez dodawanie grup reklam. Wykrywane są nieprawidłowe modyfikacje i zgłaszany jest wyjątek.
    • Rozwiązaliśmy problem polegający na tym, że po reklamie w trakcie filmu podczas przechodzenia do treści multimedialnych w szybkiej sekwencji mogły być wyświetlane dodatkowe ramki tylko do dekodowania.
    • Spraw, aby DefaultRenderersFactory dodać 2 instancje MetadataRenderer, aby aplikacje domyślnie otrzymywały 2 różne schematy metadanych.
    • Ponownie oceń, czy trwające ładowanie fragmentu powinno zostać anulowane, gdy odtwarzanie jest wstrzymane (#1785).
    • Dodanie opcji ClippingMediaSource, która umożliwia wycinanie fragmentów z mediów, których nie można przewijać.
    • Naprawiliśmy błąd, który powodował, że przewijanie z wstępnym buforowaniem mogło blokować przejście do następnego elementu multimedialnego.
    • Usunęliśmy błąd, w którym stan ExoPlayer.isLoading() pozostawał true, mimo że zmienił się na STATE_IDLE lub STATE_ENDED (#2133).
    • Dodano lastRebufferRealtimeMs do LoadControl.Parameter (#2113).
  • Transformer:
    • Dodaliśmy obsługę transmuksowania do alternatywnych formatów zgodnych wstecznie.
    • Dodano obsługę transkodowania i transmuksowania formatu Dolby Vision (profil 8).
    • Zaktualizuj parametry VideoFrameProcessor.registerInputStreamVideoFrameProcessor.Listener.onInputStreamRegistered, aby korzystały z Format.
    • Generuj statyczne metadane HDR podczas korzystania z funkcji DefaultEncoderFactory.
    • Włącz obsługę diagnostyki platformy Android za pomocą MediaMetricsManager. Moduł Transformer przekazuje zdarzenia edycji i dane o skuteczności na platformę, 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 przekazywania danych na potrzeby diagnostyki platformy Transformer za pomocą parametru Transformer.Builder.setUsePlatformDiagnostics(false).
    • Podziel InAppMuxer na InAppMp4Muxer i InAppFragmentedMp4Muxer. Użyj InAppMp4Muxer, aby utworzyć niesfragmentowany plik MP4, a InAppFragmentedMp4Muxer, aby utworzyć sfragmentowany plik MP4.
    • Przenieś interfejs Muxermedia3-muxer do media3-transformer.
    • Dodaj MediaProjectionAssetLoader, który udostępnia multimedia z MediaProjection do nagrywania ekranu, i dodaj obsługę nagrywania ekranu do aplikacji w wersji demonstracyjnej Transformer.
    • Dodaj #getInputFormat() do interfejsu Codec.
    • Przekaż odpowiedzialność za zwolnienie GlObjectsProvider na dzwoniącego w DefaultVideoFrameProcessorDefaultVideoCompositor, gdy jest to możliwe.
  • Ekstraktory:
    • AVI: poprawiono obsługę plików z dźwiękiem skompresowanym ze stałą szybkością transmisji, w których nagłówek strumienia przechowuje liczbę bajtów zamiast liczby fragmentów.
    • Poprawiono obsługę jednostek NAL o długości wyrażonej w 1 lub 2 bajtach (zamiast 4).
    • Naprawiono błąd ArrayIndexOutOfBoundsException na listach edycji MP4, gdy lista edycji zaczyna się od klatki niesynchronizowanej bez poprzedzającej klatki synchronizowanej (#2062).
    • Rozwiązanie problemu polegającego na tym, że strumienie TS mogą się zawieszać na niektórych urządzeniach (#2069).
    • FLAC: dodaliśmy obsługę 32-bitowych plików FLAC. Wcześniej nie można było odtworzyć tych filmów w IllegalStateException: Playback stuck buffering and not loading (#2197).
  • Dźwięk:
    • Poprawiono wywoływanie funkcji onAudioPositionAdvancing po wznowieniu odtwarzania (wcześniej była wywoływana po wstrzymaniu odtwarzania).
    • Nie pomijaj SonicAudioProcessor, gdy SpeedChangingAudioProcessor jest skonfigurowany z parametrami domyślnymi.
    • Naprawiono niedobór w Sonic#getOutputSize(), który mógł powodować zatrzymanie DefaultAudioSink.
    • Popraw błędy MediaCodecAudioRenderer.getDurationToProgressUs()DecoderAudioRenderer.getDurationToProgressUs(), aby wyszukiwanie prawidłowo resetowało podane czasy trwania.
    • Ustawić numer androidx.media3.common.audio.SonicAudioProcessor jako stały.
    • Dodaliśmy obsługę formatu float PCM do elementów ChannelMappingAudioProcessor i TrimmingAudioProcessor.
  • Film:
    • Zmień MediaCodecVideoRenderer.shouldUsePlaceholderSurface na protected, aby aplikacje mogły zastępować blokowanie użycia powierzchni zastępczych (#1905).
    • Dodano eksperymentalne ExoPlayer analizowanie zależności próbki AV1, aby przyspieszyć przewijanie. Włącz go za pomocą nowego interfejsu API DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies.
    • Dodano eksperymentalny interfejs API ExoPlayer, który umożliwia odrzucanie nieużywanych buforów wejściowych dekodera MediaCodecVideoRenderer z opóźnieniem. Włącz ją za pomocą DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * Rozwiązanie problemu polegającego na tym, że odtwarzacz bez powierzchni był od razu gotowy i bardzo wolno dekodował oczekujące klatki (#1973).
    • Wykluczanie urządzeń Xiaomi i OPPO z trybu odłączonej powierzchni, aby uniknąć migotania ekranu (#2059).
  • Tekst:
    • Dodano obsługę napisów VobSub (#8260).
    • Zaprzestanie wczytywania z wyprzedzeniem wszystkich plików z napisami skonfigurowanych za pomocą MediaItem.Builder.setSubtitleConfigurations i zamiast tego wczytywanie tylko jednego, jeśli zostanie on wybrany przez funkcję wyboru ścieżki (#1721).
    • TTML: dodano obsługę odwołań do tts:origintts:extent za pomocą style (#2953).
    • Ogranicz znaczniki czasu WebVTT i SubRip do dokładnie 3 miejsc po przecinku. Wcześniej nieprawidłowo analizowaliśmy dowolną liczbę miejsc po przecinku, ale zawsze zakładaliśmy, że wartość jest podana w milisekundach, co prowadziło do nieprawidłowych sygnatur czasowych (#1997).
    • Naprawiono zawieszanie się odtwarzania, gdy playlista zawierała przycięte elementy z napisami CEA-608 lub CEA-708.
    • Naprawiono IllegalStateException, gdy plik SSA zawierał wskazówkę o zerowym czasie trwania (czas rozpoczęcia i zakończenia były takie same) (#2052).
    • Tłumienie (i rejestrowanie) błędów analizowania napisów, gdy są one multipleksowane w tym samym kontenerze co dźwięk i obraz (#2052).
    • Poprawiono obsługę wielobajtowych znaków UTF-8 w plikach WebVTT z zakończeniami wierszy CR (#2167).
  • DRM:
    • Naprawiono błąd MediaCodec$CryptoException: Operation not supported in this configuration podczas odtwarzania treści ClearKey na urządzeniach z interfejsem API w wersji starszej niż 27 (#1732).
  • Skutek:
    • Przeniesiono funkcję OverlaySettings do StaticOverlaySettings. OverlaySettings można podzielić na podklasy, aby umożliwić dynamiczne ustawienia nakładki.
  • Muxers:
    • Przeniesiono MuxerException z interfejsu Muxer, aby uniknąć bardzo długiej pełnej i jednoznacznej nazwy.
    • Zmieniono nazwę metody setSampleCopyEnabled() na setSampleCopyingEnabled() w przypadku Mp4Muxer.BuilderFragmentedMp4Muxer.Builder.
    • Mp4Muxer.addTrack()FragmentedMp4Muxer.addTrack() zwracają teraz identyfikator ścieżki int zamiast TrackToken.
    • Klasy Mp4MuxerFragmentedMp4Muxer nie implementują już interfejsu Muxer.
    • Domyślnie wyłącz próbkowanie i kopiowanie Mp4Muxer.
    • Naprawiliśmy błąd w FragmentedMp4Muxer, który powodował tworzenie wielu fragmentów, gdy zapisywana była tylko ścieżka audio.
  • Sesja:
    • Utrzymanie stanu usługi na pierwszym planie przez dodatkowe 10 minut, gdy odtwarzanie zostanie wstrzymane, zatrzymane lub zakończy się niepowodzeniem. Dzięki temu użytkownicy mogą wznowić odtwarzanie w tym czasie bez ryzyka ograniczeń dotyczących usług na pierwszym planie na różnych urządzeniach. Pamiętaj, że wywołanie player.pause() nie może już być używane do zatrzymania usługi na pierwszym planie przed stopSelf() podczas zastępowania onTaskRemoved. Zamiast tego użyj MediaSessionService.pauseAllPlayersAndStopSelf().
    • Zachowaj widoczność powiadomienia, gdy odtwarzanie przejdzie w stan błędu lub zatrzymania. Powiadomienie zostanie usunięte tylko wtedy, gdy playlista zostanie wyczyszczona lub odtwarzacz zostanie zwolniony.
    • Ulepszono obsługę działań ACTION_PLAY i ACTION_PAUSE w MediaSession na platformie Android, aby ustawiać tylko jedno z nich zgodnie z dostępnymi poleceniami, a także akceptować sytuację, w której ustawione jest tylko jedno z nich.
    • Dodanie Context jako parametru do MediaButtonReceiver.shouldStartForegroundService (#1887).
    • Naprawiliśmy błąd, który powodował, że wywołanie metody Player na obiekcie MediaController połączonym z sesją starszego typu powodowało utratę zmian z oczekującej aktualizacji.
    • Umożliwienie funkcji MediaSession.setSessionActivity(PendingIntent) akceptowania wartości null (#2109).
    • Usunęliśmy błąd, który powodował, że po wyczyszczeniu playlisty nadal było widoczne nieaktualne powiadomienie (#2211).
  • UI:
    • Dodaj do modułu media3-ui-compose elementy przechowujące stan i funkcje kompozycyjne dla PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonStatePlaybackSpeedState.
  • Pobrane:
    • Naprawiono błąd w CacheWriter, który powodował, że źródła danych pozostawały otwarte, a obszary pamięci podręcznej zablokowane, jeśli źródło danych zgłaszało błąd Exception inny niż IOException (#9760).
  • Rozszerzenie HLS:
    • Dodaj pierwszą wersję HlsInterstitialsAdsLoader. Moduł wczytywania reklam odczytuje reklamy pełnoekranowe HLS z playlisty multimedialnej HLS i mapuje je na AdPlaybackState, które są przekazywane do AdsMediaSource. Ta początkowa wersja obsługuje tylko strumienie VOD HLS z atrybutami X-ASSET-URI.
    • Dodaj HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Aplikacje mogą go używać do tworzenia instancji AdsMediaSource, które w wygodny i bezpieczny sposób korzystają z HlsInterstitialsAdsLoader.
    • Analizowanie tagu SUPPLEMENTAL-CODECS z listy odtwarzania HLS w celu wykrywania formatów Dolby Vision (#1785).
    • Złagodzenie warunku wyszukiwania pozycji synchronizacji w strumieniu HLS (#2209).
  • Rozszerzenie DASH:
    • Dodanie obsługi formatu AC-4 Level-4 w przypadku DASH (#1898).
    • Rozwiązano problem z obliczaniem interwału aktualizacji wstawiania reklam w transmisjach na żywo z wieloma okresami (#1698).
    • Analizowanie atrybutu scte214:supplementalCodecs z pliku manifestu DASH w celu wykrywania formatów Dolby Vision (#1785).
    • Poprawiono obsługę przejść między okresami w transmisjach na żywo, w których okres zawiera próbki multimediów wykraczające poza zadeklarowany czas trwania okresu (#1698).
    • Rozwiązanie problemu, w którym zestawy adaptacyjne oznaczone symbolem adaptation-set-switching, ale mające różne języki lub flagi ról, były łączone ze sobą (#2222).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Dodano moduł dekodera MPEG-H, który używa wbudowanego dekodera MPEG-H do dekodowania dźwięku MPEG-H (#1826).
  • Rozszerzenie MIDI:
    • Przekazywanie niestandardowych instancji AudioSinkAudioRendererEventListener do MidiRenderer.
  • Rozszerzenie Cast:
    • Zaktualizuj zależność play-services-cast-framework do wersji 21.5.0, aby naprawić błąd FLAG_MUTABLE powodujący awarię aplikacji kierowanych na interfejs API 34 lub nowszy na urządzeniach z zainstalowanymi, ale wyłączonymi usługami Google Play (#2178).
  • Aplikacja w wersji demonstracyjnej:
    • Rozszerz możliwości demo-compose o dodatkowe przyciski i ulepsz integrację PlayerSurface dzięki obsłudze skalowania i migawki.
  • Usuń wycofane symbole:
    • Usuń wycofaną metodę AudioMixer.create(). Zamiast niej używaj zasady DefaultAudioMixer.Factory().create().
    • Usuń te wycofane metody Transformer.Builder:
      • setTransformationRequest() używaj zamiast niej zasad setAudioMimeType(),setVideoMimeType()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 przekazane 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ń wycofane zajęcia TransformationResult. Zamiast niej używaj zasady ExportResult.
    • Usuń wycofane zajęcia TransformationException. Zamiast niej używaj zasady ExportException.
    • Usuń wycofany element Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Zamiast niej używaj zasady Transformer.PROGRESS_STATE_NOT_STARTED.
    • Usuń wycofany element Transformer.setListener(). Zamiast niej używaj kolumn Transformer.addListener(), Transformer.removeListener() lub Transformer.removeAllListeners().
    • Usuń wycofane pole Transformer.startTransformation(). Zamiast niej używaj zasady Transformer.start(MediaItem, String).
    • Usuń wycofany element SingleFrameGlShaderProgram. Zamiast niej używaj zasady BaseGlShaderProgram.
    • Usuń Transformer.flattenForSlowMotion. Zamiast niej używaj zasady EditedMediaItem.flattenForSlowMotion.
    • Usunięto: ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponentExoPlayer.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 DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList).
      • getRendererCapabilities(RenderersFactory), równoważną funkcję można uzyskać, tworząc DefaultRendererCapabilitiesListRenderersFactory i wywołując DefaultRendererCapabilitiesList.getRendererCapabilities().
      • Usunięto metodę PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat). Użyj funkcji PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) i przekaż wartość (MediaSession.Token) compatToken.getToken().

1.6.0-rc02

19 marca 2025 r.

Używaj stabilnej wersji 1.6.0.

1.6.0-rc01

12 marca 2025 r.

Używaj stabilnej wersji 1.6.0.

1.6.0-beta01

26 lutego 2025 r.

Używaj stabilnej wersji 1.6.0.

Wersja 1.6.0-alpha03

6 lutego 2025 r.

Używaj stabilnej wersji 1.6.0.

Wersja 1.6.0-alpha02

30 stycznia 2025 r.

Używaj stabilnej wersji 1.6.0.

Wersja 1.6.0-alpha01

20 grudnia 2024 r.

Używaj stabilnej wersji 1.6.0.

Wersja 1.5

Wersja 1.5.1

19 grudnia 2024 r.

Publikacja androidx.media3:media3-*:1.5.1 Wersja 1.5.1 zawiera te zmiany.

  • ExoPlayer:
    • Wyłączyliśmy używanie asynchronicznego odszyfrowywania w klasie MediaCodec, aby uniknąć zgłaszanych problemów z przekroczeniem limitu czasu kodeka w tym interfejsie API platformy (#1641).
  • Ekstraktory:
    • MP3: nie przerywaj odtwarzania przedwcześnie, gdy VBRIspis treści ramki nie obejmuje wszystkich danych MP3 w pliku (#1904).
  • Film:
    • Wycofanie używania podanych wartości współczynnika proporcji piksela MediaCodecAdapter podczas przetwarzania onOutputFormatChanged (#1371).
  • Tekst:
    • Naprawiono błąd w elemencie ReplacingCuesResolver.discardCuesBeforeTimeUs, który powodował, że wskazówka aktywna w momencie timeUs (rozpoczęta wcześniej, ale jeszcze nie zakończona) była nieprawidłowo odrzucana (#1939).
  • Metadane:
    • Wyodrębnianie numeru dysku/ścieżki 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 zmiany.

  • Biblioteka wspólna:
    • Dodaj ForwardingSimpleBasePlayer, które umożliwia przekazywanie do innego odtwarzacza z niewielkimi korektami, przy jednoczesnym zapewnieniu pełnej spójności i obsługi słuchaczy (#1183).
    • Zastąp SimpleBasePlayer.State.playlist metodą getPlaylist().
    • Dodaj zastąpienie dla SimpleBasePlayer.State.Builder.setPlaylist(), aby bezpośrednio określić Timeline i bieżące Tracks oraz 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 języka Kotlin oparte na bibliotece Common.
    • Dodaj do biblioteki media3-common-ktx funkcję rozszerzenia zawieszania Player.listen, która uruchamia współprogram nasłuchujący Player.Events.
    • Usuń adnotacje @DoNotInline z ręcznie wyodrębnionych klas wewnętrznych, które mają zapobiegać błędom weryfikacji klas w czasie działania. Najnowsze wersje R8 automatycznie przenoszą takie wywołania poza funkcję, aby uniknąć błędów w czasie działania programu (dlatego ręczne przenoszenie poza funkcję 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, z powodu compileSdk = 35. Użytkownicy biblioteki z systemami kompilacji innymi niż Gradle będą musieli zadbać o to, aby ich odpowiednik R8 wykonujący krok zmniejszania/zaciemniania kodu przeprowadzał podobny automatyczny proces wyodrębniania, aby uniknąć błędów weryfikacji klas w czasie działania. Ta zmiana została już wprowadzona w innych bibliotekach AndroidX.
  • ExoPlayer:
    • MediaCodecRenderer.onProcessedStreamChange() można teraz wywołać w przypadku każdego elementu multimedialnego. Wcześniej nie było to wymagane w przypadku pierwszego konta. Aby to zrobić, użyj MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart().
    • Dodano element PreloadMediaSource.PreloadControl.onPreloadError, aby umożliwić implementacjom PreloadMediaSource.PreloadControl podejmowanie działań w przypadku wystąpienia błędu.
    • Dodaj BasePreloadManager.Listener, aby przekazywać zdarzenia wstępnego wczytywania do aplikacji.
    • Zezwalaj na zmianę czasu oczekiwania klienta SNTP i ponawianie prób połączenia z alternatywnymi adresami po przekroczeniu czasu oczekiwania (#1540).
    • Usuń pole MediaCodecAdapter.Configuration.flags, ponieważ zawsze miało wartość zero.
    • Zezwalaj użytkownikowi na wybieranie wbudowanego głośnika do odtwarzania na urządzeniach z Wear OS z API w wersji 35 lub nowszej (jeśli urządzenie deklaruje obsługę tej funkcji).
    • Odłóż blokowanie połączenia do Context.getSystemService(Context.AUDIO_SERVICE), aż zostanie włączona obsługa aktywności audio. Dzięki temu połączenie blokujące nie zostanie wykonane, jeśli obsługa fokusu audio nie jest włączona (#1616).
    • Zezwalaj na odtwarzanie niezależnie od czasu buforowania, gdy ładowanie się nie powiedzie (#1571).
    • Dodaj AnalyticsListener.onRendererReadyChanged(), aby zasygnalizować, kiedy poszczególne renderery zezwalają na odtwarzanie.
    • Naprawiono błąd, który powodował, że MediaCodec.CryptoException był czasami zgłaszany jako „nieoczekiwany błąd podczas działania”, gdy MediaCodec działał w trybie asynchronicznym (domyślne zachowanie w przypadku interfejsu API w wersji 31 lub nowszej).
    • Przekaż bufferedDurationUs zamiast bufferedPositionUs za pomocą PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Dodatkowo zmienia DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS na DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS, więc 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 być wstępnie wczytane za pomocą tego IntDef, zamiast pozycji.
    • Dodaj implementację ForwardingRenderer, która przekazuje wszystkie wywołania metod do innego renderera (1703).
    • Dodaj wstępne wczytywanie playlisty dla następnego elementu na playliście. Aplikacje mogą włączyć wstępne wczytywanie, wywołując odpowiednio funkcję ExoPlayer.setPreloadConfiguration(PreloadConfiguration). Wstępne wczytywanie jest domyślnie wyłączone. Jeśli ta funkcja jest włączona, aby nie zakłócać odtwarzania, DefaultLoadControl ogranicza wstępne wczytywanie do momentu, gdy odtwarzacz nie wczytuje treści do odtworzenia. Aplikacje mogą zmienić to zachowanie, implementując odpowiednio LoadControl.shouldContinuePreloading() (np. podczas zastępowania tej metody w DefaultLoadControl). Domyślna implementacja LoadControl wyłącza wstępne wczytywanie, jeśli aplikacja używa niestandardowej implementacji LoadControl.
    • Dodano metodę MediaSourceEventListener.EventDispatcher.dispatchEvent(), która umożliwia wywoływanie zdarzeń detektorów podklas (1736).
    • Dodaj DefaultPreloadManager.Builder, które tworzy instancje DefaultPreloadManagerExoPlayer ze spójnymi, udostępnionymi konfiguracjami.
    • Usuń parametr Renderer[] z funkcji LoadControl.onTracksSelected(), ponieważ implementacja DefaultLoadControl może pobierać typy transmisji z funkcji ExoTrackSelection[].
    • Metoda DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) została oznaczona jako przestarzała i ostateczna, aby zapobiec jej zastąpieniu. Zamiast niej należy używać nowej zasady DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • Raportuj zdarzenia MediaSourceEventListener z dodatkowych źródeł w MergingMediaSource. Spowoduje to zgłaszanie zdarzeń loadstart/error/cancelled/completed w przypadku napisów wczytanych z zewnątrz (dodanych za pomocą MediaItem.LocalConfiguration.subtitleConfigurations), które mogą pojawiać się jako zduplikowane zdarzenia wczytywania emitowane z AnalyticsListener.
    • Zapobiegaj całkowitemu zatrzymaniu odtwarzania z powodu błędów w napisach i metadanych. Problemowy utwór jest wyłączany, a odtwarzanie pozostałych utworów jest kontynuowane (#1722).
      • W nowym sposobie obsługi napisów (podczas wyodrębniania) powiązane błędy analizowania (np. nieprawidłowe dane napisów) i ładowania (np. HTTP 404) są emitowane za pomocą wywołań zwrotnych onLoadError.
      • W przypadku starszego sposobu obsługi napisów (podczas renderowania) za pomocą wywołań zwrotnych onLoadError są emitowane tylko powiązane błędy wczytywania, a błędy parsowania są cicho ignorowane (jest to dotychczasowe zachowanie).
    • Naprawiliśmy błąd, w którym elementy playlisty lub okresy w strumieniach DASH z wieloma okresami o czasie trwania niezgodnym z rzeczywistą treścią mogły powodować zamrożenie klatek na końcu elementu (#1698).
    • Dodano funkcję ustawiającą do parametru SntpClient, która umożliwia określenie maksymalnego czasu, jaki może upłynąć od ostatniej aktualizacji, po którym klient jest ponownie inicjowany (#1794).
  • Transformer:
    • Dodaj SurfaceAssetLoader, który obsługuje kolejkowanie danych wideo do transformatora za pomocą Surface.
    • ImageAssetLoader zgłasza nieobsługiwane dane wejściowe za pomocą AssetLoader.onError zamiast zgłaszać IllegalStateException.
    • Wymagaj ustawienia czasu trwania obrazu za pomocą parametru MediaItem.Builder.setImageDurationMs podczas eksportowania obrazu.
    • Dodano obsługę eksportowania przerw w sekwencjach obiektów EditedMediaItem.
  • Wybór utworu:
    • DefaultTrackSelector: w przypadku podobnych warunków preferuj dźwięk obiektowy od dźwięku opartego na kanałach.
  • Ekstraktory:
    • Zezwalaj na identyfikowanie przez opcje Mp4ExtractorFragmentedMp4Extractor próbek H264, które nie są używane jako odniesienie przez kolejne próbki.
    • Dodanie opcji włączania wyszukiwania opartego na indeksie w AmrExtractor.
    • Traktuj pliki MP3 z ponad 128 kB między prawidłowymi ramkami jako obcięte (zamiast nieprawidłowych). Oznacza to, że pliki z danymi innymi niż MP3 na końcu, bez innych metadanych wskazujących długość bajtów MP3, przestają odtwarzać się na końcu danych MP3, zamiast kończyć się błędem ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • Rozwiązaliśmy problem z obsługą próbki przed reklamą w przypadku pozycji początkowych multimediów innych niż klatki kluczowe podczas przetwarzania list edycji w plikach MP4 (#1659).
    • Ulepszono obliczanie liczby klatek na sekundę przez użycie czasu trwania multimediów z pola mdhdMp4ExtractorFragmentedMp4Extractor (#1531).
    • Poprawianie nieprawidłowego skalowania media_time na listach edycji MP4. Wartość segment_duration była już prawidłowo skalowana przy użyciu skali czasu filmu, a wartość media_time jest teraz prawidłowo skalowana przy użyciu skali czasu ścieżki, zgodnie ze standardem formatu MP4 (#1792).
    • Obsługa klatek w nieprawidłowej kolejności w obliczeniach endIndices w przypadku plików MP4 z listą edycji (#1797).
    • Poprawiono analizowanie czasu trwania multimediów w mdhd box w plikach MP4, aby obsługiwać wartości -1 (#1819).
    • Dodano obsługę identyfikowania pola h263 w plikach MP4 dla wideo H.263 (#1821).
    • Dodano obsługę formatu pliku multimedialnego ISO AC-4 Level-4 (#1265).
  • DataSource:
    • Aktualizacja HttpEngineDataSource, aby umożliwić korzystanie z niej od wersji S extension 7 zamiast od poziomu 34 interfejsu API (#1262).
    • DataSourceContractTest: Sprawdź, czy funkcja DataSource.getUri() zwraca rozwiązany identyfikator URI (zgodnie z dokumentacją). Jeśli różni się od żądanego adresu URI, testy mogą to wskazywać za pomocą nowej metody DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: sprawdź, czy funkcje DataSource.getUri()getResponseHeaders() zwracają wartość „open” po nieudanej próbie wywołania funkcji open() (z powodu braku zasobu) i przed kolejnym wywołaniem funkcji close().
      • Zastąpienie DataSourceContractTest.getNotFoundResources() umożliwia podklasom testów dostarczanie 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 konfigurować metadane głośności CTA-2075 w kodeku, jeśli są one obecne w multimediach;
    • Zapewnij płynne zmniejszanie głośności podczas przewijania.
    • Naprawiono trzaski, które mogą występować podczas przewijania.
    • Naprawiliśmy błąd kumulacji obcinania w algorytmie rozciągania czasu/zmiany wysokości dźwięku Sonic.
    • Naprawiono błąd w SpeedChangingAudioProcessor, który powodował utratę klatek wyjściowych.
  • Film:
    • MediaCodecVideoRenderer nie dekoduje próbek, które nie są renderowane ani używane jako odniesienie przez inne próbki.
    • W przypadku interfejsu API w wersji 35 i nowszych funkcja MediaCodecAdapter może teraz otrzymywać wartość null Surface w parametrze configure oraz wywoływać nową metodę detachOutputSurface w celu usunięcia wcześniej ustawionej wartości Surface, jeśli kodek to obsługuje (MediaCodecInfo.detachedSurfaceSupported).
    • Podczas przetwarzania onOutputFormatChanged używaj podanych wartości współczynnika proporcji piksela MediaCodecAdapter, jeśli są dostępne (#1371).
    • Dodano obejście problemu z urządzeniem Galaxy Tab S7 FE, który powoduje, że bezpieczne strumienie H264 o częstotliwości 60 kl./s są oznaczane jako nieobsługiwane (#1619).
    • Dodaj obejście problemu z kodekami, które po ostatniej próbce nie zwracają sygnału końca strumienia.
  • Tekst:
    • Dodaj niestandardowy element VoiceSpan i wypełnij go dla zakresów głosowych WebVTT (#1632).
    • Zadbaj o to, aby napisy WebVTT w HLS z bardzo dużymi sygnaturami czasowymi (które przekraczają 64-bitową wartość long, gdy są reprezentowane jako mikrosekundy i pomnożone przez 90,000 podstawę czasu MPEG) były wyświetlane (#1763).
    • Obsługa napisów CEA-608 w treściach Dolby Vision (#1820).
    • Naprawiono zawieszanie się odtwarzania w przypadku 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 wczytywania obrazów, takimi jak Glide czy Coil.
  • DataSource:
    • Dodano FileDescriptorDataSource, nowy DataSource, który może być używany do odczytywania danych z FileDescriptor (#3757).
  • Skutek:
    • Dodano obejście DefaultVideoFrameProcessor w przypadku niewielkiego skalowania SurfaceTexture. SurfaceTexture może obejmować niewielkie skalowanie, które odcina 1-tekselową ramkę wokół krawędzi przyciętego bufora. Teraz jest to obsługiwane w taki sposób, aby dane wyjściowe były bliższe oczekiwanym.
    • Przyspiesz DefaultVideoFrameProcessor.queueInputBitmap(). Dzięki temu eksportowanie obrazów do filmów za pomocą Transformer jest szybsze.
  • Rozszerzenie IMA:
    • Naprawiono błąd, który powodował, że wyczyszczenie playlisty mogło spowodować wystąpienie znaku ArrayIndexOutOfBoundsExceptionImaServerSideAdInsertionMediaSource.
    • Naprawiono błąd, w którym 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 wznawiającego odtwarzanie przez zastąpienie tej metody. Domyślnie usługa jest zawsze uruchomiona i nie można jej wyłączyć bez spowodowania awarii systemu z błędem ForegroundServiceDidNotStartInTimeException (#1528).
    • Naprawiliśmy błąd, który powodował, że niestandardowe polecenia wysyłane z MediaBrowser były przekazywane do MediaSessionCompat.Callback zamiast do wariantu MediaBrowserServiceCompat metody po połączeniu z usługą starszego typu. Uniemożliwiało to otrzymywanie przez MediaBrowser rzeczywistej wartości zwrotnej wysyłanej przez starszą usługę (#1474).
    • Obsługa wyjątku IllegalArgumentException zgłaszanego przez urządzenia niektórych producentów podczas ustawiania odbiornika transmisji dla intencji przycisku multimediów (#1730).
    • Dodaj przyciski poleceń do elementów multimedialnych. Spowoduje to dodanie interfejsu Media3 API dla tego, co było znane jako Custom browse actions, z biblioteką starszego typu MediaBrowserCompat. Pamiętaj, że w przypadku Media3 przyciski poleceń elementów multimedialnych są dostępne zarówno w przypadku MediaBrowser, jak i MediaController. Zobacz Implementowanie niestandardowych działań przeglądania. * Naprawiono błąd, który powodował, że kontroler Media3 czasami nie mógł zezwolić aplikacji sesji na uruchomienie usługi działającej na pierwszym planie po wysłaniu żądania play().
    • Ogranicz CommandButton.Builder.setIconUri tak, aby akceptował tylko identyfikatory URI treści.
    • Przekazywanie wskazówek dotyczących połączenia z przeglądarki Media3 do początkowego MediaBrowserCompat podczas łączenia się ze starszym MediaBrowserCompat. Usługa może odbierać wskazówki dotyczące połączenia przekazywane jako wskazówki główne przy pierwszym wywołaniu funkcji onGetRoot().
    • Rozwiązanie problemu polegającego na tym, że serwer MediaBrowser połączony z usługą starszej przeglądarki nie otrzymywał błędu wysłanego przez usługę po zasubskrybowaniu przez przeglądarkę serwera parentid.
    • Poprawiono działanie interoperacyjności, dzięki czemu przeglądarka Media3 połączona ze starszym interfejsem MediaBrowserService nie wysyła 2 razy prośby o elementy podrzędne interfejsu parentId podczas subskrybowania elementu nadrzędnego.
  • UI:
    • Wprowadź obejście problemu z rozciągniętym/przyciętym filmem w funkcji PlayerView-in-Compose-AndroidView, ponieważ występują problemy z przejściami udostępnionymi opartymi na XML. Aplikacje korzystające z PlayerView wewnątrz AndroidView muszą wywoływać PlayerView.setEnableComposeSurfaceSyncWorkaround, aby wyrazić zgodę na udział w programie (#1237, #1594).
    • Dodaj setFullscreenButtonState do PlayerView, aby umożliwić aktualizowanie ikony przycisku pełnego ekranu na żądanie, tj. poza pasmem i nie w reakcji na kliknięcie (#1590, #184).
    • Naprawiono błąd polegający na tym, że opcja „Brak” w wyborze tekstu nie działała, jeśli istniały zdefiniowane przez aplikację preferencje wyboru ścieżki tekstowej.
  • Rozszerzenie DASH:
    • Dodano obsługę okresów rozpoczynających się w środku segmentu (#1440).
  • Rozszerzenie Smooth Streaming:
    • Rozwiązano problem z błędem Bad magic number for Bundle podczas odtwarzania strumieni SmoothStreaming ze ścieżkami tekstowymi (#1779).
  • Rozszerzenie RTSP:
    • Poprawiono usuwanie informacji o użytkowniku w przypadku adresów URL zawierających zakodowane znaki @ (#1138).
    • Naprawiono 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 za pomocą biblioteki natywnej libiamf do syntezy dźwięku.
      • Odtwarzanie jest włączone w układzie stereo, a także w formacie 5.1 z przestrzennym dźwiękiem i opcjonalnym śledzeniem ruchów głowy, ale odtwarzanie binauralne nie jest obecnie obsługiwane.
    • Dodaj obsługę stron 16 KB w przypadku rozszerzeń dekodera na Androidzie 15 (#1685).
  • Rozszerzenie Cast:
    • Zatrzymuje czyszczenie osi czasu po rozłączeniu CastSession, co umożliwia aplikacji wysyłającej wznowienie odtwarzania lokalnego po rozłączeniu.
    • Wypełnij pole DeviceInfo w CastPlayer, gdy podano wartość Context. Umożliwia to połączenie MediaSessionRoutingSession, co jest niezbędne do zintegrowania przełącznika wyjścia (#1056).
  • Narzędzia testowe:
    • DataSourceContractTest obejmuje teraz testy weryfikujące:
      • Strumień wejściowy read position został zaktualizowany.
      • Bufor wyjściowy offset jest stosowany prawidłowo.
  • Aplikacja w wersji demonstracyjnej
    • Rozwiązanie problemu wycieków pamięci w aplikacji w wersji demonstracyjnej z krótkimi filmami (#1839).
  • Usuń wycofane symbole:
    • Usuń wycofane Player.hasPrevious, Player.hasPreviousWindow(). Zamiast niej używaj zasady Player.hasPreviousMediaItem().
    • Usuń wycofaną metodę Player.previous(). Zamiast niej używaj zasady Player.seekToPreviousMediaItem().
    • Usuń wycofaną metodę DrmSessionEventListener.onDrmSessionAcquired.
    • Usuń wycofane konstruktory DefaultEncoderFactory. Zamiast niej używaj zasady DefaultEncoderFactory.Builder.

Wersja 1.5.0-rc02

19 listopada 2024 r.

Używaj stabilnej wersji 1.5.0.

Wersja 1.5.0-rc01

13 listopada 2024 r.

Używaj stabilnej wersji 1.5.0.

Wersja 1.5.0-beta01

30 października 2024 r.

Używaj stabilnej wersji 1.5.0.

Wersja 1.5.0-alpha01

10 września 2024 r.

Używaj stabilnej wersji 1.5.0.

Wersja 1.4.0

Wersja 1.4.1

27 sierpnia 2024 r.

Publikacja androidx.media3:media3-*:1.4.1 Wersja 1.4.1 zawiera te zmiany.

  • ExoPlayer:
    • Asynchroniczne obsługiwanie wywołań zwrotnych wstępnego wczytywania w PreloadMediaSource (#1568).
    • Zezwalaj na odtwarzanie niezależnie od czasu buforowania, gdy ładowanie 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 zapewnić ich prawidłowe dziedziczenie z węzłów nadrzędnych z wartościami procentowymi tts:fontSize.
    • Naprawiono IndexOutOfBoundsException w LegacySubtitleUtil z powodu nieprawidłowej obsługi przypadku, w którym żądana godzina rozpoczęcia danych wyjściowych jest większa lub równa końcowej godzinie zdarzenia w Subtitle (#1516).
  • DRM:
    • Naprawiono błąd android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE na urządzeniach z interfejsem API w wersji 31 lub nowszej, na których odtwarzane są treści Widevine L1. Ten błąd jest spowodowany niepełną implementacją metody MediaDrm.requiresSecureDecoder frameworka (#1603).
  • Skutek:
    • Dodaj metodę release() do GlObjectsProvider.
  • Sesja:
    • Przekształć dwukrotne kliknięcie KEYCODE_HEADSETHOOK w działanie „przejdź do następnego”, zgodnie z dokumentacją (#1493).
    • Traktuj KEYCODE_HEADSETHOOK jako polecenie „odtwarzaj” w MediaButtonReceiver, gdy decydujesz, czy je zignorować, aby uniknąć ForegroundServiceDidNotStartInTimeException (#1581).
  • Rozszerzenie RTSP:
    • Pomijanie nieprawidłowych opisów multimediów podczas analizowania SDP (#1087).

Wersja 1.4.0

25 lipca 2024 r.

Publikacja androidx.media3:media3-*:1.4.0 Wersja 1.4.0 zawiera te zmiany.

  • Biblioteka wspólna:
    • Przekazywanie domniemanych wywołań funkcji seek bez działania do chronionych metod BasePlayer.seekTo()SimpleBasePlayer.handleSeek() zamiast ich ignorowania. Jeśli implementujesz te metody w odtwarzaczu niestandardowym, może być konieczne obsłużenie tych dodatkowych wywołań za pomocą mediaItemIndex == C.INDEX_UNSET.
    • Usunięcie zależności kompilacji od ulepszonego odcukrzania kodu Java 8 (#1312).
    • Upewnij się, że czas trwania przekazany do MediaItem.Builder.setImageDurationMs() jest ignorowany w przypadku elementu MediaItem, który nie jest obrazem (zgodnie z dokumentacją).
    • Dodaj Format.customData, aby przechowywać dostarczone przez aplikację niestandardowe informacje o instancjach Format.
  • ExoPlayer:
    • Dodaj BasePreloadManager, które koordynują 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óre używa PreloadMediaSource do wstępnego wczytywania do pamięci próbek multimediów ze źródeł i używa liczby całkowitej rankingData, która wskazuje indeks elementu w interfejsie.
    • Dodaj PlayerId do większości metod LoadControl, aby umożliwić implementacjom LoadControl obsługę wielu graczy.
    • Usuń Buffer.isDecodeOnly()C.BUFFER_FLAG_DECODE_ONLY. Nie musisz ustawiać tej flagi, ponieważ renderery i dekodery będą pomijać bufory na podstawie sygnatury czasowej. Niestandardowe implementacje Renderer powinny sprawdzać, czy czas buforowania wynosi co najmniej BaseRenderer.getLastResetPositionUs(), aby określić, czy należy wyświetlić próbkę. Niestandardowe implementacje SimpleDecoder mogą w razie potrzeby sprawdzać isAtLeastOutputStartTimeUs() lub oznaczać inne bufory symbolem DecoderOutputBuffer.shouldBeSkipped, aby je pominąć.
    • Zezwól na zwracanie wartości null przez funkcję TargetPreloadStatusControl.getTargetPreloadStatus(T), aby wskazać, że nie należy wstępnie wczytywać elementu MediaSource z podanym elementem rankingData.
    • Dodano remove(MediaSource) do BasePreloadManager.
    • Dodaj reset() do BasePreloadManager, aby zwolnić wszystkie źródła wstrzymania, zachowując instancję menedżera wstępnego wczytywania.
    • Dodaj ExoPlayer.setPriority() (i Builder.setPriority()), aby zdefiniować wartość priorytetu używaną w PriorityTaskManager i w przypadku ważności MediaCodec od interfejsu API 35.
    • Rozwiązaliśmy problem z aktualizacją czasu ostatniego ponownego buforowania, który powodował nieprawidłowy klucz bs (brak bufora) w CMCD (#1124).
    • Dodaj znak PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) , aby wskazać, że źródło zostało wczytane do końca. Umożliwia to implementacjom DefaultPreloadManager i niestandardowym PreloadMediaSource.PreloadControl wstępne wczytanie następnego źródła lub podjęcie innych działań.
    • Naprawiono błąd, który powodował, że pomijanie ciszy na końcu elementów mogło wywoływać wyjątek odtwarzania.
    • Dodaj clear do PreloadMediaSource, aby odrzucić okres wstępnego wczytywania.
    • Dodaj nowy kod błędu PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, który jest używany w przypadku odzyskiwania zasobów kodeka na potrzeby zadań o wyższym priorytecie.
    • Umożliwienie wczytywania reklam przed filmem przed zakończeniem przygotowywania początkowych treści multimedialnych (#1358).AdsMediaSource
    • Naprawiliśmy błąd, który powodował, że odtwarzanie przenosiło się do STATE_ENDED podczas ponownego przygotowywania transmisji na żywo DASH z wieloma okresami po usunięciu z pliku manifestu pierwotnego okresu.
    • Zmień nazwę onTimelineRefreshed() na onSourcePrepared()onPrepared() na onTracksSelected()PreloadMediaSource.PreloadControl. Zmień też nazwy IntDefs w DefaultPreloadManager.Stage.
    • Dodano eksperymentalną obsługę dynamicznego planowania, aby lepiej dopasowywać pracę do cykli wybudzania procesora i opóźniać wybudzanie do momentu, w którym renderery mogą kontynuować działanie. Możesz to włączyć za pomocą experimentalSetDynamicSchedulingEnabled() podczas konfigurowania instancji ExoPlayera.
    • Dodaj Renderer.getDurationToProgressUs(). Renderer może zaimplementować tę metodę, aby zwrócić do ExoPlayera czas, o który odtwarzanie musi się przesunąć, aby renderowanie mogło się dalej odbywać. Jeśli ExoPlayer jest ustawione na experimentalSetDynamicSchedulingEnabled(), ExoPlayer wywoła tę metodę podczas obliczania czasu potrzebnego 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 po otrzymaniu tych wywołań zwrotnych, a jeśli ExoPlayer jest ustawiony z experimentalSetDynamicSchedulingEnabled(), ExoPlayer zaplanuje pętlę roboczą, ponieważ renderery mogą robić postępy.
    • Zamiast poszczególnych parametrów używaj klasy danych dla metod LoadControl.
    • Dodaj ExoPlayer.isReleased(), aby sprawdzić, czy wywołano funkcję Exoplayer.release().
    • Dodaj ExoPlayer.Builder.setMaxSeekToPreviousPositionMs(), aby skonfigurować maksymalną pozycję, dla której seekToPrevious() szuka poprzedniego elementu (#1425).
    • Naprawiono niektóre niespójności związane z aktywnością audio, np. brak zgłaszania pełnej lub tymczasowej utraty aktywności audio, gdy odtwarzacz jest wstrzymany (#1436).
    • Rozwiązano potencjalne problemy IndexOutOfBoundsException spowodowane przez ekstraktory zgłaszające dodatkowe ścieżki po początkowym kroku przygotowania (#1476).
    • Effects w ExoPlayer.setVideoEffect() otrzyma sygnatury czasowe z usuniętym przesunięciem renderera (#1098).
    • Naprawiliśmy potencjalny błąd IllegalArgumentException podczas obsługi błędu odtwarzacza, który wystąpił podczas odczytywania kolejnego elementu na playliście (#1483).
  • Transformer:
    • Dodaj znaki audioConversionProcessvideoConversionProcess do ExportResult, aby wskazać, jak powstała odpowiednia ścieżka w pliku wyjściowym.
    • Złagodzenie sprawdzania poziomu H.264 w przypadku optymalizacji przycinania.
    • Dodaj obsługę przełączania między wejściowymi multimediami SDR i HDR w sekwencji.
    • Dodanie obsługi efektów audio na poziomie kompozycji.
    • Dodaj obsługę transkodowania obrazów Ultra HDR na filmy HDR.
    • Rozwiązaliśmy problem, który powodował, że po zresetowaniu i ponownym użyciu funkcja DefaultAudioMixer nie zwracała prawidłowej liczby bajtów.
    • Obejście błędu dekodera, w którym liczba kanałów audio była ograniczona do stereo podczas obsługi danych wejściowych PCM.
    • Podczas wybierania ścieżek w ExoPlayerAssetLoader zignoruj ograniczenia dotyczące liczby kanałów audio, ponieważ mają one zastosowanie tylko w przypadku odtwarzania.
    • Zastąp interfejs androidx.media3.transformer.Muxer interfejsem androidx.media3.muxer.Muxer i usuń androidx.media3.transformer.Muxer.
    • Naprawiono wczytywanie obrazów HEIC ze schematów identyfikatorów URI treści. (#1373).
    • Dostosuj czas trwania ścieżki audio w AudioGraphInput, aby poprawić synchronizację dźwięku i obrazu.
    • Usuń pole ExportResult.processedInputs. Jeśli używasz tego pola do podawania szczegółów kodeka, użyj zamiast niego pola DefaultDecoderFactory.listener. W przypadku wyjątku kodeka szczegóły kodeka będą dostępne w ExportException.codecInfo.
  • Ekstraktory:
    • MPEG-TS: wprowadź zmianę, upewniając się, że ostatnia klatka jest renderowana przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wprowadzono poprawki rozwiązujące problemy, które pojawiły się w strumieniach HLS zawierających tylko klatki I(#1150) i strumieniach HLS w formacie H.262 (#1126).
    • MP3: preferuj rozmiar danych z ramki Info zamiast rozmiaru zgłoszonego przez strumień bazowy (np. rozmiar pliku lub nagłówek HTTP Content-Length). Pomaga to wykluczyć dane nieodtwarzalnych zwiastunów (np. okładki albumów) z obliczeń wyszukiwania ze stałą szybkością transmisji, co zwiększa dokładność wyszukiwania (#1376).
    • MP3: używaj liczby klatek i innych danych w klatce Info (jeśli występuje) do obliczania średniej szybkości transmisji bitów w przypadku wyszukiwania przy stałej szybkości transmisji bitów, zamiast ekstrapolować na podstawie szybkości transmisji bitów klatki po klatce Info, która może być sztucznie mała, np. klatka PCUT (#1376).
    • Poprawiono wyodrębnianie formatu audio PCM w kontenerach AVI.
  • Dźwięk:
    • Naprawiono atrybuty kodowania DTS:X Profile 2 w przypadku odtwarzania passthrough (#1299).
    • W przypadku odtwarzania przeniesionego zresetuj pole śledzenia zakończenia strumienia w DefaultAudioSink przed wywołaniem AudioTrack.stop(), aby AudioTrack.StreamEventCallback#onPresentationEnded prawidłowo określał, kiedy wszystkie oczekujące dane zostały odtworzone.
    • Usunięto błąd w SilenceSkippingAudioProcessor, w którym przejścia między różnymi formatami audio (np. stereo na mono) mogą powodować zgłaszanie wyjątku przez procesor (#1352).
    • Zaimplementuj MediaCodecAudioRenderer.getDurationToProgressUs(), aby odtwarzacz ExoPlayer dynamicznie planował główną pętlę roboczą na czas, w którym komponent MediaCodecAudioRenderer może kontynuować działanie.
  • Film:
    • Rozwiązanie problemu polegającego na tym, że przycisk Listener.onRenderedFirstFrame() pojawiał się zbyt wcześnie podczas przełączania urządzeń w trakcie odtwarzania.
    • Poprawiono logikę rezerwową dekodera Dolby Vision, aby w razie potrzeby używać zgodnego dekodera AV1 (#1389).
    • Rozwiązanie problemu z wyjątkiem kodeka, który może być spowodowany włączeniem renderowania wideo w trakcie odtwarzania.
  • Tekst:
    • Rozwiązaliśmy problem, który powodował pomijanie napisów rozpoczynających się przed pozycją wyszukiwania. Ten problem pojawił się dopiero w Media3 w wersji 1.4.0-alpha01.
    • Zmień domyślne działanie analizowania napisów, aby odbywało się podczas wyodrębniania, a nie podczas renderowania (różnicę między wyodrębnianiem a renderowaniem znajdziesz na diagramie architektury ExoPlayera).
      • Tę zmianę można zastąpić, wywołując oba MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)TextRenderer.experimentalSetLegacyDecodingEnabled(true). Informacje o tym, jak zintegrować te komponenty z instancją ExoPlayer, znajdziesz w dokumentacji dotyczącej dostosowywania. Te metody (i cała obsługa starszego dekodowania napisów) zostaną usunięte w przyszłej wersji.
      • Aplikacje z niestandardowymi implementacjami SubtitleDecoder muszą je zaktualizować, aby zamiast nich implementować SubtitleParser (a SubtitleParser.Factory zamiast SubtitleDecoderFactory).
    • PGS: poprawiono dekodowanie długości serii, aby rozwiązać problem z 0 jako indeksem koloru zamiast dosłownej wartości koloru (#1367).
    • CEA-708: ignoruj wartość rowLock. Specyfikacja CEA-708-E S-2023 mówi, że zarówno rowLock, jak i columnLock powinny być traktowane jako prawdziwe, niezależnie od wartości obecnych w strumieniu (obsługa columnLock nie jest zaimplementowana, więc w praktyce zawsze przyjmuje się wartość false).
      • Ta informacja była pierwotnie zawarta w informacjach o wersji 1.3.0-alpha01, ale zmiana została przypadkowo cofnięta przed wydaniem wersji 1.3.0-rc01. Problem został już rozwiązany, więc zmiana jest ponownie widoczna.
    • CEA-708: unikaj dodawania duplikatów znaków nowego wiersza przez naiwną obsługę polecenia „ustaw lokalizację pióra” w ExoPlayerze (#1315).
    • Naprawiono IllegalArgumentException z LegacySubtitleUtil, gdy przykładowe napisy WebVTT nie zawierają wskazówek, np. w ramach strumienia DASH (#1516).
  • Metadane:
    • Popraw mapowanie tagów sortowania MP4 na tagi 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).
    • Poprawiono odczyt tagów numerycznych gnre (gatunek) i tmpo (tempo) w plikach MP4 (/iTunes), gdy wartość ma więcej niż 1 bajt.
    • Przekazywanie ramki ID3 TCON do MediaMetadata.genre (#1305).
  • Obraz:
    • Dodano obsługę nieskwadratowych siatek miniatur DASH (#1300).
    • Dodanie obsługi formatu AVIF w przypadku interfejsu API w wersji 34 lub nowszej.
    • Zezwól na null jako parametr dla ExoPlayer.setImageOutput(), aby wyczyścić wcześniej ustawiony parametr ImageOutput.
  • DataSource:
    • Zaimplementuj obsługę identyfikatorów URI zasobów pierwotnych android.resource://package/id, gdzie package jest inne niż pakiet bieżącej aplikacji. Wcześniej nie było to udokumentowane, ale jest to wydajniejszy sposób uzyskiwania dostępu do zasobów w innym pakiecie niż za pomocą nazwy.
    • Sprawdź, czy url jest niepusty w konstruktorach DataSpec. Ten parametr został już oznaczony jako niepusty.
    • Umożliwia ByteArrayDataSource przekształcenie identyfikatora URI w tablicę bajtów podczas open() zamiast zakodowania na stałe w momencie tworzenia (#1405).
  • DRM:
    • Zezwalaj na ustawianie LoadErrorHandlingPolicy w przypadku DefaultDrmSessionManagerProvider (#1271).
  • Skutek:
    • Obsługa wielu zmian szybkości w ramach tego samego EditedMediaItem lub Composition w SpeedChangeEffect.
    • Obsługa danych wyjściowych HLG i PQ z wejściowych map bitowych ultra HDR.
    • Dodaliśmy obsługę EGL_GL_COLORSPACE_BT2020_HLG_EXT, która poprawia dane wyjściowe HLG w funkcjach ExoPlayer.setVideoEffect i Transformer.DebugSurfaceView.
    • Zaktualizuj implementację macierzy nakładki, aby była zgodna z dokumentacją, zamieniając wartości x i y zastosowane w setOverlayFrameAnchor(). Jeśli używasz OverlaySettings.Builder.setOverlayFrameAnchor(), zamień wartości x i y, mnożąc je przez -1.
    • Naprawiono błąd, w którym TimestampWrapper ulegał awarii podczas używania z ExoPlayer#setVideoEffects (#821).
    • Zmień domyślną przestrzeń roboczą kolorów SDR z kolorów liniowych na elektryczne wideo SDR BT.709. Podaj też trzecią opcję, aby zachować oryginalną przestrzeń kolorów.
    • Zezwól na określanie nieokreślonej kolejności osi Z w przypadku EditedMediaItemSequences (#1055).
    • Utrzymanie spójnego zakresu luminancji w różnych treściach HDR (korzysta z zakresu HLG).
    • Dodaj obsługę nakładek Ultra HDR (bitmapowych) na treści HDR.
    • Zezwalaj na używanie efektów SeparableConvolution przed API 26.
    • Usuń nieużywane OverlaySettings.useHdr, ponieważ zakres dynamiczny nakładki i ramki musi być zgodny.
    • Dodaliśmy obsługę HDR w przypadku TextOverlay. Jasność nakładki tekstowej można dostosować za pomocą parametru OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Rozszerzenie IMA:
    • Promowanie interfejsu API, który jest wymagany do odtwarzania w aplikacjach strumieni reklam DAI, do wersji stabilnej.
    • Dodaj replaceAdTagParameters(Map <String, String>) do ImaServerSideAdInsertionMediaSource.AdLoader, co umożliwi zastępowanie parametrów tagu reklamy w czasie działania.
    • Naprawiono błąd polegający na tym, że funkcja VideoAdPlayer.VideoAdPlayerCallback.onError() nie była wywoływana, gdy podczas odtwarzania reklamy wystąpił błąd odtwarzacza (#1334).
    • Zaktualizowano pakiet IMA SDK do wersji 3.33.0, aby naprawić NullPointerException podczas korzystania z data:// adresów URI tagów reklam (#700).
  • Sesja:
    • Zmień domyślną wartość CommandButton.enabled na true i upewnij się, że wartość może pozostać fałszywa w przypadku kontrolerów, nawet jeśli powiązane polecenie jest dostępne.
    • Dodaj stałe wartości ikon dla CommandButton, które mają być używane zamiast niestandardowych zasobów ikon.
    • Dodaj MediaSessionService.isPlaybackOngoing(), aby umożliwić aplikacjom sprawdzanie, czy usługa musi zostać zatrzymana w onTaskRemoved() (#1219).
    • Dodaj MediaSessionService.pauseAllPlayersAndStopSelf(), który wygodnie umożliwia wstrzymanie odtwarzania wszystkich sesji i wywołanie stopSelf() w celu zakończenia cyklu życia MediaSessionService.
    • Zastąp MediaSessionService.onTaskRemoved(Intent), aby zapewnić bezpieczną domyślną implementację, która utrzymuje usługę działającą na pierwszym planie, jeśli odtwarzanie jest w toku, lub zatrzymuje usługę w innych przypadkach.
    • Ukrywanie paska przewijania w powiadomieniu o multimediach w przypadku transmisji na żywo przez nieustawianie czasu trwania w metadanych sesji platformy (#1256).
    • Dopasuj konwersję MediaMetadata do MediaDescriptionCompat, aby używać tej samej preferowanej kolejności i logiki podczas wybierania właściwości metadanych co w przypadku media1.
    • Dodano MediaSession.sendError(), który umożliwia wysyłanie błędów niekrytycznych do kontrolera Media3. Gdy używasz kontrolera powiadomień (patrz MediaSession.getMediaNotificationControllerInfo()), błąd niestandardowy służy do aktualizowania wartości PlaybackState sesji platformy do stanu błędu z podanymi informacjami o błędzie (#543).
    • Dodaj MediaSession.Callback.onPlayerInteractionFinished(), aby informować sesje, kiedy zakończyła się seria interakcji gracza z określonym kontrolerem.
    • Dodaj SessionError i użyj go w SessionResultLibraryResult 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() w Media3 do MediaSession[Builder].setSessionExtras() w kontrolerze Media1.PlaybackStateCompat.getExtras()
    • Mapuj błędy krytyczne i niekrytyczne na sesję platformy i z niej. A PlaybackException jest mapowany na stan błędu krytycznego PlaybackStateCompat. Wartość SessionError wysłana do kontrolera powiadomień o multimediach z wartością MediaSession.sendError(ControllerInfo, SessionError) jest mapowana 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.
    • Zezwól na ustawianie aktywności sesji dla każdego kontrolera, aby zastąpić globalną aktywność sesji. Aktywność sesji można zdefiniować dla kontrolera w momencie połączenia, tworząc obiekt ConnectionResult z parametrem AcceptedResultBuilder.setSessionActivivty(PendingIntent). Po nawiązaniu połączenia aktywność sesji można aktualizować za pomocą MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • Ulepszyliśmy replikację błędów wywołań funkcji MediaLibrarySession.Callback. Replikację błędów można teraz skonfigurować za pomocą symbolu MediaLibrarySession.Builder.setLibraryErrorReplicationMode(), aby wybrać typ błędu lub zrezygnować z replikacji błędów, która jest domyślnie włączona.
  • UI:
    • Dodanie obsługi wyświetlania obrazów w PlayerView po podłączeniu do ExoPlayer (#1144).
    • Dodanie możliwości dostosowywania różnych ikon w PlayerControlView za pomocą atrybutów XML, aby umożliwić stosowanie różnych elementów rysowalnych w poszczególnych instancjach PlayerControlView, zamiast globalnych zastąpień (#1200).PlayerView
    • Obejście błędu platformy powodującego rozciągnięcie lub przycięcie filmu podczas używania interfejsu SurfaceView w komponencie AndroidView w API 34 (#1237).
  • Pobrane:
    • Upewnij się, że DownloadHelper nie powoduje wycieku nieopublikowanych 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 usłudze CronetDataSource. W niektórych wersjach Croneta żądanie przekazywane przez wywołanie zwrotne nie zawsze jest takie samo. Powoduje to, że wywołanie zwrotne nie jest wykonywane, a żądanie przekracza limit czasu (https://issuetracker.google.com/328442628).
  • Rozszerzenie HLS:
    • Naprawiliśmy błąd, który powodował, że oczekujące próbki EMSG czekające na przerwę były delegowane w HlsSampleStreamWrapper z nieprawidłowym przesunięciem, co powodowało błąd IndexOutOfBoundsException lub IllegalArgumentException (#1002).
    • Usunięto błąd, który powodował, że playlisty inne niż główne były ciągle przeładowywane w przypadku strumieni LL-HLS (#1240).
    • Rozwiązanie problemu polegającego na tym, że włączenie CMCD w przypadku HLS z segmentami inicjującymi powodowało wystąpienie błędów Source Error i IllegalArgumentException.
    • Usunięto błąd, który powodował, że playlisty odtwarzane w tle nie były odświeżane podczas odtwarzania na żywo (#1240).
    • Naprawiono błąd, w którym włączenie CMCD w przypadku transmisji na żywo HLS powodowało ArrayIndexOutOfBoundsException (#1395).
  • Rozszerzenie DASH:
    • Usunięto błąd, który powodował, że ponowne przygotowanie transmisji na żywo z wieloma okresami mogło zgłosić wyjątek IndexOutOfBoundsException (#1329).
    • Dodanie obsługi adresów URL licencji dashif:Laurl (#1345).
  • Rozszerzenie Cast:
    • Naprawiono błąd, który powodował konwersję tytułu albumu MediaQueueItem na wykonawcę w elemencie multimedialnym Media3 (#1255).
  • Narzędzia testowe:
    • Zaimplementuj funkcje onInit()onRelease()FakeRenderer.
    • Zmień metody TestPlayerRunHelper.runUntil()/playUntil(), aby w przypadku błędów niekrytycznych (np. zgłaszanych do AnalyticsListener.onVideoCodecError()) zwracały błąd. Aby wyłączyć to działanie, użyj nowego łańcucha metod TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX().
  • Aplikacja w wersji demonstracyjnej:
    • Użyj DefaultPreloadManager w aplikacji demonstracyjnej z krótkimi formami.
    • Umożliwia ustawianie trybu powtarzania za pomocą argumentów Intent z wiersza poleceń (#1266).
    • Używać HttpEngineDataSource jako HttpDataSource, jeśli jest to obsługiwane przez urządzenie.
  • Usuń wycofane symbole:
    • Usuń CronetDataSourceFactory. Zamiast niej używaj zasady CronetDataSource.Factory.
    • Usuń niektóre konstruktory DataSpec. Użyj w zamian zasady DataSpec.Builder.
    • Usuń formę płatności setContentTypePredicate(Predicate) z usług DefaultHttpDataSource, OkHttpDataSourceCronetDataSource. Zamiast tego użyj odpowiedniej metody na każdej platformie XXXDataSource.Factory.
    • Usuń konstruktory OkHttpDataSourceOkHttpDataSourceFactory. Zamiast niej używaj zasady OkHttpDataSource.Factory.
    • Usuń PlayerMessage.setHandler(Handler). Zamiast niej używaj zasady setLooper(Looper).
    • Usuń pole Timeline.Window.isLive. Zamiast tego użyj metody isLive().
    • Usuń konstruktory DefaultHttpDataSource. Zamiast niej używaj zasady DefaultHttpDataSource.Factory.
    • Usuń DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Zamiast niej używaj zasady DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS.
    • Usuń MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Użyj w zamian zasady MediaCodecInfo.canReuseCodec(Format, Format).
    • Usuń metody DrmSessionManager.DUMMYgetDummyDrmSessionManager(). Zamiast niej używaj 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ą argument DecoderReuseEvaluation.
    • Usuń stałe RendererSupport.FormatSupport IntDef i FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE, FORMAT_UNSUPPORTED_TYPE. Zamiast tego używaj odpowiednich stałych i adnotacji IntDef 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()static Foo fromBundle(Bundle) w przypadku każdego typu.

Wersja 1.4.0-rc01

10 lipca 2024 r.

Używaj stabilnej wersji 1.4.0.

Wersja 1.4.0-beta01

26 czerwca 2024 r.

Używaj stabilnej wersji 1.4.0.

Wersja 1.4.0-alpha02

7 czerwca 2024 r.

Używaj stabilnej wersji 1.4.0.

Wersja 1.4.0-alpha01

17 kwietnia 2024 r.

Używaj stabilnej wersji 1.4.0.

Wersja 1.3.0

Wersja 1.3.1

11 kwietnia 2024 r.

Publikacja androidx.media3:media3-*:1.3.1 Wersja 1.3.1 zawiera te zmiany.

  • Biblioteka wspólna:
    • Dodaj Format.labels, aby zezwolić na zlokalizowane lub inne alternatywne etykiety.
  • ExoPlayer:
    • Rozwiązaliśmy problem polegający na tym, że po ponownym wstępnym wczytaniu PreloadMediaPeriod nie zachowywał strumieni.
    • Zastosuj odpowiedni atrybut TrackSelectionResult do okresu odtwarzania podczas ponownego wyboru utworu.
    • Rozpoczynanie renderowania z wczesnym włączaniem dopiero po przesunięciu okresu odtwarzania podczas przechodzenia między elementami multimedialnymi (#1017).
    • Dodanie brakującego typu zwracanego do reguły ProGuard -keepclasseswithmembers dla DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformer:
    • Dodano obejście wyjątku zgłaszanego z powodu braku obsługi MediaMuxer ujemnych sygnatur czasowych prezentacji przed API 30.
  • Wybór utworu:
    • DefaultTrackSelector: preferuj ścieżki wideo z „rozsądną” liczbą klatek na sekundę (>=10 kl./s) od tych z niższą lub nieustawioną liczbą klatek na sekundę. Dzięki temu odtwarzacz wybiera „prawdziwą” ścieżkę wideo w plikach MP4 wyodrębnionych ze zdjęć w ruchu, które mogą zawierać 2 ścieżki HEVC, z których jedna ma wyższą rozdzielczość, ale bardzo małą liczbę klatek (#1051).
  • Ekstraktory:
    • Rozwiązaliśmy problem polegający na tym, że podczas odczytywania z plików WAV fragmentów o nieparzystych rozmiarach nie pomijano dopełnienia (#1117).
    • MP3: wypełnij Format.averageBitrate na podstawie ramek metadanych, takich jak XING i VBRI.
    • MPEG-TS: wycofanie zmiany, która miała zapewnić renderowanie ostatniej klatki przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wynika to ze zmiany, która powoduje nowe problemy ze strumieniami HLS zawierającymi tylko klatki I (#1150) i strumieniami HLS H.262 (#1126).
  • Dźwięk:
    • Zezwól na przywrócenie renderera przez wyłączenie odciążania, jeśli nie uda się zainicjować ścieżki audio w trybie odciążania.
  • Film:
    • Dodano obejście problemu z urządzeniami Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie H265 o częstotliwości 60 klatek na sekundę są oznaczane jako nieobsługiwane.
    • Dodano obejście, które zapewnia, że pierwsza klatka jest zawsze renderowana podczas tunelowania, nawet jeśli urządzenie nie robi tego automatycznie, jak wymaga tego interfejs API (#1169). (#966).
    • Rozwiązano problem z obsługą informacji o kolorach HDR, która powodowała nieprawidłowe działanie kodeka i uniemożliwiała adaptacyjne przełączanie formatów w przypadku ścieżek wideo SDR (#1158).
  • Tekst:
    • WebVTT: zapobieganie tworzeniu 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 MediaDrm framework zamiast ResourceBusyException lub NotProvisionedException na niektórych urządzeniach z Androidem 14 (#1145).
  • Skutek:
    • Ulepszone mapowanie tonów PQ na SDR dzięki konwersji przestrzeni kolorów.
  • Sesja:
    • Rozwiązaliśmy problem polegający na tym, że bieżąca pozycja cofała się, gdy kontroler zastępował bieżący element (#951).
    • Rozwiązanie problemu polegającego na tym, że MediaMetadata z tylko niepustym extras nie jest przesyłany między kontrolerami multimediów a sesjami (#1176).
  • UI:
    • W przypadku, gdy Locale nie może zidentyfikować nazwy wyświetlanej (#988), użyj nazwy języka ścieżki audio.
  • Rozszerzenie DASH:
    • Wypełnij wszystkie elementy Label z pliku manifestu w Format.labels (#1054).
  • Rozszerzenie RTSP:
    • Pomijanie pustych wartości informacji o sesji (i-tagów) podczas analizowania SDP (#1087).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Domyślnie wyłącz rozszerzenie MIDI jako zależność lokalną, ponieważ wymaga ono skonfigurowania dodatkowego repozytorium Maven. Użytkownicy, którzy potrzebują tego modułu z lokalnej zależności, mogą go ponownie włączyć.

Wersja 1.3.0

6 marca 2024 roku

Publikacja androidx.media3:media3-*:1.3.0 Wersja 1.3.0 zawiera te zmiany.

  • Biblioteka wspólna:
    • Wprowadź obsługę identyfikatorów URI surowych zasobów android.resource://package/[type/]name, w których 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 wdrożone.
    • Normalizuj typy MIME ustawione przez kod aplikacji lub odczytane z multimediów, aby były w całości zapisane małymi literami.
    • Określaj reklamy za pomocą pełnego pola MediaItem zamiast pojedynczego pola Uri w polu AdPlaybackState.
    • Zwiększ wartość minSdk do 19 (Android KitKat). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX i jest wymagane, abyśmy mogli uaktualnić nasze zależności AndroidX do najnowszych wersji.
    • Wypełnij zarówno pole artworkUri, jak i artworkDataMediaMetadata.Builder.populate(MediaMetadata), jeśli co najmniej jedno z nich nie ma wartości null (#964).
  • ExoPlayer:
    • Dodaj PreloadMediaSourcePreloadMediaPeriod, które umożliwiają aplikacjom wstępne wczytywanie źródła treści multimedialnych w określonej pozycji początkowej przed odtwarzaniem. PreloadMediaSource przygotowuje źródło multimediów do otrzymania Timeline, przygotowuje i buforuje okres w danej pozycji początkowej, wybiera ścieżki i wczytuje dane multimedialne dla tego okresu. Aplikacje kontrolują postęp wstępnego wczytywania, implementując PreloadMediaSource.PreloadControl, i ustawiają wstępnie wczytane źródło w odtwarzaczu do odtwarzania.
    • Dodaj ExoPlayer.setImageOutput, które umożliwia aplikacjom ustawianie ImageRenderer.ImageOutput.
    • DefaultRenderersFactory domyślnie udostępnia graczowi ImageRenderer z wartościami null ImageOutputImageDecoder.Factory.DEFAULT.
    • Emituj zdarzenie Player.Listener.onPositionDiscontinuity, gdy pominięto ciszę (#765).
    • Dodanie eksperymentalnej obsługi analizowania napisów podczas wyodrębniania. Możesz włączyć tę funkcję za pomocą MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Obsługa adaptacyjnych źródeł multimediów za pomocą PreloadMediaSource.
    • Zaimplementuj HttpEngineDataSource, czyli HttpDataSource za pomocą interfejsu HttpEngine API.
    • Zapobiegaj tworzeniu podklas CompositeSequenceableLoader. Ten komponent był wcześniej rozszerzalny, ale nigdy nie został w bibliotece podzielony na podklasy. Dostosowywanie można przeprowadzić, opakowując instancję za pomocą wzorca dekoratora i wdrażając niestandardowy CompositeSequenceableLoaderFactory.
    • Rozwiązaliśmy problem polegający na tym, że powtórzenie tego samego czasu powodowało wyczyszczenie metadanych tego elementu (#1007).
    • Zmiana nazw metod experimentalSetSubtitleParserFactory na BundledChunkExtractor.FactoryDefaultHlsExtractorFactory na setSubtitleParserFactory oraz zablokowanie przekazywania null. Użyj nowych metod experimentalParseSubtitlesDuringExtraction(boolean), aby kontrolować zachowanie analizowania.
    • Dodano obsługę dostosowywania znaku SubtitleParser.Factory używanego podczas wyodrębniania. Można to osiągnąć za pomocą MediaSource.Factory.setSubtitleParserFactory().
    • Dodaj prefiks źródła do wszystkich pól Format.id wygenerowanych z MergingMediaSource. Pomaga to określić, które źródło wygenerowało Format (#883).
    • Poprawiono wyrażenie regularne używane do weryfikacji niestandardowych nazw kluczy danych klienta Common Media Client Data (CMCD) poprzez zmodyfikowanie go tak, aby sprawdzało tylko łącznik (#1028).
    • Zapobiegaj podwójnemu kodowaniu parametrów zapytania CMCD (#1075).
  • Transformer:
    • Dodano obsługę spłaszczania filmów w zwolnionym tempie w formacie H.265/HEVC SEF.
    • Zwiększanie szybkości transkodowania, zwłaszcza w przypadku zmian typu „usuń film”.
    • Dodaj interfejs API, aby mieć pewność, że plik wyjściowy zaczyna się od klatki wideo. Może to zwiększyć zgodność wyników operacji przycinania z implementacjami odtwarzaczy, które nie wyświetlają pierwszej klatki filmu, dopóki nie zostanie osiągnięta sygnatura czasowa prezentacji (#829).
    • Dodano obsługę optymalizacji operacji przycinania pojedynczych zasobów MP4.
    • Dodaliśmy obsługę, która zapewnia, że klatka wideo ma pierwszą sygnaturę czasową w pliku wyjściowym. Poprawiono pliki wyjściowe zaczynające się od czarnej ramki na odtwarzaczach opartych na iOS (#829).
  • Wybór utworu:
    • Dodaj DefaultTrackSelector.selectImageTrack, aby włączyć wybieranie ścieżki obrazu.
    • Dodaj TrackSelectionParameters.isPrioritizeImageOverVideoEnabled, aby określić, czy wybrać ścieżkę obrazu, jeśli dostępne są zarówno ścieżka obrazu, jak i ścieżka wideo. Wartością domyślną jest false, co oznacza, że priorytetem jest wybór ścieżki wideo.
  • Ekstraktory:
    • Dodano do ekstraktora MP4 dodatkowe parsowanie AV1C, aby pobierać wartości ColorInfo.colorSpace, ColorInfo.colorTransferColorInfo.colorRange (#692).
    • MP3: używaj wyszukiwania ze stałą szybkością transmisji (CBR) w przypadku plików z nagłówkiem Info (odpowiednik nagłówka Xing w przypadku CBR). Wcześniej używaliśmy tabeli seek z nagłówka Info, ale powoduje to mniej precyzyjne przewijanie niż w przypadku, gdy ją ignorujemy i zakładamy, że plik jest CBR.
    • MPEG2-TS: dodano obsługę DTS, DTS-LBR i DTS:X Profile2 (#275).
    • Wyodrębnianie typów audio z deskryptorów TS i mapowanie ich na flagi ról, co pozwala użytkownikom podejmować bardziej świadome decyzje dotyczące wyboru ścieżki audio (#973).
  • Dźwięk:
    • Ulepszono algorytm pomijania ciszy dzięki płynnemu zwiększaniu głośności. Zachowano minimalną ciszę i bardziej naturalne czasy trwania ciszy (#7423).
    • Bardziej deterministyczne zgłaszanie pominiętego wyciszenia (#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ą wstawić niestandardowy element VideoFrameProcessor.Factory, mogą utworzyć instancję elementu CompositingVideoSinkProvider, który używa niestandardowego elementu VideoFrameProcessor.Factory, i przekazać dostawcę ujścia wideo do elementu MediaCodecVideoRenderer.
  • Tekst:
    • Naprawiono serializację wskazówek bitmapowych, 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 mówi, że zarówno rowLock, jak i columnLock powinny być traktowane jako prawdziwe, niezależnie od wartości obecnych w strumieniu (obsługa columnLock nie jest zaimplementowana, więc w praktyce zawsze przyjmuje się wartość false).
  • Obraz:
    • Dodaliśmy obsługę miniatur DASH. Obrazy w siatce są przycinane, a poszczególne miniatury są dostarczane ImageOutput w pobliżu czasu ich wyświetlania.
  • DRM:
    • Odtwarzaj od razu domyślnie niezaszyfrowane próbki „clear lead” w treściach z DRM, nawet jeśli klucze do późniejszych zaszyfrowanych próbek nie są jeszcze gotowe. Może to prowadzić do przerw w odtwarzaniu, jeśli klucze nie będą jeszcze gotowe, gdy pozycja odtwarzania osiągnie zaszyfrowane próbki (wcześniej odtwarzanie w tym momencie w ogóle by się nie rozpoczęło). To zachowanie można wyłączyć za pomocą polecenia MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey lub DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
      • Rozszerzenie IMA:
    • Rozwiązanie problemu polegającego na tym, że nie można odtwarzać reklam DASH i HLS bez odpowiedniego rozszerzenia pliku.
  • Sesja:
    • Wyłącz wykrywanie dwukrotnego kliknięcia w aplikacjach na telewizory (#962).
    • Rozwiązaliśmy problem, który powodował, że MediaItem.RequestMetadata zawierający tylko niepuste dodatki nie był przesyłany między kontrolerami multimediów a sesjami.
    • Dodaj konstruktor do MediaLibrarySession.Builder, który przyjmuje tylko argument Context zamiast MediaLibraryService.
  • Rozszerzenie HLS:
    • Zmniejsz widoczność HlsMediaPeriod do poziomu prywatnego pakietu. Ten typ nie powinien być bezpośrednio zależny od elementów spoza pakietu HLS.
    • Rozwiązanie problemu z wydajniejszym wyszukiwaniem początku segmentu (#1031).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Dekoder MIDI: ignoruj komunikaty zdarzeń SysEx (#710).
  • Narzędzia testowe:
    • Nie wstrzymuj odtwarzania w TestPlayerRunHelper.playUntilPosition. Test utrzymuje odtwarzanie w stanie odtwarzania, ale wstrzymuje postęp, dopóki nie będzie w stanie dodać asercji i dalszych działań.
  • Aplikacja w wersji demonstracyjnej:
    • Dodaj moduł demonstracyjny krótkich form, aby zademonstrować użycie elementu PreloadMediaSource w przypadku krótkich treści.

Wersja 1.3.0-rc01

22 lutego 2024 r.

Użyj stabilnej wersji 1.3.0.

Wersja 1.3.0-beta01

7 lutego 2024 r.

Użyj stabilnej wersji 1.3.0.

Wersja 1.3.0-alpha01

15 stycznia 2024 r.

Użyj stabilnej wersji 1.3.0.

Wersja 1.2.0

Wersja 1.2.1

9 stycznia 2024 r.

  • ExoPlayer:
    • Rozwiązaliśmy problem, który powodował, że ręczne przewijanie poza zakresem LiveConfiguration.min/maxOffset powodowało ciągłe dostosowywanie przesunięcia z powrotem do min/maxOffset.
    • Naprawiono problem z nieprawidłowym układem kanałów OPUS i VORBIS w przypadku 3, 5, 6, 7 i 8 kanałów (#8396).
    • Rozwiązaliśmy problem polegający na tym, że po przewinięciu transmisji na żywo do początku wybór ścieżki powodował nieprawidłowe rozpoczęcie transmisji w pozycji domyślnej (#9347).
    • Rozwiązaliśmy problem, w którym nowe instancje CmcdData.Factory otrzymywały ujemne wartości bufferedDurationUs ze źródeł fragmentów, co powodowało błąd IllegalArgumentException (#888).
  • Transformer:
    • Rozwiązaliśmy problem, który powodował, że koder zgłaszał błąd w momencie konfiguracji z powodu ustawienia wysokiej szybkości działania.
  • Ekstraktory:
    • Oznacz dodatkowe (nieodtwarzalne) ścieżki HEVC w zdjęciach w ruchu JPEG jako ROLE_FLAG_ALTERNATE, aby zapobiec ich automatycznemu wybieraniu do odtwarzania ze względu na wyższą rozdzielczość.
    • Poprawiono nieprawidłowe wykrywanie klatek kluczowych w strumieniach TS H264 (#864).
    • Poprawiono szacowanie czasu trwania strumieni TS dłuższych niż 47721 sekund (#855).
  • Dźwięk:
    • Poprawiono obsługę EOS w przypadku wywoływania SilenceSkippingAudioProcessor wiele razy (#712).
  • Film:
    • Dodano obejście problemu z urządzeniami Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC o częstotliwości 60 kl./s są oznaczane jako nieobsługiwane (#693).
  • Metadane:
    • Naprawiono błąd, w którym pole MediaMetadata było wypełniane tylko na podstawie komentarzy Vorbis z kluczami pisanymi wielkimi literami (#876).
    • Wyłapywanie 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:
    • Rozszerzyliśmy obejście problemu z fałszywym adresem URL licencji ClearKey https://default.url na interfejs API w wersji 33 lub nowszej (wcześniej obejście dotyczyło tylko interfejsu API w wersji 33) (#837).
    • Naprawiono ERROR_DRM_SESSION_NOT_OPENED podczas przełączania z zaszyfrowanych na niezabezpieczone treści bez urządzenia podłączonego do odtwarzacza. Błąd wystąpił z powodu nieprawidłowego użycia bezpiecznego dekodera do odtwarzania treści w formie niezaszyfrowanej.
  • Sesja:
    • Umieść klucze i wartości niestandardowe w MediaMetadataCompat to MediaMetadata.extrasMediaMetadata.extras to MediaMetadataCompat (#756, #802).
    • Naprawiono transmisję notifyChildrenChanged w przypadku starszych kontrolerów (#644).
    • Naprawiliśmy błąd, który powodował awarię na niektórych urządzeniach, gdy dla wyłączonego timera setWhen powiadomienia ustawiono ujemny czas (#903).
    • Naprawiono błąd IllegalStateException, który występował, gdy kontroler powiadomień o multimediach nie zakończył łączenia, a użytkownik poprosił o pierwszą aktualizację powiadomienia (#917).
  • UI:
    • Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu i do tyłu nie były widoczne, gdy były używane z Material Design w elemencie BottomSheetDialogFragment (#511).
    • Rozwiązaliśmy problem z nieprawidłowym wyrównaniem liczb na przycisku przewijania do przodu w PlayerControlView (#547).
  • Rozszerzenie DASH:
    • Analizowanie „f800” jako liczby kanałów 5 w przypadku Dolby w manifeście DASH (#688).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • MIDI: rozwiązano problem z przewijaniem do przodu, które pomijało zdarzenia zmiany programu (#704).
    • Migracja do FFmpeg 6.0 i aktualizacja obsługiwanego NDK do wersji r26b(#707,#867).
  • Rozszerzenie Cast:
    • Poprawiono tworzenie Timeline, aby aplikacja nie ulegała awarii, gdy wczytywanie multimediów na urządzeniu do przesyłania nie powiedzie się (#708).

Wersja 1.2.0

15 listopada 2023 r.

  • Biblioteka wspólna:
    • Dodaj parametr @Nullable Throwable do metod w interfejsie Log.Logger. Parametr message w tych metodach nie zawiera już żadnych informacji o parametrze Throwable przekazywanym do metod Log.{d,i,w,e}(), więc w razie potrzeby implementacje będą musiały ręcznie dołączać te informacje (być może za pomocą parametru Logger.appendThrowableString(String, Throwable)).
    • Rozwiązanie problemu ze zgodnością z Kotlinem, który powodował, że parametry typu ogólnego dopuszczające wartość null i typy elementów tablicy dopuszczające wartość null nie były wykrywane jako dopuszczające wartość null. Przykładami są parametry metod TrackSelectorResultSimpleDecoder (#6792).
    • Zmień domyślne działanie interfejsu i powiadomień w Util.shouldShowPlayButton, aby wyświetlać przycisk „Odtwórz”, gdy odtwarzanie jest tymczasowo wstrzymane (np. z powodu chwilowej utraty aktywności audio). Poprzednie działanie można zachować, używając PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) lub MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Uaktualnij androidx.annotation:annotation-experimental do 1.3.1, aby rozwiązać problem opisany na stronie https://issuetracker.google.com/251172715.
    • Przenieś ExoPlayer.setAudioAttributes do interfejsu Player.
  • ExoPlayer:
    • Rozwiązano problemy z przewijaniem w strumieniach AC4 spowodowane nieprawidłowym identyfikowaniem próbek przeznaczonych tylko do dekodowania (#11000).
    • Dodano wyłączanie odtwarzania na nieodpowiednich urządzeniach wyjściowych audio (np. wbudowanym głośniku na urządzeniach z Wear OS), gdy ta funkcja jest włączona w ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Przyczyna wstrzymania odtwarzania zostanie zaktualizowana do wartości Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT, jeśli odtwarzanie zostanie podjęte, gdy nie są dostępne odpowiednie wyjścia audio, lub jeśli wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania. Gdy podłączysz odpowiednie wyjście, przyczyna wyciszenia zostanie usunięta.
    • Dodaj znaki MediaSource.canUpdateMediaItemMediaSource.updateMediaItem, aby zaakceptować aktualizacje MediaItem po utworzeniu za pomocą Player.replaceMediaItem(s).
    • Zezwalaj na aktualizacje MediaItem dla 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óre wysyła i odczytuje cały plik PNG do TrackOutput jako jeden przykład.
    • Ulepsz metodę SequenceableLoader.continueLoading(long) w interfejsie SequenceableLoader, aby SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo zawiera dodatkowe parametry, w tym playbackSpeedlastRebufferRealtimeMs, oprócz istniejącego parametru playbackPositionUs.
    • Ulepsz metodę ChunkSource.getNextChunk(long, long, List, ChunkHolder) w interfejsie ChunkSource, aby ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Dodaliśmy do rejestrowania danych klienta Common Media Client Data (CMCD) dodatkowe pola: buffer starvation (bs), deadline (dl), szybkość odtwarzania (pr) i startup (su) (#8699).
    • Dodaj głębię bitową luminancji i chrominancji do ColorInfo(#491).
    • Dodanie do rejestrowania danych klienta Common Media Client Data (CMCD) dodatkowych pól: następne żądanie obiektu (nor) i następne żądanie zakresu (nrr) (#8699).
    • Dodanie funkcji przesyłania danych Common Media Client Data (CMCD) za pomocą parametrów zapytania (#553).
    • Rozwiąż problem ConcurrentModificationException w sekcji ExperimentalBandwidthMeter (#612).
    • Dodaj parametr MediaPeriodId do CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Obsługa ClippingMediaSource (i innych źródeł z okresem/okresem czasu przesunięcia) w ConcatenatingMediaSource2 (#11226).
    • Zmień BaseRenderer.onStreamChanged(), aby otrzymywać też argument MediaPeriodId.
  • Transformer:
    • Analizowanie danych EXIF dotyczących obrotu w przypadku danych wejściowych w postaci obrazów.
    • Usuń typ adnotacji TransformationRequest.HdrMode i powiązane z nim stałe. Zamiast tego użyj atrybutu Composition.HdrMode i powiązanych z nim stałych.
    • Uprość OverlaySettings, aby rozwiązać problemy z obracaniem.
    • Zmieniono parametry frameRatedurationUs elementu SampleConsumer.queueInputBitmap na TimestampIterator.
  • Wybór utworu:
    • Dodaj DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness, aby wyraźnie zezwolić na adaptację niepełną lub jej zabronić. Domyślne działanie pozostaje niezmienione i wynosi true.
  • Ekstraktory:
    • MPEG-TS: upewnij się, że ostatnia klatka jest renderowana przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909).
    • Popraw literówkę podczas określania rotationDegrees. Zmieniono projectionPosePitch na projectionPoseRoll (#461).
    • Usuń założenie, że instancje Extractor można bezpośrednio sprawdzać za pomocą instanceof. Jeśli chcesz uzyskać dostęp w czasie działania do szczegółów implementacji Extractor, musisz najpierw wywołać Extractor.getUnderlyingInstance.
    • Dodaj BmpExtractor.
    • Dodaj WebpExtractor.
    • Dodaj HeifExtractor.
    • Dodaj obsługę klasycznego odtwarzacza QuickTime do Mp4Extractor.
  • Dźwięk:
    • Dodaliśmy obsługę 24/32-bitowego formatu big endian PCM w MP4 i Matrosce oraz analizowanie kodowania PCM dla lpcm w MP4.
    • Dodano obsługę wyodrębniania dźwięku Vorbis z pliku MP4.
    • Dodaj AudioSink.getFormatOffloadSupport(Format), który pobiera poziom obsługi odciążania, jaki odbiornik może zapewnić w przypadku formatu, za pomocą DefaultAudioOffloadSupportProvider. Zwraca nowy AudioOffloadSupport, który zawiera isFormatSupported, isGaplessSupported i isSpeedChangeSupported.
    • Dodaj AudioSink.setOffloadMode(), za pomocą którego konfiguracja odciążania na odbiorniku audio jest konfigurowana. Wartość domyślna to AudioSink.OFFLOAD_MODE_DISABLED.
    • Przekazywanie można włączyć w setAudioOffloadPreferenceTrackSelectionParameters. Jeśli ustawiona preferencja to włączenie, urządzenie obsługuje odciążanie w przypadku danego formatu, a wybór ścieżki to pojedyncza ścieżka audio, odciążanie audio zostanie włączone.
    • Jeśli wartość audioOffloadModePreference to AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, DefaultTrackSelector wybierze tylko ścieżkę audio i tylko wtedy, gdy jej format jest obsługiwany w przypadku przeniesienia przetwarzania. Jeśli żadna ścieżka audio nie jest obsługiwana w przypadku odciążania, nie zostanie wybrana żadna ścieżka.
    • Wyłączenie obsługi bez przerw w przypadku odciążania przed poziomem interfejsu API 33 z powodu problemu z pozycją odtwarzania po przejściu ścieżki.
    • Usuń parametr 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 bez przerw w przypadku formatu Opus podczas odtwarzania z przeniesieniem.
    • Zezwól na przywrócenie renderera przez wyłączenie przenoszenia, jeśli pierwsza próba zapisu się nie powiodła (#627).
    • Domyślnie włącz harmonogram odciążania w przypadku odtwarzania z odciążaniem audio.
    • Usuń ExoPlayer.experimentalSetOffloadSchedulingEnabledAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Zmieniono nazwę onExperimentalSleepingForOffloadChanged na onSleepingForOffloadChangedonExperimentalOffloadedPlayback na onOffloadedPlayback.
    • Przenieś interfejsy i definicje związane z trybem odciążania dźwięku TrackSelectionParameters do wewnętrznej klasy AudioOffloadPreferences.
    • Dodaj wywołania zwrotne onAudioTrackInitialized i onAudioTrackReleased do AnalyticsListener, AudioRendererEventListener i AudioSink.Listener.
    • Rozwiązanie problemu z niedomiarem bufora audio DTS Express (#650).
    • Naprawiono błąd, który powodował, że sprawdzanie możliwości w przypadku E-AC3-JOC zwracało błąd IllegalArgumentException (#677).
  • Film:
    • Zezwalaj wtyczce MediaCodecVideoRenderer na korzystanie z niestandardowego VideoFrameProcessor.Factory.
    • Rozwiązanie problemu polegającego na tym, że pierwsza klatka nie mogła być renderowana, jeśli strumień audio zaczynał się od ujemnych sygnatur czasowych (#291).
  • Tekst:
    • Usuń ExoplayerCuesDecoder. Ścieżki tekstowe z sampleMimeType = application/x-media3-cues są teraz obsługiwane bezpośrednio przez TextRenderer bez konieczności używania instancji SubtitleDecoder.
  • Metadane:
    • MetadataDecoder.decode nie będzie już wywoływana w przypadku próbek „tylko do dekodowania”, ponieważ implementacja i tak musi zwracać wartość null.
  • Skutek:
    • Dodaj VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) kolejkowanie danych wejściowych bitmapy według sygnatury czasowej.
    • Zmień VideoFrameProcessor.registerInputStream() na nieblokujące. Aplikacje muszą implementować funkcję VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Zmieniono parametry frameRatedurationUs elementu VideoFrameProcessor.queueInputBitmap na TimestampIterator.
  • Rozszerzenie IMA:
    • Rozwiązanie problemu polegającego na tym, że transmisja na żywo DASH z wieloma okresami, która nie jest pierwszym elementem na playliście, może zgłaszać wyjątek (#571).
    • Zwolnij StreamManager przed wywołaniem AdsLoader.destroy()
    • Zaktualizuj pakiet IMA SDK do wersji 3.31.0.
  • Sesja:
    • Ustaw zachowanie usługi pierwszego planu powiadomień na FOREGROUND_SERVICE_IMMEDIATEDefaultMediaNotificationProvider (#167).
    • Używaj tylko interfejsu API w wersji powyżej 31, aby uniknąć problemów z przestarzałym interfejsem API na urządzeniach Samsung (#167).android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
    • Użyj kontrolera powiadomień o multimediach jako serwera proxy, aby ustawić dostępne polecenia i niestandardowy układ używany do wypełniania powiadomienia i sesji platformy.
    • Konwertuj zdarzenia przycisków multimedialnych odbierane przez MediaSessionService.onStartCommand() w Media3 zamiast kierować je do sesji platformy i z powrotem do Media3. Dzięki temu kontroler połączeń jest zawsze kontrolerem powiadomień o multimediach, a aplikacje mogą łatwo rozpoznawać połączenia przychodzące z powiadomienia w taki sam sposób na wszystkich obsługiwanych poziomach interfejsu API.
    • Rozwiązanie problemu polegającego na tym, że MediaController.getCurrentPosition() nie przechodzi dalej, gdy jest połączony ze starszym MediaSessionCompat.
    • Dodaj MediaLibrarySession.getSubscribedControllers(mediaId) dla wygody.
    • Zastąp MediaLibrarySession.Callback.onSubscribe(), aby potwierdzić dostępność identyfikatora elementu nadrzędnego, do którego subskrybuje kontroler. Jeśli się to uda, subskrypcja zostanie zaakceptowana i notifyChildrenChanged() zostanie natychmiast wywołana, aby poinformować przeglądarkę (#561).
    • Dodaj moduł demonstracyjny sesji dla systemu Automotive OS i włącz demonstrację sesji w Androidzie Auto.
    • Nie ustawiaj kolejki sesji platformy, gdy wartość COMMAND_GET_TIMELINE jest niedostępna dla kontrolera powiadomień o multimediach. Gdy Android Auto jest kontrolerem klienta odczytującym dane z sesji frameworka, przycisk queue w interfejsie Androida Auto nie jest wyświetlany (#339).
    • Domyślnie używaj DataSourceBitmapLoader zamiast SimpleBitmapLoader (#271, #327).
    • Dodano 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ądzenia z Wear OS, która obsługuje wyciszanie odtwarzania z powodu Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT przez wyświetlanie okna systemowego, które umożliwia użytkownikowi podłączenie odpowiedniego wyjścia audio (np. słuchawek Bluetooth). Odtwarzanie zostanie automatycznie wznowione, jeśli w konfigurowalnym czasie (domyślnie 5 minut) zostanie podłączone odpowiednie urządzenie.
  • Pobrane:
    • Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” w przypadku DownloadService, aby zapewnić zgodność z Androidem 14. Podczas korzystania z tej usługi aplikacja musi też dodać dataSync jako foregroundServiceType w pliku manifestu oraz dodać uprawnienie FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • Rozszerzenie HLS:
    • Odświeżanie listy odtwarzania transmisji na żywo HLS w interwale obliczanym na podstawie czasu rozpoczęcia ostatniego wczytywania, a nie czasu zakończenia ostatniego wczytywania (#663).
  • Rozszerzenie DASH:
    • Zezwalaj na wiele identyfikatorów DASH w adresie URL szablonu segmentu.
    • Dodanie eksperymentalnej obsługi analizowania napisów podczas wyodrębniania. Ta funkcja lepiej obsługuje scalanie nakładających się napisów, w tym rozwiązuje problem migotania podczas przechodzenia między segmentami napisów. Możesz włączyć tę opcję za pomocą parametru DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Rozszerzenie RTSP:
    • Naprawiono sytuację wyścigu, która w niektórych sytuacjach mogła powodować błąd IndexOutOfBoundsException podczas powrotu do TCP lub zawieszanie się odtwarzania.
    • Sprawdzanie stanu podczas konfiguracji RTSP po powrocie do stanu ładowania RtspMediaPeriod (#577).
    • Ignorowanie niestandardowych metod żądań RTSP w nagłówku publicznym odpowiedzi na żądanie OPTIONS (#613).
    • Użyj wartości czasu oczekiwania na odpowiedź na żądanie konfiguracji RTSP w interwale czasowym wysyłania żądań opcji RTSP typu utrzymywanie aktywności (#662).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Wydanie modułu dekodera MIDI, który zapewnia obsługę odtwarzania standardowych plików MIDI za pomocą biblioteki Jsyn do syntezy dźwięku.
    • Dodaj DecoderOutputBuffer.shouldBeSkipped, aby bezpośrednio oznaczyć bufory wyjściowe, które nie muszą być prezentowane. Jest to preferowane rozwiązanie w porównaniu z C.BUFFER_FLAG_DECODE_ONLY, które zostanie wycofane.
    • Dodaj Decoder.setOutputStartTimeUsSimpleDecoder.isAtLeastOutputStartTimeUs, aby umożliwić dekoderom odrzucanie próbek tylko do dekodowania przed czasem rozpoczęcia. Jest to preferowane rozwiązanie w porównaniu z Buffer.isDecodeOnly, które zostanie wycofane.
    • Naprawiono błąd publikowania artefaktu dekodera MIDI w repozytorium Maven. Artefakt został zmieniony na media3-exoplayer-midi (#734).
  • Rozszerzenie Leanback:
    • Naprawiono błąd, w którym wyłączenie platformy może powodować błąd ArithmeticException w kodzie Leanback (#617).
  • Narzędzia testowe:
    • Zapewnij zgodność TestExoPlayerBuilderFakeClock z testami interfejsu Espresso i Compose. Rozwiązaliśmy problem, w którym odtwarzanie postępuje w sposób nieokreślony podczas interakcji z widokami Espresso lub Compose.
  • Usuń wycofane symbole:
    • Usuń:TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean) Użyj zasady Composition.Builder.setHdrMode(int) i przekaż wartość Composition do zasady Transformer.start(Composition, String).
    • Usuń wycofaną metodę DownloadNotificationHelper.buildProgressNotification. Zamiast niej użyj metody, która nie została wycofana i przyjmuje parametr notMetRequirements.

Wersja 1.2.0-rc01

1 listopada 2023 roku

Używaj stabilnej wersji 1.2.0.

Wersja 1.2.0-beta01

19 października 2023 r.

Używaj stabilnej wersji 1.2.0.

Wersja 1.2.0-alpha02

29 września 2023 r.

Używaj stabilnej wersji 1.2.0.

Wersja 1.2.0-alpha01

17 sierpnia 2023 r.

Używaj stabilnej wersji 1.2.0.

Wersja 1.1.0

Wersja 1.1.1

16 sierpnia 2023 r.

  • Biblioteka wspólna:
    • Usuń przypadkowo dodaną zależność multidex ze wszystkich modułów (#499).
  • ExoPlayer:
    • Rozwiązaliśmy problem w PlaybackStatsListener, który powodował, że po wyczyszczeniu playlisty tworzone były nieprawidłowe PlaybackStats.
    • Dodawanie dodatkowych pól do rejestrowania danych klienta Common Media Client Data (CMCD): format strumieniowania (sf), typ strumienia (st), wersja (v), najwyższa przepływność (tb), czas trwania obiektu (d), zmierzona przepływność (mtp) i typ obiektu (ot) (#8699).
  • Dźwięk:
    • Usunięto błąd, w którym podczas odtwarzania bardzo krótkich plików stan Player.getState() nigdy nie przechodził w stan STATE_ENDED (#538).
  • Odciążenie dźwięku:
    • Dodaj na początku strumienia bitów strony nagłówka identyfikatora Ogg i nagłówka komentarza, aby umożliwić odtwarzanie Opus w trybie offload zgodnie z dokumentem RFC 7845.
  • Film:
    • H.265/HEVC: poprawiono analizowanie informacji o krótkoterminowych i długoterminowych obrazach referencyjnych w SPS.
  • Tekst:
    • CEA-608: zmiana logiki obcinania wskazówek, aby uwzględniać tylko widoczny tekst. Wcześniej wcięcia i przesunięcia tabulacji były uwzględniane przy ograniczaniu długości napisu do 32 znaków (co było technicznie zgodne ze specyfikacją) (#11019).
  • Rozszerzenie IMA:
    • Zaktualizuj pakiet IMA SDK do wersji 3.30.3.
  • Sesja:
    • Dodaj niestandardowy układ do stanu kontrolera i udostępnij funkcję pobierania, aby uzyskać do niego dostęp. Gdy zmieni się układ niestandardowy, wywoływana jest funkcja MediaController.Listener.onCustomLayoutChanged. Aplikacje, które chcą wysyłać różne niestandardowe układy do różnych kontrolerów Media3, mogą to zrobić w MediaSession.Callback.onConnect, używając AcceptedResultBuilder, aby mieć pewność, że niestandardowy układ jest dostępny dla kontrolera po zakończeniu połączenia.
    • Rozwiązaliśmy problem, w którym MediaLibraryServiceLegacyStub wysyłał błąd do Result, który nie obsługiwał tej funkcji, co powodowało błąd UnsupportedOperationException (#78).
    • Poprawiono sposób, w jaki PlayerWrapper tworzy VolumeProviderCompat, poprzez określanie volumeControlType za pomocą starszych poleceń (COMMAND_ADJUST_DEVICE_VOLUMECOMMAND_SET_DEVICE_VOLUME) oraz nowych poleceń (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGSCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

Wersja 1.1.0

5 lipca 2023 r.

  • Biblioteka wspólna:
    • Dodaj powód wyłączenia nieodpowiedniej ścieżki audio i odtwarzaj, gdy będzie gotowa. Zmień powód wyłączenia na „zbyt długi”. (#15).
    • Dodawanie poleceń do odtwarzacza:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Dodaj do klasy Player przeciążone metody, które pozwalają użytkownikom określać flagi głośności:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Dodano Builder dla DeviceInfo i wycofano dotychczasowy konstruktor.
    • Dodaj DeviceInfo.routingControllerId, aby określić identyfikator kontrolera routingu w przypadku odtwarzania zdalnego.
    • Dodano Player.replaceMediaItem(s) jako skrót do dodawania i usuwania elementów w tej samej pozycji (#8046).
  • ExoPlayer:
    • Zezwalaj ExoPlayerowi na sterowanie metodami głośności urządzenia tylko wtedy, gdy użytkownik wyraźnie się na to zgodzi. Użyj ExoPlayer.Builder.setDeviceVolumeControlEnabled, aby uzyskać dostęp do:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) 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.
    • Dodanie obsługi danych klienta Common Media Client Data (CMCD) w wychodzących żądaniach formatów strumieniowania adaptacyjnego DASH, HLS i SmoothStreaming. Wprowadziliśmy te pola: br, bl, cid, rtp i sid (#8699). Struktura interfejsu API i metody interfejsu API:
      • Rejestrowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj parametru MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory).
      • Domyślnie wszystkie klucze są włączone. Zastąp ustawienie CmcdConfiguration.RequestConfig.isKeyAllowed(String key), aby odfiltrować CmcdConfiguration.RequestConfig.isKeyAllowed(String key) klucze, które mają być 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 w wersji demonstracyjnej z niestandardowym plikiem *.exolist.json (#439).
    • Dodaj ExoPlayer.setVideoEffects() za korzystanie z Effect podczas odtwarzania wideo.
    • Zaktualizuj SampleQueue, aby przechowywać sourceId jako long zamiast int. Spowoduje to zmianę sygnatur metod publicznych SampleQueue.sourceIdSampleQueue.peekSourceId.
    • Dodaj do metod LoadControlonTracksSelected parametry, które pozwolą powiązać te metody z odpowiednimi MediaPeriod.shouldStartPlayback
    • Zmień sygnaturę funkcji ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>), dodając parametr osi czasu, który zawiera okresy z identyfikatorami UID używanymi jako klucze na mapie. Jest to wymagane, aby uniknąć problemów z jednoczesnym dostępem w przypadku transmisji na żywo z wieloma okresami.
    • Wycofaj: EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Zamiast tego można wywołać warianty metod bez symbolu mediaTimeOffsetUs. Pamiętaj, że nawet w przypadku wycofanych wariantów przesunięcie nie jest już dodawane do pól startTimeUsendTimeUs obiektów MediaLoadData wysyłanych przez moduł wysyłający.
    • Zmień nazwę ExoTrackSelection.blacklist na excludeTrackisBlacklisted na isTrackExcluded.
    • Naprawiono niespójne działanie funkcji ExoPlayer.setMediaItem(s) i addMediaItem(s) wywoływanych w przypadku pustej playlisty.
  • Transformer:
    • Usuń Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Zamiast niej używaj zasad ExoPlayerAssetLoader.Factory(MediaSource.Factory)Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Usuń Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Usunęliśmy błąd polegający na tym, że transformacja mogła się zawiesić (co prowadziło do przekroczenia limitu czasu multipleksera), jeśli koniec strumienia wideo został zasygnalizowany w momencie, gdy ramka wejściowa oczekiwała na przetworzenie.
    • Aby rozszerzyć obsługę, wysyłaj zapytania o kodeki za pomocą narzędzia 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óra jest domyślnie wyłączona. Gdy ta opcja jest włączona, DefaultTrackSelector spowoduje wybranie nowego ś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ązano problem, w którym TimestampAdjuster inicjuje nieprawidłowe przesunięcie sygnatury czasowej z czasem próbki metadanych z atomu emsg (#356).
  • Dźwięk:
    • Naprawiono błąd, który powodował, że niektóre odtwarzania kończyły się niepowodzeniem, gdy włączone było tunelowanie i aktywne były np. funkcje przycinania bez przerw (#10847).AudioProcessors
    • Enkapsulacja ramek Opus w pakietach Ogg podczas bezpośredniego odtwarzania (odciążanie).
    • Ekstrapolacja bieżącej pozycji podczas snu z planowaniem odciążenia.
    • Dodaj Renderer.release()AudioSink.release(), aby zwolnić zasoby po zakończeniu cyklu życia gracza.
    • Monitorowanie zmian w funkcjach audio w DefaultAudioSink. Dodaj wymagany parametr context w konstruktorze DefaultAudioSink, za pomocą którego DefaultAudioSink zarejestruje się jako odbiorca zdarzeń AudioCapabilitiesReceiver i zaktualizuje właściwość audioCapabilities, gdy otrzyma informację o zmianie możliwości.
    • Przekazywanie zmian w funkcjach 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 lub miksowanie do kanałów audio.
    • Dodaj nową wartość całkowitą DISCARD_REASON_AUDIO_BYPASS_POSSIBLE do DecoderDiscardReasons, aby odrzucić dekoder audio, gdy po zmianie możliwości audio możliwy jest tryb obejścia.
    • Dodano obsługę bezpośredniego odtwarzania DTS Express i DTS:X (#335).
  • Film:
    • Spraw, aby MediaCodecVideoRenderer zgłaszał VideoSize o szerokości i wysokości 0, gdy moduł renderujący jest wyłączony. Player.Listener.onVideoSizeChanged jest wywoływana odpowiednio, gdy zmieni się Player.getVideoSize(). W wyniku tej zmiany rozmiar wideo ExoPlayera z MediaCodecVideoRenderer ma szerokość i wysokość 0, gdy Player.getCurrentTracks nie obsługuje wideo lub rozmiar obsługiwanej ścieżki wideo nie został jeszcze określony.
  • DRM:
    • Zmniejsz widoczność kilku metod przeznaczonych tylko do użytku wewnętrznego w DefaultDrmSession, które nie powinny być wywoływane spoza pakietu DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Dodano nową bibliotekę multipleksera, której można używać do tworzenia pliku kontenera MP4.
  • Rozszerzenie IMA:
    • Włącz transmisje na żywo DASH z wieloma przedziałami czasu na potrzeby dynamicznego wstawiania reklam. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania transmisji na żywo (#10912).
    • Naprawiono błąd, w którym w transmisjach na żywo wstawiana jest nowa grupa reklam, ponieważ obliczona pozycja treści na kolejnych osiach czasu nieznacznie się różni.
  • Sesja:
    • Dodaliśmy metodę pomocniczą MediaSession.getControllerForCurrentRequest, która umożliwia uzyskanie informacji o kontrolerze, który aktualnie wywołuje metodę Player.
    • Dodanie androidx.media3.session.MediaButtonReceiver, aby umożliwić aplikacjom wznawianie odtwarzania za pomocą zdarzeń przycisków multimedialnych wysyłanych np. przez słuchawki Bluetooth (#167).
    • Dodaj domyślną implementację do MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądanych MediaItems do Player, jeśli mają LocalConfiguration (np. URI)#282.
    • Dodanie przycisków poleceń „przewiń do poprzedniego” i „przewiń do następnego” w kompaktowym widoku powiadomienia o multimediach domyślnie w przypadku Androida 12 i starszych wersji (#410).
    • Dodaj domyślną implementację do MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądanych MediaItems do Player, jeśli mają LocalConfiguration (np. URI)#282.
    • Dodanie przycisków poleceń „przewiń do poprzedniego” i „przewiń do następnego” w kompaktowym widoku powiadomienia o multimediach domyślnie w przypadku Androida 12 i starszych wersji (#410).
  • UI:
    • Dodaj metody narzędziowe shouldShowPlayButtonhandlePlayPauseButtonAction, aby tworzyć niestandardowe elementy interfejsu z przyciskiem odtwarzania/wstrzymywania.
  • Rozszerzenie RTSP:
    • W przypadku MPEG4-LATM użyj domyślnej wartości profile-level-id, jeśli nie występuje w wiadomości SDP w odpowiedzi na Describe (#302).
    • Używaj 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.startTimeMsMediaLoadData.endTimeMs w przypadku strumieni DASH z wieloma przedziałami czasu.
    • Usunęliśmy błąd, który powodował, że ponowne przygotowanie źródła multimediów DASH na żywo z wieloma okresami generowało IndexOutOfBoundsException (#10838).
  • Rozszerzenie HLS:
    • Dodaj HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) aby ustawić limit czasu, przez jaki wątek wczytywania ma czekać na zainicjowanie elementu TimestampAdjuster. Jeśli inicjowanie nie zakończy się przed upływem limitu czasu, zostanie zgłoszony wyjątek PlaybackException, aby uniknąć niekończącego się wstrzymania odtwarzania. Domyślnie limit czasu jest ustawiony na zero (#323).
  • Narzędzia testowe:
    • Sprawdź, czy w DataSourceContractTest wielkość liter w schemacie URI nie ma znaczenia.
  • Usuń wycofane symbole:
    • Usuń konstruktory DefaultAudioSink i użyj zamiast nich konstruktorów DefaultAudioSink.Builder.
    • Usuń polecenie HlsMasterPlaylist i zamiast niego użyj polecenia HlsMultivariantPlaylist.
    • Usuń Player.stop(boolean). Zamiast niej użyj zasad Player.stop()Player.clearMediaItems() (jeśli reset ma wartość true).
    • Usuń 2 wycofane konstruktory SimpleCache. Zamiast nich użyj niewycofanego konstruktora, który przyjmuje DatabaseProvider, aby uzyskać lepszą wydajność.
    • Usuń konstruktor DefaultBandwidthMeter i użyj zamiast niego konstruktora DefaultBandwidthMeter.Builder.
    • Usuń konstruktory DefaultDrmSessionManager i użyj zamiast nich konstruktorów DefaultDrmSessionManager.Builder.
    • Usuń 2 wycofane konstruktory HttpDataSource.InvalidResponseCodeException. Użyj niewycofanego konstruktora, który akceptuje dodatkowe pola(cause, responseBody), aby ulepszyć rejestrowanie błędów.
    • Usuń zasady DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDashDownloadHelper.forSmoothStreaming, a zamiast nich używaj zasad DownloadHelper.forMediaItem.
    • Usuń wycofany konstruktor DownloadService i użyj konstruktora, który nie został wycofany i zawiera opcję podania parametru channelDescriptionResourceId.
    • Usuń wycofane stałe ciągi znaków dla zestawów znaków (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAMEUTF16LE_NAME). Zamiast nich używaj 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, createContainerFormatcreateSampleFormat, które były używane do tworzenia instancji klasy Format. Zamiast tego użyj Format.Builder do tworzenia instancji Format.
    • Usuń wycofane metody copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitratecopyWithVideoSize. Zamiast nich używaj metod Format.buildUpon() i metod ustawiających.
    • Usuń wycofany tag ExoPlayer.retry() i zamiast niego użyj tagu prepare().
    • Usuń wycofany konstruktor DefaultTrackSelector bez argumentów i użyj zamiast niego konstruktora DefaultTrackSelector(Context).
    • Usuń wycofany konstruktor OfflineLicenseHelper i użyj OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń wycofany konstruktor DownloadManager i użyj konstruktora, który przyjmuje argument Executor.
    • Usuń wycofane konstruktory Cue i zamiast nich używaj konstruktorów Cue.Builder.
    • Usuń wycofany konstruktor OfflineLicenseHelper i użyj OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń 4 wycofane metody AnalyticsListener:
      • onDecoderEnabled, użyj onAudioEnabled lub onVideoEnabled.
      • onDecoderInitialized, użyj onAudioDecoderInitialized lub onVideoDecoderInitialized.
      • onDecoderInputFormatChanged, użyj zamiast niej onAudioInputFormatChanged lub onVideoInputFormatChanged.
      • onDecoderDisabled, użyj onAudioDisabled lub onVideoDisabled.
    • Usuń wycofane polecenia Player.Listener.onSeekProcessedAnalyticsListener.onSeekProcessed, a zamiast nich użyj polecenia onPositionDiscontinuity z parametrem DISCONTINUITY_REASON_SEEK.
    • Usuń polecenie ExoPlayer.setHandleWakeLock(boolean) i zamiast niego użyj polecenia setWakeMode(int).
    • Usuń wycofany element DefaultLoadControl.Builder.createDefaultLoadControl() i zamiast niego użyj elementu build().
    • Usuń wycofany tag MediaItem.PlaybackProperties i zamiast niego użyj tagu MediaItem.LocalConfiguration. Wycofane pole MediaItem.playbackProperties ma teraz typ MediaItem.LocalConfiguration.

Wersja 1.1.0-rc01

21 czerwca 2023 r.

Używaj stabilnej wersji 1.1.0.

Wersja 1.1.0-beta01

7 czerwca 2023 r.

Używaj stabilnej wersji 1.1.0.

Wersja 1.1.0-alpha01

10 maja 2023 r.

Używaj stabilnej wersji 1.1.0.

Wersja 1.0.0

Wersja 1.0.2

18 maja 2023 r.

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

Ta wersja odpowiada wersji ExoPlayer 2.18.7.

W tej wersji wprowadziliśmy następujące zmiany w porównaniu z wersją 1.0.1:

  • Biblioteka podstawowa:
    • Dodaj Buffer.isLastSample(), które wskazuje, czy Buffer zawiera flagę C.BUFFER_FLAG_LAST_SAMPLE.
    • Rozwiązaliśmy problem, który powodował, że ostatnia klatka mogła nie być renderowana, jeśli ostatnia próbka z klatkami została usunięta z kolejki bez odczytania próbki „koniec strumienia”. (#11079).
  • Ekstraktory:
    • Naprawiono analizowanie SPS w plikach MPEG-TS w standardzie H.265 przez ponowne użycie logiki analizowania, która jest już używana przez ekstraktory RTSP i MP4 (#303).
  • Tekst:
    • SSA: dodano obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów (#319).
  • Sesja:
    • Rozwiązano problem polegający na tym, że MediaController nie aktualizował dostępnych poleceń po połączeniu ze starszym MediaSessionCompat, który aktualizował swoje działania.
    • Naprawiono błąd, który uniemożliwiał zwracanie wartości null przez MediaLibraryService w przypadku wywołania z interfejsu systemu do Callback.onGetLibraryRoot z parametrem params.isRecent == true w interfejsie API 30 (#355).
    • Naprawiono wyciek pamięci w przypadku MediaSessionService lub MediaLibraryService (#346).
    • Naprawiliśmy błąd, w którym połączona aktualizacja Timeline i pozycji w MediaSession może powodować zgłaszanie błędu MediaController przez IllegalStateException.

Wersja 1.0.1

18 kwietnia 2023 r.

Publikacja androidx.media3:media3-*:1.0.1 Wersja 1.0.1 zawiera te zmiany.

Ta wersja odpowiada wersji ExoPlayera 2.18.6.

  • Biblioteka podstawowa:
    • Resetowanie zastąpienia docelowej transmisji na żywo podczas wyszukiwania domyślnej pozycji (#11051).
    • Naprawiono błąd, który powodował zawieszanie się odtwarzania z powodu pustych strumieni próbek w multimediach.
  • Sesja:
    • Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszą wersjęMediaSessionCompat powodowało wyjątek w MediaController (#290).
    • Dodano brakujące przekazywanie MediaSession.broadcastCustomCommand do starszego MediaControllerCompat.Callback.onSessionEvent (#293).
    • Naprawiliśmy błąd, który powodował, że wywołanie MediaSession.setPlayer nie aktualizowało dostępnych poleceń.
    • Rozwiązaliśmy problem polegający na tym, że instancje TrackSelectionOverride wysłane z MediaController są ignorowane, jeśli odwołują się do grupy z Format.metadata (#296).
    • Rozwiązanie problemu, w którym dostęp do metadanych za pomocą starszego interfejsu MediaSessionCompat wymaga uprawnień Player.COMMAND_GET_CURRENT_MEDIA_ITEM.
    • Rozwiązano problem, w którym instancje MediaSession w wątku w tle powodowały awarie podczas używania w MediaSessionService (#318).
    • Rozwiązanie problemu polegającego na tym, że odbiornik przycisku multimediów był deklarowany przez bibliotekę bez intencji aplikacji (#314).
  • DASH:
    • Poprawiono obsługę pustych osi czasu segmentów (#11014).
  • RTSP:
    • Ponów próbę z protokołem TCP, jeśli konfiguracja RTSP z protokołem UDP nie powiedzie się i zostanie zwrócony błąd RTSP 461 UnsupportedTransport (#11069).

Wersja 1.0.0

22 marca 2023 r.

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

Ta wersja odpowiada wersji ExoPlayera 2.18.5.

Od wersji 1.0.0-rc02 nie wprowadziliśmy żadnych zmian.

Wersja 1.0.0-rc02

2 marca 2023 r.

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

Ta wersja odpowiada wersji ExoPlayera 2.18.4.

  • Biblioteka podstawowa:
    • Naprawiono wykrywanie typu sieci w przypadku API 33 (#10970).
    • Rozwiąż problem NullPointerException podczas dzwonienia na numer ExoPlayer.isTunnelingEnabled (#10977).
  • Pobrane:
    • Umożliwienie konfigurowania maksymalnej różnicy między czasem rozpoczęcia 2 segmentów do scalenia w SegmentDownloader i podklasach (#248).
  • Dźwięk:
    • Naprawiono nieprawidłowe odtwarzanie plików MP3 bez przerw na urządzeniach Samsung (#8594).
    • Rozwiązanie problemu polegającego na tym, że szybkość odtwarzania ustawiona natychmiast po wyłączeniu dźwięku może zostać zastąpiona przez poprzednią zmianę szybkości (#10882).
  • Film:
    • Mapowanie formatu HEVC HDR10 na HEVCProfileMain10HDR10 zamiast na HEVCProfileMain10.
    • Dodano obejście problemu z urządzeniem Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC o częstotliwości 60 kl./s są oznaczane jako nieobsługiwane (#10898).
    • Rozwiązano problemy z wydajnością zwalniania klatek podczas odtwarzania multimediów z częstotliwością klatek znacznie wyższą niż częstotliwość odświeżania ekranu.
  • Przesyłanie:
    • Rozwiązaliśmy problem z przejściowym STATE_IDLE podczas przechodzenia między elementami multimedialnymi (#245).
  • RTSP:
    • Wyłapywanie wyjątku IllegalArgumentException zgłaszanego podczas analizowania nieprawidłowych wiadomości odpowiedzi RTSP Describe (#10971).
  • Sesja:
    • Usunęliśmy błąd, który powodował, że przycisk odtwarzania/wstrzymywania w powiadomieniu nie aktualizował się zgodnie ze stanem odtwarzacza (#192).
  • Rozszerzenie IMA:
    • Naprawiono błąd, który uniemożliwiał rozpoczęcie strumieni DAI bez reklam, ponieważ nie otrzymywano pierwszego (a w przypadku strumieni bez reklam jedynego) zdarzenia LOADED.

Wersja 1.0.0-rc01

16 lutego 2023 r.

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

Ta wersja odpowiada wersji ExoPlayera 2.18.3.

  • Biblioteka podstawowa:
    • Dostosuj logikę kolejności dekoderów renderera, aby zachować preferencje MediaCodecSelector, nawet jeśli dekoder zgłosi, że może nie być w stanie odtworzyć multimediów w sposób wydajny. Na przykład w przypadku domyślnego selektora dekoder sprzętowy z tylko funkcjonalną obsługą będzie preferowany od dekodera programowego, który w pełni obsługuje format (#10604).
    • Dodaj ExoPlayer.Builder.setPlaybackLooper, który ustawia istniejący wątek odtwarzania dla nowej instancji ExoPlayera.
    • Zezwalaj na czyszczenie pomocników menedżera pobierania (#10776).
    • Dodaj parametr do BasePlayer.seekTo, aby wskazać polecenie użyte do wyszukiwania.
    • Używanie motywu podczas wczytywania elementów rysowalnych w przypadku interfejsu API w wersji 21 lub nowszej (#220).
    • Dodano ConcatenatingMediaSource2, które umożliwia łączenie wielu elementów multimedialnych w jednym oknie (#247).
  • Ekstraktory:
    • Zamiast NullPointerException zgłoś błąd ParserException, jeśli podczas analizowania atomów trak w tabeli próbek (stbl) brakuje wymaganego opisu próbki (stsd).
    • Prawidłowe pomijanie próbek podczas bezpośredniego przewijania do klatki synchronizacji w fMP4 (#10941).
  • Dźwięk:
    • Użyj przepływności skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora dla AudioTrack w bezpośrednim odtwarzaniu (passthrough).
  • Tekst:
    • Naprawiono TextRenderer przekazywanie nieprawidłowego (ujemnego) indeksu do Subtitle.getEventTime, jeśli plik z napisami nie zawiera wskazówek.
    • SubRip: dodaliśmy obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów.
  • Metadane:
    • Analizuj wiele wartości rozdzielonych znakiem null z ramek ID3, zgodnie z ID3 v2.4.
    • Dodaj MediaMetadata.mediaType, aby oznaczyć typ treści lub typ folderu opisany przez metadane.
    • Dodaj MediaMetadata.isBrowsable jako zamiennik MediaMetadata.folderType. W kolejnej wersji wycofamy ten typ folderu.
  • DASH:
    • Dodano pełne analizowanie zestawów adaptacyjnych obrazów, w tym liczbę kafelków (#3752).
  • UI:
    • Naprawiono wycofany element PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) aby mieć pewność, że zmiany widoczności są przekazywane do zarejestrowanego odbiorcy (#229).
    • Poprawiono kolejność elementów sterujących odtwarzaczem w środku w PlayerView podczas korzystania z układu od prawej do lewej (RTL) (#227).
  • Sesja:
    • Dodaj abstrakcyjny element SimpleBasePlayer, aby zaimplementować interfejs Player dla niestandardowych odtwarzaczy.
    • Dodanie metody pomocniczej do konwertowania tokena sesji platformy na Media3 (#171).SessionToken
    • Użyj onMediaMetadataChanged, aby wywołać aktualizacje sesji multimediów na platformie (#219).
    • Dodaj sesję multimediów jako argument funkcji getMediaButtons()DefaultMediaNotificationProvider i używaj list niezmiennych, aby zwiększyć przejrzystość (#216).
    • Dodaj onSetMediaItemslistener wywołania zwrotnego, aby umożliwić modyfikowanie lub ustawianie MediaItem listy, indeksu początkowego i pozycji według sesji przed ustawieniem w odtwarzaczu (#156).
    • Unikanie wykrywania dwukrotnego kliknięcia w przypadku zdarzeń przycisku multimediów innych niż Bluetooth (#233).
    • Zwiększono niezawodność QueueTimeline w przypadku podejrzanego stanu sesji starszego typu (#241).
  • Metadane:
    • Analizuj wiele wartości rozdzielonych znakiem null z ramek ID3, zgodnie z ID3 v2.4.
    • Dodaj MediaMetadata.mediaType, aby oznaczyć typ treści lub typ folderu opisany przez metadane.
    • Dodaj MediaMetadata.isBrowsable jako zamiennik MediaMetadata.folderType. W kolejnej wersji wycofamy ten typ folderu.
  • Rozszerzenie Cast:
    • Zaktualizowano wersję pakietu Cast SDK do 21.2.0.
  • Rozszerzenie IMA:
    • Usuń odbiornik odtwarzacza ImaServerSideAdInsertionMediaSource w wątku aplikacji, aby uniknąć problemów z wątkami.
    • Dodaj właściwość focusSkipButtonWhenAvailable do elementu ImaServerSideAdInsertionMediaSource.AdsLoader.Builder, aby poprosić o skupienie się na przycisku pominięcia na urządzeniach TV, i ustaw domyślnie wartość „true”.
    • Dodaj metodę focusSkipButton() do elementu ImaServerSideAdInsertionMediaSource.AdsLoader, aby programowo wysyłać żądanie ustawienia fokusu na przycisku pomijania.
    • Zaktualizowano pakiet IMA SDK do wersji 3.29.0.
  • Aplikacja w wersji demonstracyjnej:
    • Prośba o zgodę na wyświetlanie powiadomień o pobranych plikach 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 ExoPlayera 2.18.2.

  • Biblioteka podstawowa:
    • Dodano ExoPlayer.isTunnelingEnabled, aby sprawdzić, czy tunelowanie jest włączone w przypadku obecnie wybranych ścieżek (#2518).
    • Dodano WrappingMediaSource, aby uprościć zawijanie pojedynczego MediaSource (#7279).
    • Odrzucanie bufora wstecznego, zanim odtwarzanie się zatrzyma z powodu niewystarczającej ilości dostępnej pamięci.
    • Zamknij blok śledzenia „doSomeWork”, gdy włączone jest przenoszenie obliczeń.
    • Rozwiązano problem ze śledzeniem sesji w przypadku 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.
    • Naprawiono błąd, który powodował, że usunięcie słuchaczy podczas zwalniania odtwarzacza mogło wywołać wyjątek IllegalStateException (#10758).
  • Kompilacja:
    • Wymuszanie minimalnej wartości compileSdkVersion, aby uniknąć błędów kompilacji (#10684).
    • Unikaj publikowania bloku, gdy jest on uwzględniony w innej kompilacji Gradle.
  • Wybór ścieżki:
    • Jeśli wyświetlacz nie obsługuje Dolby Vision, preferuj inne ścieżki. (#8944).
  • Pobrane:
    • Rozwiązano problem z potencjalną pętlą nieskończoną w ProgressiveDownloader spowodowaną jednoczesnym pobieraniem i odtwarzaniem z tym samym PriorityTaskManager (#10570).
    • Natychmiastowe wyświetlanie powiadomienia o pobraniu (#183).
    • Ograniczono liczbę równoległych usuwań pobierania do 1, aby uniknąć nadmiernego tworzenia wątków (#10458).
  • Film:
    • Wypróbuj alternatywny dekoder Dolby Vision, jeśli wyświetlacz go nie obsługuje. (#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-kanałowego i 12-kanałowego dźwięku na maski kanałów 7.1 i 7.1.4 odpowiednio we wszystkich wersjach Androida (#10701).
  • Metadane:
    • MetadataRenderer można teraz skonfigurować tak, aby renderował metadane, gdy tylko staną się dostępne. Utwórz instancję z parametrem MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), aby określić, czy moduł renderujący ma generować metadane wcześniej czy synchronicznie z pozycją odtwarzacza.
  • DRM:
    • Obejście błędu w implementacji ClearKey w Androidzie 13, który zwraca niepusty, ale nieprawidłowy adres URL licencji.
    • Naprawiliśmy błąd setMediaDrmSession failed: session not opened, który występował podczas przełączania między schematami DRM na liście odtwarzania (np. z Widevine na ClearKey).
  • Tekst:
    • CEA-608: upewnij się, że polecenia przełączania usługi w polu 2 są obsługiwane prawidłowo (#10666).
  • DASH:
    • Analizowanie EventStream.presentationTimeOffset z plików manifestu (#10460).
  • UI:
    • Użyj bieżących zastąpień odtwarzacza jako ustawień wstępnych w TrackSelectionDialogBuilder (#10429).
  • Sesja:
    • Sprawdź, czy polecenia są zawsze wykonywane we właściwej kolejności, nawet jeśli niektóre z nich wymagają asynchronicznego rozwiązania (#85).
    • Dodaj DefaultMediaNotificationProvider.Builder, aby utworzyć instancje DefaultMediaNotificationProvider. Twórca może skonfigurować identyfikator powiadomienia, identyfikator kanału powiadomień i nazwę kanału powiadomień używane przez dostawcę. Dodaj też metodę DefaultMediaNotificationProvider.setSmallIcon(int), aby ustawić małą ikonę powiadomień. (#104).
    • Upewnij się, że polecenia wysłane przed MediaController.release() nie zostaną odrzucone (#99).
    • SimpleBitmapLoader może wczytywać mapy bitowe z identyfikatorów URI file:// (#108).
    • Naprawienie asercji, która uniemożliwia MediaController przewijanie reklamy w okresie (#122).
    • Po zakończeniu odtwarzania MediaSessionService jest zatrzymywany na pierwszym planie i wyświetlane jest powiadomienie o możliwości ponownego odtworzenia ostatniego odtwarzanego elementu multimedialnego (#112).
    • Nie uruchamiaj usługi działającej na pierwszym planie z intencją oczekującą wstrzymania (#167).
    • Ręczne ukrywanie „odznaki” powiązanej z powiadomieniem utworzonym przez DefaultNotificationProvider w przypadku interfejsów API 26 i 27 (odznaka jest automatycznie ukrywana w przypadku interfejsów API 28 i nowszych) (#131).
    • Naprawiliśmy błąd, który powodował, że drugie połączenie bindera z starszej wersji MediaSession do Media3 MediaController powodowało wyjątki IllegalStateException (#49).
  • RTSP:
    • Dodano obsługę podzielonych pakietów H263 (#119).
    • Dodano obsługę formatu MP4A-LATM (#162).
  • IMA:
    • Dodano limit czasu wczytywania informacji o reklamie, aby obsługiwać przypadki, w których pakiet IMA SDK zawiesza się podczas wczytywania reklamy (#10510).
    • Zapobieganie pomijaniu reklam w trakcie filmu podczas przewijania do końca treści (#10685).
    • Prawidłowe obliczanie czasu trwania okna w przypadku transmisji na żywo z reklamami wstawianymi po stronie serwera, np. IMA DAI (#10764).
  • Rozszerzenie FFmpeg:
    • Dodano nowe wymagane flagi do łączenia bibliotek FFmpeg z NDK w wersji 23.1.7779620 lub nowszej (#9933).
  • Rozszerzenie AV1:
    • Zaktualizowano wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Androida Studio (#9933).
  • Rozszerzenie Cast:
    • Wprowadź getDeviceInfo(), aby móc identyfikować CastPlayer podczas sterowania odtwarzaniem za pomocą MediaController (#142).
  • Transformer:
    • Dodanie timera nadzorującego multipleksera, aby wykrywać, kiedy generowanie próbki wyjściowej trwa zbyt długo.
  • Usuń wycofane symbole:
    • Usuń Transformer.Builder.setOutputMimeType(String). Ta funkcja została usunięta. Jeśli używany jest domyślny multiplekser, typ MIME będzie zawsze 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 ExoPlayera 2.18.1.

  • Biblioteka podstawowa:
    • Sprawdź, czy zmiana ShuffleOrder na ExoPlayer.setShuffleOrder powoduje wywołanie Player.Listener#onTimelineChangedreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • W przypadku mediów progresywnych uwzględniaj tylko wybrane ścieżki w pozycji buforowanej (#10361).
    • Zezwalaj na niestandardowy rejestrator dla wszystkich danych wyjściowych logów ExoPlayera (#9752).
    • Poprawiono implementację setDataSourceFactoryDefaultMediaSourceFactory, która w niektórych przypadkach nie działała (#116).
  • Ekstraktory:
    • Naprawiono analizowanie krótkoterminowych zestawów obrazów referencyjnych H265 (#10316).
    • Naprawiono analizowanie szybkości transmisji z esds pól (#10381).
  • DASH:
    • Analizowanie adresu URL licencji ClearKey z plików manifestu (#10246).
  • UI:
    • Sprawdź, czy TalkBack odczytuje aktualnie aktywną opcję szybkości w menu elementów sterujących odtwarzaniem (#10298).
  • RTSP:
    • Dodano obsługę fragmentowanych pakietów VP8 (#110).
  • Rozszerzenie Leanback:
    • Sprawdzanie zmian w playWhenReadyLeanbackAdapter (10420).
  • Przesyłanie:
    • Użyj parametru MediaItem przekazanego do metod playlisty jako Window.mediaItemCastTimeline (#25, #8212).
    • Obsługa Player.getMetadata()Listener.onMediaMetadataChanged() za pomocą CastPlayer (#25).

Wersja 1.0.0-beta01

16 czerwca 2022 r.

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

Odpowiada to wersji ExoPlayer 2.18.0.

  • Biblioteka podstawowa:
    • Włącz obsługę diagnostyki platformy Android za pomocą MediaMetricsManager. ExoPlayer będzie przekazywać do platformy zdarzenia odtwarzania i dane o skuteczności, co pomoże dostarczać informacje na potrzeby debugowania i o wydajności systemu 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 przekazywania danych do diagnostyki platformy ExoPlayer za pomocą ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Naprawiliśmy błąd, który powodował zbyt częste resetowanie ścieżek podczas korzystania z MergingMediaSource, np. podczas wczytywania napisów z pliku i zmiany wybranych napisów w trakcie odtwarzania (#10248).
    • Zaprzestanie wykrywania typu sieci 5G-NSA w przypadku interfejsów API w wersjach 29 i 30. Odtwarzanie będzie odbywać się w sieci 4G.
    • Nie zezwalaj na przekazywanie parametru null do usług MediaSource.Factory.setDrmSessionManagerProviderMediaSource.Factory.setLoadErrorHandlingPolicy. W razie potrzeby można jawnie przekazać instancje DefaultDrmSessionManagerProvider i DefaultLoadErrorHandlingPolicy.
    • Dodaj MediaItem.RequestMetadata, aby oznaczyć metadane potrzebne do odtwarzania multimediów, gdy dokładny LocalConfiguration nie jest znany. Usuń też MediaMetadata.mediaUrl, ponieważ jest to teraz uwzględnione w RequestMetadata.
    • Dodaj Player.Command.COMMAND_SET_MEDIA_ITEM, aby umożliwić graczom ustawienie pojedynczego elementu.
  • Wybór ścieżki:
    • Spłaszcz klasę TrackSelectionOverrides do TrackSelectionParameters i przenieś klasę TrackSelectionOverride na najwyższy poziom.
    • Zmień nazwę TracksInfo na TracksTracksInfo.TrackGroupInfo na Tracks.Group. Player.getCurrentTracksInfoPlayer.Listener.onTracksInfoChanged zostały też zmienione na Player.getCurrentTracksPlayer.Listener.onTracksChanged. Obejmuje to „wycofanie wycofania” nazwy metody Player.Listener.onTracksChanged, ale z innymi typami parametrów.
    • Zmień DefaultTrackSelector.buildUponParametersDefaultTrackSelector.Parameters.buildUpon na DefaultTrackSelector.Parameters.Builder zamiast wycofanego DefaultTrackSelector.ParametersBuilder.
    • DodajDefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilitiesktóra jest domyślnie włączona. Gdy ta opcja jest włączona, DefaultTrackSelector będzie preferować ś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 preferowany dźwięk stereo lub mono zamiast formatów wielokanałowych, chyba że format wielokanałowy może być przestrzenny (Android 12L lub nowszy) lub jest formatem dźwięku przestrzennego Dolby. Dodatkowo na urządzeniach obsługujących przestrzenne odtwarzanie dźwięku DefaultTrackSelector będzie monitorować zmiany w właściwościach przestrzennego odtwarzania dźwięku i w razie potrzeby wybierać nową ścieżkę. 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 być utworzona za pomocą Context.
  • Film:
    • Zmień nazwę DummySurface na PlaceholderSurface.
    • Dodanie obsługi formatu AV1 do elementu MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Dźwięk:
    • Używaj dekodera audio LG AC3 do rozgłaszania niestandardowego typu MIME.
    • Zmień typ zwracany funkcji AudioAttributes.getAudioAttributesV21()android.media.AudioAttributes na nową klasę opakowującą AudioAttributesV21, aby zapobiec powolnej weryfikacji ART w przypadku interfejsu API w wersji < 21.
    • W przypadku przekazywania dźwięku bez zmian, gdy liczba kanałów audio w formacie nie jest ustawiona, co ma miejsce w przypadku przygotowywania HLS bez segmentów (10204), wysyłaj zapytanie do platformy (API 29+) lub przyjmuj liczbę kanałów kodowania audio.
    • Skonfiguruj AudioTrack z maską kanału AudioFormat.CHANNEL_OUT_7POINT1POINT4, jeśli dekoder generuje 12-kanałowy dźwięk PCM (#10322).
  • DRM
    • Zadbaj o to, aby sesja DRM była 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 (np. OutlineColour ustawia tło wskazówki) (#8435).
    • CEA-708: analizuje dane w wielu blokach usług i ignoruje bloki, które nie są powiązane z obecnie wybranym numerem usługi.
    • Usuń znak RawCcExtractor, który był używany tylko do obsługi wewnętrznego formatu napisów Google.
  • Ekstraktory:
    • Dodano obsługę formatu AVI (#2092).
    • Matroska: analizowanie DiscardPadding w przypadku ścieżek Opus.
    • MP4: analizowanie szybkości transmisji z esds pudełek.
    • Ogg: zezwalaj na zduplikowane nagłówki identyfikatora Opus i komentarza (#10038).
  • UI:
    • Naprawiono dostarczanie zdarzeń do OnClickListener ustawionych na PlayerView w przypadku, gdy useController=false (#9605). Naprawiono też dostarczanie zdarzeń do OnLongClickListener we wszystkich konfiguracjach widoku.
    • Naprawiono problem z nieprawidłowym traktowaniem sekwencji zdarzeń dotykowych, które wychodzą poza granice elementu PlayerView przed elementem ACTION_UP, jako kliknięcia (#9861).
    • Rozwiązaliśmy problem z ułatwieniami dostępu PlayerView, który powodował, że kliknięcie mogło przełączać odtwarzanie zamiast ukrywać elementy sterujące (#8627).
    • Zmień TrackSelectionViewTrackSelectionDialogBuilder, aby działały z interfejsem Player zamiast ExoPlayer. Dzięki temu widoki mogą być używane z innymi implementacjami Player, a zależność modułu interfejsu od modułu ExoPlayer zostanie usunięta. Jest to zmiana powodująca niezgodność wsteczną.
    • Nie wyświetlaj wymuszonych ścieżek tekstowych w selektorze ścieżek PlayerView i zachowaj wybraną odpowiednią wymuszoną ścieżkę tekstową, jeśli wybrano opcję „Brak” (#9432).
  • DASH:
    • Analizowanie liczby kanałów z elementów DTS AudioChannelConfiguration. Przywraca przekazywanie dźwięku w przypadku strumieni DTS (#10159).
    • Nie zezwalaj na przekazywanie wartości null do usługi DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby można jawnie przekazywać instancje DefaultCompositeSequenceableLoaderFactory.
  • HLS:
    • Wróć do przygotowywania fragmentów, jeśli atrybut CODECS playlisty nie zawiera kodeka audio (#10065).
    • Nie zezwalaj na przekazywanie parametru null do usług HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactoryHlsMediaSource.Factory.setPlaylistTrackerFactory. Instancje DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory lub odwołanie do DefaultHlsPlaylistTracker.FACTORY można przekazać jawnie, jeśli jest to wymagane.
  • Smooth Streaming:
    • Nie zezwalaj na przekazywanie wartości null do usługi SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby można DefaultCompositeSequenceableLoaderFactoryjawnie przekazywaćDefaultCompositeSequenceableLoaderFactory instancje.
  • RTSP:
    • Dodano czytnik RTP dla H263 (#63).
    • Dodaj czytnik RTP dla MPEG4 (#35).
    • Dodano czytnik RTP dla HEVC (#36).
    • Dodaj czytnik RTP dla AMR. Obecnie obsługiwane są tylko strumienie AMR jednokanałowe, nieprzeplatane. Złożony ładunek RTP AMR nie jest obsługiwany. (#46)
    • Dodano czytnik RTP dla VP8 (#47).
    • Dodaj czytnik RTP dla formatu WAV (#56).
    • Popraw nagłówek uwierzytelniania podstawowego RTSP. (#9544).
    • Przestań sprawdzać obowiązkowe pola SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
    • Zgłaszanie sprawdzanego wyjątku podczas analizowania czasu RTSP (#10165).
    • Dodano czytnik RTP dla VP9 (#47).
    • Dodano czytnik RTP dla OPUS (#53).
  • Źródła danych:
    • Zmień nazwę DummyDataSource na PlaceholderDataSource.
    • Obejście obsługi przerwań OkHttp.
  • Sesja:
    • Zastąp MediaSession.MediaItemFiller ciągiem MediaSession.Callback.onAddMediaItems, aby zezwolić na asynchroniczne rozwiązywanie żądań.
    • Obsługa metod setMediaItems(s), gdy MediaController łączy się ze starszą sesją multimedialną.
    • Usuń MediaController.setMediaUriMediaSession.Callback.onSetMediaUri. Tę samą funkcję można uzyskać za pomocą funkcji MediaController.setMediaItem i MediaSession.Callback.onAddMediaItems.
    • Przekierowywanie połączeń z usługi starszego typu MediaController w celu odtwarzania multimediów na urządzeniu MediaSession.Callback.onAddMediaItems zamiast na urządzeniu onSetMediaUri.
    • Dodaj MediaNotification.ProviderDefaultMediaNotificationProvider, aby dostosować powiadomienie.
    • Dodano BitmapLoaderSimpleBitmapLoader do pobierania obrazów grafiki.
    • Dodaj MediaSession.setCustomLayout(), aby zapewnić zgodność wsteczną ze starszą sesją.
    • Dodaj MediaSession.setSessionExtras(), aby zapewnić równoważność funkcji ze starszą sesją.
    • Zmień nazwę MediaSession.MediaSessionCallback na MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback na MediaLibrarySession.CallbackMediaSession.Builder.setSessionCallback na setCallback.
    • Naprawiono błąd NPE w MediaControllerImplLegacy(#59).
    • Aktualizowanie informacji o pozycji sesji na osi czasu change(#51).
    • Naprawiono błąd NPE w MediaControllerImplBase po zwolnieniu kontrolera (#74).
  • Odtwarzanie reklam / IMA:
    • Zmniejsz częstotliwość odpytywania reklam ze 100 ms do 200 ms, aby dostosować ją do zaleceń organizacji Media Rating Council (MRC).
  • Rozszerzenie FFmpeg:
    • Zaktualizuj wersję CMake do 3.21.0+, aby uniknąć błędu CMake powodującego niepowodzenie synchronizacji Gradle w Android Studio (#9933).
  • Usuń wycofane symbole:
    • Usuń Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Zamiast niej używaj zasady Player.Listener.onTracksChanged(Tracks).
    • Usuń Player.getCurrentTrackGroupsPlayer.getCurrentTrackSelections. Zamiast niej używaj zasady Player.getCurrentTracks. Możesz też nadal korzystać z usług ExoPlayer.getCurrentTrackGroupsExoPlayer.getCurrentTrackSelections, ale te metody są już przestarzałe.
    • Usuń stałe DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORTDEFAULT_TRACK_SELECTOR_PARAMETERS. W miarę możliwości używaj zasady getDefaultTrackSelectorParameters(Context), a w pozostałych przypadkach zasady 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ć wartość 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 ExoPlayer 2.17.1.

  • Dźwięk:
    • Naprawiono błąd sprawdzania możliwości audio w przypadku Dolby Atmos (E-AC3-JOC) w HLS.
  • Ekstraktory:
    • FMP4: naprawiono problem polegający na tym, że metadane próbki emsg mogły być generowane w niewłaściwej kolejności w przypadku strumieni zawierających atomy emsg w wersjach 0 i 1 (#9996).
  • Tekst:
    • Poprawiono interakcję pól SingleSampleMediaSource.Factory.setTrackIdMediaItem.SubtitleConfiguration.Builder.setId, aby priorytetowo traktować pole SubtitleConfiguration i w razie jego braku używać wartości Factory (#10016).
  • Odtwarzanie reklam:
    • Naprawianie niedoborów dźwięku między okresami reklamowymi w transmisjach na żywo HLS z SSAI.

Wersja 1.0.0-alpha02

2 marca 2022 r.

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

Odpowiada to wersji ExoPlayer 2.17.0.

  • Podstawowa biblioteka:
    • Dodaj metodę chronioną DefaultRenderersFactory.getCodecAdapterFactory(), aby podklasy DefaultRenderersFactory, które zastępują buildVideoRenderers() lub buildAudioRenderers(), mogły uzyskać dostęp do fabryki adapterów kodeków i przekazywać ją do tworzonych przez siebie instancji MediaCodecRenderer.
    • Przekaż pola nagłówka ICY namegenre do MediaMetadata.stationMediaMetadata.genre odpowiednio, aby dotarły do aplikacji przez Player.Listener.onMediaMetadataChanged() (#9677).
    • Usuń klucze o wartości null z DefaultHttpDataSource#getResponseHeaders.
    • W przypadku niepowodzenia tworzenia instancji MediaCodec poczekaj i spróbuj ponownie. Rozwiązuje to problem, który występuje na niektórych urządzeniach podczas przełączania powierzchni z bezpiecznego kodeka na inny kodek (#8696).
    • Dodaj MediaCodecAdapter.getMetrics(), aby umożliwić użytkownikom uzyskiwanie danych o metrykach z MediaCodec. (#9766).
    • Rozwiązano problem z rozwiązywaniem zależności Maven (#8353).
    • Wyłącz automatyczne dostosowywanie szybkości w przypadku transmisji na żywo, które nie mają funkcji niskiego opóźnienia ani ustawienia szybkości wybranego przez użytkownika (#9329).
    • Zmień nazwę DecoderCounters#inputBufferCount na queuedInputBufferCount.
    • Ustaw SimpleExoPlayer.renderers jako prywatne. Do modułów renderujących można uzyskać dostęp za pomocą elementu ExoPlayer.getRenderer.
    • Zaktualizowano niektóre stałe wartości AnalyticsListener.EventFlags, aby były zgodne z wartościami w Player.EventFlags.
    • Podziel AnalyticsCollector na interfejs i domyślną implementację, aby R8 mógł go usunąć, jeśli aplikacja go nie potrzebuje.
  • Wybór ścieżki:
    • Obsługa preferowanych flag ról wideo w wyborze ścieżki (#9402).
    • Zaktualizowano logikę wyboru ścieżki wideo, aby podczas wybierania wielu ścieżek wideo do adaptacji uwzględniała preferowane typy MIME i flagi ról (#9519).
    • Zaktualizowano logikę wyboru ścieżek wideo i audio, aby wybierać tylko formaty do adaptacyjnego wyboru, które mają ten sam poziom obsługi dekodera i sprzętu (#9565).
    • Zaktualizowano logikę wyboru ścieżki wideo, aby preferować bardziej wydajne kodeki, jeśli podstawowe dekodery z akceleracją sprzętową obsługują wiele kodeków (#4835).
    • Preferuj ustawienia treści audio (np. „domyślną” ścieżkę audio lub ścieżkę pasującą do języka ustawionego w systemie) zamiast technicznych ograniczeń wyboru ścieżki (np. preferowanego typu MIME lub maksymalnej liczby kanałów).
    • Rozwiązanie problemu z wyborem ścieżki, który powodował, że zastąpienie jednej grupy ścieżek nie wyłączało innych grup ścieżek tego samego typu (#9675).
    • Rozwiązaliśmy problem z wyborem ścieżki, który powodował, że mieszanka niepustych i pustych zastąpień ścieżki nie była prawidłowo stosowana (#9649).
    • Zabraniaj duplikowania TrackGroup w TrackGroupArray. TrackGroups można zawsze odróżnić, ustawiając id w konstruktorze TrackGroup. Rozwiązuje to problem z awarią podczas wznawiania odtwarzania po przejściu aplikacji do trybu tła z aktywnym zastąpieniem ścieżki (#9718).
    • Zmiana logiki w AdaptiveTrackSelection, aby umożliwić zwiększenie jakości przy wystarczającej przepustowości sieci, nawet jeśli odtwarzanie jest bardzo blisko krawędzi transmisji na żywo (#9784).
  • Film:
    • Poprawiono logikę powrotu dekodera w przypadku Dolby Vision, aby w razie potrzeby używać zgodnego dekodera H264/H265.
  • Dźwięk:
    • Poprawiono logikę rezerwową dekodera Dolby Atmos (E-AC3-JOC), aby w razie potrzeby używać zgodnego dekodera E-AC3.
    • Zmień interfejsy API AudioCapabilities, aby wymagały jawnego przekazywania wartości AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES zamiast null.
    • Umożliwia dostosowanie 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łową analizę jednostek NAL SPS H.265 (#9719).
    • Analizowanie komentarzy Vorbis (w tym METADATA_BLOCK_PICTURE) w plikach Ogg Opus i Ogg Vorbis.
  • Tekst:
    • Dodaj 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 więcej danych niż zadeklarowany rozmiar bloku usługi.
  • DRM:
    • Usuń urządzenie playbackLooper z konta DrmSessionManager.(pre)acquireSession. Jeśli aplikacja używa elementu DrmSessionManager w niestandardowym elemencie MediaSource, zamiast tego należy przekazać element playbackLooper do elementu DrmSessionManager.setPlayer.
  • Odtwarzanie reklam / IMA:
    • Dodaj obsługę dynamicznego wstawiania reklam (DAI) w pakiecie IMA (#8213).
    • Dodaj metodę do AdPlaybackState, aby umożliwić resetowanie grupy reklam, tak aby można było ją ponownie odtworzyć (#9615).
    • Wymuszanie szybkości odtwarzania 1,0 podczas odtwarzania reklam (#9018).
    • Rozwiązaliśmy problem polegający na tym, że grupa reklam, której nie udało się załadować, powodowała natychmiastowe zresetowanie odtwarzania (#9929).
  • UI:
    • Naprawiliśmy kolor liczb na przyciskach StyledPlayerView przewijania do tyłu i do przodu podczas korzystania z niektórych motywów (#9765).
    • Prawidłowe tłumaczenie ciągów znaków dotyczących szybkości odtwarzania (#9811).
  • DASH:
    • Dodaj do Representation przeanalizowane właściwości podstawowe i dodatkowe (#9579).
    • Obsługa roli ścieżki forced-subtitle (#9727).
    • Przestań interpretować rolę ścieżki main jako C.SELECTION_FLAG_DEFAULT.
    • Poprawiono logikę wykluczania adresów URL w przypadku plików manifestu, które nie deklarują przestrzeni nazw DVB (#9856).
    • Obsługa względnych adresów URL MPD.Location (#9939).
  • HLS:
    • Prawidłowo wypełnij pole Format.label w przypadku strumieni HLS zawierających tylko dźwięk (#9608).
    • Domyślnie używaj przygotowania bez podziału na części, aby skrócić czas uruchamiania. Jeśli Twoje wersje zawierają zmuksowane ścieżki napisów, które nie są zadeklarowane 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 podziału na części za pomocą HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • Obsługa precyzyjnego przewijania do klatki kluczowej w HLS (#2882).
  • RTSP:
    • Udostępnij interfejs API klienta, aby zastąpić SocketFactory używany w przypadku połączeń z serwerem (#9606).
    • Preferuj metodę uwierzytelniania DIGEST zamiast BASIC, jeśli obie są obecne (#9800).
    • Obsługa sytuacji, w której czas ścieżki RTSP jest niedostępny (#9775).
    • Ignoruj nieprawidłowe wartości nagłówka RTP-Info (#9619).
  • Transformer:
    • Zwiększ minimalną wymaganą wersję interfejsu API do 21.
    • TransformationException jest teraz używany do opisywania błędów, które występują podczas przekształcenia.
    • Dodaj TransformationRequest, aby określić opcje przekształcania.
    • Zezwalaj na rejestrację wielu słuchaczy.
    • Naprawiono problem z zawieszaniem się transformatora, gdy dane wyjściowe kodeka są odczytywane częściowo.
    • Naprawianie potencjalnego błędu NPE w Transformer.getProgress podczas zwalniania multipleksera throws.
    • Dodaj aplikację w wersji demonstracyjnej do stosowania przekształceń.
  • Rozszerzenie MediaSession:
    • Domyślnie MediaSessionConnector czyści teraz playlistę po zatrzymaniu. Aplikacje, które chcą zachować playlistę, mogą wywołać setClearMediaItemsOnStop(false) w przypadku oprogramowania sprzęgającego.
  • Rozszerzenie Cast:
    • Naprawiono błąd, który uniemożliwiał prawidłowe wywoływanie funkcji CastPlayer przez funkcję onIsPlayingChanged (#9792).
    • Obsługa metadanych audio, w tym grafiki, z DefaultMediaItemConverter(#9663).
  • Rozszerzenie FFmpeg:
    • Ustawienie build_ffmpeg.sh jako zależnego od narzędzi binarnych LLVM zamiast narzędzi GNU (#9933).
  • Zgodność z Androidem 12:
    • Uaktualnij rozszerzenie Cast, aby zależało od com.google.android.gms:play-services-cast-framework:20.1.0. Starsze wersje play-services-cast-framework nie są zgodne z aplikacjami przeznaczonymi na Androida 12 i powodują błąd IllegalArgumentException podczas tworzenia PendingIntent (#9528).
  • Usuń wycofane symbole:
    • Usuń Player.EventListener. Użyj w zamian zasady Player.Listener.
    • Usuń MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactoryMediaSourceFactory#setDrmUserAgent. Zamiast niej używaj zasady MediaSourceFactory#setDrmSessionManagerProvider.
    • Usuń MediaSourceFactory#setStreamKeys. Zamiast niej używaj zasady MediaItem.Builder#setStreamKeys.
    • Usuń MediaSourceFactory#createMediaSource(Uri). Zamiast niej używaj zasady MediaSourceFactory#createMediaSource(MediaItem).
    • Usuń urządzenie setTag z konta DashMediaSource, HlsMediaSourceSsMediaSource. Zamiast niej używaj zasady MediaItem.Builder#setTag.
    • Usuń DashMediaSource#setLivePresentationDelayMs(long, boolean). Użyj symboli MediaItem.Builder#setLiveConfigurationMediaItem.LiveConfiguration.Builder#setTargetOffsetMs, aby zastąpić plik manifestu, lub symbolu DashMediaSource#setFallbackTargetLiveOffsetMs, aby podać wartość rezerwową.
    • Usuń (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Rezygnacja z egzekwowania zasad dotyczących wątków nie jest już możliwa.
    • Usuń ActionFileActionFileUpgradeUtil. Aby używać funkcji ActionFileUpgradeUtil do scalania starszych plików działań z plikami DefaultDownloadIndex, używaj ExoPlayera w wersji 2.16.1 lub starszej.
    • Usuń ProgressiveMediaSource#setExtractorsFactory. Zamiast tego użyj konstruktora ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • Usuń ProgressiveMediaSource.Factory#setTagProgressiveMediaSource.Factory#setCustomCacheKey. Zamiast niej używaj zasad MediaItem.Builder#setTagMediaItem.Builder#setCustomCacheKey.
    • Usuń konstruktory DefaultRenderersFactory(Context, @ExtensionRendererMode int)DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Zamiast tego użyj konstruktora DefaultRenderersFactory(Context), DefaultRenderersFactory#setExtensionRendererModeDefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Usuń wszystkie publiczne konstruktory CronetDataSource. Zamiast niej używaj zasady CronetDataSource.Factory.
  • Zmień tylko te elementy: IntDefs na @Target(TYPE_USE). Może to spowodować przerwanie kompilacji użyć w języku Kotlin, co można naprawić, przenosząc adnotację do adnotowania typu (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags (w com.google.android.exoplayer2.ext.flac pakiecie)
    • @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 ExoPlayera. Pierwsza wersja alfa zawiera wczesne, funkcjonalne implementacje bibliotek do wdrażania przypadków użycia multimediów, w tym:

  • ExoPlayer, czyli odtwarzacz multimediów na poziomie aplikacji na Androida, który można łatwo dostosowywać i rozszerzać.
  • Funkcje sesji multimedialnej do udostępniania odtwarzania i sterowania nim. Ten nowy moduł sesji korzysta z 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żytku z ExoPlayerem, np. wstawianie reklam za pomocą pakietu IMA SDK.

Więcej informacji znajdziesz w projekcie Media3 na GitHubie.

ExoPlayer był wcześniej hostowany w osobnym projekcie ExoPlayer GitHub. W Media3 nazwa pakietu to androidx.media3.exoplayer. Planujemy jeszcze przez jakiś czas utrzymywać i udostępniać projekt ExoPlayer w GitHubie, aby dać aplikacjom czas na przejście na Media3. Media3 ma zamienniki wszystkich modułów ExoPlayera z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session. Zapewnia to bezpośrednią integrację między odtwarzaczami a sesjami multimedialnymi bez konieczności używania klasy adaptera lub łącznika.