Media3

Obsługa bibliotek w przypadkach użycia multimediów.
Ostatnia aktualizacja Wersja stabilna Wersja kandydująca Wersja Beta Wersja alfa
13 listopada 2024 r. 1.4.1 1.5.0-rc01 - -

Deklarowanie zależności

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

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

Odlotowe

dependencies {
    def media3_version = "1.4.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
    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 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 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.4.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
    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 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 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.

Opinia

Twoja opinia pomoże nam ulepszyć Jetpacka. Korzystając z śledzika problemów z Media3, możesz znaleźć odpowiedzi na pytania, zgłaszać znane problemy i zgłaszać prośby o dodanie funkcji oraz zgłaszać nowe problemy.

Wersja 1.5

1.5.0-rc02 (2024-11-19)

androidx.media3:media3-*:1.5.0-rc02 został zwolniony.

Wersja 1.5.0-rc02 zawiera te komisy.

W tej wersji wprowadzono następujące zmiany w porównaniu z wersją 1.5.0-rc01:

  • Wyodrębnianie:
    • Dodaj obsługę formatu pliku multimedialnego AC-4 Level-4 ISO (#1265).
  • Tekst:
    • Popraw błędy w napisie CEA-608 w treściach z więcej niż jednym komunikatem SEI na próbkę.
    • Naprawić zawieszanie odtwarzania w przypadku strumieni DASH z wieloma okresami, gdy włączone są napisy CEA-608 (#1863).
    • Naprawić zniekształcone napisy CEA-608 w plikach MP4, które nieprawidłowo oznaczają każdy sample jako sample synchronizacji (#1863).
  • Aplikacja demonstracyjna
    • Rozwiązać problem z wyciekami pamięci w wersji demonstracyjnej aplikacji Short (#1839).

1.5.0-rc01 (2024-11-13)

androidx.media3:media3-*:1.5.0-rc01 został zwolniony.

Wersja 1.5.0-rc01 zawiera te komisy.

W tej wersji wprowadziliśmy następujące zmiany w porównaniu z 1.5.0-beta01:

  • ExoPlayer:
    • Rozwiązanie problemu polegającego na tym, że elementy playlisty lub okresy w strumieniu DASH z wieloma okresami o długościach niepasujących do rzeczywistej zawartości mogły powodować zablokowanie klatek na końcu elementu (#1698).
    • Dodaj metodę ustawiającą do SntpClient, aby ustawić maksymalny czas od ostatniej aktualizacji, po której klient jest ponownie inicjowany (#1794).
  • Wyodrębnianie:
    • Napraw błędny parsowanie czasu trwania multimediów w polu mdhd plików MP4, aby obsługiwać wartości -1 (#1819).
    • Dodanie obsługi identyfikacji h263 w plikach MP4 dla filmów H.263 (#1821).
  • DataSource:
    • DataSourceContractTest: sprawdź, czy funkcja DataSource.getUri() zwraca rozstrzygnięty identyfikator URI (zgodnie z dokumentacją). Jeśli jest on inny niż żądany URI, testy mogą to wskazać za pomocą nowej metody DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: sprawdź, czy funkcje DataSource.getUri() i getResponseHeaders() zwracają wartość „open” po nieudanym wywołaniu funkcji open() (z powodu zasobu „not found”) i przed kolejnym wywołaniem funkcji close().
      • Przesłonięcie DataSourceContractTest.getNotFoundResources() pozwala testowanym podklasom udostępniać wiele zasobów z wartością „nie znaleziono” oraz udostępniać oczekiwane nagłówki. Pozwala to odróżnić kod 404 HTTP (z nagłówkami) od komunikatu „serwer nie znaleziono” (bez nagłówków).
  • Tekst:
    • Naprawiono problem z brakiem napisów CEA-608 w strumieniach H.264 MPEG-TS (został on rozwiązany w 1.5.0-alpha01 w ramach commitu https://github.com/androidx/media/commit/03a205f220ecf7681f85f8a752227e3986e257ff).
    • Obsługa napisów CEA-608 w treściach Dolby Vision (#1820).
  • Rozszerzenie RTSP:
    • Naprawiono problem z zawieszaniem się podczas analizowania pakietów RTP z rozszerzeniami nagłówka (#1225).

Wersja 1.5.0-beta01

30 października 2024 r.

androidx.media3:media3-*:1.5.0-beta01 został zwolniony. Wersja 1.5.0-beta01 zawiera te komity.

  • Biblioteka wspólna:
    • Usuń adnotacje @DoNotInline z ręcznie wylistowanych wewnętrznych klas, aby uniknąć błędów weryfikacji klasy w czasie wykonywania. Najnowsze wersje R8 automatycznie wywołują takie wywołania offline, aby uniknąć błędów w czasie wykonywania (nie jest już wymagane ręczne wywoływanie offline). Wszyscy użytkownicy biblioteki Gradle muszą już używać wersji wtyczki Gradle dla Androida, która korzysta z wersji R8, która to z kolei korzysta z compileSdk = 35. Użytkownicy biblioteki korzystający z systemów kompilacji innych niż Gradle muszą zadbać o to, aby ich etap kompresji/zaciemnienia odpowiadający R8 wykonywał podobny automatyczny proces wyodrębniania, aby uniknąć błędów weryfikacji klasy w czasie wykonywania. Ta zmiana została już wprowadzona w innych bibliotekach AndroidX.
  • ExoPlayer:
    • Naprawiono błąd, który powodował, że MediaCodec.CryptoException był czasami zgłaszany jako „nieoczekiwany błąd podczas działania”, gdy MediaCodec.CryptoException działał w trybie asynchronicznym (domyślne zachowanie w wersji interfejsu API 31 lub nowszej).MediaCodec
    • Zamiast bufferedPositionUs podaj bufferedDurationUs w funkcji PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Zmiana DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS na DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS powoduje, że aplikacje muszą przekazać wartość reprezentującą konkretny czas trwania od domyślnej pozycji początkowej, dla której odpowiednie źródło multimediów musi zostać wstępnie załadowane za pomocą tej definicji typu danych zamiast pozycji.
    • Dodaj implementację ForwardingRenderer, która przekierowuje 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ępny wczyt, wywołując funkcję ExoPlayer.setPreloadConfiguration(PreloadConfiguration). Wstępne wczytywanie jest domyślnie wyłączone. Gdy ta opcja jest włączona, aby nie zakłócać odtwarzania, DefaultLoadControl ogranicza wstępny odczyt do momentu rozpoczęcia i kontynuowania tylko wtedy, gdy odtwarzacz nie wczytuje się do odtwarzania. Aplikacje mogą zmieniać to zachowanie, stosując odpowiednio funkcję LoadControl.shouldContinuePreloading() (np. przez zastąpienie tej metody w funkcji DefaultLoadControl). Domyślna implementacja funkcji LoadControl wyłącza wstępny wczyt, jeśli aplikacja używa niestandardowej implementacji funkcji LoadControl.
    • Dodaj metodę MediaSourceEventListener.EventDispatcher.dispatchEvent(), aby umożliwić wywoływanie zdarzeń w detektorach podklasy (1736).
    • Dodaj DefaultPreloadManager.Builder, który tworzy wystąpienia DefaultPreloadManager i ExoPlayer z używnymi spójnymi konfiguracjami.
    • Usuń parametr Renderer[] z funkcji LoadControl.onTracksSelected(), ponieważ implementacja DefaultLoadControl może pobierać typy strumieni z funkcji ExoTrackSelection[].
    • Wycofana metoda DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) została oznaczona jako ostateczna, aby zapobiec jej zastąpieniu. Zamiast tego należy używać nowego elementu DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • Raportowanie zdarzeń MediaSourceEventListener ze źródeł dodatkowych w MergingMediaSource. Spowoduje to zgłoszenie zdarzeń rozpoczęcia, błędu, anulowania i zakończenia wczytywania napisów wyświetlanych na ekranie (dodanych za pomocą MediaItem.LocalConfiguration.subtitleConfigurations), które mogą być wyświetlane jako zduplikowane zdarzenia wczytywania emitowane przez AnalyticsListener.
    • zapobieganie całkowitemu zatrzymaniu odtwarzania z powodu błędów w napisach i metadanych; Zamiast tego wyłączyliśmy problemowy utwór, a pozostałe utwory będą odtwarzane dalej (#1722).
      • W przypadku nowej obsługi napisów (podczas wyodrębniania) powiązane błędy analizy (np. nieprawidłowe dane napisów) i błędy wczytywania (np. HTTP 404) są emitowane za pomocą wywołań zwrotnych onLoadError.
      • W przypadku obsługi starszych napisów (podczas renderowania) tylko powiązane błędy wczytywania są emitowane za pomocą wywołań zwrotnych onLoadError, a błędy parsowania są ignorowane (jest to wcześniejsze zachowanie).
  • Transformator:
    • Ustaw czas trwania obrazu za pomocą funkcji MediaItem.Builder.setImageDurationMs jako obowiązkowy element eksportu obrazu.
    • Dodano obsługę eksportowania przerw w sekwencji zmodyfikowanych elementów audio.
  • Wybór utworu:
    • DefaultTrackSelector: preferowanie dźwięku obiektowego nad dźwiękiem kanału, jeśli inne czynniki są takie same.
  • Wyodrębnianie:
    • Poprawiono obsługę próbki preroll dla pozycji początkowych mediów, które nie są kluczowymi klatkami podczas przetwarzania list edycji w plikach MP4 (#1659).
    • Ulepszenie obliczeń częstotliwości klatek dzięki użyciu czasu trwania multimediów z pola mdhd w Mp4Extractor i FragmentedMp4Extractor (#1531).
    • Poprawka nieprawidłowego skalowania media_time w listach edycji MP4. Podczas gdy segment_duration została już prawidłowo przeskalowana za pomocą skali czasowej filmu, media_time jest teraz prawidłowo przeskalowana za pomocą skali czasowej ścieżki zgodnie ze standardem formatu MP4 (#1792).
    • Obsługa klatek o nieprawidłowej kolejności w obliczeniach endIndices w pliku MP4 z listą edycji (#1797).
  • Dźwięk:
    • Poprawiono dźwięki trzasknięcia, które mogły występować podczas przewijania.
    • Naprawiono gromadzenie błędów związanych z odcięciem w przypadku algorytmu rozciągania czasowego/zmiany wysokości dźwięku Sonic.
    • Naprawiono błąd w SpeedChangingAudioProcessor, który powodował utratę klatek na wyjściu.
  • Film:
    • Dodano obejście problemu z urządzeniem Galaxy Tab S7 FE, który powodował, że strumienie H264 z zabezpieczeniami i częstotliwością 60 fps były oznaczane jako niedostępne (#1619).
    • Dodaj obejście dla kodeków, które utknęły po ostatnim próbku bez zwrócenia sygnału końca strumienia.
  • Tekst:
    • Upewnij się, że wyświetlane są napisy WebVTT w HLS z bardzo dużymi sygnaturami czasowymi napisów (które przepełniają 64-bitową long, gdy są reprezentowane jako mikrosekundy i pomnożone przez bazę czasu MPEG 90,000) (#1763).
  • Metadane:
    • Przypisz typ C.TRACK_TYPE_METADATA do ścieżek zawierających treści icy lub vnd.dvb.ait.
  • DRM:
    • Napraw IllegalStateException z DefaultDrmSession.requiresSecureDecoder po otwarciu sesji DRM. Ten problem pojawił się w wersji 1.5.0-alpha01.
  • Muxery:
  • Rozszerzenie IMA:
    • Naprawiono błąd, w którym strumienie DAI wstawiane po stronie serwera bez prerollu mogły powodować ArrayIndexOutOfBoundsException podczas odtwarzania po ostatniej reklamie midroll (#1741).
  • Sesja:
    • Naprawiono błąd, który powodował, że niestandardowe polecenia wysyłane z usługi MediaBrowser były wysyłane do usługi MediaSessionCompat.Callback zamiast do usługi MediaBrowserServiceCompat, gdy użytkownik był połączony ze starszą usługą. To uniemożliwiło MediaBrowser otrzymanie rzeczywistej wartości zwróconej przez starszą usługę (#1474).
    • Obsługa wyjątku IllegalArgumentException zgłaszanego przez urządzenia niektórych producentów podczas konfigurowania odbiornika transmisji dla intencji przycisku multimedialnego (#1730).
    • Dodawanie przycisków poleceń dla elementów multimediów. Dodaje interfejs Media3 API do tego, co było znane jako Custom browse actions, z zastosowaniem starszej biblioteki z MediaBrowserCompat. Pamiętaj, że w przypadku Media3 przyciski poleceń dotyczące multimediów są dostępne zarówno dla MediaBrowser, jak i MediaController. Zobacz niestandardowe działania przeglądania w AAOS.
    • Naprawiono błąd, który powodował, że kontroler Media3 nie zawsze pozwalał aplikacji sesji na uruchomienie usługi na pierwszym planie po wysłaniu żądania play().
    • Ogranicz CommandButton.Builder.setIconUri, aby akceptować tylko identyfikatory URI treści.
    • Przekazywanie wskazówek dotyczących połączenia przeglądarki Media3 do początkowego MediaBrowserCompat podczas łączenia się z starszą wersją MediaBrowserCompat. Usługa może otrzymywać wskazówki dotyczące połączenia przekazywane jako wskazówki główne podczas pierwszego wywołania onGetRoot().
    • Rozwiązanie błędu polegającego na tym, że MediaBrowser połączony ze starszą usługą przeglądarki nie otrzymywał błędu wysłanego przez usługę po subskrypcji parentid w przeglądarce.
    • Poprawić działanie interoperacyjności, aby przeglądarka Media3 połączona ze starszą wersją MediaBrowserService nie wysyłała żądania do podrzędnych parentId dwukrotnie, gdy subskrybuje wersję nadrzędną.
  • UI:
    • Włącz opcję PlayerVieww ComposeAndroidView, aby korzystać z obejścia problemu związanego z udostępnianiem przejść na podstawie pliku XML. Aplikacje korzystające z funkcji PlayerView w ramach AndroidView muszą wywoływać funkcję PlayerView.setEnableComposeSurfaceSyncWorkaround, aby umożliwić użytkownikom wyrażenie zgody (#1237, #1594).
    • Dodaj setFullscreenButtonState do PlayerView, aby umożliwić aktualizację ikony przycisku pełnoekranowego na żądanie, czyli poza pasmem i nie w reakcji na kliknięcie (#1590, #184).
    • Rozwiązanie błędu polegającego na tym, że opcja „Brak” w przypadku wyboru tekstu nie działa, jeśli istnieją określone przez aplikację preferencje wyboru ścieżki tekstowej.
  • Rozszerzenie płynnego przesyłania strumieniowego:
    • Naprawiono błąd Bad magic number for Bundle podczas odtwarzania strumieni danych SmoothStreaming z ścieżkami tekstowymi (#1779).
  • Rozszerzenie RTSP:
    • Popraw usuwanie informacji o użytkownikach w przypadku adresów URL zawierających zakodowane znaki @ (#1138).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Dodanie obsługi stron o długości 16 KB dla rozszerzeń dekoderów w Androidzie 15 (#1685).
  • Rozszerzenie Cast:
    • Zatrzymanie czyszczenia osi czasu po rozłączeniu sesji przesyłania, co umożliwia aplikacji nadawcy wznowienie odtwarzania lokalnie po rozłączeniu.
    • Wypełnij parametr DeviceInfo w CastPlayer, gdy podano parametr Context. Umożliwia to połączenie MediaSession z RoutingSession, co jest konieczne do zintegrowania przełącznika wyjścia (#1056).
  • Usuń symbole wycofane:
    • Usuń przestarzałe konstruktory DefaultEncoderFactory. Zamiast tego użyj atrybutu DefaultEncoderFactory.Builder.

Wersja 1.5.0-alpha01

10 września 2024 r.

W tej wersji wprowadzono następujące zmiany w porównaniu z wersją 1.4.1:

  • Biblioteka wspólna:
    • Dodaj ForwardingSimpleBasePlayer, który umożliwia przekierowanie do innego odtwarzacza z niewielkimi zmianami, zapewniając przy tym pełną spójność i obsługę odbiorcy (#1183).
    • Zastąp metodę SimpleBasePlayer.State.playlist metodą getPlaylist().
    • Dodaj zastąpienie dla SimpleBasePlayer.State.Builder.setPlaylist(), aby bezpośrednio określić Timeline oraz bieżące Tracks i Metadata zamiast tworzyć strukturę playlisty.
    • Zwiększ minSdk do 21 (Android Lollipop). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX.
    • Dodaj element androidx.media3:media3-common-ktx, który zapewnia funkcje związane z językiem Kotlin i oparte na bibliotece wspólnej.
    • Dodaj funkcję rozszerzenia Player.listen, która zawiesza coroutine, aby wykonać Player.Events w bibliotece media3-common-ktx.
  • ExoPlayer:
    • MediaCodecRenderer.onProcessedStreamChange() może teraz dzwonić do każdego elementu multimedialnego. Wcześniej nie był on wywoływany w przypadku pierwszego. Aby to zrobić, kliknij MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart().
    • Dodaj element PreloadMediaSource.PreloadControl.onPreloadError, aby umożliwić implementacjom PreloadMediaSource.PreloadControl wykonywanie działań w przypadku wystąpienia błędu.
    • Dodaj BasePreloadManager.Listener, aby rozpowszechniać zdarzenia wstępnego wczytania do aplikacji.
    • Zezwalanie na zmianę limitu czasu klienta SNTP i ponowne próby wysyłania danych do alternatywnych adresów w przypadku przekroczenia limitu czasu (problem 1540).
    • Usuń MediaCodecAdapter.Configuration.flags, ponieważ pole zawsze zawierało wartość zero.
    • Zezwalaj użytkownikowi na wybranie wbudowanego głośnika do odtwarzania na Wear OS w wersji API 35 lub nowszej (gdzie urządzenie reklamuje obsługę tej funkcji).
    • Odrocz wywołanie blokady do Context.getSystemService(Context.AUDIO_SERVICE), dopóki nie włączysz obsługi skupienia na dźwięku. Dzięki temu nie dochodzi do blokowania połączeń, jeśli nie jest włączone obsługiwanie dźwięku w przypadku skupienia (#1616).
    • Zezwalanie na odtwarzanie niezależnie od czasu buforowania w przypadku niepowodzenia wczytywania (#1571).
    • Dodaj AnalyticsListener.onRendererReadyChanged(), aby zasygnalizować, że poszczególne renderery są gotowe do odtwarzania.
  • Transformator:
    • Dodaj SurfaceAssetLoader, który umożliwia kolejkowanie danych wideo do Transformera za pomocą Surface.
    • ImageAssetLoader zwraca nieobsługiwany typ danych za pomocą AssetLoader.onError zamiast IllegalStateException.
  • Wyodrębnianie:
    • Zezwalaj na to, aby Mp4Extractor i FragmentedMp4Extractor rozpoznawały próbki H264, które nie są używane jako odniesienie przez kolejne próbki.
    • Dodanie opcji włączania przeskakiwania na podstawie indeksu w AmrExtractor.
    • Pliki MP3 z więcej niż 128 kB między prawidłowymi ramkami są traktowane jako obcięte (zamiast nieprawidłowe). Oznacza to, że pliki z danymi innymi niż MP3 na końcu, które nie mają innych metadanych wskazujących długość bajtów MP3, będą teraz odtwarzane do końca danych MP3 zamiast kończyć się błędem ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
  • DataSource:
    • Zaktualizuj HttpEngineDataSource, aby umożliwić korzystanie z wersji S rozszerzenia 7 zamiast poziomu interfejsu API 34 (#1262).
  • Dźwięk:
    • automatycznie skonfigurować metadane głośności CTA-2075 w kodeki, jeśli są one obecne w multimediów;
    • zapewnić płynne zmniejszanie głośności podczas przewijania.
  • Film:
    • MediaCodecVideoRenderer zapobiega dekodowaniu próbek, które nie są renderowane ani używane jako odniesienie przez inne próbki.
    • W interfejsie API 35 i nowszych MediaCodecAdapter może teraz otrzymywać null Surface w configure i wywoływać nową metodę detachOutputSurface, aby usunąć wcześniej ustawiony Surface, jeśli kodek obsługuje tę funkcję (MediaCodecInfo.detachedSurfaceSupported).
    • Podczas przetwarzania onOutputFormatChanged użyj wartości współczynnika proporcji pikseli MediaCodecAdapter, jeśli zostały podane (#1371).
  • Tekst:
  • Obraz:
    • Dodaj ExternallyLoadedImageDecoder, aby uprościć integrację z zewnętrzną biblioteką do ładowania obrazów, np. Glide lub Coil.
  • DataSource:
    • Dodaj FileDescriptorDataSource, nowy DataSource, który może być używany do odczytu z FileDescriptor (#3757).
  • Skutek:
    • Dodaj obejście problemu DefaultVideoFrameProcessor w przypadku drobnego SurfaceTexturezwiększania skali. SurfaceTexture może zawierać niewielkie skalowanie, które odcina 1 pikselową krawędź narożnika przyciętego bufora. Teraz jest to obsługiwane, dzięki czemu wyniki są bliższe oczekiwanym.
    • Przyspiesz DefaultVideoFrameProcessor.queueInputBitmap(). W rezultacie eksportowanie obrazów do filmów za pomocą Transformer jest szybsze.
  • Rozszerzenie IMA:
    • Naprawiono błąd, który powodował, że czyszczenie playlisty mogło spowodować błąd ArrayIndexOutOfBoundsException w ImaServerSideAdInsertionMediaSource.
  • Sesja:
    • Dodaj MediaButtonReceiver.shouldStartForegroundService(Intent), aby umożliwić aplikacjom pominięcie przychodzącej komendy odtwarzania w celu wznowienia odtwarzania przez zastąpienie tej metody. Domyślnie usługa jest zawsze uruchamiana, a odtwarzanie nie może zostać wstrzymane bez awarii systemu z ForegroundServiceDidNotStartInTimeException (#1528).
  • Rozszerzenie DASH:
    • Dodawanie obsługi okresów rozpoczynających się w środku segmentu (#1440).
  • 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ą natywnej biblioteki libiamf do syntezy dźwięku.
      • Odtwarzanie jest włączone w układzie stereo i 5.1 ze sterowaniem przestrzennym oraz opcjonalnym śledzeniem ruchów głowy, ale obsługa odtwarzania binauralnego jest obecnie niedostępna.
  • Rozszerzenie Cast:
    • Zatrzymanie czyszczenia osi czasu po rozłączeniu sesji przesyłania, co umożliwia aplikacji przesyłającej wznowienie odtwarzania lokalnie po rozłączeniu.
    • Wypełnij parametr DeviceInfo w CastPlayer, gdy podano parametr Context. Umożliwia to połączenie MediaSession z RoutingSession, co jest konieczne do zintegrowania przełącznika wyjścia (#1056).
  • Narzędzia testowe:
    • DataSourceContractTest zawiera teraz testy, które sprawdzają:
      • Strumień wejściowy read position został zaktualizowany.
      • Bufor wyjściowy offset jest prawidłowo stosowany.
  • Usuń symbole wycofane:
    • Usuń wycofane Player.hasPrevious, Player.hasPreviousWindow(). Zamiast tego użyj Player.hasPreviousMediaItem().
    • Usuń wycofaną metodę Player.previous(). Zamiast tego użyj atrybutu Player.seekToPreviousMediaItem().
    • Usuń wycofaną metodę DrmSessionEventListener.onDrmSessionAcquired.

Wersja 1.4.0

Wersja 1.4.1

27 sierpnia 2024 r.

androidx.media3:media3-*:1.4.1 został zwolniony. Wersja 1.4.1 zawiera te komity.

  • ExoPlayer:
    • Niesynchroniczne obsługiwanie wywołań zwrotnych w funkcji PreloadMediaSource (#1568).
    • Zezwalanie na odtwarzanie niezależnie od czasu buforowania w przypadku niepowodzenia wczytywania (#1571).
  • Wyodrębnianie:
    • MP3: poprawka błędu Searched too many bytes polegająca na prawidłowym ignorowaniu danych niebędących w formacie MP3 na podstawie pola długości w ramce Info (#1480).
  • Tekst:
    • TTML: poprawić obsługę wartości procentowych tts:fontSize, aby były one prawidłowo dziedziczone z węzłów nadrzędnych z wartościami procentowymi tts:fontSize.
    • Poprawka IndexOutOfBoundsExceptionLegacySubtitleUtil ze względu na nieprawidłowe przetwarzanie przypadku, w którym żądany czas rozpoczęcia wyjścia jest większy lub równy końcowemu czasowi 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 i nowszej, na których odtwarzane są treści L1 Widevine. Ten błąd jest spowodowany niepełną implementacją metody MediaDrm.requiresSecureDecoder (#1603).
  • Skutek:
    • Dodaj formę płatności release() do GlObjectsProvider.
  • Sesja:
    • Przekształcić podwójne kliknięcie KEYCODE_HEADSETHOOK w działanie „przewinąć do następnego”, zgodnie z dokumentacją (#1493).
    • Obsługuj KEYCODE_HEADSETHOOK jako polecenie „odtwórz” 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.

androidx.media3:media3-*:1.4.0 został zwolniony. Wersja 1.4.0 zawiera te komitowane zmiany.

  • Biblioteka wspólna:
    • Przekazywanie do metod BasePlayer.seekTo()SimpleBasePlayer.handleSeek() (zamiast ich ignorowania) zapytań o wyszukiwanie, które prawdopodobnie nie wymagają działania. Jeśli te metody są stosowane w niestandardowym odtwarzaczu, może być konieczne obsłużenie tych dodatkowych wywołań za pomocą funkcji mediaItemIndex == C.INDEX_UNSET.
    • Usuń zależność kompilacji od ulepszonej desugaring Java 8 (#1312).
    • Upewnij się, że czas trwania przekazany do elementu MediaItem.Builder.setImageDurationMs() jest ignorowany w przypadku elementów innych niż obrazy MediaItem (jak to zostało udokumentowane).
    • Dodaj Format.customData, aby przechowywać informacje niestandardowe dotyczące instancji Format dostarczone przez aplikację.
  • ExoPlayer:
    • Dodaj BasePreloadManager, który koordynuje wstępne wczytywanie wielu źródeł na podstawie priorytetów zdefiniowanych przez ich rankingData. Dostosowywanie jest możliwe dzięki rozszerzeniu tej klasy. Dodaj DefaultPreloadManager, który używa PreloadMediaSource do wstępnego załadowania próbek multimediów źródeł do pamięci, oraz liczby całkowitej rankingData, która wskazuje indeks elementu w interfejsie.
    • Dodaj PlayerId do większości metod LoadControl, aby umożliwić LoadControl implementacje obsługujące wielu graczy.
    • Usuń Buffer.isDecodeOnly()C.BUFFER_FLAG_DECODE_ONLY. Nie trzeba ustawiać tej flagi, ponieważ renderowanie i dekodowanie zdecydują o pominięciu buforów na podstawie sygnatury czasowej. Niestandardowe implementacje Renderer powinny sprawdzać, czy czas buforowania wynosi co najmniej BaseRenderer.getLastResetPositionUs(), aby zdecydować, czy należy wyświetlić próbkę. W przypadku niestandardowych implementacji SimpleDecoder można sprawdzić isAtLeastOutputStartTimeUs() w razie potrzeby lub oznaczyć inne bufory za pomocą DecoderOutputBuffer.shouldBeSkipped, aby je pominąć.
    • Umożliw zwracanie przez funkcję TargetPreloadStatusControl.getTargetPreloadStatus(T) wartości null, aby wskazać, że nie należy wstępnie wczytywać elementu MediaSource z danym elementem rankingData.
    • Dodano remove(MediaSource) do BasePreloadManager.
    • Dodaj reset() do BasePreloadManager, aby zwolnić wszystkie źródła z zatrzymaniem, a jednocześnie zachować instancję menedżera wstępnego wczytania.
    • Dodaj ExoPlayer.setPriority() (i Builder.setPriority()), aby zdefiniować wartość priorytetu używaną w PriorityTaskManager i w przypadku znaczenia MediaCodec z interfejsu API 35.
    • Rozwiązanie problemu z aktualizacją ostatniego czasu ponownego buforowania, który powodował nieprawidłowy klucz bs (niedobór bufora) w CMCD (#1124).
    • Dodaj znakPreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource), aby wskazać, że źródło zostało załadowane do końca. Umożliwia to DefaultPreloadManager i spersonalizowanym PreloadMediaSource.PreloadControl wstępne załadowanie następnego źródła lub wykonanie innych działań.
    • Naprawiono błąd, który powodował, że pomijanie ciszy na końcu elementów mogło wywołać wyjątek od odtwarzania.
    • Aby odrzucić okres wstępnego wczytywania, dodaj clear do PreloadMediaSource.
    • Dodaj nowy kod błędu PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, który jest używany, gdy zasoby kodeka są odzyskiwane na potrzeby zadań o wyższym priorytecie.
    • Pozwalaj AdsMediaSource wczytywać reklamy przed rozpoczęciem przygotowywania treści (#1358).
    • Naprawiono 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 oryginalnego okresu z pliku manifestu.
    • Zmień nazwę onTimelineRefreshed() na onSourcePrepared(), a onPrepared() na onTracksSelected() w PreloadMediaSource.PreloadControl. Odpowiednio zmień też nazwy definicji interfejsów w pliku DefaultPreloadManager.Stage.
    • Dodanie eksperymentalnej obsługi dynamicznego harmonogramowania w celu lepszego dopasowania pracy do cykli aktywacji procesora i opóźnienia aktywacji do momentu, gdy renderowanie może się rozpocząć. Możesz to włączyć, używając experimentalSetDynamicSchedulingEnabled() podczas konfigurowania instancji ExoPlayera.
    • Dodaj Renderer.getDurationToProgressUs(). Renderer może zaimplementować tę metodę, aby zwrócić do ExoPlayera czas trwania odtwarzania, który musi zostać przesunięty, aby renderer mógł kontynuować. Jeśli ExoPlayer jest ustawiony za pomocą experimentalSetDynamicSchedulingEnabled(), wtedy ExoPlayer wywoła tę metodę podczas obliczania czasu, aby zaplanować zadanie robocze.
    • Dodaj MediaCodecAdapter#OnBufferAvailableListener, aby otrzymywać alerty, gdy bufor danych wejściowych i wyjściowych jest dostępny do użycia przez MediaCodecRenderer. MediaCodecRenderer będzie wysyłać sygnały do ExoPlayer, gdy otrzyma te callbacki. Jeśli ExoPlayer jest ustawiony na experimentalSetDynamicSchedulingEnabled(), ExoPlayer będzie planować swoją pętlę roboczą, gdy tylko renderowanie będzie się posuwać do przodu.
    • Zamiast poszczególnych parametrów w metodach LoadControl używaj klasy danych.
    • Dodaj ExoPlayer.isReleased(), aby sprawdzić, czy funkcja Exoplayer.release() została wywołana.
    • Dodaj ExoPlayer.Builder.setMaxSeekToPreviousPositionMs(), aby skonfigurować maksymalną pozycję, dla której funkcja seekToPrevious() ma szukać poprzedniego elementu (#1425).
    • Poprawiono niespójności w przypadku skupienia dźwięku, np. brak zgłaszania pełnego lub chwilowego utraty skupienia podczas pauzy odtwarzacza (#1436).
    • Naprawiono potencjalny błąd IndexOutOfBoundsException spowodowany przez ekstraktory zgłaszające dodatkowe ścieżki po początkowym etapie przygotowania (#1476).
    • EffectsExoPlayer.setVideoEffect() otrzyma sygnatury czasowe z usuniętym przesunięciem w renderowaniu (#1098).
    • Naprawiono potencjalny błąd IllegalArgumentException podczas obsługi błędu odtwarzacza, który wystąpił podczas odczytu do przodu innego elementu playlisty (#1483).
  • Transformator:
    • Dodaj audioConversionProcess i videoConversionProcess do ExportResult, aby wskazać, jak powstała dana ścieżka w pliku wyjściowym.
    • Zmniejszenie liczby kontroli poziomu H.264 w optymalizacji przycinania.
    • Dodaj obsługę sekwencyjnego przełączania się między SDR a HDR.
    • Dodaliśmy obsługę efektów dźwiękowych na poziomie kompozycji.
    • Dodaliśmy obsługę transkodowania obrazów Ultra HDR na filmy HDR.
    • Rozwiązanie problemu polegającego na tym, że funkcja DefaultAudioMixer nie zwraca prawidłowej ilości bajtów po zresetowaniu i ponownym użyciu.
    • obejście błędu dekodera, w którym liczba kanałów audio była ograniczona do stereo podczas obsługi wejścia PCM;
    • Podczas wybierania ścieżek w ExoPlayerAssetLoader ignoruj ograniczenia dotyczące liczby kanałów audio, ponieważ dotyczą one tylko odtwarzania.
    • Zastąp interfejs androidx.media3.transformer.Muxer interfejsem androidx.media3.muxer.Muxer i usuń androidx.media3.transformer.Muxer.
    • Naprawiono wczytywanie obrazów HEIC ze schematów identyfikatorów URI treści. (#1373).
    • Aby poprawić synchronizację obrazu i dźwięku, dostosuj czas trwania ścieżki audio w AudioGraphInput.
    • Usuń pole ExportResult.processedInputs. Jeśli używasz tego pola do określenia szczegółów kodeka, użyj pola DefaultDecoderFactory.listener. W przypadku wyjątku dotyczącego kodeka szczegóły dotyczące tego kodeka będą dostępne w ExportException.codecInfo.
  • Wyodrębnianie:
    • MPEG-TS: wprowadź zmianę, aby zapewnić renderowanie ostatniego kadru, przekazując ostatnią jednostkę dostępu strumienia do kolejki próbek (#7909). Wprowadzono poprawki, które rozwiązują problemy występujące w przypadku strumieni HLS tylko z ramkami I(#1150) i strumieni HLS H.262 (#1126).
    • MP3: preferuj rozmiar danych z ramki Info zamiast rozmiaru podanego przez strumień źródłowy (np. rozmiar pliku lub nagłówek HTTP Content-Length). Pomaga to wykluczyć z obliczeń wyszukiwania z stałym bitrate’em dane dotyczące nieodtwarzalnych zwiastunów (np. okładki albumów), co zwiększa dokładność wyszukiwania (#1376).
    • MP3: do obliczenia średniej szybkości transmisji danych dla wyszukiwania stałej szybkości transmisji danych użyj liczby klatek i innych danych w Info kroku (jeśli jest obecny), a nie ekstrapoluj z szybkości transmisji danych w kroku po Info, który może być sztucznie mały, np. PCUT krok (#1376).
    • Naprawić wyodrębnianie formatu audio PCM w kontenerach AVI.
  • Dźwięk:
    • Naprawiono atrybuty kodowania DTS:X Profile 2 w przypadku odtwarzania przezroczystego (#1299).
    • W przypadku odtwarzania w pamięci podręcznej zresetuj pole śledzenia zakończenia strumienia w DefaultAudioSink przed wywołaniem AudioTrack.stop(), aby AudioTrack.StreamEventCallback#onPresentationEnded prawidłowo rozpoznawał, kiedy odtworzono wszystkie oczekujące dane.
    • Usunięto błąd w SilenceSkippingAudioProcessor, w którym przejścia między różnymi formatami audio (np. stereo na mono) mogły spowodować wyjątek w procesorze (#1352).
    • Wprowadź MediaCodecAudioRenderer.getDurationToProgressUs(), aby ExoPlayer dynamicznie planował główną pętlę roboczą w taki sposób, aby MediaCodecAudioRenderer mogła się rozwijać.
  • Film:
    • Rozwiązanie problemu polegającego na tym, że Listener.onRenderedFirstFrame() pojawia się zbyt wcześnie podczas przełączania powierzchni w trakcie odtwarzania.
    • Naprawić logikę zastępczego dekodera w przypadku 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, które zaczynają się przed pozycją przesunięcia. Ten problem pojawił się tylko w Media3 w wersji 1.4.0-alpha01.
    • Zmień domyślne zachowanie parsowania napisów, aby odbywało się podczas wyodrębniania, a nie podczas renderowania (aby poznać różnicę między wyodrębnianiem a renderowaniem, zapoznaj się z diagramem architektury ExoPlayera).
      • Tę zmianę można zastąpić, wywołując obie funkcje MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) i TextRenderer.experimentalSetLegacyDecodingEnabled(true). Aby dowiedzieć się, jak podłączyć te komponenty do instancji ExoPlayer, zapoznaj się z dokumentacją dotyczącą dostosowywania. Te metody (oraz cała obsługa starszego dekodowania napisów) zostaną usunięte w przyszłej wersji.
      • Aplikacje z niestandardową implementacją SubtitleDecoder muszą zostać zaktualizowane, aby zamiast niej używać SubtitleParser (a zamiast SubtitleDecoderFactory – SubtitleParser.Factory).
    • PGS: napraw dekodowanie długości sekwencji, aby traktować 0 jako indeks koloru zamiast dosłownej wartości koloru (#1367).
    • CEA-708: zignoruj wartość rowLock. Specyfikacja CEA-708-E S-2023 określa, że wartości rowLockcolumnLock powinny być uznawane za prawdziwe niezależnie od wartości obecnych w strumieniu (obsługa parametru columnLock nie jest implementowana, więc jest on uznawany za zawsze fałszywy).
      • Informacje te zostały pierwotnie uwzględnione w notatkach do wersji 1.3.0-alpha01, ale zostały przypadkowo cofnięte przed wydaniem wersji 1.3.0-rc01. Problem został rozwiązany, więc zmiana jest ponownie widoczna.
    • CEA-708: unikaj zduplikowanych znaków nowej linii dodawanych przez ExoPlayera w ramach prostego obsługiwania polecenia „set pen location” (#1315).
    • Napraw IllegalArgumentException z LegacySubtitleUtil, gdy próbka napisów WebVTT nie zawiera żadnych wskazówek, np. w ramach strumienia DASH (#1516).
  • Metadane:
    • Poprawiono mapowanie tagów sortowania MP4 na ID3. Wcześniej tagi MP4 „album sort” (soal), „artist sort” (soar) i „album artist sort” (soaa) były błędnie mapowane na tagi ID3 TSO2, TSOA i TSOP (#1302).
    • Naprawiono odczyt tagów MP4 (/iTunes) gnre (gatunek) i tmpo (tempo), gdy wartość ma więcej niż 1 bajt.
    • Przekaż ramkę ID3 TCON do MediaMetadata.genre (#1305).
  • Obraz:
    • Dodaj obsługę niekwadratowych siatek miniatur DASH (#1300).
    • Dodanie obsługi formatu AVIF w przypadku interfejsu API w wersji 34 lub nowszej.
    • Dopuszczanie wartości null jako parametru dla ExoPlayer.setImageOutput() w celu wyczyszczenia wcześniej ustawionej wartości ImageOutput.
  • DataSource:
    • Wdrożyć obsługę identyfikatorów URI surowych zasobów android.resource://package/id, gdzie package jest inny 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ż przez nazwę.
    • W konstruktorach DataSpec sprawdź, czy url jest niezerową wartością. Ten parametr został już oznaczony jako niepusty.
    • Dozwolić ByteArrayDataSource na rozwiązywanie identyfikatora URI do tablicy bajtów podczas open(), zamiast kodowania na stałe podczas tworzenia (#1405).
  • DRM:
    • Zezwalaj na ustawienie LoadErrorHandlingPolicyDefaultDrmSessionManagerProvider (#1271).
  • Skutek:
    • Obsługa wielu zmian szybkości w ramach tego samego EditedMediaItem lub CompositionSpeedChangeEffect.
    • Obsługa danych wyjściowych HLG i PQ z wejścia bitmapy ultra HDR.
    • Dodaliśmy obsługę EGL_GL_COLORSPACE_BT2020_HLG_EXT, która poprawia wyjście powierzchni HLG w ExoPlayer.setVideoEffect i Debug SurfaceView w Transformer.
    • Zaktualizuj implementację macierzy nakładki, aby była zgodna z dokumentacją. Aby to zrobić, obróć wartości x i y zastosowane w funkcji setOverlayFrameAnchor(). Jeśli używasz parametru OverlaySettings.Builder.setOverlayFrameAnchor(), odwróć wartości x i y, mnożąc je przez -1.
    • Naprawiono błąd, który powodował awarię aplikacji TimestampWrapper podczas korzystania z aplikacji ExoPlayer#setVideoEffects (#821).
    • Zmień domyślną przestrzeń roboczą kolorów SDR z kolorów liniowych na elektryczne BT 709 SDR. Dodaj też trzecią opcję, aby zachować oryginalną przestrzeń barw.
    • Zezwalanie na definiowanie nieokreślonego z-orderu dla EditedMediaItemSequences (#1055).
    • Zachowanie spójnego zakresu luminacji w różnych częściach treści HDR (korzystanie z zakresu HLG).
    • Dodano obsługę nakładek Ultra HDR (map bitowych) w treściach HDR.
    • Zezwalanie na używanie efektów SeparableConvolution przed wersją API 26.
    • Usuń nieużywane OverlaySettings.useHdr, ponieważ zakres dynamiczny nakładki i ramki musi być taki sam.
    • Dodaj obsługę HDR dla TextOverlay. Jasność nakładki tekstowej można dostosować za pomocą OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Rozszerzenie IMA:
    • Przeniesienie interfejsu API, który jest wymagany do odtwarzania strumynów reklam DAI w aplikacjach, do wersji stabilnej.
    • Dodaj tag replaceAdTagParameters(Map <String, String>) do tagu ImaServerSideAdInsertionMediaSource.AdLoader, który umożliwia zastępowanie parametrów tagu reklamy w czasie wykonywania.
    • Naprawiono błąd, który powodował, że funkcja VideoAdPlayer.VideoAdPlayerCallback.onError() nie była wywoływana, gdy podczas odtwarzania reklamy wystąpił błąd odtwarzacza (#1334).
    • Zaktualizuj wersję pakietu IMA SDK do 3.33.0, aby naprawić błąd NullPointerException występujący podczas korzystania z URI tagu reklamy data:// (#700).
  • Sesja:
    • Zmień domyślną wartość CommandButton.enabled na true i upewnij się, że w przypadku kontrolerów wartość może pozostać jako fałsz, nawet jeśli powiązane polecenie jest dostępne.
    • Dodaj stałe ikony dla CommandButton, które powinny być używane zamiast niestandardowych zasobów ikon.
    • Dodaj MediaSessionService.isPlaybackOngoing(), aby umożliwić aplikacjom sprawdzanie, czy usługa musi zostać zatrzymana w onTaskRemoved() (#1219).
    • Dodaj MediaSessionService.pauseAllPlayersAndStopSelf(), który pozwala w wygodny sposób wstrzymać odtwarzanie wszystkich sesji i wywołać funkcję stopSelf(), aby zakończyć cykl życia MediaSessionService.
    • Zastąpić MediaSessionService.onTaskRemoved(Intent), aby zapewnić bezpieczną implementację domyślną, która utrzymuje usługę na pierwszym planie, jeśli odtwarzanie jest w toku, lub w przeciwnym razie zatrzymuje usługę.
    • Ukryj suwak w powiadomieniu o multimediów w przypadku transmisji na żywo, nie ustawiając czasu trwania w metadanych sesji platformy (#1256).
    • Dopasuj konwersję atrybutu MediaMetadata do atrybutu MediaDescriptionCompat, aby podczas wybierania właściwości metadanych używać tej samej preferowanej kolejności i logiki co w przypadku atrybutów w media1.
    • Dodaj MediaSession.sendError(), który umożliwia wysyłanie błędów niekrytycznych do kontrolera Media3. Podczas korzystania z kontrolera powiadomień (patrz MediaSession.getMediaNotificationControllerInfo()) błąd niestandardowy służy do aktualizowania PlaybackState sesji platformy do stanu błędu z podanymi informacjami o błędzie (#543).
    • Dodaj MediaSession.Callback.onPlayerInteractionFinished(), aby informować o zakończeniu serii interakcji gracza z konkretnym kontrolerem.
    • Dodaj SessionError i użyj go w SessionResult i LibraryResult zamiast kodu błędu, aby przekazać więcej informacji o błędzie i sposobie jego rozwiązania (jeśli to możliwe).
    • Opublikuj kod aplikacji testowej sterownika media3, która może służyć do testowania interakcji z aplikacjami publikującymi sesję multimedialną.
    • Przekaż dodatkowe informacje przekazane do MediaSession[Builder].setSessionExtras() w media3 do MediaSession[Builder].setSessionExtras() sterownika media1.PlaybackStateCompat.getExtras()
    • Mapowanie błędów krytycznych i niekrytycznych na sesję platformy i z niej. PlaybackException jest mapowane na stan krytycznego błędu PlaybackStateCompat. SessionError wysłany do kontrolera powiadomień o mediach z wartością MediaSession.sendError(ControllerInfo, SessionError) jest mapowany na błąd niekrytyczny w PlaybackStateCompat, co oznacza, że kod błędu i komunikat są ustawione, ale stan sesji platformy pozostaje inny niż STATE_ERROR.
    • Zezwalanie na ustawianie aktywności sesji na poziomie kontrolera w celu zastąpienia aktywności sesji globalnej. Aktywność sesji można zdefiniować dla kontrolera w momencie połączenia, tworząc ConnectionResultAcceptedResultBuilder.setSessionActivivty(PendingIntent). Po nawiązaniu połączenia aktywność sesji można zaktualizować za pomocą MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • Poprawiono replikowanie błędów wywołań do MediaLibrarySession.Callback. Replikację błędów można teraz skonfigurować, używając opcji MediaLibrarySession.Builder.setLibraryErrorReplicationMode() do wyboru typu błędu lub rezygnacji z replikacji błędów, która jest domyślnie włączona.
  • UI:
    • Dodaj obsługę wyświetlania obrazów w PlayerView po połączeniu z ExoPlayer (#1144).
    • Dodaj możliwość dostosowywania różnych ikon w elementach PlayerControlView za pomocą atrybutów XML, aby umożliwić tworzenie różnych obiektów do rysowania na podstawie poszczególnych wystąpień elementu PlayerControlView, a nie globalnych zastąpień (#1200).PlayerView
    • obejście błędu platformy, który powoduje rozciąganie lub przycinanie filmu podczas używania elementu SurfaceView w komponencie AndroidView w wersji interfejsu API 34 (#1237).
  • Pobrane:
    • Upewnij się, że DownloadHelper nie ujawnia nieopublikowanych instancji Renderer, ponieważ może to spowodować awarię aplikacji z IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Rozszerzenie Cronet:
    • Napraw błąd SocketTimeoutExceptionCronetDataSource. W niektórych wersjach Cronet żądanie przekazywane przez funkcję wywołania zwrotnego nie jest zawsze takie samo. Powoduje to, że wywołanie zwrotne nie jest wykonywane, a czas oczekiwania na odpowiedź kończy się (https://issuetracker.google.com/328442628).
  • Rozszerzenie HLS:
    • Naprawiono błąd, który powodował, że oczekujące próbki EMSG oczekujące na przerwę były delegowane w HlsSampleStreamWrapper z nieprawidłowym przesunięciem, co powodowało błąd IndexOutOfBoundsException lub błąd IllegalArgumentException (#1002).
    • Usunięto błąd, który powodował ciągłe wczytywanie niegłównych playlist w przypadku strumieni LL-HLS (#1240).
    • Rozwiązanie problemu, w którym włączenie CMCD dla HLS z segmentami inicjowania powodowało Source Error i IllegalArgumentException.
    • Usunięto błąd, który powodował, że inne niż główne odtwarzane playlisty nie były odświeżane podczas odtwarzania na żywo (#1240).
    • Naprawiono błąd, który powodował problemy z włączeniem CMCD w przypadku transmisji na żywo HLS.ArrayIndexOutOfBoundsException(#1395).
  • Rozszerzenie DASH:
    • Usunięto błąd, który powodował, że ponowne przygotowanie transmisji na żywo z wieloma okresami mogło wywołać błąd IndexOutOfBoundsException (#1329).
    • Dodano obsługę 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:
    • Wdróż funkcje onInit()onRelease()FakeRenderer.
    • Zmień metody TestPlayerRunHelper.runUntil()/playUntil() tak, aby nie działały w przypadku błędów niekrytycznych (np. zgłoszonych do AnalyticsListener.onVideoCodecError()). Aby wyłączyć to zachowanie, użyj nowego łańcucha metod TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX().
  • Aplikacja demonstracyjna:
    • Użyj DefaultPreloadManager w aplikacji demonstracyjnej dotyczącej krótkich form.
    • Umożliwienie ustawiania trybu powtarzania za pomocą argumentów Intent z poziomu wiersza poleceń (#1266).
    • Użyj HttpEngineDataSource jako HttpDataSource, jeśli urządzenie obsługuje tę funkcję.
  • Usuń symbole wycofane:
    • Usuń CronetDataSourceFactory. Zamiast tego użyj pola CronetDataSource.Factory.
    • Usuń niektóre konstruktory DataSpec. Zamiast tego użyj DataSpec.Builder.
    • Usuń metodę płatności setContentTypePredicate(Predicate) z kont DefaultHttpDataSource, OkHttpDataSourceCronetDataSource. Zamiast tego użyj w przypadku każdego elementu XXXDataSource.Factory odpowiednich metod.
    • Usuń konstruktory OkHttpDataSourceOkHttpDataSourceFactory. Zamiast tego użyj OkHttpDataSource.Factory.
    • Usuń PlayerMessage.setHandler(Handler). Zamiast tego użyj pola setLooper(Looper).
    • Usuń pole Timeline.Window.isLive. Zamiast tego użyj metody isLive().
    • Usuń konstruktory DefaultHttpDataSource. Zamiast tego użyj atrybutu DefaultHttpDataSource.Factory.
    • Usuń DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Zamiast tego użyj atrybutu DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS.
    • Usuń MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Zamiast tego użyj MediaCodecInfo.canReuseCodec(Format, Format).
    • Usuń metody płatności DrmSessionManager.DUMMYgetDummyDrmSessionManager(). Zamiast tego użyj 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żyj odpowiednich definicji typu IntDef i konstant w funkcji androidx.media3.common.C (np. C.FORMAT_HANDLED).
    • Usuń interfejs Bundleable. Obejmuje to usunięcie wszystkich pól stałych Bundleable.Creator<Foo> CREATOR. W takich przypadkach należy używać metod Bundle toBundle()static Foo fromBundle(Bundle) w przypadku każdego typu.

Wersja 1.4.0-rc01

10 lipca 2024 r.

Użyj wersji stabilnej 1.4.0.

Wersja 1.4.0-beta01

26 czerwca 2024 r.

Użyj wersji stabilnej 1.4.0.

Wersja 1.4.0-alpha02

7 czerwca 2024 r.

Użyj wersji stabilnej 1.4.0.

Wersja 1.4.0-alpha01

17 kwietnia 2024 r.

Użyj wersji stabilnej 1.4.0.

Wersja 1.3.0

Wersja 1.3.1

11 kwietnia 2024 r.

androidx.media3:media3-*:1.3.1 został zwolniony. Wersja 1.3.1 zawiera te komity.

  • Biblioteka wspólna:
    • Dodaj Format.labels, aby zezwolić na lokalizowane lub inne alternatywne etykiety.
  • ExoPlayer:
    • Rozwiązanie problemu polegającego na tym, że PreloadMediaPeriod nie może zachować strumieni danych, gdy są one ponownie wczytywane.
    • Zastosowanie odpowiedniego TrackSelectionResult do okresu odtwarzania podczas ponownego wybierania ścieżki.
    • Rozpoczynanie renderowania wczesnego tylko po przesunięciu okresu odtwarzania podczas przechodzenia między elementami multimediów (#1017).
    • Dodaj brakujący typ zwracania do reguły proguard -keepclasseswithmembers w przypadku DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformator:
    • Dodaj obejście problemu z wyjątkiem wywołanym z powodu braku obsługi negatywnych sygnatur czasowych w prezentacji przed wersją API 30.MediaMuxer
  • Wybór utworu:
    • DefaultTrackSelector: preferuj ścieżki wideo z „rozsądną” liczbą klatek na sekundę (≥ 10 fps) zamiast tych z niższą lub nieskonfigurowaną liczbą klatek na sekundę. Dzięki temu odtwarzacz wybierze „prawdziwą” ścieżkę wideo w plikach MP4 wyodrębnionych z filmów poklatkowych, które mogą zawierać 2 ścieżki HEVC, z których jedna ma wyższą rozdzielczość, ale bardzo małą liczbę klatek (#1051).
  • Wyodrębnianie:
    • Rozwiązanie problemu, który powodował, że podczas odczytu nieparzystych rozmiarów fragmentów z plików WAV nie było pomijane wypełnienie (#1117).
    • MP3: wypełnij pole Format.averageBitrate za pomocą ramek metadanych, takich jak XING i VBRI.
    • MPEG-TS: przywróć zmianę, która miała na celu zapewnienie renderowania ostatniego obrazu przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wynika to z faktu, że ta zmiana spowodowała nowe problemy ze strumieniami HLS zawierającymi tylko ramki I (#1150) i strumieniami HLS H.262 (#1126).
  • Dźwięk:
    • Zezwalanie na odzyskiwanie przez renderera poprzez wyłączenie funkcji offload, jeśli nie uda się zainicjować ścieżki audio w trybie offload.
  • Film:
    • Dodawanie obejścia problemu z urządzeniem Galaxy Tab S7 FE, Chromecastem z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie H265 60 fps są oznaczone jako niedostępne
    • Dodaj obejście, które zapewni, że pierwszy kadr będzie zawsze renderowany podczas tunelowania, nawet jeśli urządzenie nie robi tego automatycznie zgodnie z wymaganiami interfejsu API (#1169). (#966).
    • Rozwiązanie problemu, w którym obsługa informacji o kolorze HDR powodowała nieprawidłowe działanie kodeka i uniemożliwiała przełączanie na format adaptacyjny w przypadku ścieżek wideo SDR (#1158).
  • Tekst:
    • WebVTT: zapobieganie tworzeniu przez bezpośrednio następujące po sobie sygnały dodatkowego CuesWithTiming instancje z WebvttParser.parse (#1177).
  • DRM:
    • obejście problemu NoSuchMethodError, który może zostać wywołany przez framework MediaDrm zamiast ResourceBusyException lub NotProvisionedException na niektórych urządzeniach z Androidem 14 (#1145);
  • Skutek:
    • Ulepszona mapa tonów PQ na SDR poprzez konwersję przestrzeni kolorów.
  • Sesja:
    • Rozwiązanie problemu polegającego na tym, że bieżąca pozycja przeskakiwała do tyłu, gdy kontroler zastępował bieżący element (#951).
    • Rozwiązaliśmy problem, który powodował, że MediaMetadata z wartością niezerową extras nie był przesyłany między kontrolerami multimediów i sesjami (#1176).
  • UI:
    • Uwzględnij nazwę języka ścieżki audio, jeśli Locale nie może zidentyfikować nazwy wyświetlanej (#988).
  • Rozszerzenie DASH:
    • Wypełnij wszystkie elementy Label z pliku manifestu w Format.labels (#1054).
  • Rozszerzenie RTSP:
    • Pomijanie pustych wartości informacji o sesji (tagów i) podczas analizowania SDP (#1087).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Domyślnie wyłącz rozszerzenie MIDI jako zależność lokalną, ponieważ wymaga 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

androidx.media3:media3-*:1.3.0 został zwolniony. Wersja 1.3.0 zawiera te komity.

  • Biblioteka wspólna:
    • Wprowadź obsługę nieprzetworzonych identyfikatorów URI zasobów android.resource://package/[type/]name, gdzie package jest inny niż pakiet bieżącej aplikacji. Ta funkcja była zawsze udokumentowana, ale do tej pory nie była prawidłowo implementowana.
    • Normalizuj typy MIME ustawione przez kod aplikacji lub odczytane z multimediów, tak aby były w całości małymi literami.
    • Zamiast pojedynczej wartości Uri w polu AdPlaybackState definiuj reklamy za pomocą pełnej wartości MediaItem.
    • Zwiększ minSdk do 19 (Android KitKat). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX i jest wymagane, abyśmy mogli zaktualizować do najnowszych wersji zależności AndroidX.
    • Wypełnij pola artworkUriartworkData w kolumnie MediaMetadata.Builder.populate(MediaMetadata), gdy co najmniej jedno z nich ma wartość niezerową (#964).
  • ExoPlayer:
    • Dodaj PreloadMediaSourcePreloadMediaPeriod, które umożliwiają aplikacjom wstępne załadowanie źródła multimediów w konkretnej pozycji początkowej przed odtworzeniem. PreloadMediaSource zajmuje się przygotowaniem źródła multimediów treści do odbioru Timeline, przygotowaniem i zapisaniem okresu w podanej pozycji początkowej, wybraniem ścieżek i załadowaniem danych multimediów dla tego okresu. Aplikacje kontrolują postępy w wstępnym wczytywaniu, wdrażając PreloadMediaSource.PreloadControl, i ustawiają wstępnie załadowane źródło w odtwarzaczu na potrzeby odtwarzania.
    • Dodaj uprawnienie ExoPlayer.setImageOutput, które umożliwia aplikacjom ustawianie wartości ImageRenderer.ImageOutput.
    • DefaultRenderersFactory udostępnia teraz ImageRenderer graczowi domyślnie z wartością null ImageOutputImageDecoder.Factory.DEFAULT.
    • Emituj zdarzenie Player.Listener.onPositionDiscontinuity, gdy pominięto wyciszenie (#765).
    • Dodanie eksperymentalnej obsługi analizowania napisów podczas wyodrębniania. Możesz to włączyć za pomocą MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Obsługa dostosowanych źródeł multimediów za pomocą PreloadMediaSource.
    • Zaimplementuj HttpEngineDataSource, czyli HttpDataSource, za pomocą interfejsu HttpEngine API.
    • Zapobieganie tworzeniu podklas CompositeSequenceableLoader. Ten komponent został wcześniej rozszerzony, ale nigdy nie został podklasyfikowany w bibliotece. Dostosowania można wprowadzić, owijając instancję za pomocą wzoru dekoratora i wdrażając niestandardową funkcję CompositeSequenceableLoaderFactory.
    • Rozwiązanie problemu polegającego na tym, że powtarzanie tego samego czasu powoduje wyczyszczenie metadanych tego elementu (#1007).
    • Zmień nazwę metod experimentalSetSubtitleParserFactory w metodach BundledChunkExtractor.FactoryDefaultHlsExtractorFactory na setSubtitleParserFactory i zablokuj przekazywanie parametru null. Używaj nowych metod experimentalParseSubtitlesDuringExtraction(boolean) do kontrolowania zachowania podczas analizowania.
    • Dodano obsługę dostosowywania SubtitleParser.Factory używanego podczas ekstrakcji. Można to zrobić za pomocą MediaSource.Factory.setSubtitleParserFactory().
    • Dodaj prefiks źródła do wszystkich pól Format.id wygenerowanych z MergingMediaSource. Pomaga to zidentyfikować źródło, które wygenerowało odpowiedź Format (#883).
    • Popraw wyrażenie regularne używane do sprawdzania nazw niestandardowych kluczy danych klienta w ramach usługi Common Media Data (CMCD), tak aby sprawdzało tylko obecność myślnika (#1028).
    • Zaprzestanie podwójnego kodowania parametrów zapytania CMCD (#1075).
  • Transformator:
    • Dodanie obsługi spłaszczenia filmów w zwolnionym tempie w formacie H.265/HEVC SEF.
    • Zwiększ szybkość transmuxowania, zwłaszcza w przypadku zmian typu „usuń wideo”.
    • Dodaj interfejs API, aby plik wyjściowy zaczynał się od klatki filmu. Dzięki temu operacje przycinania będą bardziej kompatybilne z implementacjami odtwarzaczy, które nie wyświetlają pierwszego klatki wideo do momentu jej sygnatury czasowej (#829).
    • Dodano obsługę optymalizacji operacji przycinania MP4 pojedynczego komponentu.
    • Dodaj obsługę, aby mieć pewność, że pierwsza sygnatura czasowa w pliku wyjściowym będzie odpowiadać klatce filmu. Naprawiono problem z plikami wyjściowymi zaczynającymi się od czarnego kadru w odtwarzaczach na iOS (#829).
  • Wybór utworu:
    • Dodaj DefaultTrackSelector.selectImageTrack, aby włączyć wybór ścieżki obrazu.
    • Dodaj TrackSelectionParameters.isPrioritizeImageOverVideoEnabled, aby określić, czy wybrać ścieżkę obrazu, jeśli dostępne są zarówno ścieżka obrazu, jak i ścieżka wideo. Wartość domyślna to false, co oznacza, że priorytetem jest wybór ścieżki wideo.
  • Wyodrębnianie:
    • Dodaj do ekstraktora MP4 dodatkowe parsowanie AV1C, aby pobrać wartości ColorInfo.colorSpace, ColorInfo.colorTransfer i ColorInfo.colorRange (#692).
    • MP3: użyj wyszukiwania z stałym bitrate (CBR) dla plików z nagłówkiem Info (odpowiadającemu nagłówkowi Xing w CBR). Wcześniej używaliśmy tabeli przeskakiwania z nagłówka Info, ale powoduje to mniej precyzyjne przeskakiwanie niż wtedy, gdy zignorujemy ten nagłówek i zakładamy, że plik jest w formacie CBR.
    • MPEG2-TS: dodanie obsługi DTS, DTS-LBR i DTS:X Profile2 (#275).
    • Wyodrębnianie typów dźwięku z opisów TS i przypisywanie im flag ról, co pozwala użytkownikom na dokonywanie bardziej świadomych wyborów ścieżek audio (#973).
  • Dźwięk:
    • Ulepszenie algorytmu pomijania ciszy dzięki płynnemu zwiększaniu głośności; zachowanie minimalnej ciszy i bardziej naturalnego czasu trwania ciszy (#7423).
    • Raportowanie pominiętej ciszy w sposób bardziej deterministyczny (#1035).
  • Film:
    • Zmień konstruktor MediaCodecVideoRenderer, który przyjmuje argument VideoFrameProcessor.Factory, i zastąp go konstruktorem, który przyjmuje argument VideoSinkProvider. Aplikacje, które chcą wstrzyknąć niestandardowe VideoFrameProcessor.Factory, mogą utworzyć instancję CompositingVideoSinkProvider, która używa niestandardowego VideoFrameProcessor.Factory, i przekazać dostawcę odbiornika wideo do MediaCodecVideoRenderer.
  • Tekst:
    • Naprawić serializację wskazówek bitmapy, aby rozwiązać błąd Tried to marshall a Parcel that contained Binder objects podczas używania DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • CEA-708: zignoruj wartość rowLock. Specyfikacja CEA-708-E S-2023 określa, że wartości rowLockcolumnLock powinny być uznawane za prawdziwe niezależnie od wartości obecnych w strumieniu (obsługa parametru columnLock nie jest implementowana, więc jest on uznawany za zawsze fałszywy).
  • Obraz:
    • Dodaj obsługę miniatur DASH. Obrazy siatki są przycinane, a pojedyncze miniatury są dostarczane w ImageOutput w przybliżeniu do czasu ich wyświetlania.
  • DRM:
  • Rozszerzenie IMA:
    • Rozwiązanie problemu polegającego na tym, że reklamy DASH i HLS bez odpowiedniego rozszerzenia pliku nie mogą być odtwarzane.
  • Sesja:
    • Wyłącz wykrywanie podwójnego kliknięcia w aplikacjach na telewizory (#962).
    • Rozwiązanie problemu polegającego na tym, że MediaItem.RequestMetadata z tylko niezerowymi dodatkami nie jest przesyłany między kontrolerami multimediów i sesjami.
    • Dodaj konstruktor do klasy MediaLibrarySession.Builder, który przyjmuje tylko argument Context zamiast MediaLibraryService.
  • Rozszerzenie HLS:
    • Zmniejsz widoczność HlsMediaPeriod do widoczności prywatnej pakietu. Ten typ nie powinien być bezpośrednio zależny od elementów spoza pakietu HLS.
    • Rozwiązanie szybciej przeszukuje początek segmentu (#1031).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Dekoder MIDI: ignoruj komunikaty zdarzeń SysEx (#710).
  • Narzędzia testowe:
    • Nie wstrzymywać odtwarzania w aplikacji TestPlayerRunHelper.playUntilPosition. Test utrzymuje odtwarzanie w stanie odtwarzania, ale wstrzymuje postępy, dopóki nie będzie można dodać stwierdzeń i dalszych działań.
  • Aplikacja demonstracyjna:
    • Dodaj moduł demonstracyjny treści krótkich, aby zaprezentować zastosowanie funkcji PreloadMediaSource w przypadku treści krótkich.

Wersja 1.3.0-rc01

22 lutego 2024 r.

Użyj wersji stabilnej 1.3.0.

Wersja 1.3.0-beta01

7 lutego 2024 r.

Użyj wersji stabilnej 1.3.0.

Wersja 1.3.0-alpha01

15 stycznia 2024 r.

Użyj wersji stabilnej 1.3.0.

Wersja 1.2.0

Wersja 1.2.1

9 stycznia 2024 r.

  • ExoPlayer:
    • Rozwiązaliśmy problem, w którym ręczne przewijanie poza zakres LiveConfiguration.min/maxOffset powodowało przesunięcie z powrotem do min/maxOffset.
    • Rozwiązanie problemu polegający na tym, że układy kanałów OPUS i VORBIS są nieprawidłowe w przypadku 3, 5, 6, 7 i 8 kanałów (#8396).
    • Rozwiązaliśmy problem, który powodował, że wybór ścieżki po przesunięciu do zera w transmisji na żywo nieprawidłowo pozwalał na rozpoczęcie transmisji od pozycji domyślnej (#9347).
    • Rozwiązanie problemu, w którym nowe wystąpienia CmcdData.Factory otrzymywały ujemne wartości atrybutu bufferedDurationUs ze źródeł fragmentów, co powodowało błąd IllegalArgumentException (#888).
  • Transformator:
    • Rozwiązanie problemu polegające na tym, że koder zgłasza błąd podczas konfigurowania z powodu ustawienia wysokiej szybkości działania.
  • Wyodrębnianie:
    • Oznacz jako ROLE_FLAG_ALTERNATE dodatkowe (nieodtwarzalne) ścieżki HEVC w zdjęciach w formacie JPEG, aby nie były automatycznie wybierane do odtwarzania ze względu na wyższą rozdzielczość.
    • Poprawić wykrywanie nieprawidłowej klatki kluczowej w przypadku strumieni TS H264 (#864).
    • Naprawiono szacowanie czasu trwania strumieni TS dłuższych niż 47721 sekund (#855).
  • Dźwięk:
    • Poprawka obsługi EOS dla SilenceSkippingAudioProcessor, gdy jest wywoływany kilka razy (#712).
  • Film:
    • Dodaj obejście problemu z urządzeniem Galaxy Tab S7 FE, Chromecastem z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC z częstotliwością 60 FPS są oznaczone jako niedostępne (#693).
  • Metadane:
    • Naprawiono błąd, w którym MediaMetadata było wypełniane tylko z komentarzy Vorbis z kluczami w wielkiej literze (#876).
    • Wyłapywanie OutOfMemoryError podczas analizowania bardzo dużych ramek ID3, co oznacza, że odtwarzanie może być kontynuowane bez informacji o tagu, a nie zakończyć się całkowicie.
  • DRM:
    • Rozszerzenie obejścia problemu z nieprawidłowym adresem URL licencji ClearKey https://default.url do poziomu API 33 lub nowszego (wcześniej obejście działało tylko w przypadku poziomu API 33) (#837).
    • Rozwiązanie problemu z ERROR_DRM_SESSION_NOT_OPENED podczas przełączania się z zaszyfrowanych na przejrzyste treści bez powierzchni przymocowanej do odtwarzacza. Ten błąd wystąpił z powodu nieprawidłowego użycia bezpiecznego dekodera do odtwarzania treści bez szyfrowania.
  • Sesja:
    • Umieść klucze i wartości niestandardowe w wartościach MediaMetadataCompat do MediaMetadata.extrasMediaMetadata.extras do MediaMetadataCompat (#756, #802).
    • Naprawiono problem z transmisją notifyChildrenChanged w przypadku starszych kontrolerów (#644).
    • Naprawiliśmy błąd, który powodował awarię na niektórych urządzeniach po ustawieniu ujemnego czasu dla wyłączonego setWhen minutnika powiadomienia (#903).
    • Naprawiono błąd IllegalStateException, gdy kontroler powiadomień multimedialnych nie ukończył łączenia po żądaniu pierwszego powiadomienia (#917).
  • UI:
    • Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu i do tyłu nie są widoczne, gdy są używane w ramach interfejsu Material Design w BottomSheetDialogFragment (#511).
    • Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu w PlayerControlView były nieprawidłowo wyrównane (#547).
  • Rozszerzenie DASH:
    • Przeanalizuj „f800” jako liczbę kanałów 5 dla Dolby w pliku manifestu DASH (#688).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • MIDI: rozwiązano problem, w którym przewijanie do przodu pomijało zdarzenia Program Change (#704).
    • Przejdź na FFmpeg 6.0 i zaktualizuj obsługiwany NDK do wersji r26b (#707, #867).
  • Rozszerzenie Cast:
    • Sanitize creation of a Timeline to not crash the app when loading media fails on the cast device (#708).

Wersja 1.2.0

15 listopada 2023 r.

  • Biblioteka wspólna:
    • Dodaj parametr @Nullable Throwable do metod w interfejsie Log.Logger. Parametr message tych metod nie zawiera już żadnych informacji o parametry Throwable przekazanych metodom Log.{d,i,w,e}(), więc implementacje będą musiały ręcznie dołączać te informacje (np. za pomocą parametru Logger.appendThrowableString(String, Throwable)).
    • Rozwiązanie problemu z kompatybilnością Kotlina polegającego na tym, że parametry typu ogólnego z możliwością wartości pustej i typy elementów tablicy z możliwością wartości pustej nie są wykrywane jako umożliwiające wartości pustą. Przykładami są parametry metody TrackSelectorResultSimpleDecoder (#6792).
    • Zmień domyślne zachowanie interfejsu i powiadomień w Util.shouldShowPlayButton, aby wyświetlić przycisk „odtwórz” podczas tymczasowego wstrzymania odtwarzania (np. z powodu chwilowego utraty skupienia na dźwięku). Aby zachować zachowanie zgodne ze starszymi wersjami, użyj opcji PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) lub MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Aby rozwiązać problem https://issuetracker.google.com/251172715, zaktualizuj wersję androidx.annotation:annotation-experimental na 1.3.1.
    • Przenieś ExoPlayer.setAudioAttributes do interfejsu Player.
  • ExoPlayer:
    • Rozwiązanie problemów z przewijaniem w strumieniu AC4 spowodowanych nieprawidłowym rozpoznawaniem próbek przeznaczonych tylko do dekodowania (#11000).
    • Dodaj funkcję blokowania odtwarzania na nieodpowiednich urządzeniach do wyjścia audio (np. wbudowany głośnik na urządzeniach z Wear OS), gdy ta funkcja jest włączona za pomocą ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Jeśli podczas odtwarzania nie ma dostępnych odpowiednich wyjść audio lub wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania, przyczyna tłumienia odtwarzania zostanie zaktualizowana na Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT. Po podłączeniu odpowiedniego wyjścia przyczyna pominięcia zostanie usunięta.
    • Dodaj elementy MediaSource.canUpdateMediaItemMediaSource.updateMediaItem, aby akceptować aktualizacje MediaItem po utworzeniu za pomocą elementu 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óry wysyła i odczytuje cały plik PNG do TrackOutput jako jedną próbkę.
    • Ulepszona metoda SequenceableLoader.continueLoading(long) w interfejsie SequenceableLoader została zmieniona na SequenceableLoader.continueLoading(LoadingInfo loadingInfo). Tag LoadingInfo zawiera dodatkowe parametry, w tym playbackSpeedlastRebufferRealtimeMs, oprócz dotychczasowego parametru playbackPositionUs.
    • Zaktualizuj metodę ChunkSource.getNextChunk(long, long, List, ChunkHolder) w interfejsie ChunkSource, aby stała się ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Dodaj dodatkowe pola do rejestrowania danych klienta w ramach wspólnego interfejsu mediów (CMCD): buffer starvation (bs), deadline (dl), playback rate (pr) i startup (su) (#8699).
    • Dodaj głębię bitową luminacji i chrominancji do ColorInfo (#491).
    • Dodaj dodatkowe pola do rejestrowania danych klienta w ramach wspólnego interfejsu mediów (CMCD): żądanie następnego obiektu (nor) i żądanie następnego zakresu (nrr) (#8699).
    • Dodaj funkcję przesyłania danych klienta wspólnego multimediów (CMCD) za pomocą parametrów zapytania (#553).
    • Napraw problem ConcurrentModificationException w sekcji ExperimentalBandwidthMeter (#612).
    • Dodaj parametr MediaPeriodId do CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Obsługa ClippingMediaSource (i innych źródeł z przesunięciem czasowym okresu/okna) w ConcatenatingMediaSource2 (#11226).
    • Zmień BaseRenderer.onStreamChanged() na MediaPeriodId.
  • Transformator:
    • Przetwarzanie danych EXIF dotyczących obracania w przypadku danych wejściowych dotyczących obrazu.
    • Usuń typ adnotacji TransformationRequest.HdrMode i powiązane z nim stałe. Zamiast tego użyj funkcji Composition.HdrMode i powiązanych z nią stałych.
    • Uprość OverlaySettings, aby rozwiązać problemy z rotacją.
    • Zmieniono parametry frameRatedurationUs w kampanii SampleConsumer.queueInputBitmap na TimestampIterator.
  • Wybór utworu:
    • Dodaj DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness, aby wyraźnie zezwolić lub zabronić niepłynnej adaptacji. Domyślnie działanie pozostaje takie samo jak w przypadku wartości true.
  • Wyodrębnianie:
    • MPEG-TS: aby mieć pewność, że ostatnia klatka zostanie wyrenderowana, prześlij ostatnią jednostkę dostępu strumienia do kolejki próbek (#7909).
    • Poprawiono literówkę w przypadku rotationDegrees. Zmieniono projectionPosePitch na projectionPoseRoll (#461).
    • Usuń założenie, że instancje Extractor można bezpośrednio przeglądać za pomocą funkcji instanceof. Jeśli chcesz uzyskać dostęp do szczegółów implementacji funkcji Extractor w czasie wykonywania, musisz najpierw wywołać funkcję Extractor.getUnderlyingInstance.
    • Dodaj BmpExtractor.
    • Dodaj WebpExtractor.
    • Dodaj HeifExtractor.
    • Dodaj obsługę klasycznej wersji QuickTime do Mp4Extractor.
  • Dźwięk:
    • Dodano obsługę 24-/32-bitowego kodowania PCM w formacie big-endian w plikach MP4 i Matroska oraz zanalizowano kodowanie lpcm w formacie PCM w plikach MP4.
    • Dodano obsługę wyodrębniania dźwięku Vorbis w formacie MP4.
    • Dodaj AudioSink.getFormatOffloadSupport(Format), który pobiera poziom obsługi offloadu, który może zapewnić odbiornik dla formatu za pomocą DefaultAudioOffloadSupportProvider. Zwraca nową kolumnę AudioOffloadSupport zawierającą kolumny isFormatSupported, isGaplessSupportedisSpeedChangeSupported.
    • Dodaj AudioSink.setOffloadMode(), za pomocą którego konfigurowana jest konfiguracja przesyłania na gniazdo audio. Wartość domyślna to AudioSink.OFFLOAD_MODE_DISABLED.
    • Przesyłanie danych można włączyć w sekcji setAudioOffloadPreference w ustawieniach TrackSelectionParameters. Jeśli ustawione ustawienie to „Włącz”, urządzenie obsługuje przenoszenie danych dla danego formatu, a wybrany utwór to pojedynczy utwór audio, przenoszenie danych audio zostanie włączone.
    • Jeśli audioOffloadModePreference ma wartość AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, DefaultTrackSelector wybierze tylko ścieżkę audio, o ile format tej ścieżki jest obsługiwany w ramach funkcji offload. Jeśli podczas przenoszenia nie jest obsługiwana żadna ścieżka audio, nie zostanie wybrana żadna ścieżka.
    • Wyłączenie obsługi bez przerw dla przenoszenia w przypadku interfejsu API w wersji wcześniejszej niż 33 ze względu na problem z pozycją odtwarzania po przejściu do następnego utworu.
    • Usuń parametr enableOffload z podpisu metody DefaultRenderersFactory.buildAudioSink.
    • Usuń formę płatności DefaultAudioSink.Builder.setOffloadMode.
    • Usuń wartość nieokreśloną DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Dodano obsługę metadanych Opus bez przerw podczas odtwarzania z pamięci zewnętrznej.
    • Zezwalanie na odzyskiwanie przez procesor graficzny polegające na wyłączeniu przesyłania, jeśli nie udało się podczas pierwszego zapisu (#627).
    • Domyślnie włącz harmonogram przenoszenia danych w przypadku odtwarzania tylko dźwięku.
    • Usuń ExoPlayer.experimentalSetOffloadSchedulingEnabledAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Zmieniono nazwę onExperimentalSleepingForOffloadChanged na onSleepingForOffloadChanged, a onExperimentalOffloadedPlayback na onOffloadedPlayback.
    • Przenieś interfejsy TrackSelectionParameters i definicje związane z trybem przesyłania audio do wewnętrznej klasy AudioOffloadPreferences.
    • Dodaj wywołania zwrotne onAudioTrackInitializedonAudioTrackReleased do funkcji AnalyticsListener, AudioRendererEventListenerAudioSink.Listener.
    • Rozwiązanie problemu z przepełnieniem bufora dźwięku DTS Express (#650).
    • Naprawiono błąd, który powodował, że sprawdzanie możliwości E-AC3-JOC powodowało błądIllegalArgumentException(#677).
  • Film:
    • Zezwalaj aplikacji MediaCodecVideoRenderer na korzystanie z niestandardowej VideoFrameProcessor.Factory.
    • Usunęliśmy błąd, który powodował, że pierwszy kadr nie był renderowany, 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 korzystania z instancji SubtitleDecoder.
  • Metadane:
    • Funkcja MetadataDecoder.decode nie będzie już wywoływana w przypadku próbek „tylko do dekodowania”, ponieważ implementacja musi zwracać null.
  • Skutek:
    • Dodaj VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) ustawienie kolejki danych bitmapy według sygnatury czasowej.
    • Zmień VideoFrameProcessor.registerInputStream() na nieblokujący. Aplikacje muszą implementować VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Zmieniono parametry frameRatedurationUs w kampanii VideoFrameProcessor.queueInputBitmap na TimestampIterator.
  • Rozszerzenie IMA:
    • Naprawiono błąd, który powodował, że transmisja na żywo DASH obejmująca wiele okresów, która nie jest pierwszym elementem na playliście, mogła wywołać wyjątek (#571).
    • Przed wywołaniem AdsLoader.destroy() zwalniaj obiekt StreamManager
    • Zaktualizuj wersję pakietu IMA SDK do 3.31.0.
  • Sesja:
    • W pliku DefaultMediaNotificationProvider ustaw zachowanie usługi powiadomień na pierwszym planie na FOREGROUND_SERVICE_IMMEDIATE (#167).
    • Aby uniknąć problemów z nieobsługiwanym interfejsem API na urządzeniach Samsung, używaj tylko wersji android.media.session.MediaSession.setMediaButtonBroadcastReceiver() powyżej 31 (#167).
    • Użyj kontrolera powiadomień multimedialnych jako elementu pośredniczącego, aby ustawić dostępne polecenia i niestandardowy układ, który będzie używany do wypełniania powiadomienia i sesji platformy.
    • Konwertuj zdarzenia przycisku multimediów otrzymywane przez MediaSessionService.onStartCommand() w Media3 zamiast kierować je do sesji platformy i z powrotem do Media3. W tym przypadku kontroler wywołującego jest zawsze kontroler powiadomienia multimedialnego, a aplikacje mogą łatwo rozpoznawać wywołania przychodzące z powiadomienia w taki sam sposób na wszystkich obsługiwanych poziomach interfejsu API.
    • Usunęliśmy błąd polegający na tym, że MediaController.getCurrentPosition() nie przesuwa się, gdy jest połączony ze starszą wersją MediaSessionCompat.
    • Dodaj MediaLibrarySession.getSubscribedControllers(mediaId) dla wygody.
    • Zastąp MediaLibrarySession.Callback.onSubscribe(), aby potwierdzić dostępność identyfikatora nadrzędnego, do którego subskrybuje kontroler. Jeśli operacja się powiedzie, subskrypcja zostanie zaakceptowana, a funkcja notifyChildrenChanged() zostanie natychmiast wywołana, aby poinformować przeglądarkę (#561).
    • Dodaj moduł demonstracyjny sesji dla systemu operacyjnego Automotive i włącz demonstrację sesji dla Androida Auto.
    • Nie ustawiaj kolejki sesji frameworku, gdy COMMAND_GET_TIMELINE jest niedostępna dla kontrolera powiadomień multimedialnych. Gdy Android Auto jest kontrolerem klienta odczytuje dane z sesji frameworku, w interfejsie Androida Auto nie będzie widoczny przycisk queue (#339).
    • Domyślnie używaj wartości DataSourceBitmapLoader zamiast wartości SimpleBitmapLoader (#271, #327).
    • Dodaj MediaSession.Callback.onMediaButtonEvent(Intent), który umożliwia aplikacjom zastąpienie domyślnego sposobu obsługi zdarzeń przycisku multimediów.
  • UI:
    • Dodaj implementację Player.Listener na urządzeniach z Wear OS, która obsługuje tłumienie odtwarzania z powodu Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT, uruchamiając okno dialogowe systemu, aby umożliwić użytkownikowi podłączenie odpowiedniego wyjścia audio (np. słuchawek Bluetooth). Odtwarzanie zostanie automatycznie wznowione, jeśli odpowiednie urządzenie zostanie połączone w określonym czasie (domyślnie 5 minut).
  • Pobrane:
    • Zadeklaruj typ usługi na pierwszym planie „synchronizacja danych” dla DownloadService, aby zapewnić zgodność z Androidem 14. Aby korzystać z tej usługi, aplikacja musi też dodać dataSync jako foregroundServiceType w pliku manifestu i dodać uprawnienie FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • Rozszerzenie HLS:
    • Odświeżaj playlistę z transmisją na żywo HLS z interwałem obliczanym od ostatniego czasu rozpoczęcia wczytywania, a nie od ostatniego ukończonego wczytania (#663).
  • Rozszerzenie DASH:
    • Zezwalanie na wielokrotne występowanie tego samego identyfikatora DASH w adresie URL szablonu segmentu.
    • Dodanie eksperymentalnej obsługi analizowania napisów podczas wyodrębniania. Wprowadziliśmy też lepszą obsługę łączenia nakładających się napisów, w tym usunięcie migotania podczas przełączania między segmentami napisów. Możesz to włączyć za pomocą DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Rozszerzenie RTSP:
    • Usunięto warunek wyścigu, który mógł prowadzić do IndexOutOfBoundsException podczas korzystania z TCP lub zawieszania się odtwarzania w pewnych sytuacjach.
    • Sprawdzanie stanu w konfiguracji RTSP podczas zwracania stanu wczytywania RtspMediaPeriod (#577).
    • Ignorowanie niestandardowych metod żądania RTSP w nagłówku publicznym odpowiedzi opcji (#613).
    • Użyj wartości czasu oczekiwania na odpowiedź konfiguracji RTSP w interwale czasu wysyłania próśb o opcje RTSP keep-alive (#662).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Opublikuj moduł 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 związku z tym, że funkcja C.BUFFER_FLAG_DECODE_ONLY zostanie wycofana.
    • Dodaj Decoder.setOutputStartTimeUs i SimpleDecoder.isAtLeastOutputStartTimeUs, aby dekodery mogły odrzucić próbki tylko do dekodowania przed czasem rozpoczęcia. Należy używać tego parametru zamiast parametru Buffer.isDecodeOnly, który zostanie wycofany.
    • Naprawiono błąd publikowania artefaktu dekodera MIDI w repozytorium Maven. Nazwa artefaktu została zmieniona na media3-exoplayer-midi (#734).
  • Rozszerzenie leanback:
    • Naprawiono błąd, który powodował, że wyłączenie powierzchni mogło powodować błąd ArithmeticException w Leanback (#617).
  • Narzędzia testowe:
    • Spraw, aby TestExoPlayerBuilderFakeClock były zgodne z testami interfejsu użytkownika Espresso i testami interfejsu użytkownika Compose. Rozwiązanie to naprawia błąd polegający na tym, że odtwarzanie nie działało w sposób deterministyczny podczas interakcji z widokami Espresso lub Compose.
  • Usuń symbole wycofane:
    • Usuń: TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) i TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Zamiast tego użyj operatora Composition.Builder.setHdrMode(int) i przekaż parametr Composition do funkcji Transformer.start(Composition, String).
    • Usuń wycofaną metodę DownloadNotificationHelper.buildProgressNotification i 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żyj wersji stabilnej 1.2.0.

Wersja 1.2.0-beta01

19 października 2023 r.

Użyj wersji stabilnej 1.2.0.

Wersja 1.2.0-alpha02

29 września 2023 r.

Użyj wersji stabilnej 1.2.0.

Wersja 1.2.0-alpha01

17 sierpnia 2023 r.

Użyj wersji stabilnej 1.2.0.

Wersja 1.1.0

Wersja 1.1.1

16 sierpnia 2023 r.

  • Biblioteka wspólna:
    • Usuń ze wszystkich modułów przypadkowo dodaną zależność multidex (#499).
  • ExoPlayer:
    • Rozwiązanie problemu w PlaybackStatsListener, w którym po wyczyszczeniu playlisty tworzone są nieprawidłowe PlaybackStats.
    • Dodaj dodatkowe pola do rejestrowania danych klienta wspólnego (CMCD): format strumieniowania (sf), typ strumienia (st), wersja (v), najwyższa stawka (tb), czas trwania obiektu (d), zmierzona przepustowość (mtp) i typ obiektu (ot) (#8699).
  • Dźwięk:
    • Rozwiązanie błędu, który powodował, że Player.getState() nigdy nie przechodziło do STATE_ENDED podczas odtwarzania bardzo krótkich plików (#538).
  • Przesyłanie dźwięku:
    • Dodaj nagłówek identyfikatora Ogg i strony nagłówka komentarza do bitstreama na potrzeby odtwarzania Opusa w chmurze zgodnie ze standardem RFC 7845.
  • Film:
    • H.265/HEVC: poprawiono analizowanie informacji o krótkim i długim okresie referencyjnym obrazu SPS.
  • Tekst:
    • CEA-608: zmiana logiki skracania cue, tak aby uwzględniać tylko tekst widoczny. Wcześniej wcięcie i przesunięcie tabulacji były uwzględniane przy ograniczaniu długości cue do 32 znaków (co było technicznie zgodne ze specyfikacją) (#11019).
  • Rozszerzenie IMA:
    • Zaktualizuj wersję pakietu IMA SDK do 3.30.3.
  • Sesja:
    • Dodaj niestandardowy układ do stanu kontrolera i zapewnij dostęp do niego za pomocą metody gettera. Gdy układ niestandardowy ulegnie zmianie, zostanie wywołana funkcja MediaController.Listener.onCustomLayoutChanged. Aplikacje, które chcą wysyłać różne układy niestandardowe do różnych kontrolerów Media3, mogą to zrobić w MediaSession.Callback.onConnect, używając AcceptedResultBuilder, aby upewnić się, że układ niestandardowy jest dostępny dla kontrolera po zakończeniu procesu łączenia.
    • Rozwiązanie problemu, w którym MediaLibraryServiceLegacyStub wysyłał błąd do Result, który tego nie obsługiwał, co powodowało błąd UnsupportedOperationException (#78).
    • Napraw sposób, w jaki PlayerWrapper tworzy VolumeProviderCompat, określając volumeControlType za pomocą zarówno starszych poleceń (COMMAND_ADJUST_DEVICE_VOLUMECOMMAND_SET_DEVICE_VOLUME), jak i 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 odtwórz, gdy będzie gotowa. Zmień powód wyłączenia zbyt długiego dźwięku. (#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 Playera przeciążone metody, które umożliwiają użytkownikom określanie flag głośności:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Dodaj Builder dla DeviceInfo i wycofaj istniejący konstruktor.
    • Dodaj DeviceInfo.routingControllerId, aby określić identyfikator kontrolera routingu na potrzeby odtwarzania zdalnego.
    • Dodaj Player.replaceMediaItem(s) jako skrót do dodawania i usuwania elementów w tej samej pozycji (#8046).
  • ExoPlayer:
    • Zezwalaj ExoPlayerowi na kontrolowanie głośności urządzenia tylko wtedy, gdy użytkownik wyraźnie wyrazi na to zgodę. Użyj ExoPlayer.Builder.setDeviceVolumeControlEnabled, aby uzyskać dostęp do:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int)setDeviceVolume(int, int)
      • increaseDeviceVolume(int)increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int)decreaseDeviceVolume(int, int)
    • Dodaj FilteringMediaSource, który umożliwia filtrowanie dostępnych typów ścieżek w MediaSource.
    • Dodaj obsługę dołączania danych klienta Common Media Data (CMCD) w wychodzących żądaniach formatów strumieniowego przesyłania danych w systemie adaptacyjnej transmisji danych DASH, HLS i SmoothStreaming. Zostały uwzględnione pola: br, bl, cid, rtp isid (#8699). Struktura interfejsu API i metody API:
      • Rejestrowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj polecenia MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory).
      • Domyślnie wszystkie klucze są włączone. Aby wykluczyć z rejestrowania niektóre z nich, użyj parametru override:CmcdConfiguration.RequestConfig.isKeyAllowed(String key).
      • Zastąp CmcdConfiguration.RequestConfig.getCustomData(), aby włączyć logowanie niestandardowych kluczy.
    • Dodaj dodatkową akcję do pliku manifestu głównej wersji demonstracyjnej, aby ułatwić uruchamianie aplikacji demonstracyjnej za pomocą niestandardowego pliku *.exolist.json (#439).
    • Dodaj ExoPlayer.setVideoEffects(), aby używać Effect podczas odtwarzania filmu.
    • Zaktualizuj SampleQueue, aby przechowywać sourceId jako long, a nie int. Zmiana ta powoduje zmianę sygnatur publicznych metod SampleQueue.sourceIdSampleQueue.peekSourceId.
    • Dodaj do metod LoadControl shouldStartPlaybackonTracksSelected parametry, które umożliwiają powiązanie tych metod z odpowiednimi MediaPeriod.
    • Zmień podpis ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>), dodając parametr osi czasu zawierający okresy z identyfikatorami unikatowymi (UID) używanymi jako klucze na mapie. Jest to konieczne, aby uniknąć problemów z jednoczesnością w przypadku transmisji na żywo obejmujących wiele okresów.
    • Wycofaj funkcje EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Zamiast tego można wywołać wariant metody bez parametru mediaTimeOffsetUs. Pamiętaj, że nawet w przypadku wycofanych wersji offset nie jest już dodawany do wartości startTimeUsendTimeUs obiektów MediaLoadData, które są wysyłane przez moduł rozsyłający.
    • Zmień nazwę ExoTrackSelection.blacklist na excludeTrack, a isBlacklisted na isTrackExcluded.
    • Naprawiono niespójności między metodami ExoPlayer.setMediaItem(s) i addMediaItem(s) podczas wywołania pustej playlisty.
  • Transformator:
    • Usuń Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Zamiast niej użyj zasad ExoPlayerAssetLoader.Factory(MediaSource.Factory)Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Usuń Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Usunęliśmy błąd, który powodował zawieszanie się przekształcenia (co prowadziło do przekroczenia limitu czasu muxera), jeśli koniec strumienia wideo był sygnalizowany w momencie, gdy ramka wejściowa oczekiwała na przetworzenie.
    • Aby zwiększyć obsługę, zapytaj o kodeki za pomocą MediaCodecList zamiast używać narzędzi findDecoder/EncoderForFormat.
    • Usuń konfigurację ramki B w DefaultEncoderFactory, ponieważ nie działa na niektórych urządzeniach.
  • Wybór ścieżki:
    • Dodaj DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange który jest domyślnie wyłączony. Po włączeniu opcja DefaultTrackSelectorwywołuje wybór nowego utworu, gdy zmienią się możliwości renderera.
  • Wyodrębnianie:
    • Ogg: usunięto błąd podczas przewijania w plikach o długim czasie trwania (#391).
    • FMP4: rozwiązano problem, w którym TimestampAdjuster inicjuje nieprawidłowy opóźniony sygnaturę czasową z czasem próbki metadanych z atomu emsg (#356).
  • Dźwięk:
    • Naprawiono błąd, który powodował niepowodzenia niektórych odtwarzań, gdy tunelowanie było włączone, a AudioProcessors były aktywne, np. w przypadku przycinania bez przerw (#10847).
    • Opakowanie ramek Opus w pakietach Ogg w przypadku bezpośredniego odtwarzania (offload).
    • ekstrapolacja bieżącej pozycji podczas uśpienia za pomocą harmonogramu przenoszenia;
    • Dodaj Renderer.release()AudioSink.release(), aby uwolnić zasoby na końcu cyklu życia odtwarzacza.
    • Słuchaj zmian w możliwościach obsługi dźwięku w DefaultAudioSink. Do konstruktora klasy DefaultAudioSink dodaj parametr wymagany context, za pomocą którego klasa DefaultAudioSink zarejestruje się jako odbiorca zdarzeń w klasie AudioCapabilitiesReceiver i zaktualizuje swoją właściwość audioCapabilities, gdy zostanie poinformowana o zmianie możliwości.
    • Rozpowszechnianie zmian w możliwościach dotyczących dźwięku za pomocą nowego zdarzenia onAudioCapabilitiesChanged w interfejsie AudioSink.Listener oraz nowego interfejsu RendererCapabilities.Listener, który uruchamia zdarzenia onRendererCapabilitiesChanged.
    • Dodaj ChannelMixingAudioProcessor, aby zastosować skalowanie/miksowanie do kanałów audio.
    • Dodaj nową wartość int DISCARD_REASON_AUDIO_BYPASS_POSSIBLE do DecoderDiscardReasons, aby odrzucić dekoder audio, gdy tryb obejścia jest możliwy po zmianie możliwości audio.
    • Dodano obsługę bezpośredniego odtwarzania dla DTS Express i DTS:X (#335).
  • Film:
    • Gdy renderowanie jest wyłączone, element MediaCodecVideoRenderer powinien raportować element VideoSize o szerokości i wysokości 0. Funkcja Player.Listener.onVideoSizeChanged jest wywoływana odpowiednio, gdy zmienia się wartość zmiennej Player.getVideoSize(). Dzięki tej zmianie rozmiar wideo ExoPlayera z MediaCodecVideoRenderer ma szerokość i wysokość 0, gdy Player.getCurrentTracks nie obsługuje wideo lub gdy rozmiar obsługiwanej ścieżki wideo nie został jeszcze określony.
  • DRM:
    • Zmniejsz widoczność kilku metod tylko wewnętrznych w DefaultDrmSession, które nie powinny być wywoływane spoza pakietu DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Dodaj nową bibliotekę muxera, której można używać do tworzenia plików 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 w transmisjach na żywo (#10912).
    • Naprawiono błąd, który powodował wstawianie nowej grupy reklam w transmisjach na żywo z powodu niewielkich różnic w obliczonej pozycji treści na kolejnych liniach czasowych.
  • Sesja:
    • Dodaj pomocniczą metodę MediaSession.getControllerForCurrentRequest, aby uzyskać informacje o kontrolerze, który obecnie wywołuje metodę Player.
    • Dodaj androidx.media3.session.MediaButtonReceiver, aby umożliwić aplikacjom wznawianie odtwarzania za pomocą zdarzeń przycisku multimediów wysyłanych przez przykładowo zestaw słuchawkowy Bluetooth (#167).
    • Dodaj do MediaSession.Callback.onAddMediaItems domyślną implementację, aby umożliwić przekazywanie żądanych MediaItems do Player, jeśli mają one LocalConfiguration (np. URI) (#282).
    • Dodaj przyciski poleceń „przewinąć do poprzedniego” i „przewinąć do następnego” w kompaktowym widoku powiadomienia o mediach domyślnie w Androidzie 12 i starszych wersjach (#410).
    • Dodaj do MediaSession.Callback.onAddMediaItems domyślną implementację, aby umożliwić przekazywanie żądanych MediaItems do Player, jeśli mają one LocalConfiguration (np. URI) (#282).
    • Dodaj przyciski poleceń „przewinąć do poprzedniego” i „przewinąć do następnego” w kompaktowym widoku powiadomienia o mediach domyślnie w Androidzie 12 i starszych wersjach (#410).
  • UI:
    • Dodaj metody Util shouldShowPlayButtonhandlePlayPauseButtonAction, aby pisać niestandardowe elementy interfejsu z przyciskiem odtwarzania/pauzowania.
  • Rozszerzenie RTSP:
    • W przypadku MPEG4-LATM użyj domyślnej wartości profile-level-id, jeśli nie ma jej w komunikacie SDP odpowiedzi (#302).
    • Użyj podstawowego adresu URI do rozpoznawania ścieżki względnej z sesji RTSP, jeśli jest on obecny w nagłówku odpowiedzi DESCRIBE (#11160).
  • Rozszerzenie DASH:
    • Usuń przesunięcie czasu multimediów z MediaLoadData.startTimeMs i MediaLoadData.endTimeMs w przypadku strumieni DASH z wieloma okresami.
    • Usunęliśmy błąd, który powodował, że ponowne przygotowanie źródła multi-period live Dash media powodowało błąd IndexOutOfBoundsException (#10838).
  • Rozszerzenie HLS:
    • Dodaj HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long), aby ustawić limit czasu dla wątku ładowania, który ma czekać na zainicjowanie funkcji TimestampAdjuster. Jeśli inicjalizacja nie zostanie zakończona przed upływem czasu oczekiwania, zostanie wywołana funkcja PlaybackException, aby uniknąć niekończącego się opóźnienia odtwarzania. Domyślnie czas oczekiwania jest ustawiony na 0 (#323).
  • Narzędzia testowe:
    • Sprawdź, czy w DataSourceContractTest schemat adresu URL jest niezależny od wielkości liter.
  • Usuń symbole wycofane:
    • Usuń konstruktory DefaultAudioSink i zamiast nich użyj konstruktora DefaultAudioSink.Builder.
    • Usuń polecenie HlsMasterPlaylist i użyj zamiast niego 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 i zamiast nich użyj konstruktora, który przyjmuje parametr DatabaseProvider, aby uzyskać lepszą wydajność.
    • Usuń konstruktor DefaultBandwidthMeter i zamiast niego użyj konstruktora DefaultBandwidthMeter.Builder.
    • Usuń konstruktory DefaultDrmSessionManager i zamiast nich użyj konstruktora DefaultDrmSessionManager.Builder.
    • Usuń 2 wycofane konstruktory HttpDataSource.InvalidResponseCodeException, użyj konstruktora, który nie został wycofany i akceptuje dodatkowe pola(cause, responseBody), aby zwiększyć możliwości rejestrowania błędów.
    • Usuń zasady DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDashDownloadHelper.forSmoothStreaming, a zamiast nich użyj zasady DownloadHelper.forMediaItem.
    • Usuń przestarzały konstruktor DownloadService i użyj konstruktora, który nie został wycofany i zawiera opcję podania parametru channelDescriptionResourceId.
    • Usuń wycofane stałe ciągu znaków dla kodowania (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAMEUTF16LE_NAME). Zamiast tego użyj kodowania Kotlin z pakietu kotlin.text, java.nio.charset.StandardCharsets lub com.google.common.base.Charsets.
    • Usuń wycofany konstruktor WorkManagerScheduler i zamiast niego użyj konstruktora, który nie został wycofany i zawiera opcję przekazywania parametru Context.
    • Usuń wycofane metody createVideoSampleFormat, createAudioSampleFormat, createContainerFormat i createSampleFormat, które były używane do tworzenia instancji klasy Format. Zamiast tego użyj funkcji Format.Builder do tworzenia instancji Format.
    • Usuń przestarzałe metody copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitratecopyWithVideoSize. Zamiast nich użyj metody Format.buildUpon() i setter.
    • Usuń wycofany tag ExoPlayer.retry() i użyj zamiast niego tagu prepare().
    • Usuń wycofany konstruktor DefaultTrackSelector z argumentem o wartości zerowej. Zamiast niego użyj konstruktora DefaultTrackSelector(Context).
    • Usuń wycofany konstruktor OfflineLicenseHelper i zamiast niego użyj konstruktora OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń wycofany konstruktor DownloadManager i zamiast niego użyj konstruktora, który przyjmuje parametr Executor.
    • Usuń wycofane konstruktory Cue i zamiast nich używaj konstruktora Cue.Builder.
    • Usuń wycofany konstruktor OfflineLicenseHelper i zamiast niego użyj konstruktora OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń 4 nieużywane metody AnalyticsListener:
      • onDecoderEnabled, użyj zamiast niej zasad onAudioEnabled lub onVideoEnabled.
      • onDecoderInitialized, użyj zamiast niej zasad onAudioDecoderInitialized lub onVideoDecoderInitialized.
      • onDecoderInputFormatChanged, użyj zamiast niej zasad onAudioInputFormatChanged lub onVideoInputFormatChanged.
      • onDecoderDisabled, użyj zamiast niej zasad onAudioDisabled lub onVideoDisabled.
    • Usuń wycofane tagi Player.Listener.onSeekProcessedAnalyticsListener.onSeekProcessed. Zamiast nich użyj tagów onPositionDiscontinuityDISCONTINUITY_REASON_SEEK.
    • Usuń polecenie ExoPlayer.setHandleWakeLock(boolean) i użyj zamiast niego polecenia setWakeMode(int).
    • Usuń wycofany tag DefaultLoadControl.Builder.createDefaultLoadControl() i użyj zamiast niego tagu build().
    • Usuń wycofany tag MediaItem.PlaybackProperties i użyj zamiast niego tagu MediaItem.LocalConfiguration. Wycofane pole MediaItem.playbackProperties ma teraz typ MediaItem.LocalConfiguration.

Wersja 1.1.0-rc01

21 czerwca 2023 r.

Użyj wersji stabilnej 1.1.0.

Wersja 1.1.0-beta01

7 czerwca 2023 r.

Użyj wersji stabilnej 1.1.0.

Wersja 1.1.0-alpha01

10 maja 2023 r.

Użyj wersji stabilnej 1.1.0.

Wersja 1.0.0

Wersja 1.0.2

18 maja 2023 r.

androidx.media3:media3-*:1.0.2 został zwolniony. 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óry oznacza, czy Buffer zawiera flagę C.BUFFER_FLAG_LAST_SAMPLE.
    • Rozwiązaliśmy problem, który powodował, że ostatnia klatka mogła nie zostać wyświetlona, jeśli ostatnia próbka z ramkami została usunięta z kolejki bez odczytania próbki „końca strumienia”. (#11079).
  • Wyodrębnianie:
    • Naprawianie analizowania SPS H.265 w plikach MPEG-TS przez ponowne użycie logiki analizowania używanej już przez ekstraktory RTSP i MP4 (#303).
  • Tekst:
    • SSA: dodano obsługę plików UTF-16, jeśli zaczynają się od oznaczenia kolejności bajtów (#319).
  • Sesja:
    • Rozwiązanie problemu polegającego na tym, że MediaController nie aktualizuje dostępnych poleceń po połączeniu ze starszą wersją MediaSessionCompat, która aktualizuje swoje działania.
    • Naprawiono błąd, który uniemożliwiał wywołaniu MediaLibraryService zwracanie wartości null w przypadku wywołania Callback.onGetLibraryRoot z interfejsu System UI z parametrem params.isRecent == true w interfejsie API 30 (#355).
    • Naprawiono wyciek pamięci w programach MediaSessionServiceMediaLibraryService (#346).
    • Naprawiono błąd, w którym połączona aktualizacja Timeline i pozycji w funkcji MediaSession mogła spowodować wygenerowanie przez funkcję MediaController błędu IllegalStateException.

Wersja 1.0.1

18 kwietnia 2023 r.

androidx.media3:media3-*:1.0.1 został zwolniony. Wersja 1.0.1 zawiera te zatwierdzenia.

Ta wersja odpowiada wersji ExoPlayer 2.18.6.

  • Biblioteka podstawowa:
    • Resetowanie zastąpienia docelowej transmisji na żywo podczas przewijania do pozycji domyślnej (#11051).
    • Naprawiono błąd, który powodował, że puste strumienie próbek w mediach mogły powodować zacinanie się odtwarzania.
  • Sesja:
    • Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszy MediaSessionCompat powodowało wyjątek w MediaController (#290).
    • Dodanie brakującego przekierowania MediaSession.broadcastCustomCommand do starszego MediaControllerCompat.Callback.onSessionEvent (#293).
    • Naprawiono błąd polegający na tym, że wywołanie MediaSession.setPlayer nie aktualizowało dostępnych poleceń.
    • Rozwiązanie problemu polegającego na tym, że instancje TrackSelectionOverride wysyłane z MediaController są ignorowane, jeśli odwołują się do grupy z Format.metadata (#296).
    • Rozwiązanie problemu, w którym Player.COMMAND_GET_CURRENT_MEDIA_ITEM musi być dostępna, aby uzyskać dostęp do metadanych za pomocą starszej wersji MediaSessionCompat.
    • Rozwiązanie problemu, w którym wystąpienia elementu MediaSession w wątku tle wywoływały awarie podczas używania w elementach MediaSessionService (#318).
    • Rozwiązanie problemu polegającego na tym, że biblioteka zadeklarowała odbiornik przycisku multimediów bez zamiaru aplikacji (#314).
  • DASH:
    • Poprawiono obsługę pustych linii czasu segmentów (#11014).
  • RTSP:
    • Jeśli konfiguracja RTSP z UDP zakończy się niepowodzeniem z powodu błędu RTSP 461 UnsupportedTransport (#11069), spróbuj ponownie użyć protokołu TCP.

Wersja 1.0.0

22 marca 2023 r.

androidx.media3:media3-*:1.0.0 został zwolniony. Wersja 1.0.0 zawiera te zatwierdzenia.

Ta wersja odpowiada wersji ExoPlayer 2.18.5.

Brak zmian od wersji 1.0.0-rc02.

Wersja 1.0.0-rc02

2 marca 2023 r.

androidx.media3:media3-*:1.0.0-rc02 został zwolniony. Wersja 1.0.0-rc02 zawiera te zatwierdzenia.

Ta wersja odpowiada wersji ExoPlayer 2.18.4.

  • Biblioteka podstawowa:
    • Naprawiono wykrywanie typu sieci w poziomie API 33 (#10970).
    • Napraw NullPointerException podczas dzwonienia do ExoPlayer.isTunnelingEnabled (#10977).
  • Pobrane:
    • Umożliw konfigurowanie maksymalnej różnicy w czasie rozpoczęcia 2 segmentów, które mają zostać scalone, w SegmentDownloader i jego podklasach (#248).
  • Dźwięk:
    • Naprawiono problem z nieprawidłowym odtwarzaniem bez przerw MP3 na urządzeniach Samsung (#8594).
    • Rozwiązanie błędu, w którym szybkość odtwarzania ustawiona bezpośrednio po wyłączeniu dźwięku mogła zostać zastąpiona przez poprzednią zmianę szybkości (#10882).
  • Film:
    • Zamiast HEVCProfileMain10 mapuj format HEVC HDR10 na HEVCProfileMain10HDR10.
    • Dodaj obejście problemu z urządzeniem Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC z częstotliwością 60 FPS są oznaczane jako niedostępne (#10898).
    • Rozwiązanie problemów z wydajnością podczas uwalniania klatek podczas odtwarzania multimediów z częstotliwością klatek znacznie wyższą niż częstotliwość odświeżania ekranu.
  • Przesyłanie:
    • Naprawiono przejściowe STATE_IDLE podczas przechodzenia między elementami multimediów (#245).
  • RTSP:
    • Przechwyć IllegalArgumentException rzucony podczas analizowania nieprawidłowego RTSP. Opisz komunikaty odpowiedzi (#10971).
  • Sesja:
    • Usunęliśmy błąd, który powodował, że przycisk odtwarzania/pauzowania w powiadomieniu nie aktualizował się zgodnie ze stanem odtwarzacza (#192).
  • Rozszerzenie IMA:
    • Naprawiono błąd, który uniemożliwiał uruchamianie strumieni DAI bez reklam, ponieważ nie był odbierany pierwszy (a w przypadku braku reklam jedyny) LOADED.

Wersja 1.0.0-rc01

16 lutego 2023 r.

androidx.media3:media3-*:1.0.0-rc01 został zwolniony. Wersja 1.0.0-rc01 zawiera te zatwierdzenia.

Ta wersja odpowiada wersji ExoPlayer 2.18.3.

  • Biblioteka podstawowa:
    • Dostosuj logikę kolejkowania dekodera w rendererze, aby zachować preferencje MediaCodecSelector, nawet jeśli dekoder zgłosi, że nie może odtworzyć multimediów z odpowiednią wydajnością. Na przykład w przypadku domyślnego selektora dekoder sprzętowy z ograniczonym wsparciem będzie preferowany od dekodera oprogramowania, który w pełni obsługuje format (#10604).
    • Dodaj ExoPlayer.Builder.setPlaybackLooper, który ustawia istniejący wątek odtwarzania dla nowej instancji ExoPlayer.
    • Zezwalaj na usuwanie pomocników menedżera pobierania (#10776).
    • Dodaj parametr do BasePlayer.seekTo, aby wskazać polecenie używane do przewijania.
    • Używanie motywu podczas wczytywania plików drawable w wersji interfejsu API 21 lub nowszej (#220).
    • Dodaj ConcatenatingMediaSource2, który umożliwia łączenie wielu elementów multimediów w jednym oknie (#247).
  • Wyodrębnianie:
    • Wyrzuć ParserException zamiast NullPointerException, jeśli w tabeli próbek (stbl) brakuje wymaganego opisu próbki (stsd) podczas analizowania atomów trak.
    • Prawidłowo pomijać próbki podczas przechodzenia bezpośrednio do synchronizowanej klatki w pliku fMP4 (#10941).
  • Dźwięk:
    • Użyj bitrate’u skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora dla AudioTrack w przypadku bezpośredniego odtwarzania (przepuszczania).
  • Tekst:
    • Naprawiono błąd polegający na przekazywaniu przez TextRenderer nieprawidłowego (ujemnego) indeksu do funkcji Subtitle.getEventTime, jeśli plik z napisami nie zawiera żadnych cue.
    • SubRip: dodano obsługę plików UTF-16, jeśli zaczynają się od znacznika kolejności bajtów.
  • Metadane:
    • Parsowanie wielu wartości rozdzielonych znakiem null z ramek ID3 zgodnie z zaleceniami ID3 w wersji 2.4.
    • Dodaj MediaMetadata.mediaType, aby oznaczyć typ treści lub typ folderu opisanego przez metadane.
    • Dodaj MediaMetadata.isBrowsable jako zamiennik MediaMetadata.folderType. W następnej wersji wycofamy ten typ folderu.
  • DASH:
    • Dodano pełne parsowanie zestawów dostosowań obrazu, w tym liczby kafelków (#3752).
  • UI:
    • Napraw przestarzały kod PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) aby upewnić się, że zmiany widoczności są przekazywane do zarejestrowanego słuchacza (#229).
    • Poprawić kolejność elementów sterujących odtwarzaczem w PlayerView w przypadku układu od prawej do lewej (#227).
  • Sesja:
    • Dodaj abstrakt SimpleBasePlayer, aby ułatwić implementację interfejsu Player dla niestandardowych odtwarzaczy.
    • Dodaj metodę pomocniczą do konwertowania tokenu sesji platformy na Media3 SessionToken (#171).
    • Użyj onMediaMetadataChanged, aby wywołać aktualizacje sesji multimediów platformy (#219).
    • Dodaj sesję multimediów jako argument funkcji getMediaButtons() w funkcji DefaultMediaNotificationProvider i użyj niezmiennych list, aby zwiększyć przejrzystość kodu (#216).
    • Dodaj odbiorczy interfejs wywołania onSetMediaItems, aby umożliwić modyfikowanie/ustawianie listy MediaItem, indeksu początkowego i pozycji w ramach sesji przed ustawieniem ich w odtwarzaczu (#156).
    • Unikaj wykrywania dwukrotnego dotknięcia w przypadku zdarzeń przycisku multimediów innych niż Bluetooth (#233).
    • Spraw, aby QueueTimeline był bardziej niezawodny w przypadku niejasnego stanu sesji w starszej wersji (#241).
  • Metadane:
    • Parsowanie wielu wartości rozdzielonych znakiem null z ramek ID3 zgodnie z zaleceniami ID3 w wersji 2.4.
    • Dodaj MediaMetadata.mediaType, aby oznaczyć typ treści lub typ folderu opisanego przez metadane.
    • Dodaj MediaMetadata.isBrowsable jako zamiennik MediaMetadata.folderType. W następnej wersji wycofamy ten typ folderu.
  • Rozszerzenie przesyłania:
    • Zaktualizuj wersję pakietu SDK Cast do 21.2.0.
  • Rozszerzenie IMA:
    • Usuń listenera 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 przycisku pominięcia na urządzeniach TV i ustawić domyślnie wartość „Prawda”.
    • Dodaj metodę focusSkipButton() do klasy ImaServerSideAdInsertionMediaSource.AdsLoader, aby programowo poprosić o skupienie się na przycisku pominięcia.
    • Zaktualizuj pakiet IMA SDK do wersji 3.29.0.
  • Aplikacja demonstracyjna:
    • Prośba o uprawnienia do powiadomień o pobieraniu w czasie działania aplikacji (#10884).

Wersja 1.0.0-beta03

22 listopada 2022 r.

androidx.media3:media3-*:1.0.0-beta03 został zwolniony. Wersja 1.0.0-beta03 zawiera te komitowane zmiany.

Ta wersja odpowiada wersji ExoPlayer 2.18.2.

  • Biblioteka podstawowa:
    • Dodaj ExoPlayer.isTunnelingEnabled, aby sprawdzić, czy tunelowanie jest włączone dla wybranych ścieżek (#2518).
    • Dodaj WrappingMediaSource, aby uprościć owinięcie pojedynczego elementu MediaSource (#7279).
    • odrzucenie bufora z danymi z poprzedniego odtwarzania, zanim odtwarzanie się zatrzyma z powodu braku dostępnej pamięci;
    • Zamknij blok kodu śledzenia „doSomeWork” po włączeniu funkcji przenoszenia.
    • Rozwiązano problem ze śledzeniem sesji w przypadku szybkiego przewijania w PlaybackStatsListener (#180).
    • Wysyłanie brakującego wywołania zwrotnego onMediaItemTransition podczas wywoływania funkcji seekToNext lub seekToPrevious na playliście z jednym elementem (#10667).
    • Dodaj funkcję Player.getSurfaceSize, która zwraca rozmiar powierzchni, na której renderowany jest film.
    • Naprawiono błąd, który powodował, że usuwanie słuchaczy podczas odtwarzania mogło spowodować błąd IllegalStateException (#10758).
  • Kompilacja:
    • Aby uniknąć błędów kompilacji, zastosuj minimalną wartość compileSdkVersion (#10684).
    • Unikaj blokowania publikowania, gdy jest ono uwzględnione w innej kompilacji Gradle.
  • Wybór ścieżki:
    • preferuj inne ścieżki niż Dolby Vision, jeśli wyświetlacz go nie obsługuje; (#8944).
  • Pobrane:
    • Naprawiono potencjalną nieskończoną pętlę w ProgressiveDownloader spowodowaną jednoczesnym pobieraniem i odtwarzaniem tego samego PriorityTaskManager (#10570).
    • Aby powiadomienie o pobieraniu wyświetlało się natychmiast (#183).
    • Ogranicz liczbę równoczesnych usuwanych pobrań do 1, aby uniknąć nadmiernego tworzenia wątków (#10458).
  • Film:
    • Jeśli wyświetlacz nie obsługuje Dolby Vision, spróbuj użyć alternatywnego dekodera. (#9794).
  • Dźwięk:
    • Aby uniknąć błędów OutOfMemory podczas uwalniania wielu odtwarzaczy w tym samym czasie (#10057), używaj funkcji SingleThreadExecutor do uwalniania instancji AudioTrack.
    • Dodaje AudioOffloadListener.onExperimentalOffloadedPlayback do stanu przenoszenia ścieżki audio. (#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ę za pomocą parametru MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), aby określić, czy renderer ma wyprowadzać metadane wcześniej, czy zsynchronizowanie z pozycją odtwarzacza.
  • DRM:
    • obejście błędu w implementacji ClearKey w Androidzie 13, który zwraca nieprawidłowy adres URL licencji, ale nie pusty;
    • Naprawiono błąd setMediaDrmSession failed: session not opened podczas przełączania się między schematami DRM w liście odtwarzania (np. z Widevine na ClearKey).
  • Tekst:
    • CEA-608: upewnij się, że polecenie przełączenia usługi w polu 2 jest obsługiwane prawidłowo (#10666).
  • DASH:
    • Analizowanie EventStream.presentationTimeOffset z plików manifestu (#10460).
  • UI:
    • Używanie bieżących zastąpień odtwarzacza jako wstępnie ustawionych w TrackSelectionDialogBuilder (#10429).
  • Sesja:
    • Zadbaj o to, aby polecenia były 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. Kreator może skonfigurować identyfikator powiadomienia, identyfikator kanału powiadomienia i nazwę kanału powiadomienia 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 są odrzucane (#99).
    • SimpleBitmapLoader może wczytywać bitmapy z identyfikatorów URI file:// (#108).
    • Poprawić twierdzenie, które uniemożliwia MediaController przeskakiwanie przez reklamę w okresie (#122).
    • Po zakończeniu odtwarzania MediaSessionService przestaje być wyświetlany na pierwszym planie i wyświetla się powiadomienie z prośbą o ponowne uruchomienie ostatnio odtwarzanego elementu multimedialnego (#112).
    • Nie uruchamiaj usługi na pierwszym planie z oczekującym zamiarem wstrzymania (#167).
    • Ręczne ukrywanie „plakietki” powiązanej z powiadomieniem utworzonym przez DefaultNotificationProvider w interfejsach API 26 i 27 (w interfejsach API 28 i nowszych plakietka jest ukryta automatycznie) (#131).
    • Naprawiono błąd, który powodował, że drugie połączenie bindera z starszego obiektu MediaSession z obiektem Media3 MediaController powodowało wyjątek IllegalStateException (#49).
  • RTSP:
    • Dodaj obsługę fragmentowanych pakietów H263 (#119).
    • Dodano obsługę MP4A-LATM (#162).
  • IMA:
    • Dodaj limit czasu na wczytywanie informacji o reklamach, aby rozwiązać problemy, 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łowo obliczać czas trwania okna w przypadku transmisji na żywo z reklamami wstawianymi po stronie serwera, na przykład IMA DAI (#10764).
  • Rozszerzenie FFmpeg:
    • Dodaj nowe wymagane flagi, aby połączyć biblioteki FFmpeg z NDK 23.1.7779620 i nowszymi (#9933).
  • Rozszerzenie AV1:
    • Zaktualizuj wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Android Studio (#9933).
  • Rozszerzenie przesyłania:
    • Wdrożyć getDeviceInfo(), aby można było zidentyfikować CastPlayer podczas sterowania odtwarzaniem za pomocą MediaController (#142).
  • Transformator:
    • Dodaj licznik czasu muxera, aby wykrywać zbyt wolne generowanie próbki wyjściowej.
  • Usuń symbole wycofane:
    • Usuń Transformer.Builder.setOutputMimeType(String). Ta funkcja została usunięta. Gdy używany jest domyślny muxer, typ MIME będzie zawsze MP4.

Wersja 1.0.0-beta02

21 lipca 2022 r.

androidx.media3:media3-*:1.0.0-beta02 został zwolniony. Wersja 1.0.0-beta02 zawiera te zatwierdzenia.

Ta wersja odpowiada wersji ExoPlayer 2.18.1.

  • Biblioteka podstawowa:
    • Upewnij się, że zastąpienie ShuffleOrder wartością ExoPlayer.setShuffleOrder powoduje wywołanie funkcji Player.Listener#onTimelineChanged z wartością reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • W przypadku mediów progresywnych uwzględnij tylko wybrane utwory w pozycji buforowanej (#10361).
    • Zezwalanie na niestandardowy rejestrator dla wszystkich danych wyjściowych logów ExoPlayer (#9752).
    • Naprawiono implementację funkcji setDataSourceFactory w DefaultMediaSourceFactory, która w niektórych przypadkach nie działała (#116).
  • Wyodrębnianie:
    • Naprawiono problem z parsowaniem krótkich zestawów obrazów referencyjnych H.265 (#10316).
    • Naprawiono analizowanie bitrate’ów z pudełek esds (#10381).
  • DASH:
    • Parsowanie adresu URL licencji ClearKey z plików manifestu (#10246).
  • UI:
    • Sprawdzanie, czy TalkBack ogłasza aktualnie aktywną opcję szybkości w menu elementów sterujących odtwarzaniem (#10298).
  • RTSP:
    • Dodaj obsługę fragmentowanych pakietów VP8 (#110).
  • Rozszerzenie leanback:
    • Posłuchaj zmian w playWhenReadyLeanbackAdapter (10420).
  • Przesyłanie:
    • Użyj wartości MediaItem przekazanej do metod playlisty jako Window.mediaItemCastTimeline (#25, #8212).
    • Obsługuje Player.getMetadata()Listener.onMediaMetadataChanged()CastPlayer (#25).

Wersja 1.0.0-beta01

16 czerwca 2022 r.

androidx.media3:media3-*:1.0.0-beta01 został zwolniony. Wersja 1.0.0-beta01 zawiera te commity.

Odpowiada to wersji ExoPlayer 2.18.0.

  • Biblioteka podstawowa:
    • Włącz obsługę diagnostyki platformy Android za pomocą MediaMetricsManager. ExoPlayer przekaże zdarzenia odtwarzania i dane dotyczące wydajności do platformy, co pomoże w dostarczaniu informacji o wydajności systemu i debugowaniu na urządzeniu. Te dane mogą być też gromadzone przez Google, jeśli użytkownik urządzenia włączył udostępnianie danych o użyciu i diagnostyce. Aplikacje mogą zrezygnować z udostępniania danych do diagnostyki platformy ExoPlayer za pomocą parametru ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Rozwiązanie problemu polegającego na zbyt częstym resetowaniu ścieżek podczas korzystania z funkcji MergingMediaSource, na przykład podczas wczytywania napisów i zmiany wybranych napisów w trakcie odtwarzania (#10248).
    • Zatrzymanie wykrywania typu sieci 5G-NSA w interfejsach API 29 i 30. Odtwarzanie będzie odbywać się w sieci 4G.
    • Nie zezwalaj na przekazywanie null do MediaSource.Factory.setDrmSessionManagerProvider i MediaSource.Factory.setLoadErrorHandlingPolicy. W razie potrzeby można jawnie przekazać instancje DefaultDrmSessionManagerProvider i DefaultLoadErrorHandlingPolicy.
    • Dodaj MediaItem.RequestMetadata, aby reprezentować metadane potrzebne do odtworzenia multimediów, gdy dokładna wartość LocalConfiguration jest nieznana. Usuń też MediaMetadata.mediaUrl, ponieważ jest ono teraz uwzględnione w RequestMetadata.
    • Dodaj Player.Command.COMMAND_SET_MEDIA_ITEM, aby umożliwić graczom ustawianie pojedynczego elementu.
  • Wybór ścieżki:
    • Spłaszcz zajęcia TrackSelectionOverrides do poziomu zajęć TrackSelectionParameters i przenieś zajęcia TrackSelectionOverride na najwyższy poziom.
    • Zmień nazwę TracksInfo na Tracks, a TracksInfo.TrackGroupInfo na Tracks.Group. Nazwa Player.getCurrentTracksInfoPlayer.Listener.onTracksInfoChanged została zmieniona odpowiednio na Player.getCurrentTracksPlayer.Listener.onTracksChanged. Obejmuje to „odwołanie się” do nazwy metody Player.Listener.onTracksChanged, ale z innymi typami parametrów.
    • Zmień operatory DefaultTrackSelector.buildUponParametersDefaultTrackSelector.Parameters.buildUpon, aby zwracały wartość DefaultTrackSelector.Parameters.Builder zamiast przestarzałego operatora DefaultTrackSelector.ParametersBuilder.
    • Dodaj DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities, które jest domyślnie włączone. Po włączeniu DefaultTrackSelectorbę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 preferuje format stereo/mono zamiast formatów dźwięku wielokanałowego, chyba że format wielokanałowy może być przestrzenny (Android 12L+), lub jest to format dźwięku przestrzennego Dolby. Dodatkowo na urządzeniach obsługujących przestrzenny dźwięk DefaultTrackSelectorbędzie sprawdzać zmiany w właściwościach Spatializer i uruchamiać wybór nowej ścieżki. Urządzenia z television trybem interfejsu użytkownika są wyłączone z tych ograniczeń, a preferowany będzie format z największą liczbą kanałów. Aby włączyć tę funkcję, instancja DefaultTrackSelector musi być utworzona za pomocą Context.
  • Film:
    • Zmień nazwę DummySurface na PlaceholderSurface.
    • Dodaj obsługę AV1 do MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Dźwięk:
    • Użyj dekodera audio LG AC3, który reklamuje niestandardowy typ MIME.
    • Zmień typ zwracanej wartości funkcji AudioAttributes.getAudioAttributesV21()android.media.AudioAttributes na nową klasę o nazwie AudioAttributesV21, aby uniknąć powolnego procesu weryfikacji ART w interfejsie API <21.
    • Wysłać zapytanie do platformy (API 29+), aby uzyskać liczbę kanałów kodowania dźwięku, lub przyjąć liczbę kanałów kodowania dźwięku w przypadku przesyłania dźwięku, gdy liczba kanałów formatu dźwięku nie jest ustawiona (co występuje w przypadku przygotowania bez fragmentów HLS (10204).
    • Skonfiguruj AudioTrack z maską kanału AudioFormat.CHANNEL_OUT_7POINT1POINT4, jeśli dekoder wyprowadza 12-kanałowe audio PCM (#10322).
  • DRM
    • Upewnij się, że sesja DRM jest zawsze prawidłowo aktualizowana podczas przewijania bezpośrednio po zmianie formatu (10274).
  • Tekst:
    • Zmień Player.getCurrentCues() na CueGroup zamiast List<Cue>.
    • SSA: obsługa ustawienia stylu OutlineColour, gdy BorderStyle == 3 (tzn. OutlineColour ustawia tło cue) (#8435).
    • CEA-708: Przeanalizuj dane w wiele bloki usług i ignoruj bloki niezwiązane z obecnie wybranym numerem usługi.
    • Usuń RawCcExtractor, który był używany tylko do obsługi formatu napisów wewnętrznych Google.
  • Wyodrębnianie:
    • Dodano obsługę formatu AVI (#2092).
    • Matroska: przeanalizuj DiscardPadding dla ścieżek Opus.
    • MP4: przeanalizuj bitrate z pól esds.
    • Ogg: zezwalaj na zduplikowane nagłówki identyfikatora i komentarza Opus (#10038).
  • UI:
    • Naprawić przesyłanie zdarzeń do OnClickListeners ustawionych w PlayerView w przypadku, gdy useController=false (#9605). Naprawiono też przesyłanie zdarzeń do OnLongClickListener we wszystkich konfiguracjach widoku.
    • Rozwiązanie problemu polegającego na nieprawidłowym traktowaniu sekwencji zdarzeń dotyku, które wychodzą poza granice PlayerView przed ACTION_UP, jako kliknięcia (#9861).
    • Rozwiązanie problemu PlayerView z ułatwieniami dostępu, w którym dotknięcie mogło włączyć odtwarzanie zamiast ukryć elementy sterujące (#8627).
    • Zmień polecenia TrackSelectionViewTrackSelectionDialogBuilder, aby działały z interfejsem Player, a nie ExoPlayer. Dzięki temu widoki można używać z innymi implementacjami Player, a także usunąć zależność modułu interfejsu od modułu ExoPlayer. To jest zmiana zasadnicza.
    • Nie wyświetlaj ścieżek z wymuszonym tekstem w selektorze ścieżek PlayerView i zachowaj odpowiednią ścieżkę z wymuszonym tekstem, jeśli wybrana jest opcja „Brak” (#9432).
  • DASH:
    • Przeanalizuj liczbę kanałów z elementów DTS AudioChannelConfiguration. Ta zmiana ponownie włącza przepuszczanie dźwięku w przypadku strumieni DTS (#10159).
    • Nie zezwalaj na przekazywanie wartości null do DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby instancje DefaultCompositeSequenceableLoaderFactory można przekazywać wprost.
  • HLS:
    • Przejście na przygotowanie w kawałkach, jeśli atrybut CODECS playlisty nie zawiera kodeka audio (#10065).
    • Nie zezwalaj na przekazywanie wartości null do usług HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory i HlsMediaSource.Factory.setPlaylistTrackerFactory. W razie potrzeby można jawnie przekazywać instancje funkcji DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory lub odwołania do funkcji DefaultHlsPlaylistTracker.FACTORY.
  • Wygładzanie strumieniowego przesyłania danych:
    • Nie zezwalaj na przekazywanie wartości null do SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby instancje DefaultCompositeSequenceableLoaderFactory można przekazywać wprost.
  • RTSP:
    • Dodaj czytnik RTP dla H263 (#63).
    • Dodaj czytnik RTP dla MPEG4 (#35).
    • Dodaj czytnik RTP dla HEVC (#36).
    • Dodaj czytnik RTP dla AMR. Obecnie obsługiwane są tylko monokanałowe strumienie AMR bez przeplotu. Złożony strumień AMR RTP nie jest obsługiwany. (#46)
    • Dodaj czytnik RTP dla VP8 (#47).
    • Dodaj czytnik RTP dla WAV (#56).
    • Popraw nagłówek autoryzacji podstawowej RTSP. (#9544).
    • Zatrzymaj sprawdzanie pól SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
    • Wyjątek kontrolowany podczas analizowania czasu RTSP (#10165).
    • Dodaj czytnik RTP dla VP9 (#47).
    • Dodaj czytnik RTP dla OPUS (#53).
  • Źródła danych:
    • Zmień nazwę DummyDataSource na PlaceholderDataSource.
    • Sposób obejścia obsługi przerwania OkHttp.
  • Sesja:
    • Zastąp MediaSession.MediaItemFiller wartością MediaSession.Callback.onAddMediaItems, aby umożliwić asynchroniczne przetwarzanie żądań.
    • Obsługuje metody setMediaItems(s), gdy MediaController łączy się z sesją multimediów w starszej wersji.
    • Usuń MediaController.setMediaUriMediaSession.Callback.onSetMediaUri. Tę samą funkcję można uzyskać, używając pól MediaController.setMediaItemMediaSession.Callback.onAddMediaItems.
    • Przekierowuj połączenia z usług MediaController, które odtwarzają treści multimedialne, do MediaSession.Callback.onAddMediaItems zamiast do onSetMediaUri.
    • Dodaj atrybuty MediaNotification.Provider i DefaultMediaNotificationProvider, aby dostosować powiadomienie.
    • Dodaj BitmapLoaderSimpleBitmapLoader do pobierania obrazów z elementami graficznymi.
    • Dodaj MediaSession.setCustomLayout(), aby zapewnić zgodność wsteczną ze starszą sesją.
    • Dodaj MediaSession.setSessionExtras(), aby zapewnić zgodność funkcji z sesją w wersji starszej.
    • Zmień nazwę MediaSession.MediaSessionCallback na MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback na MediaLibrarySession.Callback, a MediaSession.Builder.setSessionCallback na setCallback.
    • Naprawiono NPE w funkcji MediaControllerImplLegacy (#59).
    • Zaktualizuj informacje o pozycji sesji na osi czasu(#51).
    • Naprawiono NPE w MediaControllerImplBase po zwolnieniu kontrolera (#74).
  • Odtwarzanie reklamy / IMA:
    • Zmniejsz częstotliwość sprawdzania reklam z co 100 ms na co 200 ms, aby dostosować się do zaleceń Media Rating Council (MRC).
  • Rozszerzenie FFmpeg:
    • Zaktualizuj wersję CMake do 3.21.0+, aby uniknąć błędu w CMake, który powoduje niepowodzenie synchronizacji Gradle w Android Studio (#9933).
  • Usuń symbole wycofane:
    • Usuń Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Zamiast tego użyj pola Player.Listener.onTracksChanged(Tracks).
    • Usuń Player.getCurrentTrackGroupsPlayer.getCurrentTrackSelections. Zamiast tego użyj pola Player.getCurrentTracks. Możesz też nadal używać metod ExoPlayer.getCurrentTrackGroupsExoPlayer.getCurrentTrackSelections, chociaż są one nadal wycofywane.
    • Usuń stałe DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT i DEFAULT_TRACK_SELECTOR_PARAMETERS. Jeśli to możliwe, używaj tagu getDefaultTrackSelectorParameters(Context), a w przeciwnym razie tagu DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Usuń konstruktor DefaultTrackSelector(ExoTrackSelection.Factory). Zamiast tego użyj DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Usuń Transformer.Builder.setContext. Zamiast tego parametr Context powinien być przekazywany do konstruktora Transformer.Builder.

Wersja 1.0.0-alpha03

14 marca 2022 r.

androidx.media3:media3-*:1.0.0-alpha03 został zwolniony. Wersja 1.0.0-alpha03 zawiera te commity.

Odpowiada ona wersji ExoPlayer 2.17.1.

  • Dźwięk:
    • Naprawiono błąd sprawdzania możliwości dźwięku Dolby Atmos (E-AC3-JOC) w HLS.
  • Wyodrębnianie:
    • FMP4: rozwiązano problem polegający na tym, że metadane próbki emsg mogły być wyświetlane w złym kolejności w przypadku strumieni zawierających zarówno atom emsg w wersji 0, jak i w wersji 1 (#9996).
  • Tekst:
    • Napraw interfejs SingleSampleMediaSource.Factory.setTrackId i MediaItem.SubtitleConfiguration.Builder.setId, aby nadać priorytet polu SubtitleConfiguration i użyć wartości Factory, jeśli to pole nie jest ustawione (#10016).
  • Odtwarzanie reklamy:
    • Napraw problemy z dźwiękiem w trakcie reklam w transmisjach na żywo HLS SSAI.

Wersja 1.0.0-alpha02

2 marca 2022 r.

androidx.media3:media3-*:1.0.0-alpha02 został zwolniony. Wersja 1.0.0-alpha02 zawiera te commity.

Odpowiada to wersji ExoPlayer 2.17.0.

  • Podstawowa biblioteka:
    • Dodaj metodę DefaultRenderersFactory.getCodecAdapterFactory() chronioną przed modyfikacją, aby podklasy klasy DefaultRenderersFactory, które zastępują metodę buildVideoRenderers() lub buildAudioRenderers(), mogły uzyskać dostęp do fabryki adaptera kodeka i przekazać ją do tworzonych przez siebie wystąpień klasy MediaCodecRenderer.
    • Przeprowadź pola nagłówka ICY namegenre odpowiednio do pól MediaMetadata.stationMediaMetadata.genre, aby dotarły do aplikacji przez pole Player.Listener.onMediaMetadataChanged() (#9677).
    • Usuń klucze null z elementu DefaultHttpDataSource#getResponseHeaders.
    • Przejście w stan uśpienia i ponowne próby tworzenia instancji MediaCodec, gdy się nie uda. Rozwiązanie to pozwala obejść problem, który występuje na niektórych urządzeniach podczas przełączania powierzchni z bezpiecznego kodeka na inny (#8696).
    • Dodaj MediaCodecAdapter.getMetrics(), aby umożliwić użytkownikom uzyskiwanie danych pomiarowych z MediaCodec. (#9766).
    • Naprawiono rozwiązanie zależności Maven (#8353).
    • Wyłącz automatyczne dostosowywanie szybkości w przypadku transmisji na żywo, które nie mają funkcji niskiej latencji ani nie mają ustawionej szybkości przez użytkownika (#9329).
    • Zmień nazwę DecoderCounters#inputBufferCount na queuedInputBufferCount.
    • Ustaw SimpleExoPlayer.renderers jako prywatne. Do renderowania można uzyskać dostęp za pomocą ExoPlayer.getRenderer.
    • Zaktualizowano niektóre wartości stałych AnalyticsListener.EventFlags, aby pasowały do wartości w pliku Player.EventFlags.
    • Podziel AnalyticsCollector na interfejs i domyślną implementację, aby umożliwić usunięcie go przez R8, jeśli aplikacja go nie potrzebuje.
  • Wybór ścieżki:
    • Obsługa flag preferowanych ról wideo w wyborze ścieżki (#9402).
    • Aktualizacja logiki wyboru ścieżki wideo w celu uwzględnienia preferowanych typów MIME i flag ról podczas wybierania wielu ścieżek wideo do adaptacji (#9519).
    • Zaktualizowano logikę wyboru ścieżki wideo i ścieżki audio, aby wybierać tylko formaty dla opcji dostosowanych, które mają ten sam poziom obsługi dekodera i sprzętu (#9565).
    • Zaktualizuj logikę wyboru ścieżki wideo, aby preferować bardziej wydajne kodeki, jeśli wiele kodeków jest obsługiwanych przez podstawowe dekodery z akceleracją sprzętową (#4835).
    • Preferuj ustawienia treści audio (np. „domyślny” ścieżka audio lub ścieżka dopasowana do języka systemu) zamiast ograniczeń technicznych dotyczących wyboru ścieżki (np. preferowany typ MIME lub maksymalna liczba kanałów).
    • Rozwiązanie problemu z wybieraniem ścieżek, w którym zastąpienie jednej grupy ścieżek nie wyłączało innych grup ścieżek tego samego typu (#9675).
    • Rozwiązanie problemu z wybieraniem ścieżek, w którym nieprawidłowo stosowano mieszankę niepustych i pustych zastąpień ścieżek (#9649).
    • Zabrania zduplikowanych TrackGroup w ramach TrackGroupArray. TrackGroups może być zawsze odróżnialny przez ustawienie id w konstruktorze TrackGroup. Rozwiązuje to problem z zawieszaniem się aplikacji podczas wznawiania odtwarzania po przełączeniu aplikacji na tło z aktywnym zastąpieniem ścieżki (#9718).
    • Zmień reguły działania w AdaptiveTrackSelection, aby umożliwić zwiększenie jakości przy wystarczającej przepustowości sieci, nawet jeśli odtwarzanie jest bardzo bliskie do krawędzi na żywo (#9784).
  • Film:
    • Popraw logikę dekodera zapasowego dla Dolby Vision, aby w razie potrzeby używać zgodnego dekodera H264/H265.
  • Dźwięk:
    • Popraw logikę dekodera zapasowego w przypadku Dolby Atmos (E-AC3-JOC), aby w razie potrzeby użyć zgodnego dekodera E-AC3.
    • Zmień interfejsy API AudioCapabilities, aby wymagały przekazywania wartości AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES zamiast null.
    • Umożliw dostosowanie obliczeń rozmiaru bufora AudioTrack przez wstrzyknięcie wartości AudioTrackBufferSizeProvider do DefaultAudioSink. (#8891).
    • Ponownie utwórz AudioTrack, jeśli żądany rozmiar bufora wynosił > 1 MB. (#9712).
  • Wyodrębnianie:
    • WAV: dodanie obsługi strumieni RF64 (#9543).
    • Naprawiono nieprawidłowe parsowanie 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).
    • Dodaj podstawową obsługę napisów WebVTT w kontenerach Matroska (#9886).
    • Zapobieganie odczytywaniu przez Cea708Decoder większej ilości danych niż zadeklarowany rozmiar bloku usługi.
  • DRM:
    • Usuń playbackLooper z konta DrmSessionManager.(pre)acquireSession. Gdy aplikacja używa elementu DrmSessionManager w niestandardowym elemencie MediaSource, playbackLooper musi zostać przekazany do elementu DrmSessionManager.setPlayer.
  • Odtwarzanie reklamy / IMA:
    • Dodano obsługę dynamicznego wstawiania reklam IMA (DAI) (#8213).
    • Dodaj do metody AdPlaybackState metodę resetowania grupy reklam, aby można było ją odtworzyć ponownie (#9615).
    • Wymuś szybkość odtwarzania 1,0 podczas odtwarzania reklamy (#9018).
    • Rozwiązanie problemu, który powodował natychmiastowe zresetowanie odtwarzania, gdy nie udało się załadować grupy reklam (#9929).
  • UI:
    • Poprawiliśmy kolor numerów na przyciskach StyledPlayerView do przewijania do tyłu i do przodu w przypadku niektórych motywów (#9765).
    • Prawidłowo przetłumaczyć ciągi znaków dotyczące szybkości odtwarzania (#9811).
  • DASH:
    • Dodaj zanalizowane właściwości podstawowe i dodatkowe do elementu Representation (#9579).
    • Obsługa roli ścieżki forced-subtitle (#9727).
    • Zatrzymaj interpretowanie roli ścieżki main jako C.SELECTION_FLAG_DEFAULT.
    • Poprawiono logikę wykluczania adresów URL podstawowych 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 Format.label w przypadku strumieni HLS zawierających tylko dźwięk (#9608).
    • Aby skrócić czas uruchamiania, domyślnie używaj przygotowania bez segmentów. Jeśli Twoje wersje zawierają zmiksowane napisy, które nie są określone w playliście głównej, dodaj je do tej playlisty, aby były dostępne do odtwarzania, lub wyłącz przygotowanie bez segmentów za pomocą opcji HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • Obsługa dokładnego przewijania do kluczowych klatek w HLS (#2882).
  • RTSP:
    • Dostarczyć interfejs API klienta, aby zastąpić wartość SocketFactory używaną dla dowolnego połączenia z serwerem (#9606).
    • Jeśli dostępne są obie metody, preferuj DIGEST zamiast BASIC (#9800).
    • Obsługa sytuacji, gdy czas trwania utworu RTSP jest niedostępny (#9775).
    • Ignoruj nieprawidłowe wartości nagłówka RTP-Info (#9619).
  • Transformator:
    • Zwiększ wymaganą minimalną wersję interfejsu API do 21.
    • Wartość TransformationException służy teraz do opisywania błędów występujących podczas przekształcenia.
    • Dodaj TransformationRequest, aby określić opcje przekształcania.
    • Zezwalanie na rejestrację wielu słuchaczy.
    • Rozwiązanie problemu z zablokowaniem się Transformera, gdy kodek jest częściowo odczytywany.
    • Napraw potencjalny NPE w Transformer.getProgress podczas zwalniania muxera.
    • Dodaj aplikację demonstracyjną do stosowania przekształceń.
  • Rozszerzenie MediaSession:
    • Domyślnie MediaSessionConnector teraz czyści playlistę po zatrzymaniu. Aplikacje, które chcą zachować playlistę, mogą wywołać funkcję setClearMediaItemsOnStop(false) w oprogramowaniu sprzęgającym.
  • Rozszerzenie przesyłania:
    • Usunięto błąd uniemożliwiający prawidłowe wywołanie funkcji CastPlayer przez funkcję onIsPlayingChanged (#9792).
    • Obsługa metadanych audio, w tym grafiki z DefaultMediaItemConverter (#9663).
  • Rozszerzenie FFmpeg:
    • Ustaw zależność build_ffmpeg.sh od bin utils w LLVM, a nie od GNU (#9933).
  • Zgodność z Androidem 12:
    • Zaktualizuj rozszerzenie Cast, aby zależało od com.google.android.gms:play-services-cast-framework:20.1.0. Wcześniejsze wersje play-services-cast-framework nie są zgodne z aplikacjami kierowanymi na Androida 12 i spowodują błąd IllegalArgumentException podczas tworzenia PendingIntent (#9528).
  • Usuń symbole wycofane:
    • Usuń Player.EventListener. Zamiast tego użyj Player.Listener.
    • Usuń MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory i MediaSourceFactory#setDrmUserAgent. Zamiast tego użyj atrybutu MediaSourceFactory#setDrmSessionManagerProvider.
    • Usuń MediaSourceFactory#setStreamKeys. Zamiast tego użyj atrybutu MediaItem.Builder#setStreamKeys.
    • Usuń MediaSourceFactory#createMediaSource(Uri). Zamiast tego użyj atrybutu MediaSourceFactory#createMediaSource(MediaItem).
    • Usuń setTag z kont DashMediaSource, HlsMediaSourceSsMediaSource. Zamiast tego użyj MediaItem.Builder#setTag.
    • Usuń DashMediaSource#setLivePresentationDelayMs(long, boolean). Użyj wartości MediaItem.Builder#setLiveConfiguration i MediaItem.LiveConfiguration.Builder#setTargetOffsetMs, aby zastąpić plik manifestu, lub wartości DashMediaSource#setFallbackTargetLiveOffsetMs, aby podać wartość zapasową.
    • Usuń (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Wycofanie się z przestrzegania zasad dotyczących wątków nie jest już możliwe.
    • Usuń ActionFileActionFileUpgradeUtil. Aby scalić starsze pliki akcji z plikiem ActionFileUpgradeUtil, musisz użyć ExoPlayera w wersji 2.16.1 lub nowszej.DefaultDownloadIndex
    • Usuń ProgressiveMediaSource#setExtractorsFactory. Zamiast tego użyj konstruktora ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • Usuń ProgressiveMediaSource.Factory#setTagProgressiveMediaSource.Factory#setCustomCacheKey. Zamiast niej użyj zasad MediaItem.Builder#setTagMediaItem.Builder#setCustomCacheKey.
    • Usuń konstruktory DefaultRenderersFactory(Context, @ExtensionRendererMode int)DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Zamiast tego użyj konstruktora DefaultRenderersFactory(Context), funkcji DefaultRenderersFactory#setExtensionRendererMode i funkcji DefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Usuń wszystkich publicznych konstruktorów CronetDataSource. Zamiast tego użyj atrybutu CronetDataSource.Factory.
  • Zmień te IntDefs na @Target(TYPE_USE). Może to spowodować błąd kompilacji w Kotlinie, który można naprawić, przenosząc adnotację, aby oznaczyć typ (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags (w pakiecie com.google.android.exoplayer2.ext.flac)
    • @FlacExtractor.Flags (w pakiecie com.google.android.exoplayer2.extractor.flac)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

Wersja 1.0.0-alpha01

27 października 2021 roku

androidx.media3:media3-*:1.0.0-alpha01 został zwolniony. Wersja 1.0.0-alpha01 zawiera te commity.

Nowe funkcje

Media3 to nowe miejsce dla bibliotek obsługujących multimedia, w tym ExoPlayer. Pierwsza wersja alfa zawiera wczesne, funkcjonalne implementacje bibliotek do implementowania przypadków użycia multimediów, w tym:

  • ExoPlayer – odtwarzacz multimediów na poziomie aplikacji na Androida, który jest łatwy do dostosowania i rozszerzania.
  • Funkcje sesji multimediów, które umożliwiają odtwarzanie i sterowanie nim. Ten nowy moduł sesji używa tego samego interfejsu Player co ExoPlayer.
  • Komponenty UI do tworzenia interfejsów odtwarzania multimediów.
  • moduły otaczające funkcje w innych bibliotekach do użycia z ExoPlayerem, na przykład wstawianie reklam za pomocą pakietu IMA SDK;

Więcej informacji znajdziesz w projekcie Media3 na GitHubie.

ExoPlayer był wcześniej hostowany w oddzielnym projekcie ExoPlayer na GitHubie. W Media3 jego nazwa to androidx.media3.exoplayer. Planujemy jeszcze przez jakiś czas utrzymywać i publikować projekt ExoPlayer na GitHubie, aby dać aplikacjom czas na migrację do Media3. Media3 zawiera zamienniki wszystkich modułów ExoPlayera, z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session. Umożliwia to bezpośrednią integrację odtwarzaczy z sesjami multimediów bez konieczności korzystania z klasy adaptera lub złącza.