Media3

Biblioteki pomocy na potrzeby przypadków użycia multimediów.
Ostatnia aktualizacja Wersja stabilna Wersja kandydująca Wersja Beta Wersja alfa
30 października 2024 r. 1.4.1 - 1.5.0-beta01 1.5.0-alfa01

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

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 wykorzystuje compileSdk = 35. Użytkownicy biblioteki korzystający z systemów kompilacji innych niż Gradle muszą zadbać o to, aby ich odpowiednik kroku kompresji/zaciemnienia 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 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 int, 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ępne wczytywanie, wywołując odpowiednio polecenie ExoPlayer.setPreloadConfiguration(PreloadConfiguration). Wstępne wczytywanie jest domyślnie wyłączone. Gdy ta opcja jest włączona i nie chcesz zakłócać odtwarzania, DefaultLoadControl ogranicza wstępne wczytywanie do rozpoczęcia i kontynuowania tylko wtedy, gdy odtwarzacz się nie wczytuje. Aplikacje mogą zmienić to zachowanie, implementując kod LoadControl.shouldContinuePreloading() (np. przy zastąpieniu tej metody w DefaultLoadControl). Domyślna implementacja LoadControl wyłącza wstępne wczytywanie w przypadkach, gdy aplikacja używa niestandardowej implementacji LoadControl.
    • Dodaj metodę MediaSourceEventListener.EventDispatcher.dispatchEvent(), aby umożliwić wywoływanie zdarzeń detektorów podklas (1736).
    • Dodaj obiekt DefaultPreloadManager.Builder, który kompiluje instancje DefaultPreloadManager i ExoPlayer o spójnych konfiguracjach.
    • 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 niego należy używać nowej DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • Raportuj zdarzenia typu MediaSourceEventListener ze źródeł dodatkowych w usłudze 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.
    • Zapobiegaj błędom napisów i metadanych przed całkowitym zatrzymaniem odtwarzania. Zamiast tego wyłączyliśmy problemowy utwór, a pozostałe utwory będą odtwarzane dalej (#1722).
      • W nowej obsłudze napisów (podczas wyodrębniania) powiązane błędy analizy (np. nieprawidłowe dane napisów) i błędy wczytywania (np. HTTP 404) są emitowane 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ę eksportu luk w sekwencjach plików audio EditedMediaItems.
  • Wybór utworu:
    • DefaultTrackSelector: wolą dźwięk bazujący na obiektach niż dźwięk kanałowy, gdy inne czynniki są równe.
  • Moduły wyodrębniania danych:
    • Poprawiono obsługę próbki preroll dla pozycji rozpoczęcia mediów, które nie są kluczowymi klatkami, podczas przetwarzania list edycji w plikach MP4 (#1659).
    • Ulepszono obliczanie częstotliwości klatek za pomocą 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ługuj nieodpowiednie klatki w obliczeniach funkcji endIndices w przypadku 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 czasu i zmiany wysokości dźwięku w 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 zabezpieczone H264 z częstotliwością 60 fps były oznaczane jako niedostępne (#1619).
    • Dodaj obejście dla kodeków, które blokują się po odtworzeniu ostatniego przykładu bez zwracania 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 multimediów (#1730).
    • Dodawanie przycisków poleceń dla elementów multimediów. Spowoduje to dodanie interfejsu Media3 API do biblioteki znanej jako Custom browse actions do starszej biblioteki w MediaBrowserCompat. Pamiętaj, że przyciski poleceń Media3 dla elementów multimedialnych są dostępne zarówno w przypadku 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 z pierwszym wywołaniem funkcji onGetRoot().
    • Naprawiono błąd polegający na tym, że gdy przeglądarka MediaBrowser była połączona ze starszą wersją przeglądarki, nie otrzymywała wiadomości o błędzie wysłanych przez tę usługę po zasubskrybowaniu przeglądarki parentid.
    • 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:
    • Z powodu problemów ze współdzielonymi przejściami opartymi na formacie XML włącz w usłudze PlayerView-in-Compose-AndroidView rozciągnięte/przycięte filmy. 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).
    • Naprawiono błąd polegający na tym, że opcja „Brak” w zaznaczonym tekście nie działa, jeśli istnieją preferencje wyboru ścieżki tekstowej zdefiniowane przez aplikację.
  • Rozszerzenie Płynne strumieniowanie:
    • Poprawiono błąd Bad magic number for Bundle podczas odtwarzania strumieni SmoothStreaming ze ścieżkami tekstowymi (#1779).
  • Rozszerzenie RTSP:
    • Popraw usuwanie informacji o użytkowniku w przypadku adresów URL zawierających zakodowane znaki @ (#1138).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1 itp.):
    • Dodano obsługę stron o rozmiarze 16 KB w przypadku rozszerzeń dekodera na 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 podany jest parametr Context. Umożliwia to połączenie MediaSession z elementem RoutingSession, co jest niezbędne do integracji przełącznika wyjścia (#1056).
  • Usuń wycofane symbole:
    • Usuń wycofane 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 element ForwardingSimpleBasePlayer, który umożliwia przekazywanie dalej do innego odtwarzacza z niewielkimi zmianami, a jednocześnie zapewnia pełną spójność i obsługę słuchaczy (#1183).
    • Zastąp metodę SimpleBasePlayer.State.playlist metodą getPlaylist().
    • Dodaj zastąpienie dla SimpleBasePlayer.State.Builder.setPlaylist(), aby bezpośrednio określić Timeline oraz bieżące Tracks i Metadata zamiast tworzyć strukturę playlisty.
    • Zwiększ minSdk do 21 (Android Lollipop). Jest to zgodne ze wszystkimi innymi bibliotekami AndroidX.
    • Dodaj element androidx.media3:media3-common-ktx, który zapewnia funkcje związane z językiem Kotlin i oparte na bibliotece wspólnej.
    • Dodaj funkcję zawieszania rozszerzenia Player.listen, aby uruchomić rutynę w celu nasłuchiwania funkcji Player.Events w bibliotece media3-common-ktx.
  • ExoPlayer:
    • MediaCodecRenderer.onProcessedStreamChange() można teraz wywoływać dla każdego elementu multimedialnego. Wcześniej nie wywołano pierwszego. Aby włączyć tę funkcję, użyj polecenia MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart().
    • Dodaj PreloadMediaSource.PreloadControl.onPreloadError, aby umożliwić implementacji PreloadMediaSource.PreloadControl wykonywania działań w przypadku wystąpienia błędu.
    • Dodaj BasePreloadManager.Listener, aby propagować zdarzenia wstępnego wczytywania 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 renderowanie pozwala na odtwarzanie.
  • Transformator:
    • Dodaj SurfaceAssetLoader, który umożliwia kolejkowanie danych wideo do usługi Transformer 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, bez innych metadanych wskazujących długość bajtów MP3, będą teraz odtwarzane do końca danych MP3 zamiast kończyć się z 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 skonfiguruj 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 pozwala uniknąć dekodowania próbek, które nie są renderowane ani używane jako odwołanie przez inne przykłady.
    • 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 bibliotekami zewnętrznymi do ładowania obrazów, takimi jak Glide czy Coil.
  • DataSource:
    • Dodaj FileDescriptorDataSource, nowy obiekt DataSource, którego można używać do odczytu z pola FileDescriptor (#3757).
  • Efekt:
    • Dodaj obejście problemu DefaultVideoFrameProcessor w przypadku drobnego SurfaceTexturezwiększania skali. SurfaceTexture może zawierać niewielkie skalowanie, które odcina 1-texelską krawędź 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, w którym wyczyszczenie playlisty mogło spowodować błąd ArrayIndexOutOfBoundsExceptionImaServerSideAdInsertionMediaSource.
  • Sesja:
    • Dodaj MediaButtonReceiver.shouldStartForegroundService(Intent), aby umożliwić aplikacjom pominięcie polecenia odtwarzania przychodzącego w celu wznowienia odtwarzania przez zastąpienie tej metody. Domyślnie usługa jest zawsze uruchomiona i odtwarzanie nie może zostać wstrzymane, jeśli system nie spowoduje awarii usługi za pomocą kodu 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 przy użyciu 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 elementem RoutingSession, co jest niezbędne do integracji przełącznika wyjścia (#1056).
  • Narzędzia testowe:
    • DataSourceContractTest zawiera teraz testy, które sprawdzają:
      • Strumień wejściowy read position został zaktualizowany.
      • Bufor wyjściowy offset jest stosowany prawidłowo.
  • Usuń symbole wycofane:
    • Usuń wycofane Player.hasPrevious, Player.hasPreviousWindow(). Użyj w zamian zasady Player.hasPreviousMediaItem().
    • Usuń przestarzała metodę Player.previous(). Zamiast tego użyj atrybutu Player.seekToPreviousMediaItem().
    • Usuń przestarzała metodę DrmSessionEventListener.onDrmSessionAcquired.

Wersja 1.4.0

Wersja 1.4.1

27 sierpnia 2024 r.

Usługa androidx.media3:media3-*:1.4.1 została zwolniona. Wersja 1.4.1 zawiera te komity.

  • ExoPlayer:
    • Asynchronicznie obsługuje wywołania zwrotne wstępnego wczytywania w PreloadMediaSource (#1568).
    • Zezwalanie na odtwarzanie niezależnie od czasu buforowania w przypadku niepowodzenia wczytywania (#1571).
  • Moduły wyodrębniania danych:
    • MP3: napraw błąd Searched too many bytes, prawidłowo ignorując dane końcowe inne niż 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.
    • Napraw IndexOutOfBoundsExceptionLegacySubtitleUtil z powodu nieprawidłowego obsługiwania przypadku, gdy żądany czas rozpoczęcia danych wyjściowych jest większy lub równy końcowemu zdarzeniu 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 nowszych, na których odtwarzane są treści L1 Widevine. Ten błąd jest spowodowany niepełną implementacją metody platformy 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”, jak opisane (#1493).
    • Obsługuj KEYCODE_HEADSETHOOK jako polecenie „odtwarzanie” 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:
    • Przesyłaj do metod BasePlayer.seekTo()SimpleBasePlayer.handleSeek() chronione wywołania seek, które prawdopodobnie nie wymagają wykonania żadnej operacji, zamiast je ignorować. 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 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ępny 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ąć.
    • Zezwalaj na zwracanie przez TargetPreloadStatusControl.getTargetPreloadStatus(T) wartości null, aby wskazać, że nie należy wstępnie wczytywać MediaSource za pomocą podanego parametru 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 PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource), aby wskazać, że źródło zostało wczytane do końca. Umożliwia to implementacjom DefaultPreloadManager i specjalnym implementacjom 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 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(), ExoPlayer wywoła tę metodę podczas obliczania czasu, aby zaplanować zadanie robocze.
    • Dodaj MediaCodecAdapter#OnBufferAvailableListener, aby otrzymywać alerty, gdy MediaCodecRenderer ma dostęp do buforów danych wejściowych i wyjściowych. MediaCodecRenderer będzie wysyłać sygnały do ExoPlayer po otrzymaniu tych wywołań zwrotnych. 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ę, z której funkcja seekToPrevious() wyszukuje poprzedni element (#1425).
    • Poprawiono niespójności w przyciąganiu uwagi dźwiękiem, 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).
    • Funkcja Effects w regionie ExoPlayer.setVideoEffect() otrzyma sygnatury czasowe z usuniętym przesunięciem mechanizmu renderowania (#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.
    • Dodanie obsługi 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 po zresetowaniu i ponownym użyciu, DefaultAudioMixer nie zwraca prawidłowej liczby bajtów.
    • obejście błędu dekodera, w którym liczba kanałów audio była ograniczona do stereo podczas obsługi 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 zamiast tego 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: wycofuj zmianę tak, aby renderowała ostatnią klatkę, 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: wybieraj rozmiar danych z klatki Info zamiast rozmiaru zgłaszanego 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: na podstawie liczby klatek i innych danych w klatce Info (jeśli występują) oblicz średnią szybkość transmisji bitów dla stałej szybkości transmisji bitów, zamiast zawyżać szybkość transmisji bitów klatki po klatce Info, która może być sztucznie mała, np. PCUT (#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).
    • Zaimplementuj MediaCodecAudioRenderer.getDurationToProgressUs(), by ExoPlayer dynamicznie zaplanował, kiedy główna pętla pracy może wykonać MediaCodecAudioRenderer.
  • 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ę dekodera zapasowego dla Dolby Vision, aby w razie potrzeby używać zgodnego dekodera AV1 (#1389).
    • Napraw wyjątek w kodeku, który może być spowodowany włączeniem mechanizmu 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ślny sposób analizy napisów, tak aby miał miejsce podczas wyodrębniania, a nie podczas renderowania (różnicę między wyodrębnianiem a renderowaniem znajdziesz na schemacie architektury ExoPlayer).
      • Tę zmianę można zastąpić, wywołując zarówno MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false), jak i TextRenderer.experimentalSetLegacyDecodingEnabled(true). Aby dowiedzieć się, jak podłączyć te komponenty do instancji ExoPlayer, zapoznaj się z dokumentacją dotyczącą dostosowywania. Te metody (oraz cała obsługa 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 trwania, aby wskazać 0 jako indeks kolorów zamiast dosłownej wartości koloru (#1367).
    • CEA-708: zignoruj wartość rowLock. Specyfikacja CEA-708-E S-2023 mówi, że obie wartości właściwości rowLock i columnLock powinny być traktowane jako prawdziwe, niezależnie od wartości występujących w strumieniu (obsługa columnLock nie jest zaimplementowana, więc w rzeczywistości przyjmuje się, że zawsze ma ona wartość fałsz).
      • 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 dodawania powielonych wierszy do nowego wiersza w wyniku niesłusznego korzystania przez ExoPlayer z polecenia „set pen location” (ustawienie lokalizacji pióra) (#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 ich wartość ma więcej niż 1 bajt.
    • Propaguj ramkę TCON o identyfikatorze 3 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.
    • Zezwalaj funkcji ByteArrayDataSource na rozstrzyganie identyfikatora URI do tablicy bajtów podczas open(), zamiast być zakodowany na stałe podczas budowy (#1405).
  • DRM:
    • Zezwalaj na ustawienie LoadErrorHandlingPolicyDefaultDrmSessionManagerProvider (#1271).
  • Skutek:
    • Obsługuj kilka zmian szybkości w obrębie tego samego EditedMediaItem lub Composition w polu SpeedChangeEffect.
    • 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 jakość wyjścia 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 OverlaySettings.Builder.setOverlayFrameAnchor(), odwróć ich 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).
    • Dodaliśmy obsługę nakładek Ultra HDR (bitmapy) w przypadku treści 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.
    • Dodano obsługę HDR w przypadku zdjęć (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).
    • Zmień wersję pakietu IMA SDK na 3.33.0, aby naprawić błąd NullPointerException, jeśli używasz identyfikatorów 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 ikon CommandButton, które powinny być używane zamiast niestandardowych zasobów ikon.
    • Dodaj MediaSessionService.isPlaybackOngoing(), aby umożliwić aplikacjom wysyłanie zapytań o to, czy w onTaskRemoved() (#1219) trzeba zatrzymać usługę.
    • 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. W przypadku korzystania z kontrolera powiadomień (patrz MediaSession.getMediaNotificationControllerInfo()) błąd niestandardowy jest używany do aktualizowania PlaybackState sesji platformy do stanu błędu z podanymi informacjami o błędzie (#543).
    • Dodaj MediaSession.Callback.onPlayerInteractionFinished(), aby informować 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()
    • Zmapuj błędy krytyczne i niekrytyczne na sesję platformy i z niej. PlaybackException jest mapowany na stan błędu krytycznego w 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 przez poszczególne kontrolery 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).
    • Popraw replikację błędów wywołań funkcji 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 PlayerView, a nie globalnych zastąpień (#1200).
    • Obchodzenie błędu platformy, który powoduje rozciąganie lub przycinanie wideo podczas używania elementu SurfaceView w komponencie AndroidView w wersji interfejsu API 34 (#1237).
  • Pobrane:
    • Upewnij się, że DownloadHelper nie ujawnia nieopublikowanych instancji Renderer, co może doprowadzić do awarii aplikacji przy użyciu IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Rozszerzenie Cronet:
    • Napraw SocketTimeoutExceptionCronetDataSource. W niektórych wersjach Cronet żądanie przekazywane przez funkcję wywołania zwrotnego nie jest zawsze takie samo. Spowoduje to, że wywołanie zwrotne nie zostanie ukończone i przekroczy limit czasu żądania (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).
    • Naprawiono błąd, który powodował, że włączenie CMCD dla HLS z segmentami inicjowania powodowało błąd 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).
    • Dodaj 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:
    • Zaimplementuj onInit() i onRelease() w 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 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. Użyj w zamian zasady CronetDataSource.Factory.
    • Usuń niektóre konstruktory DataSpec. Użyj w zamian zasady 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 OkHttpDataSource i OkHttpDataSourceFactory. Zamiast tego użyj pola OkHttpDataSource.Factory.
    • Usuń PlayerMessage.setHandler(Handler). Użyj w zamian zasady setLooper(Looper).
    • Usuń pole Timeline.Window.isLive. Zamiast tego użyj metody isLive().
    • Usuń konstruktory DefaultHttpDataSource. Użyj 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 pola MediaCodecInfo.canReuseCodec(Format, Format).
    • Usuń metody płatności DrmSessionManager.DUMMYgetDummyDrmSessionManager(). Użyj w zamian zasady DrmSessionManager.DRM_UNSUPPORTED.
    • Usuń: AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). Zamiast tego użyj przeciążeń, które przyjmują argument DecoderReuseEvaluation.
    • Usuń stałe RendererSupport.FormatSupport i FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE i 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. Wywołujący powinni w przypadku każdego typu używać metod Bundle toBundle() i static Foo fromBundle(Bundle).

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 zatwierdzenia.

  • 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 po ponownym załadowaniu.
    • Zastosuj właściwą wartość TrackSelectionResult do okresu odtwarzania przy ponownym wyborze utworu.
    • 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 wyjątku zgłoszonego, ponieważ MediaMuxer nie obsługuje wykluczających sygnatur czasowych prezentacji przed interfejsem API 30.
  • 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 plik Format.averageBitrate z ramek metadanych, takich jak XING i VBRI.
    • MPEG-TS: cofnięcie zmiany, która miała zagwarantować wyrenderowanie ostatniej klatki, przez przekazanie ostatniej jednostki dostępu strumienia do kolejki próbek (#7909). Wynika to ze zmiany, która powoduje nowe problemy ze strumieniami HLS (#1150) i H.262 HLS (#1126) tylko ze strumieniami I-Frame.
  • Dźwięk:
    • Zezwalaj na przywracanie mechanizmu renderowania przez wyłączenie funkcji odciążania, jeśli nie uda się zainicjować ścieżki audio w trybie odciążania.
  • 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 pierwsza klatka będzie zawsze renderowana podczas tunelowania, nawet jeśli urządzenie nie zrobi tego automatycznie zgodnie z wymaganiami interfejsu API (#1169). (#966).
    • Rozwiązanie problemu, który polegał na tym, że obsługa informacji o kolorach HDR powoduje nieprawidłowe działanie kodeka i uniemożliwia przełączanie formatu adaptacyjnego ś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);
  • Efekt:
    • 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).
  • Interfejs:
    • Jeśli Locale nie może zidentyfikować wyświetlanej nazwy, dodaj nazwę języka ścieżki audio (#988).
  • Rozszerzenie DASH:
    • Wypełnij wszystkie elementy Label z pliku manifestu w Format.labels (#1054).
  • Rozszerzenie RTSP:
    • Pomiń puste wartości informacji o sesji (i-tagi) podczas analizy SDP (#1087).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Domyślnie wyłącz rozszerzenie MIDI jako zależność lokalną, ponieważ wymaga ono skonfigurowania dodatkowego repozytorium Maven. Użytkownicy, którzy potrzebują tego modułu z lokalnej zależności, mogą go ponownie włączyć.

Wersja 1.3.0

6 marca 2024 roku

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 artworkUri i artworkData w polu MediaMetadata.Builder.populate(MediaMetadata), gdy co najmniej 1 z nich ma wartość inną niż null (#964).
  • ExoPlayer:
    • Dodaj PreloadMediaSourcePreloadMediaPeriod, które umożliwiają aplikacjom wstępne wczytanie ź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ęp wstępnego wczytywania, implementując polecenie PreloadMediaSource.PreloadControl i ustawiając wstępnie wczytywane źródło do odtwarzacza, aby można było je odtwarzać.
    • Dodaj zasadę ExoPlayer.setImageOutput, która zezwala aplikacjom na konfigurowanie ustawień 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).
    • Dodano eksperymentalną obsługę analizy 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 (HttpDataSource) za pomocą interfejsu API HttpEngine.
    • Zapobiegaj podklasyfikowaniu 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ń nazwy metod experimentalSetSubtitleParserFactory na BundledChunkExtractor.Factory i DefaultHlsExtractorFactory na setSubtitleParserFactory i zablokuj przekazywanie danych null. Używaj nowych metod experimentalParseSubtitlesDuringExtraction(boolean) do kontrolowania działania analizy.
    • Dodano obsługę dostosowywania SubtitleParser.Factory używanego podczas ekstrakcji. Umożliwia to 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).
  • Transformer:
    • Dodano obsługę spłaszczania filmów w zwolnionym tempie w formacie H.265/HEVC SEF.
    • Zwiększ szybkość transmuksowania, zwłaszcza przy usuwaniu zmian za pomocą polecenia „usuń film”.
    • 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).
    • Dodanie obsługi optymalizacji operacji przycinania w formacie MP4 pojedynczego zasobu.
    • Dodaj obsługę, aby klatka wideo miała w pliku wyjściowym pierwszą sygnaturę czasową. Naprawiono problem z plikami wyjściowymi zaczynającymi się od czarnego kadru w odtwarzaczach na iOS (#829).
  • Wybór utworu:
    • Aby umożliwić wybór ścieżki obrazów, dodaj DefaultTrackSelector.selectImageTrack.
    • 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.
  • Moduły wyodrębniania danych:
    • 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 CBR nagłówkowi Xing). 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:
    • Napraw 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: ignoruj 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 odpowiedniej rozszerzenia pliku nie mogą być odtwarzane.
  • Sesja:
    • Wyłącz wykrywanie dwukrotnego kliknięcia w aplikacjach TV (#962).
    • Rozwiązanie problemu polegającego na tym, że między kontrolerami multimediów a sesjami obiekt MediaItem.RequestMetadata z tylko niepustymi dodatkami nie jest przesyłany.
    • Dodaj do MediaLibrarySession.Builder konstruktor, który wymaga tylko Context zamiast MediaLibraryService.
  • Rozszerzenie HLS:
    • Zmniejsz widoczność HlsMediaPeriod do widoczności prywatnej pakietu. Ten typ nie powinien być bezpośrednio zależny od pakietu HLS.
    • Rozwiązanie skuteczniej przeszukuje początek segmentu (#1031).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Dekoder MIDI: ignoruj komunikaty o zdarzeniach 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 krótki moduł demonstracyjny, aby zaprezentować zastosowanie PreloadMediaSource w przypadku użycia krótkich treści.

Wersja 1.3.0-rc01

22 lutego 2024 r.

Użyj wersji stabilnej 1.3.0.

Wersja 1.3.0-beta01

7 lutego 2024 r.

Użyj wersji stabilnej 1.3.0.

Wersja 1.3.0-alpha01

15 stycznia 2024 r.

Użyj wersji stabilnej 1.3.0.

Wersja 1.2.0

Wersja 1.2.1

9 stycznia 2024 r.

  • ExoPlayer:
    • Rozwiązaliśmy problem, w którym ręczne przewijanie poza zakres LiveConfiguration.min/maxOffset powodowało przesunięcie z powrotem do min/maxOffset.
    • Rozwiązanie problemu polegającego 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ąż problem, który powodował, że koder wydłużył czas konfiguracji z powodu ustawienia wysokiej szybkości działania.
  • Moduły wyodrębniania danych:
    • Oznacz dodatkowe (nieodtwarzane) ścieżki HEVC w zdjęciach ruchomych JPEG jako ROLE_FLAG_ALTERNATE, aby uniemożliwić ich automatyczne odtwarzanie 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:
    • Naprawa obsługi EOS w przypadku funkcji SilenceSkippingAudioProcessor w przypadku wielokrotnego wywoływania (#712).
  • Film:
    • Dodaj obejście problemu z urządzeniem na urządzeniach Galaxy Tab S7 FE, Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC 60 kl./s są oznaczane jako nieobsługiwane (#693).
  • Metadane:
    • Naprawiono błąd, 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 dotyczącego nieprawidłowego adresu 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).
    • Napraw ERROR_DRM_SESSION_NOT_OPENED, jeśli przełączasz się z zaszyfrowanej na oczyszczoną treść bez przymocowanej powierzchni 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).
    • Naprawiono błąd, który powodował, że ustawienie ujemnego czasu w przypadku wyłączonego minutnika setWhen powiadomienia powodowało awarię na niektórych urządzeniach (#903).
    • Naprawiono błąd IllegalStateException, gdy kontroler powiadomienia o multimediach nie ukończy połączenia po żądaniu aktualizacji pierwszego powiadomienia (#917).
  • UI:
    • Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu i do tyłu nie są widoczne podczas korzystania z BottomSheetDialogFragment w ramach Material Design (#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).
    • Przeprowadź migrację do FFmpeg 6.0 i zaktualizuj obsługiwaną wersję 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ą Logger.appendThrowableString(String, Throwable)).
    • Rozwiązanie problemu ze zgodnością z Kotlin, w którym ogólne parametry typu ogólne i elementy tablicy z możliwością wartości null nie są wykrywane jako dopuszczające wartości null. 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 blokowanie odtwarzania na nieodpowiednich urządzeniach wyjściowych audio (np. wbudowanym głośniku na urządzeniach z Wear OS), gdy ta funkcja jest włączona w 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 MediaSource.canUpdateMediaItem i MediaSource.updateMediaItem, aby zaakceptować aktualizacje typu MediaItem po utworzeniu w 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 zastąpiona metodą SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo zawiera dodatkowe parametry, w tym playbackSpeed i lastRebufferRealtimeMs oprócz obecnych playbackPositionUs.
    • Ulepsz metodę ChunkSource.getNextChunk(long, long, List, ChunkHolder) w interfejsie ChunkSource do wersji 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.
  • Transformer:
    • 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 niego używaj elementu Composition.HdrMode i powiązanych z nim stałych.
    • Uprość OverlaySettings, aby rozwiązać problemy z rotacją.
    • Zmieniono parametry frameRatedurationUs w kampanii SampleConsumer.queueInputBitmap na TimestampIterator.
  • Wybór ścieżki:
    • 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: upewnij się, że ostatnia klatka została wyrenderowana, przekazując ostatnią jednostkę dostępu strumienia do kolejki przykładowej (#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 w czasie działania do szczegółów implementacji obiektu Extractor, musisz najpierw wywołać 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 ujściu na ujściu 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 wybrana ścieżka to pojedyncza ścieżka audio, przenoszenie danych audio zostanie włączone.
    • Jeśli audioOffloadModePreference ma wartość AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, DefaultTrackSelector wybiera ścieżkę audio tylko wtedy, gdy jej format jest obsługiwany przy odciążaniu. Jeśli przy odciążaniu 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 odzyskanie przez renderowanie przez wyłączenie przesyłania, jeśli nie udało się podczas pierwszego zapisu (#627).
    • Domyślnie włącz harmonogram przenoszenia danych na potrzeby odtwarzania tylko dźwięku.
    • Usuń ExoPlayer.experimentalSetOffloadSchedulingEnabledAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Zmieniono nazwę onExperimentalSleepingForOffloadChanged na onSleepingForOffloadChanged, a onExperimentalOffloadedPlayback na onOffloadedPlayback.
    • Przenieś powiązane interfejsy i definicje TrackSelectionParameters związane z trybem odciążania dźwięku do wewnętrznej klasy AudioOffloadPreferences.
    • Dodaj wywołania zwrotne onAudioTrackInitializedonAudioTrackReleased do funkcji AnalyticsListener, AudioRendererEventListenerAudioSink.Listener.
    • Rozwiąż problem z niedostatecznym przepływem w buforze audio DTS Express (#650).
    • Naprawiono błąd polegający na tym, że sprawdzanie możliwości E-AC3-JOC powoduje wyświetlenie błędu IllegalArgumentException(#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 przykładów „tylko dekodowanie”, ponieważ implementacja i tak musi zwracać wartość 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 polegający na tym, że wyjątkowa transmisja DASH z wieloma przedziałami czasu, która nie jest pierwszym elementem playlisty, (#571).
    • Zanim wywołasz funkcję AdsLoader.destroy(), zwolnij StreamManagera
    • Zaktualizuj pakiet IMA SDK do wersji 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. Dzięki temu kontroler wywołujący jest zawsze kontrolerem powiadomień o multimediach, a aplikacje mogą w taki sam sposób rozpoznawać wywołania pochodzące z powiadomień w taki sam sposób na wszystkich obsługiwanych poziomach interfejsu API.
    • Usunęliśmy błąd, który powodował, że MediaController.getCurrentPosition() nie przewija 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ę uda, subskrypcja zostanie zaakceptowana, a funkcja notifyChildrenChanged() zostanie natychmiast wywołana z informacją o przeglądarce (#561).
    • Dodaj moduł demonstracyjny sesji dla systemu operacyjnego Automotive i włącz demonstrację sesji dla Androida Auto.
    • Nie ustawiaj kolejki sesji platformy, gdy interfejs COMMAND_GET_TIMELINE jest niedostępny dla kontrolera powiadomień o multimediach. Gdy Android Auto jest kontrolerem klienta odczytującym dane z sesji platformy, przycisk queue w interfejsie Androida Auto nie jest wyświetlany (#339).
    • Domyślnie używaj parametru DataSourceBitmapLoader zamiast 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 systemowe, 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:
    • Zezwalaj na wiele 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 keep-alive RTSP (#662).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Zwolnij 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. Artefakt został przemianowany 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:
    • Zadbaj o to, aby TestExoPlayerBuilder i FakeClock były zgodne z testami interfejsu Espresso oraz testami interfejsu Compose. Usunęliśmy błąd polegający na tym, że podczas interakcji w widoku Espresso lub Composer odtwarzanie przesuwało się w sposób niedeterministyczny.
  • 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.

  • Wspólna biblioteka:
    • Usuń ze wszystkich modułów przypadkowo dodaną zależność multidex (#499).
  • ExoPlayer:
    • Rozwiązaliśmy problem w PlaybackStatsListener, w którym po wyczyszczeniu playlisty tworzone są fałszywe PlaybackStats.
    • Dodaj do logowania danych Common Media Client Data (CMCD) dodatkowe pola: format strumieniowania (sf), typ strumienia (st), wersja (v), górna szybkość transmisji bitów (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 w celu odtwarzania Opusa w trybie offloaded 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 widoczny tekst. 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:
    • Zmień wersję pakietu IMA SDK na 3.30.3.
  • Sesja:
    • Dodaj układ niestandardowy do stanu kontrolera i udostępnij obiekt pobierający, aby uzyskać do niego dostęp. 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 przyczynę wstrzymania w przypadku nieodpowiedniej trasy audio i odtwarzaj, gdy gotowy powód zmiany jest zbyt długi. (#15).
    • Dodaj polecenia do odtwarzacza:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Dodaj do 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 atrybut FilteringMediaSource, który umożliwia filtrowanie dostępnych typów ścieżek z MediaSource.
    • Dodano obsługę uwzględniania danych Common Media Client Data (CMCD) w żądaniach wychodzących adaptacyjnych formatów strumieniowania DASH, HLS i SmoothStreaming. Pola br, bl, cid, rtp i sid zostały uwzględnione (#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 je odfiltrować, użyj opcji zastąpienia CmcdConfiguration.RequestConfig.isKeyAllowed(String key).
      • Zastąp CmcdConfiguration.RequestConfig.getCustomData(), aby włączyć logowanie kluczy niestandardowych.
    • 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 zmienia sygnatury 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ę ramek 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ąż problem, który polegał na tym, że funkcja TimestampAdjuster inicjuje nieprawidłową przesunięcie sygnatury czasowej z czasem próbki metadanych z atomu emsg (#356).
  • Dźwięk:
    • Naprawiono błąd, który powodował, że niektóre odtwarzania nie działały, gdy tunelowanie było włączone, a AudioProcessors były aktywne, np. w przypadku przycinania bez przerw (#10847).
    • Umieszczaj ramki Opus w pakietach Ogg podczas odtwarzania bezpośredniego (odciążania).
    • ekstrapolowanie bieżącej pozycji podczas uśpienia za pomocą harmonogramu przenoszenia;
    • Dodaj Renderer.release()AudioSink.release(), aby uwolnić zasoby na końcu cyklu życia odtwarzacza.
    • Posłuchaj zmian funkcji audio w usłudze 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ść parametru 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:
    • Ogranicz widoczność kilku metod przeznaczonych tylko do użytku wewnętrznego w DefaultDrmSession, których nie należy wywoływać spoza pakietu DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Dodaj nową bibliotekę muxera, która może służyć 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 wdrażanie wznawiania odtwarzania ze zdarzeniami dotyczącymi przycisku multimediów wysyłanymi na przykład przez zestaw słuchawkowy Bluetooth (#167).
    • Dodaj domyślną implementację do MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądań MediaItems do Player, jeśli mają one LocalConfiguration (np. identyfikator 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 (#410).
    • Dodaj domyślną implementację do MediaSession.Callback.onAddMediaItems, aby umożliwić przekazywanie żądań MediaItems do Player, jeśli mają one LocalConfiguration (np. identyfikator 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 (#410).
  • UI:
    • Dodaj metody Util shouldShowPlayButton i handlePlayPauseButtonAction, aby pisać niestandardowe elementy interfejsu z przyciskiem odtwarzania/pauzowania.
  • Rozszerzenie RTSP:
    • W przypadku MPEG4-LATM należy użyć domyślnej wartości identyfikatora na poziomie profilu, jeśli nie podano jej w opisie wiadomości 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 przedziałami czasu.
    • 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 inicjowanie nie zakończy się przed upływem czasu oczekiwania, generowany jest żądanie PlaybackException, aby uniknąć niekończącego się procesu 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ń wycofane symbole:
    • Usuń konstruktory DefaultAudioSink, zamiast nich użyj DefaultAudioSink.Builder.
    • Usuń kolumnę HlsMasterPlaylist. Zamiast niej użyj zasady HlsMultivariantPlaylist.
    • Usuń Player.stop(boolean). Zamiast nich użyj właściwości Player.stop() i Player.clearMediaItems() (jeśli reset to 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, zamiast nich użyj DefaultDrmSessionManager.Builder.
    • Usuń 2 nieaktualne konstruktory HttpDataSource.InvalidResponseCodeException. Użyj konstruktora, który nie jest nieaktualny 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ń przestarzałe metody createVideoSampleFormat, createAudioSampleFormat, createContainerFormat i createSampleFormat, które były używane do tworzenia instancji klasy Format. Zamiast tego do tworzenia instancji Format użyj Format.Builder.
    • 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 użyj zamiast niego 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 użyj zamiast niego konstruktora OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń 4 wycofane 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 właściwości onAudioDisabled lub onVideoDisabled.
    • Usuń wycofane polecenia Player.Listener.onSeekProcessedAnalyticsListener.onSeekProcessed. Zamiast nich używaj polecenia onPositionDiscontinuity z opcją DISCONTINUITY_REASON_SEEK.
    • Usuń polecenie ExoPlayer.setHandleWakeLock(boolean) i użyj zamiast niego polecenia setWakeMode(int).
    • Usuń wycofany atrybut DefaultLoadControl.Builder.createDefaultLoadControl(), zamiast niego użyj zasady 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.

Od wersji 1.0.1 w tej wersji wprowadzono te zmiany:

  • Podstawowa biblioteka:
    • 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).
  • Moduły wyodrębniania danych:
    • Napraw analizę składni H.265 SPS w plikach MPEG-TS, ponownie korzystając z logiki analizy używanej już przez moduły wyodrębniania 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.

  • Podstawowa biblioteka:
    • 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ć zablokowanie odtwarzania.
  • Sesja:
    • Naprawiliśmy błąd polegający na tym, że wiele identycznych elementów kolejki opublikowanych przez starszy program 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 wysłane z interfejsu MediaController są ignorowane, jeśli odwołują się do grupy 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ązano problem, który powodował awarie instancji MediaSession na wątku tle podczas używania w funkcji 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 błędem 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.

Usługa androidx.media3:media3-*:1.0.0-rc02 została zwolniona. Wersja 1.0.0-rc02 zawiera te zatwierdzenia.

Ta wersja odpowiada wersji ExoPlayer 2.18.4.

  • Podstawowa biblioteka:
    • Naprawiono wykrywanie typu sieci w poziomie API 33 (#10970).
    • Popraw NullPointerException podczas wywoływania numeru ExoPlayer.isTunnelingEnabled (#10977).
  • Pobrane:
    • Zastosuj maksymalną różnicę w czasie rozpoczęcia w przypadku 2 segmentów, które można skonfigurować do scalania w klasach SegmentDownloader i 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:
    • Popraw przejściowe STATE_IDLE podczas przechodzenia między elementami multimedialnymi (#245).
  • RTSP:
    • Przechwyć IllegalArgumentException rzucony podczas analizowania nieprawidłowego RTSP. Opisz komunikaty odpowiedzi (#10971).
  • Sesja:
    • Naprawiono błąd, który powodował, że przycisk odtwarzania/wstrzymywania powiadomienia nie aktualizuje się wraz ze stanem odtwarzacza (#192).
  • Rozszerzenie IMA:
    • Naprawiliśmy błąd, który uniemożliwiał uruchomienie strumieni z dynamicznym wstawianiem reklam bez reklam, ponieważ nie odebrano pierwszego (i w przypadku bez reklam jedynego) zdarzenia 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.

  • Podstawowa biblioteka:
    • 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 czyszczenie pomocniczych 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:
    • Zgłoś ParserException zamiast NullPointerException, jeśli w tabeli przykładowej (STB) 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 napisów nie zawiera żadnych cue.
    • SubRip: dodaj obsługę plików UTF-16, jeśli zaczynają się od znaku 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 wskazać typ treści lub typ folderu opisany przez metadane.
    • Dodaj MediaMetadata.isBrowsable jako zamiennik MediaMetadata.folderType. Ten typ folderu zostanie wycofany w następnej wersji.
  • 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 abstrakcyjny SimpleBasePlayer, aby ułatwić implementację interfejsu Player w odtwarzaczach niestandardowych.
    • Dodaj metodę pomocniczą do konwertowania tokenu sesji platformy na Media3 SessionToken (#171).
    • Użyj polecenia onMediaMetadataChanged, aby aktywować aktualizacje sesji multimediów na platformie (#219).
    • Dodaj sesję multimediów jako argument funkcji getMediaButtons() w DefaultMediaNotificationProvider i użyj list stałych, aby zwiększyć przejrzystość (#216).
    • Dodaj detektor wywołania zwrotnego onSetMediaItems, aby określić sposoby modyfikowania/ustawiania listy MediaItem, początkowy indeks i pozycja według sesji przed ustawieniem dla odtwarzacza (#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 wskazać typ treści lub typ folderu opisany przez metadane.
    • Dodaj MediaMetadata.isBrowsable jako zamiennik MediaMetadata.folderType. W następnej wersji wycofamy ten typ folderu.
  • Rozszerzenie Cast:
    • Zmień wersję pakietu SDK Cast na 21.2.0.
  • Rozszerzenie IMA:
    • Usuń detektor odtwarzacza ImaServerSideAdInsertionMediaSource z wątku aplikacji, aby uniknąć problemów z wątkami.
    • Dodaj do obiektu ImaServerSideAdInsertionMediaSource.AdsLoader.Builder właściwość focusSkipButtonWhenAvailable, aby wskazać, że przycisk pomijania jest ustawiony na telewizorach, i domyślnie ustaw tę wartość na 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ś o przyznanie uprawnień do wysyłania 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ć pakowanie pojedynczego MediaSource (#7279).
    • Wyczyść bufor wsteczny, zanim odtwarzanie się zatrzyma z powodu niewystarczającej ilości dostępnej pamięci.
    • Zamknij blok kodu śledzenia „doSomeWork” po włączeniu przenoszenia.
    • Rozwiąż problem ze śledzeniem sesji z szybkimi przewijaniem w trybie PlaybackStatsListener (#180).
    • Wysyłanie brakującego wywołania zwrotnego onMediaItemTransition podczas wywoływania funkcji seekToNext lub seekToPrevious na playliście z 1 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:
    • Wymuś minimalną wartość compileSdkVersion, aby uniknąć błędów kompilacji (#10684).
    • Unikaj publikowania bloku, gdy jest on uwzględniony w innej kompilacji Gradle.
  • Wybór ścieżki:
    • Preferuj inne ścieżki do Dolby Vision, jeśli wyświetlacz go nie obsługuje. (#8944).
  • Pobrane pliki:
    • Naprawiono potencjalną nieskończoną pętlę w ProgressiveDownloader spowodowaną jednoczesnym pobieraniem i odtwarzaniem tego samego PriorityTaskManager (#10570).
    • Aby powiadomienie o pobieraniu pojawiało się natychmiast (#183).
    • Ogranicz liczbę równoczesnych usuwania plików 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ło metadane, gdy tylko będą dostępne. Utwórz instancję za pomocą parametru MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), aby określić, czy renderowanie ma się odbywać z wczesnym wyprowadzeniem metadanych czy z synchronizacją 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 wartości 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 powiadomień, identyfikator kanału powiadomień i nazwę kanału powiadomień używaną przez dostawcę. Dodaj też metodę DefaultMediaNotificationProvider.setSmallIcon(int), aby ustawić małą ikonę powiadomień. (#104).
    • Sprawdź, czy polecenia wysłane przed MediaController.release() nie są pomijane (#99).
    • SimpleBitmapLoader może wczytywać bitmapy z identyfikatorów URI file:// (#108).
    • Napraw problem, który uniemożliwia usłudze MediaController przewinięcie reklamy w danym okresie (#122).
    • Po zakończeniu odtwarzania element MediaSessionService jest zatrzymywany na pierwszym planie i wyświetla się powiadomienie z prośbą o ponowne rozpoczęcie odtwarzania 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.

  • Podstawowa biblioteka:
    • Upewnij się, że zmiana ShuffleOrder za pomocą ExoPlayer.setShuffleOrder skutkuje wywołaniem Player.Listener#onTimelineChanged z 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 ExoPlayer (#9752).
    • Naprawiono implementację funkcji setDataSourceFactory w funkcji DefaultMediaSourceFactory, która w niektórych przypadkach nie działała (#116).
  • Moduły wyodrębniania danych:
    • 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).
  • Interfejs:
    • 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 metody MediaItem przekazanej do metod playlisty jako Window.mediaItem w CastTimeline (nr 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 zatwierdzenia.

Odpowiada to wersji ExoPlayer 2.18.0.

  • Podstawowa biblioteka:
    • 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).
    • Przestań wykrywać typ 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 przekazywać instancje funkcji DefaultDrmSessionManagerProvider i DefaultLoadErrorHandlingPolicy.
    • Dodaj element MediaItem.RequestMetadata reprezentujący metadane potrzebne do odtwarzania multimediów, gdy dokładna wartość LocalConfiguration nie jest znana. 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 wycofanie nazwy metody Player.Listener.onTracksChanged, ale z użyciem innych typów 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 będzie preferować dźwięk stereo lub mono zamiast formatów dźwięku wielokanałowego, chyba że format wielokanałowy może być przestrzenny (Android 12L+) lub jest formatem dźwięku przestrzennego Dolby. Dodatkowo na urządzeniach obsługujących przestrzenne odtwarzanie dźwięku DefaultTrackSelectorbędzie sprawdzać zmiany w właściwościach Spatializer i uruchamiać wybór nowego utworu. Urządzenia z television trybem interfejsu użytkownika są wykluczone z tych ograniczeń, a preferowany będzie format z największą liczbą kanałów. Aby włączyć tę funkcję, instancja DefaultTrackSelector musi być utworzona za pomocą Context.
  • Film:
    • Zmień nazwę DummySurface na PlaceholderSurface.
    • Dodaj obsługę AV1 do MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Dźwięk:
    • Użyj dekodera audio LG AC3, który reklamuje niestandardowy typ MIME.
    • Zmień typ zwrotu AudioAttributes.getAudioAttributesV21() z android.media.AudioAttributes na nową klasę otoki AudioAttributesV21, aby zapobiec powolnej weryfikacji ART w interfejsie API < 21.
    • Wyślij zapytanie do platformy (API w wersji 29 lub nowszej) lub załóż, że liczba kanałów kodowania audio na potrzeby przekazywania dźwięku jest nieskonfigurowana, gdy liczba kanałów audio nie jest określona, co ma miejsce w przypadku przygotowania bezfragmentowego protokołu 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(), aby zwracała wartość 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.
  • Moduły wyodrębniania danych:
    • 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 useController=false (#9605). Poprawiono też wyświetlanie 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ązaliśmy problem z ułatwieniami dostępu PlayerView, który polegał na tym, że kliknięcie może przełączyć odtwarzanie zamiast ukryć elementy sterujące (#8627).
    • Zmodyfikuj 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 pokazuj wymuszonych ścieżek tekstowych w selektorze ścieżek PlayerView i pozostaw wybraną odpowiednią ścieżkę tekstową, jeśli wybrano opcję „Brak” (#9432).
  • DASH:
    • Przeanalizuj liczbę kanałów z elementów DTS AudioChannelConfiguration. Spowoduje to ponowne włączenie przekazywania dźwięku w strumieniach DTS (#10159).
    • Nie zezwalaj na przekazywanie danych 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 komunikatów null do HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory i HlsMediaSource.Factory.setPlaylistTrackerFactory. Wystąpienia DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory lub odniesienie do DefaultHlsPlaylistTracker.FACTORY mogą być w razie potrzeby przekazywane bezpośrednio.
  • 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 ładunek RTP AMR nie jest obsługiwany. (#46)
    • Dodaj czytnik RTP dla VP8 (#47).
    • Dodaj czytnik RTP na potrzeby WAV (#56).
    • Popraw nagłówek autoryzacji podstawowej RTSP. (#9544).
    • Zatrzymaj sprawdzanie pól SDP, ponieważ ExoPlayer ich nie potrzebuje (#10049).
    • Podczas analizy czasu RTSP (#10165) zgłaszaj wyjątek zaznaczony.
    • 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 problemu z przerwaniem wywołania OkHttp.
  • Sesja:
    • Zastąp MediaSession.MediaItemFiller wartością MediaSession.Callback.onAddMediaItems, aby umożliwić asynchroniczne przetwarzanie żądań.
    • Obsługuj metody setMediaItems(s), gdy MediaController łączy się ze starszą sesją multimediów.
    • 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ć spójność funkcji ze starszą sesją.
    • Zmień nazwę MediaSession.MediaSessionCallback na MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback na MediaLibrarySession.Callback, a MediaSession.Builder.setSessionCallback na setCallback.
    • Naprawić NPE w MediaControllerImplLegacy (#59).
    • Zaktualizuj informacje o pozycji sesji na osi czasu(#51).
    • Napraw NPE w MediaControllerImplBase po zwolnieniu kontrolera (#74).
  • Odtwarzanie reklamy / interaktywnych reklam multimedialnych:
    • 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 wersji 3.21.0+, aby uniknąć błędu CMake, który powodował niepowodzenie synchronizacji narzędzia Gradle w Android Studio (#9933).
  • Usuń symbole wycofane:
    • Usuń Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Użyj w zamian zasady 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. W miarę możliwości używaj parametru getDefaultTrackSelectorParameters(Context), a w przeciwnym razie – DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Usuń konstruktor DefaultTrackSelector(ExoTrackSelection.Factory). Zamiast tego użyj pola 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.

Usługa androidx.media3:media3-*:1.0.0-alpha03 została zwolniona. Wersja 1.0.0-alpha03 zawiera te commity.

Odpowiada ona wersji ExoPlayer 2.17.1.

  • Dźwięk:
    • Usunęliśmy błąd podczas sprawdzania funkcji audio Dolby Atmos (E-AC3-JOC) w HLS.
  • Wyodrębnianie:
    • FMP4: usunięto problem, który powodował, że przykładowe metadane emsg w niewłaściwej kolejności w przypadku strumieni zawierających atomy emsg w wersjach v0 i v1 (#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 nie jest ono ustawione (#10016).
  • Odtwarzanie reklam:
    • Napraw przerwy w odtwarzaniu dźwięku między okresami reklamowymi w transmisjach HLS SSAI na żywo.

Wersja 1.0.0-alpha02

2 marca 2022 r.

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

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ń 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 DefaultHttpDataSource#getResponseHeaders.
    • Uśpienie i ponowienie próby, jeśli nie uda się utworzyć instancji MediaCodec. 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 automatyczną korektę szybkości w przypadku transmisji na żywo, które nie mają funkcji małego opóźnienia ani nie mają ustawienia szybkości na żądanie 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).
    • Zaktualizowano logikę wyboru ścieżki wideo, aby uwzględniać preferowane typy MIME i flagi 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 główne dekodery z akceleracją sprzętową obsługują wiele kodeków (#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 wyborem ścieżki, 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 wyborem utworu, w którym nie można prawidłowo zastąpić zarówno niepustego, jak i pustego utworu (#9649).
    • Zabrania zduplikowanych TrackGroup w ramach TrackGroupArray. Elementy TrackGroup można zawsze odróżnić, ustawiając element 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ń zasady w AdaptiveTrackSelection, aby zapewnić wzrost jakości przy wystarczającej przepustowości sieci nawet wtedy, gdy odtwarzanie odbywa się bardzo blisko brzegu transmisji 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).
  • Moduły wyodrębniania danych:
    • WAV: dodanie obsługi strumieni RF64 (#9543).
    • Poprawka nieprawidłowego parsowania 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 zostanie przekazane do pola Format.id ścieżki z napisami utworzonej na podstawie konfiguracji (#9673).
    • Dodanie podstawowej obsługi 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 / interaktywnych reklam multimedialnych:
    • Dodano obsługę dynamicznego wstawiania reklam IMA (DAI) (#8213).
    • Dodaj do AdPlaybackState metodę, która umożliwi zresetowanie grupy reklam, aby można było ją odtworzyć ponownie (#9615).
    • Egzekwuj szybkość odtwarzania wynoszącą 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 wstecz 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 przeanalizowane podstawowe i dodatkowe właściwości do Representation (#9579).
    • Obsługuj rolę śledzenia forced-subtitle (#9727).
    • Zatrzymaj interpretowanie roli ścieżki main jako C.SELECTION_FLAG_DEFAULT.
    • Poprawiono logikę wykluczania adresów URL podstawowych w przypadku manifestów, 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).
    • Domyślnie używaj przygotowywania bez fragmentów, aby skrócić czas uruchamiania. Jeśli Twoje wypożyczenia zawierają powielone ścieżki napisów, które nie są zadeklarowane na playliście reklamy nadrzędnej, dodaj je do playlisty reklamy nadrzędnej, aby umożliwić odtwarzanie, lub wyłącz przygotowywanie bez fragmentów, korzystając z usługi 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, gdy czas ścieżki 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 muxer throws.
    • Dodaj aplikację w wersji demonstracyjnej do stosowania przekształceń.
  • Rozszerzenie MediaSession:
    • Domyślnie MediaSessionConnector teraz czyści playlistę po zatrzymaniu. Aplikacje, które chcą zachować playlistę, mogą wywoływać setClearMediaItemsOnStop(false) w oprogramowaniu sprzęgającym.
  • Rozszerzenie Cast:
    • Napraw błąd, który uniemożliwiał usłudze CastPlayer prawidłowe wywołanie numeru onIsPlayingChanged (#9792).
    • Obsługa metadanych audio, w tym grafiki z DefaultMediaItemConverter (#9663).
  • Rozszerzenie FFmpeg:
    • Spraw, aby funkcja build_ffmpeg.sh korzystała z narzędzi bin LLVM, a nie GNU (#9933).
  • Zgodność z Androidem 12:
    • Uaktualnij rozszerzenie Cast, by korzystać z interfejsu 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ń wycofane symbole:
    • Usuń Player.EventListener. Zamiast tego użyj pola 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. Użyj w zamian zasady MediaItem.Builder#setTag.
    • Usuń DashMediaSource#setLivePresentationDelayMs(long, boolean). Użyj parametrów MediaItem.Builder#setLiveConfiguration i MediaItem.LiveConfiguration.Builder#setTargetOffsetMs, aby zastąpić instrukcje wyświetlane w pliku manifestu, lub DashMediaSource#setFallbackTargetLiveOffsetMs, aby podać wartość zastępczą.
    • Usuń (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Wycofanie się z przestrzegania zasad dotyczących wątków nie jest już możliwe.
    • Usuń ActionFileActionFileUpgradeUtil. Użyj rozszerzenia ExoPlayer w wersji 2.16.1 lub starszej, aby za pomocą ActionFileUpgradeUtil scalać starsze pliki działań w DefaultDownloadIndex.
    • Usuń ProgressiveMediaSource#setExtractorsFactory. Zamiast tego użyj konstruktora ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • Usuń ProgressiveMediaSource.Factory#setTagProgressiveMediaSource.Factory#setCustomCacheKey. Zamiast niej użyj właściwości 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, w którym znajdziesz biblioteki obsługujące multimedia, w tym ExoPlayer. Pierwsza wersja alfa obejmuje wczesne, funkcjonalne implementacje bibliotek do implementacji 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.
  • Funkcja sesji multimediów, aby pokazać i kontrolować odtwarzanie. 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 na potrzeby ExoPlayera, na przykład wstawianie reklam za pomocą pakietu IMA SDK;

Więcej informacji znajdziesz w projekcie Media3 na GitHubie.

Oprogramowanie ExoPlayer było wcześniej hostowane w oddzielnym projekcie GitHub. 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.