Multimedia3
Biblioteki pomocy na potrzeby przypadków użycia multimediów.
Najnowsza aktualizacja Wersja stabilna Kandydat do wydania Wersja Beta Wydanie alfa
26 czerwca 2024 r. 1.3.1 - 1.4.0-beta01 1.4.0-alfa02

Deklarowanie zależności

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

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

Odlotowy

dependencies {
    def media3_version = "1.3.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"
}

Kotlin

dependencies {
    val media3_version = "1.3.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")
}

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

Opinia

Twoja opinia pomoże nam ulepszyć Jetpack. W narzędziu Media3 Issue tracker możesz znaleźć odpowiedzi na pytania, znane problemy oraz prośby o dodanie funkcji, a także zgłaszać nowe problemy.

Wersja 1.4.0

Wersja 1.4.0-beta01

26 czerwca 2024 r.

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

  • ExoPlayer:
    • Dodaj ExoPlayer.isReleased(), aby sprawdzić, czy usługa Exoplayer.release() została wywołana.
    • Dodaj ExoPlayer.Builder.setMaxSeekToPreviousPositionMs, aby skonfigurować maksymalną pozycję, podczas której seekToPrevious() przeszukuje poprzedni element (#1425).
  • Transformer:
    • Usuń pole ExportResult.processedInputs. Jeśli używasz tego pola do szczegółów kodeka, zamiast niego użyj DefaultDecoderFactory.listener. W przypadku wyjątku kodeka jego szczegóły będą dostępne w interfejsie ExportException.codecInfo.
  • Moduły wyodrębniania danych:
    • Naprawiono wyodrębnianie formatu audio PCM w kontenerach AVI.
  • Obraz:
    • Zezwalaj na używanie null jako parametru parametru ExoPlayer.setImageOutput, aby wyczyścić wcześniej ustawioną wartość ImageOutput.
  • Efekt:
    • Usuń nieużywaną wartość OverlaySettings.useHdr, bo zakres dynamiczny nakładki i klatki musi być taki sam.
    • Dodano obsługę HDR w przypadku zdjęć (TextOverlay). Luminancję nakładki tekstowej można dostosować za pomocą parametru OverlaySettings.setHdrLuminanceMultiplier.
  • Sesja:
    • Dodaj MediaSession.Callback.onPlayerInteractionFinished, by informować sesje o zakończeniu serii interakcji graczy z określonego kontrolera.
    • Dodaj SessionError i użyj go w SessionResult i LibraryResult zamiast kodu błędu, aby w miarę możliwości podać więcej informacji o błędzie i sposobie jego rozwiązania.
    • Opublikuj kod aplikacji testowej kontrolera media3, aby móc testować interakcje z aplikacjami publikującymi sesję multimediów.
    • Rozpowszechniaj dodatki przekazywane do media3 MediaSession[Builder].setSessionExtras() do kontrolera 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. Pole SessionError wysłane do kontrolera powiadomień o multimediach z identyfikatorem MediaSession.sendError(ControllerInfo, SessionError) jest zmapowane na błąd niekrytyczny w PlaybackStateCompat, co oznacza, że ustawiono kod błędu i komunikat o błędzie, ale stan sesji na platformie nie różni się od STATE_ERROR.
  • Interfejs:
    • Dodaj obsługę wyświetlania obrazów do PlayerView po podłączeniu urządzenia ExoPlayer (#1144).
    • Dodaj dostosowanie różnych ikon w PlayerControlView za pomocą atrybutów XML, aby umożliwić różne elementy rysowane w poszczególnych instancjach PlayerView zamiast globalnych zastąpień (#1200).
  • Rozszerzenie HLS:
    • Naprawiono błąd polegający na tym, że playlisty odtwarzane poza główną funkcją odtwarzania nie są odświeżane podczas odtwarzania na żywo (#1240).
  • Usuń wycofane symbole:
    • Usuń interfejs Bundleable. Obejmuje to usunięcie wszystkich Bundleable.Creator<Foo> CREATOR pól stałych. Wywołujący powinni w przypadku każdego typu używać metod Bundle toBundle() i static Foo fromBundle(Bundle).

Wersja 1.4.0-alpha02

7 czerwca 2024 r.

Usługa androidx.media3:media3-*:1.4.0-alpha02 została zwolniona. Wersja 1.4.0-alfa02 zawiera te zatwierdzenia.

  • Wspólna biblioteka:
    • Przekierowuje wywołania przewijania uznawane za brak działań do chronionych metod BasePlayer.seekTo i SimpleBasePlayer.handleSeek, zamiast je ignorować. Jeśli implementujesz te metody w odtwarzaczu niestandardowym, być może trzeba będzie obsługiwać te dodatkowe wywołania za pomocą funkcji mediaItemIndex == C.INDEX_UNSET.
    • Usuń zależność kompilacji z ulepszonego usuwania szumu w języku Java 8 (#1312).
    • Upewnij się, że czas przekazywany do MediaItem.Builder.setImageDurationMs jest ignorowany w przypadku właściwości MediaItem, które nie są obrazami (zgodnie z opisem).
  • ExoPlayer:
    • Dodaj reset do BasePreloadManager, aby zwolnić wszystkie źródła wstrzymania, zachowując instancję menedżera wstępnego wczytywania.
    • Dodaj ExoPlayer.setPriority (oraz Builder.setPriority), aby określić wartość priorytetu używaną w PriorityTaskManager i na potrzeby znaczenia MediaCodec z interfejsu API 35.
    • Rozwiązaliśmy problem z aktualizowaniem czasu ostatniego ponownego buforowania, który powodował, że klucz bs (wytwarzanie bufora) w CMCD (#1124) był nieprawidłowy.
    • Dodaj PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource), aby wskazać, że źródło zostało wczytane do końca. Dzięki temu implementacje DefaultPreloadManager i niestandardowe PreloadMediaSource.PreloadControl mogą wstępnie wczytywać następne źródło lub wykonywać inne działania.
    • Naprawiono błąd polegający na tym, że pomijanie elementów na końcu wyciszenia może wywoływać wyjątek odtwarzania.
    • Dodaj clear do PreloadMediaSource, aby odrzucić okres wstępnego wczytywania.
    • Dodaj nowy kod błędu PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, który jest używany w przypadku odzyskiwania zasobów kodeka na potrzeby zadań o wyższym priorytecie.
    • Pozwól funkcji AdsMediaSource wczytywać reklamy przed filmem, zanim zakończy się wstępne przygotowanie treści multimedialnych (#1358).
    • Naprawiono błąd polegający na tym, że podczas ponownego przygotowywania wielookresowej transmisji na żywo DASH z wcześniejszym okresem usunięcia z pliku manifestu ponownie odtwarzanie było przenoszone do STATE_ENDED.
    • Zmień nazwę onTimelineRefreshed na onSourcePrepared, a onPrepared na onTracksSelected w PreloadMediaSource.PreloadControl. Możesz też odpowiednio zmienić nazwy IntDefs w elemencie DefaultPreloadManager.Stage.
    • Dodaj eksperymentalną obsługę harmonogramu dynamicznego, aby lepiej dostosować pracę do cykli wybudzania procesora i opóźnić pobudkę do momentu, w którym mechanizmy renderowania mogą zacząć korzystać z pomiaru. Możesz to włączyć za pomocą experimentalSetDynamicSchedulingEnabled podczas konfigurowania instancji ExoPlayer.
    • Dodaj Renderer.getDurationToProgressMs. Renderer może zaimplementować tę metodę, aby zwracać do ExoPlayer czas, jaki musi upłynąć od odtwarzania, aby mechanizm renderowania mógł przejść dalej. Jeśli ExoPlayer jest ustawiony za pomocą experimentalSetDynamicSchedulingEnabled, ExoPlayer wywołuje tę metodę podczas obliczania czasu na zaplanowanie zadania roboczego.
    • Dodaj MediaCodecAdapter#OnBufferAvailableListener, aby otrzymywać alerty, gdy MediaCodecRenderer ma dostęp do buforów danych wejściowych i wyjściowych. Po otrzymaniu tych wywołań zwrotnych MediaCodecRenderer zasygnalizuje ExoPlayer, a jeśli zasada ExoPlayer jest ustawiona za pomocą parametru experimentalSetDynamicSchedulingEnabled, ExoPlayer zaplanuje pętlę roboczą w miarę postępów mechanizmów renderowania.
    • Używaj klasy danych w metodach LoadControl zamiast poszczególnych parametrów.
  • Transformer:
    • Rozwiązanie problemu z dekoderem, który polegał na tym, że podczas obsługi wejścia PCM liczba kanałów audio była ograniczona do stereo.
    • Wybierając ścieżki w usłudze ExoPlayerAssetLoader, zignoruj ograniczenia liczby kanałów audio, ponieważ mają zastosowanie tylko do odtwarzania.
    • Zastąp interfejs androidx.media3.transformer.Muxer elementem androidx.media3.muxer.Muxer i usuń androidx.media3.transformer.Muxer.
    • Napraw ładowanie obrazów HEIC ze schematów identyfikatora URI treści. (#1373).
    • Dostosuj czas trwania ścieżki audio w AudioGraphInput, aby poprawić synchronizację dźwięku z obrazem.
  • Moduły wyodrębniania danych:
    • MPEG-TS: wycofuj zmianę tak, aby renderowała ostatnią klatkę, przekazując ostatnią jednostkę dostępu strumienia do kolejki próbek (#7909). Wprowadzenie poprawek mających na celu rozwiązanie problemów, które pojawiły się tylko w strumieniach HLS(#1150) i H.262 HLS (#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). Dzięki temu dane zwiastunów, których nie można odtworzyć (np. okładki albumu) nie będą uwzględniane w obliczeniach o stałej szybkości transmisji bitów, co zwiększy 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).
  • Dźwięk:
    • Naprawiono atrybuty kodowania DTS:X profilu 2 na potrzeby odtwarzania przekazującego (#1299).
    • W przypadku odtwarzania bez wczytywania zresetuj pole śledzenia zakończenia strumienia w DefaultAudioSink przed wywołaniem funkcji AudioTrack.stop(). Dzięki temu AudioTrack.StreamEventCallback#onPresentationEnded będzie prawidłowo identyfikował się z odtworzeniem wszystkich oczekujących danych.
    • Naprawiono błąd w SilenceSkippingAudioProcessor, który powodował, że przejścia między różnymi formatami audio (np. stereo na mono) mogły spowodować zgłoszenie wyjątku (#1352).
    • Zaimplementuj MediaCodecAudioRenderer.getDurationToProgressUs, by ExoPlayer dynamicznie zaplanował, kiedy główna pętla pracy może wykonać MediaCodecAudioRenderer.
  • Film:
    • Napraw logikę awaryjny dekodera dla Dolby Vision, by w razie potrzeby używać zgodnego dekodera AV1 (#1389).
  • Tekst:
    • Rozwiązanie problemu polegającego na tym, że napisy rozpoczynające się przed pozycją przewijania są pomijane. Ten problem został wprowadzony tylko w Media3 w wersji 1.4.0-alfa01.
    • Zmień domyślny sposób analizy napisów, tak aby odbywał się 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). Informacje o tym, jak umieścić te komponenty w instancji ExoPlayer, znajdziesz w dokumentacji dotyczącej dostosowywania. Te metody (oraz cała obsługa dekodowania starszych napisów) zostaną usunięte w przyszłej wersji.
      • Aplikacje z niestandardową implementacją SubtitleDecoder muszą zaktualizować je tak, aby zamiast SubtitleDecoderFactory implementowały one zasadę SubtitleParser (i 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: ignoruj wartość rowLock. Specyfikacja CEA-708-E S-2023 stanowi, ż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).
      • Ta zmiana była pierwotnie uwzględniona w informacjach o wersji 1.3.0-alpha01, ale została przypadkowo cofnięta przed wersją 1.3.0-rc01. Problem został już rozwiązany, więc zmiana jest już wprowadzona.
    • CEA-708: unikaj dodawania powielonych wierszy do nowego wiersza przez następne działanie polecenia „set pen location” (ustaw lokalizację rysika) przez ExoPlayer (#1315).
  • Metadane:
    • Popraw mapowanie tagów sortowania MP4 na identyfikatory ID3. Wcześniej tagi MP4 „sortowanie albumu” (soal), „sortowanie według wykonawcy” (soar) i „sortowanie według wykonawcy albumu” (soaa) były niewłaściwie zmapowane na tagi TSO2, TSOA i TSOP ID3 (#1302).
    • Poprawiono odczyt liczbowych tagów gnre (genre) i tmpo (tempo) MP4 (/iTunes), gdy wartość ma więcej niż 1 bajt.
    • Propaguj ramkę TCON o identyfikatorze 3 do MediaMetadata.genre(#1305).
  • Obraz:
    • Dodano obsługę niekwadratowych siatek miniatur DASH (#1300).
    • Dodano obsługę AVIF w przypadku interfejsu API w wersji 34 lub nowszej.
  • Źródło danych:
    • 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 LoadErrorHandlingPolicy w DefaultDrmSessionManagerProvider(#1271).
  • Efekt:
    • Naprawiono błąd, który powodował awarię TimestampWrapper podczas używania z ExoPlayer#setVideoEffects (#821).
    • Zmień domyślny obszar roboczy koloru SDR z kolorów liniowych na elektryczny film SDR BT 709. Udostępnij też trzecią opcję zachowania oryginalnej przestrzeni kolorów.
    • Zezwalaj na definiowanie nieokreślonej kolejności elementów EditedMediaItemSequences (#1055).
    • Utrzymuj stały zakres luminancji dla różnych fragmentów treści HDR (korzysta z zakresu HLG).
    • Dodaliśmy obsługę nakładek Ultra HDR (bitmapy) w przypadku treści HDR.
    • Zezwalaj na używanie efektów SeparableConvolution przed interfejsem API 26.
  • Rozszerzenie IMA:
    • Zmień interfejs API, który jest wymagany, aby aplikacje odtwarzały strumienie reklam w ramach DAI do wersji stabilnej.
    • Dodanie parametru replaceAdTagParameters(Map <String, String>) do tagu ImaServerSideAdInsertionMediaSource.AdLoader umożliwia zastępowanie parametrów tagu reklamy w czasie działania.
    • Naprawiono błąd, który powodował, że podczas odtwarzania reklamy nie był wywoływane wywołanie VideoAdPlayer.VideoAdPlayerCallback.onError (#1334).
    • Zmień wersję pakietu IMA SDK na 3.33.0, aby naprawić błąd NullPointerException, gdy używasz identyfikatorów URI tagu reklamy data:// (#700).
  • Sesja:
    • Ukryj pasek przewijania w powiadomieniu o multimediach w transmisjach na żywo, nie ustawiając czasu trwania w metadanych sesji platformy (#1256).
    • Dopasuj konwersję wartości MediaMetadata na MediaDescriptionCompat, aby podczas wybierania właściwości metadanych używać tej samej preferowanej kolejności i tej samej logiki co w przypadku media1.
    • Dodaj identyfikator 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 służy do zaktualizowania elementu PlaybackState sesji platformy do stanu błędu z podanymi informacjami o błędzie (#543).
  • Rozszerzenie Cronet:
    • Napraw problem SocketTimeoutException w: CronetDataSource. W niektórych wersjach Cronet żądanie przekazane przez wywołanie zwrotne nie zawsze jest 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 polegający na tym, że oczekujące próbki EMSG oczekujące na nieciągłość zostały przekazane w polu HlsSampleStreamWrapper z nieprawidłowym przesunięciem powodującym błąd IndexOutOfBoundsException lub IllegalArgumentException (#1002).
    • Naprawiono błąd polegający na tym, że w przypadku strumieni LL-HLS ciągle ładują się ponownie playlisty inne niż podstawowa (#1240).
    • Naprawiono błąd, który powodował, że włączenie CMCD dla HLS z segmentami inicjowania skutkowało wywołaniem Source Error i IllegalArgumentException.
  • Rozszerzenie DASH:
    • Naprawiono błąd, który powodował, że ponowne przygotowanie transmisji na żywo obejmującej kilka okresów może powodować wyświetlenie błędu IndexOutOfBoundsException(#1329).
    • Dodaj obsługę adresów URL licencji dashif:Laurl (#1345).
  • Rozszerzenie Cast:
    • Naprawiono błąd polegający na przekształceniu tytułu albumu MediaQueueItem na wykonawcę w elemencie multimedialnym3 (#1255).
  • Aplikacja w wersji demonstracyjnej
    • Zezwalaj na ustawianie trybu powtarzania za pomocą argumentów Intent z wiersza poleceń (#1266).
  • Usuń wycofane symbole:
    • Usuń metodę setContentTypePredicate(Predicate) z metod DefaultHttpDataSource, OkHttpDataSource i CronetDataSource. Użyj tej samej metody w każdym elemencie XXXDataSource.Factory.
    • Usuń konstruktory OkHttpDataSource i OkHttpDataSourceFactory. Użyj w zamian zasady OkHttpDataSource.Factory.
    • Usuń PlayerMessage.setHandler(Handler). Użyj w zamian zasady setLooper(Looper).
    • Usuń pole Timeline.Window.isLive. Zamiast tego użyj metody isLive().
    • Usuń konstruktory DefaultHttpDataSource. Użyj DefaultHttpDataSource.Factory.
    • Usuń DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Użyj DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS.
    • Usuń MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Użyj w zamian zasady MediaCodecInfo.canReuseCodec(Format, Format).
    • Usuń metody DrmSessionManager.DUMMY i getDummyDrmSessionManager(). Użyj w zamian zasady DrmSessionManager.DRM_UNSUPPORTED.
    • Usuń AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). Użyj przeciążeń, które zajmują DecoderReuseEvaluation.
    • Usuń stałe RendererSupport.FormatSupport i FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE i FORMAT_UNSUPPORTED_TYPE. Użyj równoważnej wartości IntDef i stałych w elemencie androidx.media3.common.C (np. C.FORMAT_HANDLED).

Wersja 1.4.0-alpha01

17 kwietnia 2024 r.

Usługa androidx.media3:media3-*:1.4.0-alpha01 została zwolniona. Wersja 1.4.0-alfa01 zawiera te zatwierdzenia.

  • ExoPlayer:
    • Dodaj komponent BasePreloadManager, który koordynuje wstępne wczytywanie wielu źródeł na podstawie priorytetów zdefiniowanych w parametrach rankingData. Dostosowanie jest możliwe dzięki rozszerzeniu tej klasy. Dodaj polecenie DefaultPreloadManager, które używa PreloadMediaSource do wstępnego wczytywania przykładowych multimediów ze źródeł do pamięci i używa liczby całkowitej rankingData, która wskazuje indeks elementu w interfejsie.
    • Dodaj PlayerId do większości metod LoadControl, aby umożliwić implementacji LoadControl obsługi wielu odtwarzaczy.
    • Usuń Buffer.isDecodeOnly() i C.BUFFER_FLAG_DECODE_ONLY. Nie musisz ustawiać tej flagi jako mechanizmy renderowania, a dekodery będą pomijać bufory na podstawie sygnatury czasowej. Niestandardowe implementacje interfejsu Renderer powinny sprawdzić, czy czas buforowania wynosi co najmniej BaseRenderer.getLastResetPositionUs(), aby zdecydować, czy należy wyświetlić próbkę. Niestandardowe implementacje SimpleDecoder mogą w razie potrzeby zaznaczyć pole isAtLeastOutputStartTimeUs lub oznaczyć inne bufory za pomocą parametru 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.
    • Dodaj remove(MediaSource) do BasePreloadManager.
  • Transformer:
    • Dodaj audioConversionProcess i videoConversionProcess do ExportResult, aby wskazać, jak utworzono odpowiednią ścieżkę w pliku wyjściowym.
    • Łatwiejsze sprawdzanie przycięcia wersji H.264
    • Dodanie obsługi przełączania między nośnikami wejściowymi SDR i HDR w sekwencjach.
    • Dodanie obsługi 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 ponownie użytym urządzeniu DefaultAudioMixer nie zwraca prawidłowej liczby bajtów.
  • Film:
    • Rozwiązanie problemu polegającego na tym, że przy przełączaniu platform w trakcie odtwarzania treści Listener.onRenderedFirstFrame() pojawia się zbyt wcześnie.
  • Źródło danych:
    • Zaimplementuj obsługę identyfikatorów URI nieprzetworzonych zasobów android.resource://package/id, gdzie package różni się od pakietu bieżącej aplikacji. Dotychczas nie udokumentowaliśmy, że ta metoda działa, ale jest to skuteczniejszy sposób uzyskiwania dostępu do zasobów w innym pakiecie niż nazwa.
    • Sprawdź z własnością wartość url w konstruktorach DataSpec. Ten parametr został już oznaczony jako niepusty.
  • Efekt:
    • Obsługuj kilka zmian szybkości w obrębie tego samego EditedMediaItem lub Composition w polu SpeedChangeEffect.
    • Obsługa HLG i PQ z wejścia mapy bitowej ultra HDR.
    • Dodano obsługę EGL_GL_COLORSPACE_BT2020_HLG_EXT, która ulepsza dane wyjściowe HLG w przypadku ExoPlayer.setVideoEffect i Debuger SurfaceView.
    • Zaktualizuj implementację matrycy nakładki, aby była spójna z dokumentacją, i odwróć wartości x i y zastosowane w zasadzie setOverlayFrameAnchor(). Jeśli używasz OverlaySettings.Builder.setOverlayFrameAnchor(), odwróć ich wartości x i y, mnożąc je przez -1.
  • Sesja:
    • Zmień wartość domyślną z CommandButton.enabled na true i upewnij się, że ta wartość może pozostać Fałsz w przypadku kontrolerów, nawet jeśli powiązane polecenie jest dostępne.
    • Dodaj stałe ikony dla elementu CommandButton, których należy używać zamiast zasobów ikon niestandardowych.
    • Dodaj MediaSessionService.isPlaybackOngoing(), aby umożliwić aplikacjom wysyłanie zapytań o to, czy w onTaskRemoved() (#1219) trzeba zatrzymać usługę.
    • Dodaj element MediaSessionService.pauseAllPlayersAndStopSelf(), który pozwala w wygodny sposób wstrzymać odtwarzanie wszystkich sesji, i wywołuj metodę stopSelf, aby zakończyć cykl życia sesji MediaSessionService.
    • Zastąp MediaSessionService.onTaskRemoved(Intent), aby zapewnić bezpieczną implementację domyślną, dzięki której usługa działa na pierwszym planie, jeśli odtwarzanie trwa, lub zatrzymuje jej działanie w innym przypadku.
  • Pobrane pliki:
    • Zadbaj o to, aby usługa DownloadHelper nie ujawniała nieopublikowanych instancji Renderer, co może doprowadzić do awarii aplikacji przy użyciu IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Narzędzia testowe:
    • Wdróż onInit() i onRelease() w FakeRenderer.
    • Zmień metody TestPlayerRunHelper.runUntil/playUntil, aby zawodziły w przypadku błędów niekrytycznych (np. tych zgłoszonych do AnalyticsListener.onVideoCodecError). Aby wyłączyć to działanie, użyj nowego łańcucha metod TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX().
  • Aplikacja w wersji demonstracyjnej
    • Użyj DefaultPreloadManager w krótkiej wersji demonstracyjnej aplikacji.
  • Usuń wycofane symbole:
    • Usuń CronetDataSourceFactory. Użyj w zamian zasady CronetDataSource.Factory.
    • Usuń niektóre konstruktory DataSpec. Użyj w zamian zasady DataSpec.Builder.

Wersja 1.3.0

Wersja 1.3.1

11 kwietnia 2024 r.

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

  • Wspólna biblioteka:
    • Aby zezwolić na zlokalizowane lub inne etykiety, dodaj Format.labels.
  • 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.
    • Uruchamiaj mechanizmy renderowania we wczesnej wersji dopiero po upływie okresu odtwarzania przy przejściu między elementami multimedialnymi (#1017).
    • Dodaj brakujący typ zwrotu do reguły ProGuard -keepclasseswithmembers dla DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformer:
    • Dodaj obejście wyjątku zgłoszonego, ponieważ MediaMuxer nie obsługuje wykluczających sygnatur czasowych prezentacji przed interfejsem API 30.
  • Wybór ścieżki:
    • DefaultTrackSelector: preferuj ścieżki wideo z „wystarczającą” liczbą klatek (>=10 kl./s) zamiast tych z niższą lub nieustawioną liczbą klatek. Dzięki temu odtwarzacz wybiera „prawdziwą” ścieżkę wideo w formacie MP4 wyodrębnionym ze zdjęć ruchomych, które mogą zawierać dwie ścieżki HEVC, z których jedna ma wyższą rozdzielczość, ale bardzo małą liczbę klatek (#1051).
  • Moduły wyodrębniania danych:
    • Rozwiązanie problemu polegającego na tym, że dopełnienie nie było pomijane podczas odczytywania nieparzystych fragmentów z plików WAV (#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:
    • Dodaj obejście problemu z urządzeniem na Galaxy Tab S7 FE, urządzeniu Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie H265 o szybkości 60 kl./s są oznaczane jako nieobsługiwane
    • 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: zapobiegaj tworzeniu fałszywych instancji CuesWithTiming bezpośrednio po sobie przez wskazówki z WebvttParser.parse (#1177).
  • DRM:
    • Obejście problemu NoSuchMethodError, który może zostać zgłoszony przez platformę MediaDrm zamiast ResourceBusyException lub NotProvisionedException na niektórych urządzeniach z Androidem 14 (#1145).
  • Efekt:
    • Poprawiono mapowanie tonów PQ na SDR przez konwersję przestrzeni kolorów.
  • Sesja:
    • Rozwiązanie problemu polegającego na tym, że bieżąca pozycja cofa się, gdy kontroler zastępuje bieżący element (#951).
    • Rozwiązanie problemu, który polegał na tym, że między kontrolerami multimediów a sesjami nie jest przesyłana wartość MediaMetadata z tylko wartością extras o wartości innej niż null (#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 do pola 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 zależności lokalnej, mogą go ponownie włączyć.

Wersja 1.3.0

6 marca 2024 roku

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

  • Wspólna biblioteka:
    • Zaimplementuj obsługę identyfikatorów URI nieprzetworzonych zasobów android.resource://package/[type/]name, gdzie package różni się od pakietu bieżącej aplikacji. Działanie to zawsze było udokumentowane, ale do tej pory nie było stosowane prawidłowo.
    • Normalizuj typy MIME ustawione przez kod aplikacji lub odczytywane z multimediów, tak aby były w pełni pisane małymi literami.
    • Definiuj reklamy zawierające pełne MediaItem zamiast pojedynczych reklam Uri w języku: AdPlaybackState.
    • Zwiększ minSdk do 19 (Android KitKat). Jest to dostosowane do wszystkich pozostałych bibliotek AndroidaX i jest wymagane, abyśmy mogli przejść na najnowszą wersję zależności AndroidaX.
    • 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 zasady PreloadMediaSource i PreloadMediaPeriod, które umożliwiają aplikacjom wstępne wczytywanie źródła multimediów treści w określonej pozycji początkowej przed odtworzeniem. PreloadMediaSource przygotowuje źródło multimediów do otrzymania Timeline, przygotowuje i zapisuje okres w danej pozycji początkowej, wybiera ścieżki i wczytuje dane 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 obiekt ExoPlayer.setImageOutput, który umożliwia aplikacjom konfigurowanie ustawień ImageRenderer.ImageOutput.
    • DefaultRenderersFactory domyślnie udostępnia odtwarzaczowi wartość ImageRenderer z wartościami null ImageOutput i ImageDecoder.Factory.DEFAULT.
    • Emituj zdarzenie Player.Listener.onPositionDiscontinuity po pominięciu ciszy (#765).
    • Dodano eksperymentalną obsługę analizy napisów podczas wyodrębniania. Możesz to włączyć za pomocą MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Obsługuj adaptacyjne źródła multimediów za pomocą funkcji PreloadMediaSource.
    • Zaimplementuj HttpEngineDataSource (HttpDataSource) za pomocą interfejsu API HttpEngine.
    • Zapobiegaj podklasyfikowaniu CompositeSequenceableLoader. Ten komponent był wcześniej rozszerzalny, ale nigdy nie był podklasyfikowany w bibliotece. Aby dostosować instancję, należy opakować instancję za pomocą wzorca dekoratora i zaimplementować niestandardowy CompositeSequenceableLoaderFactory.
    • Rozwiązanie problemu, który polegał na tym, że powtarzanie tego samego czasu powoduje usunięcie metadanych z 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 właściwości SubtitleParser.Factory używanej podczas wyodrębniania. Umożliwia to MediaSource.Factory.setSubtitleParserFactory().
    • Dodaj prefiks źródła do wszystkich pól Format.id wygenerowanych na podstawie MergingMediaSource. Pomaga to określić, z którego źródła pochodzi Format (#883).
    • Popraw wyrażenie regularne używane do weryfikacji nazw kluczy niestandardowych danych klienta (CMCD), modyfikując je tak, aby sprawdzało tylko łączniki (#1028).
    • Zatrzymaj podwójne kodowanie 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 mieć pewność, że plik wyjściowy będzie zaczynać się w ramce wideo. Dzięki temu dane wyjściowe operacji przycinania będą bardziej zgodne z implementacjami odtwarzacza, w których pierwsza klatka filmu nie pojawia się aż do momentu jej prezentacji (#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ą. Naprawia pliki wyjściowe rozpoczynające się od czarnej ramki w odtwarzaczach na iOS (#829).
  • Wybór ścieżki:
    • 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ępna jest zarówno ścieżka obrazu, jak i ścieżka wideo. Wartość domyślna to false, co oznacza, że wybór ścieżki wideo ma priorytet.
  • Moduły wyodrębniania danych:
    • Dodaj dodatkową analizę AV1C do wyodrębniania MP4, aby pobrać wartości ColorInfo.colorSpace, ColorInfo.colorTransfer i ColorInfo.colorRange (#692).
    • MP3: przewijanie o stałej szybkości transmisji bitów (CBR) w przypadku plików z nagłówkiem Info (odpowiednik CBR nagłówka Xing). Wcześniej użyliśmy tabeli przewijania z nagłówka Info, ale powoduje to mniej precyzyjne przewijanie niż w przypadku zignorowania jej i założenia, że plik to CBR.
    • MPEG2-TS: obsługa DTS, DTS-LBR i DTS:X Profile2 (#275).
    • Wyodrębnianie typów audio z deskryptorów TS i mapowanie ich na flagi ról, umożliwiając użytkownikom dokonywanie świadomych wyborów ścieżek audio (#973).
  • Dźwięk:
    • Popraw algorytm pomijania ciszy z płynną rampą głośności; zachowana minimalna cisza i bardziej naturalny czas ciszy (#7423).
    • Pominięte ciszy zgłaszaj 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ąć niestandardowy VideoFrameProcessor.Factory, mogą utworzyć instancję CompositingVideoSinkProvider, która korzysta z niestandardowego VideoFrameProcessor.Factory, i przekazywać dostawcę ujścia wideo do MediaCodecVideoRenderer.
  • Tekst:
    • Napraw serializację wskazówek dotyczących mapy bitowej, aby naprawić 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 stanowi, ż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).
  • Obraz:
    • Dodanie obsługi miniatur DASH. Obrazy w siatce są przycinane, a pojedyncze miniatury są przesyłane do ImageOutput w zbliżonym czasie.
  • DRM:
  • Rozszerzenie IMA:
    • Rozwiązanie problemu polegającego na tym, że nie można odtwarzać reklam DASH i HLS bez odpowiedniego rozszerzenia pliku.
  • Sesja:
    • Wyłącz wykrywanie dwukrotnych kliknięć 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:
    • Ogranicz HlsMediaPeriod do prywatnej widoczności pakietów. Ten typ nie powinien być bezpośrednio zależny od pakietu HLS.
    • Rozwiązanie pozwala skuteczniej szukać początku segmentu (#1031).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • Dekoder MIDI: ignoruj komunikaty o zdarzeniach SysEx (#710).
  • Narzędzia testowe:
    • Nie wstrzymuj odtwarzania za TestPlayerRunHelper.playUntilPosition. Test powoduje utrzymanie odtwarzania w stanie odtwarzania, ale zawiesza postęp do czasu, aż w ramach testu pojawią się asercje i dalsze działania.
  • Aplikacja w wersji demonstracyjnej
    • 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ązanie problemu polegającego na tym, że ręczne przewijanie poza zakresem LiveConfiguration.min/maxOffset nadal koryguje przesunięcie z powrotem do min/maxOffset.
    • Rozwiąż problem, który polegał 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ązanie problemu polegającego na tym, że wybór ścieżki po przejściu do zera w transmisji na żywo powoduje nieprawidłowe rozpoczęcie transmisji od pozycji domyślnej (#9347).
    • Rozwiązaliśmy problem, który powodował, że nowe wystąpienia zmiennej CmcdData.Factory otrzymywały wartości ujemne dla parametru bufferedDurationUs ze źródeł fragmentów, powodując powstawanie błędu IllegalArgumentException(#888).
  • Transformer:
    • 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ść.
    • Naprawianie nieprawidłowego wykrywania klatek kluczowych w przypadku strumieni TS H264 (#864).
    • Popraw szacowany czas trwania strumieni TS, który jest dłuższy niż 47 721 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 polegający na tym, że w komentarzach Vorbisa pole MediaMetadata było wypełniane tylko wielkimi literami (#876).
    • Wyłapuje element OutOfMemoryError podczas analizowania bardzo dużych klatek ID3. Oznacza to, że odtwarzanie może być kontynuowane bez informacji o tagu, a odtwarzanie kończy się niepowodzeniem.
  • DRM:
    • Rozszerz obejście adresu URL fałszywej licencji ClearKey https://default.url na interfejs API w wersji 33 lub nowszej (wcześniej obejście stosowane było dokładnie w interfejsie API 33) (#837).
    • Napraw ERROR_DRM_SESSION_NOT_OPENED, jeśli przełączasz się z zaszyfrowanej na oczyszczoną treść bez przymocowanej powierzchni do odtwarzacza. Przyczyną błędu było nieprawidłowe użycie bezpiecznego dekodera do odtwarzania wyraźnych treści.
  • Sesja:
    • Umieść niestandardowe klucze i wartości w komórce MediaMetadataCompat jako MediaMetadata.extras, a MediaMetadata.extras jako MediaMetadataCompat (#756, #802).
    • Poprawiono 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).
    • Rozwiązanie problemu IllegalStateException, który polegał na tym, że kontroler powiadomień o multimediach nie zakończył połączenia przy żądaniu pierwszej aktualizacji powiadomienia (#917).
  • Interfejs:
    • Rozwiązanie problemu polegającego na tym, że przyciski przewijania do przodu i do tyłu nie były widoczne podczas używania stylu Material Design we fragmencie bottomSheetDialogFragment (#511).
    • Rozwiązanie problemu polegającego na tym, że liczby na przycisku przewijania do przodu na elemencie PlayerControlView były niewłaściwie wyrównane (#547).
  • Rozszerzenie DASH:
    • Przeanalizuj parametr „f800” jako liczbę kanałów równą 5 w przypadku Dolby w pliku manifestu DASH (#688).
  • Rozszerzenia dekodera (FFmpeg, VP9, AV1, MIDI itp.):
    • MIDI: usunięto problem, który powodował, że przewijanie do przodu pomija zdarzenia zmiany programu (#704).
    • Przeprowadź migrację do FFmpeg 6.0 i zaktualizuj obsługiwaną wersję NDK do wersji r26b (#707, #867).
  • Rozszerzenie Cast:
    • Napraw proces tworzenia obiektu Timeline, aby uniknąć awarii aplikacji, gdy nie uda się wczytać multimediów na urządzeniu przesyłającym (#708).

Wersja 1.2.0

15 listopada 2023 r.

  • Wspólna biblioteka:
    • Dodaj parametr @Nullable Throwable do metod w interfejsie Log.Logger. Parametr message tych metod nie zawiera już żadnych informacji o Throwable przekazanych do metod Log.{d,i,w,e}(), więc implementacje będą musiały ręcznie dołączać te informacje w razie potrzeby (ewentualnie przy użyciu 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 metod TrackSelectorResult i SimpleDecoder (#6792).
    • Zmień domyślny interfejs i działanie powiadomień w usłudze Util.shouldShowPlayButton, aby wyświetlać przycisk odtwarzania, gdy odtwarzanie jest tymczasowo wstrzymywane (np. z powodu tymczasowej utraty ostrości dźwięku). Starsze zachowanie można zachować, używając parametru PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) lub MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Zmień androidx.annotation:annotation-experimental na 1.3.1, aby rozwiązać problem https://issuetracker.google.com/251172715.
    • Przenieś ExoPlayer.setAudioAttributes do interfejsu Player.
  • ExoPlayer:
    • Rozwiąż problemy z przewijaniem w strumieniach AC4 wynikające z nieprawidłowej identyfikacji próbek tylko do dekodowania (#11000).
    • Dodaj blokowanie odtwarzania na nieodpowiednich urządzeniach wyjściowych audio (np. wbudowanym głośniku na urządzeniach z Wear OS), gdy ta funkcja jest włączona za pomocą ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Przyczyna wstrzymania odtwarzania zostanie zaktualizowana jako Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT, jeśli zostanie podjęta próba odtwarzania, gdy nie ma odpowiednich wyjść audio lub gdy wszystkie odpowiednie wyjścia zostaną odłączone podczas odtwarzania. Przyczyna zablokowania zostanie usunięta po podłączeniu odpowiednich danych wyjściowych.
    • Dodaj MediaSource.canUpdateMediaItem i MediaSource.updateMediaItem, aby zaakceptować aktualizacje typu MediaItem po utworzeniu w Player.replaceMediaItem(s).
    • Zezwalaj na aktualizacje funkcji MediaItem w przypadku wszystkich klas MediaSource udostępnionych 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 do TrackOutput cały plik PNG jako jedną próbkę.
    • Ulepsz metodę SequenceableLoader.continueLoading(long) w interfejsie SequenceableLoader do 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 do rejestrowania danych Common Media Client Data (CMCD) dodatkowe pola: brak bufora (bs), termin (dl), szybkość odtwarzania (pr) i uruchomienie (su) (#8699).
    • Dodaj głębię kolorów Lumy i chroma do funkcji ColorInfo (#491).
    • Dodaj więcej pól do logowania Common Media Client Data (CMCD): żądanie następnego obiektu (nor) i żądanie następnego zakresu (nrr) (#8699).
    • Dodaj funkcje przesyłania danych Common Media Client Data (CMCD) przy użyciu parametrów zapytania (#553).
    • Napraw problem ConcurrentModificationException w: ExperimentalBandwidthMeter (#612).
    • Dodaj parametr MediaPeriodId do CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Obsługuj ClippingMediaSource (i inne źródła z przesunięciem okresu/okna) w ConcatenatingMediaSource2(#11226).
    • Zmień BaseRenderer.onStreamChanged(), aby otrzymać także argument MediaPeriodId.
  • Transformer:
    • Analizuj dane obrotu EXIF dla danych wejściowych 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.
    • Aby rozwiązać problemy z rotacją, uprość OverlaySettings.
    • Zmieniono parametry frameRate i durationUs parametru SampleConsumer.queueInputBitmap na TimestampIterator.
  • Wybór ścieżki:
    • Aby wyraźnie zezwolić na łatwą adaptację lub ją zablokować, dodaj DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness. Wartość domyślna pozostaje bez zmian (true).
  • Moduły wyodrębniania danych:
    • MPEG-TS: upewnij się, że ostatnia klatka została wyrenderowana, przekazując ostatnią jednostkę dostępu strumienia do kolejki przykładowej (#7909).
    • Popraw literówkę podczas określania wartości rotationDegrees. Zmieniono projectionPosePitch na projectionPoseRoll(#461).
    • Usuń założenie, że instancje Extractor mogą być sprawdzane bezpośrednio przy użyciu 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 aplikacji Mp4Extractor.
  • Dźwięk:
    • Dodaj obsługę 24-/32-bitowego kodu PCM w formatach MP4 i Matroska oraz przeanalizuj kodowanie PCM dla lpcm w formacie MP4.
    • Dodano obsługę wyodrębniania dźwięku Vorbis w formacie MP4.
    • Dodaj obiekt AudioSink.getFormatOffloadSupport(Format), który pobiera poziom obsługi odciążania, który może zapewnić ujście w przypadku danego formatu za pomocą pola DefaultAudioOffloadSupportProvider. Zwraca nową wartość AudioOffloadSupport, która zawiera isFormatSupported, isGaplessSupported i isSpeedChangeSupported.
    • Dodaj element AudioSink.setOffloadMode(), który pozwala skonfigurować odciążanie w ujściach audio. Wartość domyślna to AudioSink.OFFLOAD_MODE_DISABLED.
    • Odciążanie można włączyć za pomocą funkcji setAudioOffloadPreference w obszarze TrackSelectionParameters. Jeśli wybrane ustawienie ma być włączone, urządzenie obsługuje odciążanie w przypadku tego formatu, a wybór utworu to jedna ścieżka dźwiękowa, to wyłączenie dźwięku 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 odciążania w przypadku wersji sprzed interfejsu API na poziomie 33 z powodu problemu z pozycją odtwarzania po przejściu ścieżki.
    • Usuń parametr enableOffload z podpisu metody DefaultRenderersFactory.buildAudioSink.
    • Usuń metodę DefaultAudioSink.Builder.setOffloadMode.
    • Usuń wartość intdef DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Dodanie obsługi metadanych Opus podczas odtwarzania bez przerw.
    • Zezwalaj na przywracanie mechanizmu renderowania przez wyłączenie funkcji odciążania w przypadku niepowodzenia przy pierwszym zapisie (#627).
    • Włącz domyślnie planowanie przeładowania, aby odtwarzać bez dźwięku w trybie „Tylko dźwięk”.
    • Usuń ExoPlayer.experimentalSetOffloadSchedulingEnabled i AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • Nazwa onExperimentalSleepingForOffloadChanged została zmieniona 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 onAudioTrackInitialized i onAudioTrackReleased do AnalyticsListener, AudioRendererEventListener i AudioSink.Listener.
    • Rozwiąż problem z niedostatecznym przepływem w buforze audio DTS Express (#650).
    • Naprawiono błąd, który powodował, że sprawdzanie możliwości E-AC3-JOC powoduje wyświetlenie błędu IllegalArgumentException(#677).
  • Film:
    • Zezwól przeglądarce MediaCodecVideoRenderer na używanie niestandardowego interfejsu VideoFrameProcessor.Factory.
    • Naprawiono błąd polegający na tym, że nie można było wyrenderować pierwszej klatki, jeśli strumień audio zaczyna się od ujemnych sygnatur czasowych (#291).
  • Tekst:
    • Usuń ExoplayerCuesDecoder. Ścieżki tekstowe zawierające właściwość sampleMimeType = application/x-media3-cues są teraz obsługiwane bezpośrednio przez usługę TextRenderer bez konieczności 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.
  • Efekt:
    • Dodaj VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) do kolejki bitmapowej według sygnatury czasowej.
    • Zmień ustawienie VideoFrameProcessor.registerInputStream() na nieblokujące. Aplikacje muszą obsługiwać obiekt VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Zmieniono parametry frameRate i durationUs parametru VideoFrameProcessor.queueInputBitmap na TimestampIterator.
  • Rozszerzenie IMA:
    • Naprawiono błąd, który powodował, że w przypadku wielookresowej transmisji na żywo DASH, która nie jest pierwszym elementem playlisty, może zostać zgłoszony wyjątek (#571).
    • Zanim wywołasz funkcję AdsLoader.destroy(), zwolnij StreamManagera
    • Zmień wersję pakietu IMA SDK na 3.31.0.
  • Sesja:
    • Ustaw zachowanie usługi na pierwszym planie na FOREGROUND_SERVICE_IMMEDIATE w DefaultMediaNotificationProvider(#167).
    • Aby uniknąć problemów z wycofanym interfejsem API na urządzeniach Samsung, używaj tylkoandroid.media.session.MediaSession.setMediaButtonBroadcastReceiver()interfejsu API 31 powyżej (#167).
    • Używaj kontrolera powiadomień o multimediach jako serwera proxy do ustawiania dostępnych poleceń i niestandardowego układu do wypełniania powiadomienia i sesji platformy.
    • Konwertuj zdarzenia przycisku multimediów odebrane przez usługę 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.
    • Naprawiono błąd, przez który MediaController.getCurrentPosition() nie rozwija się po połączeniu ze starszą wersją MediaSessionCompat.
    • Dla wygody dodaj MediaLibrarySession.getSubscribedControllers(mediaId).
    • Zastąp MediaLibrarySession.Callback.onSubscribe(), aby potwierdzić dostępność identyfikatora nadrzędnego, który 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ę 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 obiekt MediaSession.Callback.onMediaButtonEvent(Intent), który umożliwia aplikacjom zastępowanie domyślnej obsługi zdarzeń przycisku multimediów.
  • Interfejs:
    • Dodaj na urządzeniach z Wear OS implementację Player.Listener, która obsługuje blokowanie odtwarzania z powodu Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT.Otwórz okno systemowe, aby umożliwić użytkownikowi podłączenie odpowiedniego wyjścia audio (np. słuchawek Bluetooth). Detektor automatycznie wznowi odtwarzanie, jeśli odpowiednie urządzenie zostanie podłączone w określonym czasie oczekiwania (domyślnie jest to 5 minut).
  • Pobrane pliki:
    • Zadeklaruj typ usługi na pierwszym planie typu „synchronizacja danych” na potrzeby DownloadService w związku ze zgodnością z Androidem 14. Gdy używasz tej usługi, aplikacja musi też dodać w pliku manifestu uprawnienia dataSync jako foregroundServiceType i dodać uprawnienie FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • Rozszerzenie HLS:
    • Odśwież playlistę na żywo HLS, stosując odstęp obliczony na podstawie czasu rozpoczęcia ostatniego wczytywania, a nie od momentu zakończenia ostatniego wczytywania (#663).
  • Rozszerzenie DASH:
    • Zezwalaj na wiele tego samego identyfikatora DASH w adresie URL szablonu segmentu.
    • Dodano eksperymentalną obsługę analizy napisów podczas wyodrębniania. Ta funkcja zapewnia lepszą obsługę łączenia nakładających się napisów, w tym migotania przy przechodzeniu między segmentami napisów. Możesz to włączyć za pomocą metody DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()(#288).
  • Rozszerzenie RTSP:
    • Napraw warunek wyścigu, który może powodować występowanie IndexOutOfBoundsException przy ponownym połączeniu z TCP lub zawieszanie się odtwarzania w niektórych sytuacjach.
    • Sprawdź stan w konfiguracji RTSP podczas zwracania stanu wczytywania RtspMediaPeriod (#577).
    • Ignoruj niestandardowe metody żądań Rtsp w nagłówku publicznym odpowiedzi Opcje (#613).
    • Użyj wartości limitu czasu oczekiwania odpowiedzi na konfigurację RTSP w przedziale czasu podczas wysyłania żądań utrzymywania aktywności opcji 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 atrybut DecoderOutputBuffer.shouldBeSkipped, aby bezpośrednio oznaczać bufory wyjściowe, których nie trzeba udostępniać. Ta opcja jest preferowana zamiast wersji C.BUFFER_FLAG_DECODE_ONLY, która zostanie wycofana.
    • Dodaj Decoder.setOutputStartTimeUs i SimpleDecoder.isAtLeastOutputStartTimeUs, aby umożliwić dekoderom usuwanie próbek tylko z dekodowania przed godziną rozpoczęcia. Zalecamy tę opcję w przypadku funkcji Buffer.isDecodeOnly, która zostanie wycofana.
    • Poprawiono błąd podczas publikowania artefaktu dekodera MIDI w repozytorium Maven. Nazwa artefaktu została zmieniona na media3-exoplayer-midi(#734).
  • Rozszerzenie Leanback:
    • Naprawiono błąd, przez który wyłączenie powierzchni może powodować pojawienie się kodu ArithmeticException w kodzie Leanback (#617).
  • Narzędzia testowe:
    • Zadbaj o to, aby TestExoPlayerBuilder i FakeClock były zgodne z testami interfejsu Espresso i 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ń wycofane symbole:
    • Usuń TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) i TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Użyj funkcji Composition.Builder.setHdrMode(int) i przekaż Composition użytkownikowi Transformer.start(Composition, String).
    • Usuń wycofaną metodę DownloadNotificationHelper.buildProgressNotification. Użyj niewycofanej metody, która 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-alfa02

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ń przypadkowo dodaną zależność multidex ze wszystkich modułów (#499).
  • ExoPlayer:
    • Naprawiono błąd w PlaybackStatsListener, który polegał na tym, że po wyczyszczeniu playlisty były tworzone 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:
    • Naprawiono błąd, który powodował, że podczas odtwarzania bardzo krótkich plików Player.getState() nigdy nie przełączał się na STATE_ENDED (#538).
  • Odciążanie dźwięku:
    • Dołącz nagłówek identyfikatora Ogg i strony nagłówków komentarzy na początku strumienia bitowego na potrzeby wyłączonego odtwarzania Opus, zgodnie ze standardem RFC 7845.
  • Film:
    • H.265/HEVC: naprawianie analizy informacji o obrazie referencyjnym SPS krótko- i długoterminowych.
  • Tekst:
    • CEA-608: zmień logikę obcinania wskazówek tak, aby uwzględniała tylko widoczny tekst. Wcześniej przy ograniczeniu długości sygnału do 32 znaków (#11019) uwzględniono wcześniej wcięcie i odsunięcie tabulatora.
  • Rozszerzenie IMA:
    • Zaktualizuj pakiet IMA SDK do wersji 3.30.3.
  • Sesja:
    • Dodaj układ niestandardowy do stanu kontrolera i udostępnij metodę pobierania dostępu do niego. Gdy zmienia się układ niestandardowy, wywoływana jest funkcja MediaController.Listener.onCustomLayoutChanged. Aplikacje, które chcą wysyłać różne układy niestandardowe do różnych kontrolerów Media3, mogą to zrobić w MediaSession.Callback.onConnect za pomocą elementu AcceptedResultBuilder, który zagwarantuje, że po zakończeniu połączenia układ niestandardowy będzie dostępny dla kontrolera.
    • Napraw przypadki, gdy funkcja MediaLibraryServiceLegacyStub wysłała błąd do funkcji Result, która go nie obsługuje, co spowodowało wyświetlenie UnsupportedOperationException(#78).
    • Napraw sposób tworzenia elementu VolumeProviderCompat przez funkcję PlayerWrapper, wskazując volumeControlType za pomocą zarówno starszych poleceń (COMMAND_ADJUST_DEVICE_VOLUME i COMMAND_SET_DEVICE_VOLUME), jak i nowych (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS i COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

Wersja 1.1.0

5 lipca 2023 r.

  • Wspólna biblioteka:
    • 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 odtwarzacza metody przeciążenia, które pozwalają użytkownikom określać flagi woluminu:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Dodaj element Builder dla elementu DeviceInfo i wycofaj istniejący konstruktor.
    • Dodaj DeviceInfo.routingControllerId, aby określić identyfikator kontrolera routingu na potrzeby odtwarzania zdalnych.
    • Dodaj Player.replaceMediaItem(s) jako skrót do dodawania i usuwania elementów w tym samym miejscu (#8046).
  • ExoPlayer:
    • Zezwól ExoPlayer na sterowanie opcjami głośności urządzenia tylko wtedy, gdy jest to wyraźnie dozwolone. Użyj konta 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 jego metody:
      • Logowanie CMCD jest domyślnie wyłączone. Aby je włączyć, użyj MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory).
      • Wszystkie klucze są domyślnie włączone. Zastąp CmcdConfiguration.RequestConfig.isKeyAllowed(String key), aby odfiltrować logowane klucze.
      • Zastąp CmcdConfiguration.RequestConfig.getCustomData(), aby włączyć logowanie kluczy niestandardowych.
    • Dodaj dodatkowe działanie do pliku manifestu głównej wersji demonstracyjnej, aby ułatwić uruchamianie aplikacji w wersji demonstracyjnej za pomocą niestandardowego pliku *.exolist.json (#439).
    • Dodaj ExoPlayer.setVideoEffects() za używanie Effect podczas odtwarzania filmu.
    • Zaktualizuj SampleQueue, aby zapisać element sourceId jako long, a nie int. Spowoduje to zmianę podpisów metod publicznych SampleQueue.sourceId i SampleQueue.peekSourceId.
    • Dodaj parametry do metod LoadControl shouldStartPlayback i onTracksSelected, które umożliwiają powiązanie tych metod z odpowiednimi wartościami MediaPeriod.
    • Zmień podpis elementu ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>), dodając parametr osi czasu, który zawiera kropki z identyfikatorami UID używanymi jako klucze na mapie. Jest to wymagane, aby uniknąć problemów z równoczesnością w transmisjach na żywo z wieloma okresami.
    • Wycofuj EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) i BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Zamiast tego można wywołać wariant metod bez mediaTimeOffsetUs. Nawet w przypadku wycofanych wersji nie jest ono już dodawane do elementów startTimeUs i endTimeUs obiektów MediaLoadData wysyłanych przez dyspozytora.
    • Zmień nazwę ExoTrackSelection.blacklist na excludeTrack, a isBlacklisted na isTrackExcluded.
    • Rozwiąż problem z niespójnościami między wywołaniem ExoPlayer.setMediaItem(s) i addMediaItem(s) w przypadku pustej playlisty.
  • Transformer:
    • Usuń Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Zamiast nich używaj właściwości ExoPlayerAssetLoader.Factory(MediaSource.Factory) i Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Usuń Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Naprawiono błąd, który powodował, że przekształcenie mogło się zawiesić (co powodowało przekroczenie limitu czasu działania routera), jeśli koniec strumienia wideo był sygnalizowany w momencie, gdy klatka wejściowa czekała na przetworzenie.
    • Aby zwiększyć obsługę, wysyłaj zapytania do kodeków za pomocą MediaCodecList zamiast za pomocą narzędzi findDecoder/EncoderForFormat.
    • Usuń konfigurację ramek B w DefaultEncoderFactory, ponieważ nie działa na niektórych urządzeniach.
  • Wybór ścieżki:
    • Dodaj pole DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange, które jest domyślnie wyłączone. Jeśli ta opcja jest włączona, po zmianie możliwości mechanizmu renderowania DefaultTrackSelector aktywuje nową ścieżkę.
  • Moduły wyodrębniania danych:
    • Ogg: naprawiono błąd związany z przewijaniem plików 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 polegający na tym, że niektóre odtworzenia kończyły się niepowodzeniem, gdy włączone jest tunelowanie, a pole AudioProcessors jest aktywne, np. w przypadku pełnego przycinania (#10847).
    • Umieszczaj ramki Opus w pakietach Ogg podczas odtwarzania bezpośredniego (odciążania).
    • Przeprowadź ekstrapolację bieżącej pozycji podczas snu z planowaniem odciążania.
    • Dodaj Renderer.release() i AudioSink.release(), aby zwolnić zasoby pod koniec cyklu życia odtwarzacza.
    • Posłuchaj zmian funkcji audio w usłudze DefaultAudioSink. Dodaj w konstruktorze DefaultAudioSink wymagany parametr context, dzięki któremu DefaultAudioSink będzie rejestrować się jako detektor AudioCapabilitiesReceiver i aktualizować właściwość audioCapabilities po otrzymaniu informacji o zmianie możliwości.
    • Propaguj zmiany możliwości dźwiękowych za pomocą nowego zdarzenia onAudioCapabilitiesChanged w interfejsie AudioSink.Listener i nowego interfejsu RendererCapabilities.Listener, który aktywuje zdarzenia onRendererCapabilitiesChanged.
    • Dodaj ChannelMixingAudioProcessor, aby zastosować skalowanie/miksowanie do kanałów audio.
    • Dodaj nową wartość int (DISCARD_REASON_AUDIO_BYPASS_POSSIBLE) do elementu DecoderDiscardReasons, aby odrzucić dekoder dźwięku, gdy tryb ominięcia jest możliwy po zmianie funkcji audio.
    • Dodanie bezpośredniej obsługi odtwarzania DTS Express i DTS:X(#335).
  • Film:
    • Gdy mechanizm renderowania jest wyłączony, MediaCodecVideoRenderer zgłasza VideoSize z szerokością i wysokością równą 0. Po zmianie parametru Player.getVideoSize() funkcja Player.Listener.onVideoSizeChanged jest wywoływana odpowiednio. Po tej zmianie rozmiar wideo ExoPlayera z MediaCodecVideoRenderer ma szerokość i wysokość 0, jeśli element Player.getCurrentTracks nie obsługuje wideo lub rozmiar obsługiwanej ścieżki wideo nie jest 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órej można użyć do utworzenia pliku kontenera MP4.
  • Rozszerzenie IMA:
    • Włącz transmisje DASH z wieloma przedziałami czasu na potrzeby DAI. Pamiętaj, że obecna implementacja nie obsługuje jeszcze przewijania w transmisjach na żywo (#10912).
    • Napraw błąd polegający na wstawieniu nowej grupy reklam w transmisjach na żywo, ponieważ obliczona pozycja treści na kolejnych osiach czasu nieznacznie się zmienia.
  • Sesja:
    • Dodaj metodę pomocniczą 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).
    • Domyślnie dodaj przyciski poleceń „przewiń do poprzedniego” i „przewiń do następnego” w widoku powiadomień o multimediach kompaktowych na 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).
    • Domyślnie dodaj przyciski poleceń „przewiń do poprzedniego” i „przewiń do następnego” w widoku powiadomień o multimediach kompaktowych na Androidzie 12 i starszych (#410).
  • Interfejs:
    • Dodaj metody narzędzi shouldShowPlayButton i handlePlayPauseButtonAction, aby zapisać niestandardowe elementy interfejsu za pomocą przycisku odtwarzania/wstrzymania.
  • 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 identyfikatora URI do rozpoznawania ścieżki względnej z sesji RTSP, jeśli znajduje się w nagłówku odpowiedzi DESCRIBE (#11160).
  • Rozszerzenie DASH:
    • Usuń przesunięcie czasu multimediów z MediaLoadData.startTimeMs i MediaLoadData.endTimeMs w przypadku strumieni DASH z wieloma okresami.
    • Poprawiono błąd polegający na tym, że ponowne przygotowanie wielookresowego źródła multimediów na żywo w Dash dawało kod IndexOutOfBoundsException (#10838).
  • Rozszerzenie HLS:
    • Dodaj HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long), aby ustawić czas oczekiwania, po którym wczytywany wątek będzie czekać na zainicjowanie 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 limit czasu jest ustawiony na zero (#323).
  • Narzędzia testowe:
    • Sprawdź w DataSourceContractTest, czy w schemacie URI nie jest rozróżniana wielkość 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 konstrukcje SimpleCache. Aby uzyskać lepszą wydajność, użyj wycofanego konstruktora, który zamiast tego używa DatabaseProvider.
    • Usuń konstruktor DefaultBandwidthMeter, zamiast niego użyj DefaultBandwidthMeter.Builder.
    • Usuń konstruktory DefaultDrmSessionManager, zamiast tego użyj DefaultDrmSessionManager.Builder.
    • Usuń 2 wycofane konstrukcje HttpDataSource.InvalidResponseCodeException i użyj wycofanego konstruktora, który akceptuje dodatkowe pola(cause, responseBody), aby usprawnić logowanie błędów.
    • Usuń DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash i DownloadHelper.forSmoothStreaming. Zamiast nich użyj DownloadHelper.forMediaItem.
    • Usuń wycofany konstruktor DownloadService. Użyj niewycofanego konstruktora zawierającego opcję podawania parametru channelDescriptionResourceId.
    • Usuń wycofane stałe ciągi znaków dla znaków (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME i UTF16LE_NAME). Użyj zamiast tego Kotlin Charsets z pakietu kotlin.text albo java.nio.charset.StandardCharsets lub com.google.common.base.Charsets.
    • Usuń wycofany konstruktor WorkManagerScheduler. Użyj wycofanego konstruktora, który zawiera opcję podania parametru Context.
    • Usuń wycofane metody createVideoSampleFormat, createAudioSampleFormat, createContainerFormat i createSampleFormat, które zostały użyte do utworzenia instancji klasy Format. Zamiast tego do tworzenia instancji Format użyj Format.Builder.
    • Usuń wycofane metody copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate i copyWithVideoSize, użyj zamiast nich metod Format.buildUpon() i metod ustawiania.
    • Usuń wycofaną zasadę ExoPlayer.retry(). Zamiast niej użyj zasady prepare().
    • Usuń wycofany konstruktor DefaultTrackSelector bez argumentu. Zamiast niego użyj DefaultTrackSelector(Context).
    • Usuń wycofany konstruktor OfflineLicenseHelper. Zamiast niego użyj OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń wycofany konstruktor DownloadManager. Użyj konstruktora, który korzysta z obiektu Executor.
    • Usuń wycofane konstrukcje Cue. Zamiast nich użyj Cue.Builder.
    • Usuń wycofany konstruktor OfflineLicenseHelper. Zamiast niego użyj OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Usuń 4 wycofane metody AnalyticsListener:
      • onDecoderEnabled, użyj właściwości onAudioEnabled lub onVideoEnabled.
      • onDecoderInitialized, zamiast tego użyj onAudioDecoderInitialized lub onVideoDecoderInitialized.
      • onDecoderInputFormatChanged, użyj właściwości onAudioInputFormatChanged lub onVideoInputFormatChanged.
      • onDecoderDisabled, użyj właściwości onAudioDisabled lub onVideoDisabled.
    • Usuń wycofane Player.Listener.onSeekProcessed i AnalyticsListener.onSeekProcessed. Zamiast nich używaj onPositionDiscontinuity z DISCONTINUITY_REASON_SEEK.
    • Usuń ExoPlayer.setHandleWakeLock(boolean), zamiast tego użyj setWakeMode(int).
    • Usuń wycofany atrybut DefaultLoadControl.Builder.createDefaultLoadControl(), zamiast niego użyj zasady build().
    • Usuń wycofaną zasadę MediaItem.PlaybackProperties. Zamiast niej użyj MediaItem.LocalConfiguration. Wycofane pole MediaItem.playbackProperties jest teraz typu MediaItem.LocalConfiguration.

Wersja 1.1.0-rc01

21 czerwca 2023 r.

Użyj wersji stabilnej 1.1.0.

Wersja 1.1.0-beta01

7 czerwca 2023 r.

Użyj wersji stabilnej 1.1.0.

Wersja 1.1.0-alpha01

10 maja 2023 r.

Użyj wersji stabilnej 1.1.0.

Wersja 1.0.0

Wersja 1.0.2

18 maja 2023 r.

Usługa androidx.media3:media3-*:1.0.2 została zwolniona. 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:

  • Biblioteka podstawowa:
    • Dodaj Buffer.isLastSample(), który wskazuje, czy Buffer zawiera flagę C.BUFFER_FLAG_LAST_SAMPLE.
    • Rozwiązanie problemu polegającego na tym, że ostatnia klatka może nie zostać wyrenderowana, jeśli ostatnia klatka z klatek została usunięta z kolejki bez odczytania próbki „koniec 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: dodaj obsługę plików UTF-16, jeśli zaczynają się od znaku 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 działania.
    • Naprawiono błąd, który uniemożliwiał MediaLibraryService zwracanie wartości null w przypadku wywołania z interfejsu systemu do Callback.onGetLibraryRoot za pomocą parametru params.isRecent == true w interfejsie API 30 (#355).
    • Napraw wyciek pamięci w: MediaSessionService lub MediaLibraryService (#346).
    • Naprawiono błąd, w wyniku którego połączone atrybuty Timeline i aktualizacja pozycji w MediaSession mogą powodować, że MediaController przesyła IllegalStateException.

Wersja 1.0.1

18 kwietnia 2023 r.

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

Ta wersja odpowiada wersji ExoPlayer 2.18.6.

  • Biblioteka podstawowa:
    • Zresetuj zastąpienie docelowej transmisji na żywo po przejściu do pozycji domyślnej (#11051).
    • Usunęliśmy błąd polegający na tym, że puste przykładowe strumienie multimediów mogły blokować odtwarzanie.
  • Sesja:
    • Naprawiono błąd, który powodował, że wiele identycznych elementów kolejki opublikowanych przez starszą wersję MediaSessionCompat skutkuje wyjątkiem w zasadzie MediaController(#290).
    • Dodaj brakujące przekierowanie z adresu MediaSession.broadcastCustomCommand do starszej wersji MediaControllerCompat.Callback.onSessionEvent (#293).
    • Naprawiono błąd, który powodował, że wywołanie funkcji MediaSession.setPlayer nie aktualizuje 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ąż problem, który polegał na tym, że do metadanych za pomocą starszej wersji MediaSessionCompat wymagana jest usługa Player.COMMAND_GET_CURRENT_MEDIA_ITEM.
    • Rozwiązaliśmy problem polegający na tym, że instancje MediaSession w wątku w tle powodują awarię, gdy są używane w MediaSessionService (#318).
    • Rozwiązanie problemu polegającego na tym, że odbiornik przycisku multimediów został zadeklarowany przez bibliotekę bez spełnienia tego celu przez aplikację (#314).
  • DASH:
    • Poprawiono obsługę pustych osi czasu segmentów (#11014).
  • RTSP:
    • Spróbuj ponownie, korzystając z TCP, jeśli konfiguracja RTSP z UDP nie powiedzie się i pojawi się błąd RTSP 461 Nieobsługiwany transport (#11069).

Wersja 1.0.0

22 marca 2023 r.

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

Ta wersja odpowiada wersji ExoPlayer 2.18.5.

Od wersji 1.0.0-rc02 nie ma żadnych zmian.

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.

  • Biblioteka podstawowa:
    • Naprawiono wykrywanie typu sieci w interfejsie API 33 (#10970).
    • Popraw NullPointerException podczas wywoływania numeru ExoPlayer.isTunnelingEnabled (#10977).
  • Pobrane pliki:
    • Zastosuj maksymalną różnicę w czasie rozpoczęcia w przypadku 2 segmentów, które można scalać w klasach SegmentDownloader i podklasach (#248).
  • Dźwięk:
    • Naprawianie uszkodzonego odtwarzania plików MP3 bez przerw na urządzeniach Samsung (#8594).
    • Naprawiono błąd, który powodował, że szybkości odtwarzania ustawione natychmiast po wyłączeniu dźwięku mogą zostać zastąpione przez poprzednią zmianę szybkości (#10882).
  • Film:
    • Zmapuj format HEVC HDR10 na HEVCProfileMain10HDR10 zamiast na HEVCProfileMain10.
    • Dodaj obejście problemu z urządzeniem Chromecast z Google TV i Lenovo M10 FHD Plus, który powoduje, że strumienie AVC 60 kl./s są oznaczane jako nieobsługiwane (#10898).
    • Rozwiąż problemy z wydajnością renderowania klatek podczas odtwarzania multimediów, w których liczba klatek jest znacznie większa niż częstotliwość odświeżania ekranu.
  • Obsada:
    • Popraw przejściowe STATE_IDLE podczas przechodzenia między elementami multimedialnymi (#245).
  • RTSP:
    • Zidentyfikuj wyjątek IllegalArgumentException podczas analizy nieprawidłowego protokołu RTSP. Opisz 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.

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

Ta wersja odpowiada wersji ExoPlayer 2.18.3.

  • Biblioteka podstawowa:
    • Dostosuj logikę porządkowania dekodera mechanizmu renderowania, by zachować preferencje MediaCodecSelector, nawet jeśli według dekodera nie jest w stanie odtworzyć multimediów wydajnie. Na przykład z selektorem domyślnym dekoder sprzętowy z obsługą wyłącznie funkcjonalnych będzie miał wyższy priorytet niż dekoder programowy, który w pełni obsługuje ten format (#10604).
    • Dodaj ExoPlayer.Builder.setPlaybackLooper, który ustawia istniejący wątek odtwarzania nowej instancji ExoPlayer.
    • Zezwalaj na czyszczenie pomocniczych menedżera pobierania (#10776).
    • Dodaj parametr do elementu BasePlayer.seekTo, aby wskazać też polecenie używane do przewijania.
    • Użyj motywu podczas wczytywania elementów możliwych do rysowania w interfejsie API 21 lub nowszym (#220).
    • Dodaj obiekt ConcatenatingMediaSource2, który umożliwia połączenie wielu elementów multimedialnych w jednym oknie (#247).
  • Moduły wyodrębniania danych:
    • 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 pomijaj próbki podczas przechodzenia bezpośrednio do klatki synchronizacji w fMP4 (#10941).
  • Dźwięk:
    • Użyj szybkości transmisji skompresowanego formatu audio, aby obliczyć minimalny rozmiar bufora w przypadku elementu AudioTrack w przypadku odtwarzania bezpośrednich (przekazywanych).
  • Tekst:
    • Popraw TextRenderer, który przekazuje nieprawidłowy (ujemny) indeks do Subtitle.getEventTime, jeśli plik napisów nie zawiera żadnych znaków.
    • SubRip: dodaj obsługę plików UTF-16, jeśli zaczynają się od znaku kolejności bajtów.
  • Metadane:
    • Przeanalizuj wiele wartości rozdzielonych null z ramek ID3, zgodnie z zasadami 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:
    • Dodaj pełną analizę na potrzeby zestawów do adaptacji obrazów, w tym liczbę kafelków (#3752).
  • Interfejs:
    • Napraw wycofany tag PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener), aby mieć pewność, że zmiany dotyczące widoczności będą przekazywane do zarejestrowanego detektora (#229).
    • Popraw kolejność elementów sterujących środkowego odtwarzacza w PlayerView, jeśli używasz układu od prawej do lewej (od prawej do lewej) (#227).
  • Sesja:
    • Dodaj abstrakcyjny SimpleBasePlayer, aby ułatwić implementację interfejsu Player w odtwarzaczach niestandardowych.
    • Dodaj metodę pomocniczą, aby przekonwertować token 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ń przycisków multimediów niezwiązanych z Bluetoothem (#233).
    • Zwiększ wydajność funkcji QueueTimeline w przypadku podejrzanego stanu sesji starszego typu (#241).
  • Metadane:
    • Przeanalizuj wiele wartości rozdzielonych null z ramek ID3, zgodnie z zasadami 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.
  • 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 zażądać skoncentrowania przycisku pomijania na telewizorach i domyślnie ustawić ją na wartość Prawda.
    • Dodaj metodę focusSkipButton() do obiektu ImaServerSideAdInsertionMediaSource.AdsLoader, aby automatycznie zażądać zaznaczenia przycisku pominięcia.
    • Zmień wersję pakietu IMA SDK na 3.29.0.
  • Aplikacja w wersji demonstracyjnej
    • Poproś o zgodę na wyświetlanie powiadomień o pobieraniu (#10884).

Wersja 1.0.0-beta03

22 listopada 2022 r.

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

Ta wersja odpowiada wersji ExoPlayer 2.18.2.

  • Biblioteka podstawowa:
    • Dodaj ExoPlayer.isTunnelingEnabled, aby sprawdzić, czy dla obecnie wybranych ścieżek włączone jest tunelowanie (#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.
    • Gdy włączone jest odciążanie, zamknij blok śledzenia „doSomeWork”.
    • Rozwiąż problem ze śledzeniem sesji z szybkimi przewijaniem w trybie PlaybackStatsListener (#180).
    • Wyślij brakujące wywołanie zwrotne onMediaItemTransition podczas wywoływania funkcji seekToNext lub seekToPrevious w playliście z jednym elementem (#10667).
    • Dodaj pole Player.getSurfaceSize, które zwraca rozmiar powierzchni, na której jest renderowany film.
    • Naprawiono błąd, który powodował, że usunięcie detektorów w trakcie publikowania odtwarzacza mogło powodować błąd IllegalStateException(#10758).
  • Kompilacja:
    • Wymuszaj minimalną wartość compileSdkVersion, aby uniknąć błędów kompilacji (#10684).
    • Unikaj publikowania bloku, który jest częścią 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:
    • Napraw potencjalną pętlę nieskończoną w polu ProgressiveDownloader spowodowana równoczesnym pobieraniem i odtwarzaniem przy użyciu tego samego parametru PriorityTaskManager (#10570).
    • Powiadomienie o pobraniu pojawia się natychmiast (#183).
    • Ogranicz liczbę równoległych operacji pobierania do 1, aby uniknąć tworzenia wątków (#10458).
  • Film:
    • Jeśli wyświetlacz nie obsługuje Dekodera Dolby Vision, wypróbuj inny dekoder. (#9794).
  • Dźwięk:
    • Użyj SingleThreadExecutor do publikowania instancji AudioTrack, aby uniknąć błędów OutOfMemory w przypadku publikowania wielu odtwarzaczy jednocześnie (#10057).
    • Dodaje wartość AudioOffloadListener.onExperimentalOffloadedPlayback dla stanu odciążania AudioTrack. (nr 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.
    • Zmapuj odpowiednio 8- i 12-kanałowy dźwięk na maski kanałów 7.1 i 7.1.4 na 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ą atrybutu MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), aby określić, czy mechanizm renderowania zwróci metadane wcześnie, czy zsynchronizowane z pozycją odtwarzacza.
  • DRM:
    • Obejście błędu w implementacji ClearKey na Androidzie 13, który zwraca niepusty, ale nieprawidłowy adres URL licencji.
    • Naprawa błędu setMediaDrmSession failed: session not opened występującego podczas przełączania między schematami DRM na playliście (np. z Widevine na ClearKey).
  • Tekst:
    • CEA-608: upewnij się, że polecenia przełącznika usługi w polu 2 są prawidłowo obsługiwane (#10666).
  • DASH:
    • Przeanalizuj EventStream.presentationTimeOffset z plików manifestu (#10460).
  • Interfejs:
    • Użyj bieżących zastąpień odtwarzacza jako gotowych ustawień w TrackSelectionDialogBuilder(#10429).
  • Sesja:
    • Sprawdź, czy polecenia są zawsze wykonywane w odpowiedniej kolejności, nawet jeśli niektóre wymagają rozdzielczości asynchronicznej (#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ń. (nr 104).
    • Sprawdź, czy polecenia wysłane przed MediaController.release() nie są pomijane (#99).
    • SimpleBitmapLoader może wczytać bitmapę z identyfikatorów URI typu 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 pojawia się powiadomienie z prośbą o ponowne uruchomienie odtwarzania ostatnio odtwarzanego elementu multimedialnego (#112).
    • Nie uruchamiaj usługi na pierwszym planie z oczekującą intencją wstrzymania (#167).
    • Ręcznie ukryj „plakietkę” powiązaną z powiadomieniem utworzonym przez użytkownika DefaultNotificationProvider w interfejsach API 26 i API 27 (w interfejsach API w wersji 28 i nowszych plakietka jest automatycznie ukrywana) (#131).
    • Usunęliśmy błąd, który powodował, że drugie połączenie powiązania ze starszą sesją MediaSession z Media3 MediaController powoduje wystąpienie wyjątku IllegalStateExceptions (#49).
  • RTSP:
    • Dodaj pofragmentowaną obsługę pakietów H263 (#119).
    • Dodano obsługę formatów MP4A-LATM (#162).
  • IMA:
    • Dodaj czas oczekiwania na wczytanie informacji o reklamie, aby obsługiwać przypadki, gdy pakiet IMA SDK utknie na etapie wczytywania reklamy (#10510).
    • Zapobiegaj pomijaniu reklam w trakcie filmu po przejściu do końca treści (#10685).
    • Prawidłowo obliczaj czas trwania transmisji na żywo z reklamami wstawionymi po stronie serwera, np. IMA DAI (#10764).
  • Rozszerzenie FFmpeg:
    • Dodaj nowo wymagane flagi, aby połączyć biblioteki FFmpeg z biblioteką NDK w wersji 23.1.7779620 lub nowszej (#9933).
  • Rozszerzenie AV1:
    • Zaktualizuj wersję CMake, aby uniknąć niezgodności z najnowszymi wersjami Androida Studio (#9933).
  • Rozszerzenie Cast:
    • Zaimplementuj getDeviceInfo(), aby umożliwić rozpoznawanie CastPlayer podczas sterowania odtwarzaniem za pomocą MediaController (nr 142).
  • Transformer:
    • Dodaj licznik watchdoga Spannera, aby wykryć, że generowanie próbki wyjściowego jest za wolne.
  • Usuń wycofane symbole:
    • Usuń Transformer.Builder.setOutputMimeType(String). Ta funkcja została usunięta. Gdy jest używany domyślny multiplekser, typem MIME jest zawsze MP4.

Wersja 1.0.0-beta02

21 lipca 2022 r.

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

Ta wersja odpowiada wersji ExoPlayer 2.18.1.

  • Biblioteka podstawowa:
    • 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 multimediów progresywnych umieszczaj tylko wybrane ścieżki w buforze (#10361).
    • Zezwalaj na korzystanie z niestandardowego rejestratora dla wszystkich danych wyjściowych dziennika ExoPlayer (#9752).
    • Napraw implementację setDataSourceFactory w DefaultMediaSourceFactory, która w niektórych przypadkach nie działała (#116).
  • Moduły wyodrębniania danych:
    • Poprawianie analizy zestawów krótkoterminowych obrazów referencyjnych H265 (#10316).
    • Popraw analizowanie szybkości transmisji bitów z pola esds (#10381).
  • DASH:
    • Analizuj URL licencji ClearKey z plików manifestu (#10246).
  • Interfejs:
    • Sprawdź, czy TalkBack informuje na głos o obecnie aktywnej opcji szybkości w menu elementów sterujących odtwarzaniem (#10298).
  • RTSP:
    • Dodaj pofragmentowaną obsługę pakietów VP8 (#110).
  • Rozszerzenie Leanback:
    • Posłuchaj zmian funkcji playWhenReady w dokumencie LeanbackAdapter (10420).
  • Obsada:
    • Użyj metody MediaItem przekazanej do metod playlisty jako Window.mediaItem w CastTimeline (nr 25, #8212).
    • Obsługa Player.getMetadata() i Listener.onMediaMetadataChanged() przy użyciu CastPlayer (nr 25).

Wersja 1.0.0-beta01

16 czerwca 2022 r.

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

Odpowiada to wersji ExoPlayer 2.18.0.

  • Biblioteka podstawowa:
    • Włącz obsługę diagnostyki platformy Androida za pomocą MediaMetricsManager. ExoPlayer przekaże do platformy zdarzenia odtwarzania i dane o wydajności, co pomaga dostarczyć informacje dotyczące wydajności systemu i debugowania na urządzeniu. Te dane mogą być też gromadzone przez Google, jeśli użytkownik urządzenia włączy udostępnianie danych o użytkowaniu i diagnostyce. Aplikacje mogą zrezygnować z udziału w diagnostyce platformy ExoPlayer za pomocą ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Poprawiliśmy błąd polegający na tym, że ścieżki są zbyt często resetowane podczas korzystania z elementu MergingMediaSource, np. gdy ładujesz napisy z innego urządzenia lub zmieniasz wybrane napisy w trakcie ich odtwarzania (#10248).
    • Przestań wykrywać typ sieci 5G-NSA w interfejsach API 29 i 30. W przypadku odtwarzania tych treści zakładamy, że korzystasz z sieci 4G.
    • Nie zezwalaj na przekazywanie komunikatów null do MediaSource.Factory.setDrmSessionManagerProvider i MediaSource.Factory.setLoadErrorHandlingPolicy. Instancje DefaultDrmSessionManagerProvider i DefaultLoadErrorHandlingPolicy można w razie potrzeby przekazywać wprost.
    • Dodaj atrybut MediaItem.RequestMetadata reprezentujący metadane potrzebne do odtwarzania multimediów, gdy dokładna wartość LocalConfiguration nie jest znana. Usuń też MediaMetadata.mediaUrl, ponieważ jest on teraz uwzględniony w usłudze RequestMetadata.
    • Dodaj Player.Command.COMMAND_SET_MEDIA_ITEM, aby umożliwić graczom ustawienie jednego elementu.
  • Wybór ścieżki:
    • Rozdziel klasę TrackSelectionOverrides na TrackSelectionParameters i zmień klasę TrackSelectionOverride na klasę najwyższego poziomu.
    • Zmień nazwę TracksInfo na Tracks, a TracksInfo.TrackGroupInfo na Tracks.Group. Nazwy Player.getCurrentTracksInfo i Player.Listener.onTracksInfoChanged również zostały zmienione na Player.getCurrentTracks i Player.Listener.onTracksChanged. Obejmuje to wycofanie nazwy metody Player.Listener.onTracksChanged, ale z użyciem innych typów parametrów.
    • Zmień DefaultTrackSelector.buildUponParameters i DefaultTrackSelector.Parameters.buildUpon, aby zwracały DefaultTrackSelector.Parameters.Builder zamiast wycofanej funkcji DefaultTrackSelector.ParametersBuilder.
    • Dodaj pole DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities, które jest domyślnie włączone. Gdy ta opcja jest włączona, DefaultTrackSelector preferuje ścieżki audio, których liczba kanałów nie przekracza możliwości wyjścia urządzenia. W przypadku urządzeń mobilnych DefaultTrackSelector preferuje dźwięk stereo/mono niż wielokanałowe formaty audio, chyba że format wielokanałowy może być uprzestrzenny (Android 12L lub nowszy) lub dźwięk przestrzenny Dolby. Dodatkowo na urządzeniach, które obsługują uporządkowanie dźwięku, DefaultTrackSelector będzie monitorować zmiany we właściwościach przestrzennika i aktywować na nich nowy wybór ścieżki. Urządzenia z television trybem interfejsu są wykluczone z tych ograniczeń. Preferowany jest format z największą liczbą kanałów. Aby można było włączyć tę funkcję, instancję DefaultTrackSelector trzeba utworzyć za pomocą Context.
  • Film:
    • Zmień nazwę DummySurface na PlaceholderSurface.
    • Dodaj obsługę AV1 do interfejsu MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Dźwięk:
    • Używaj niestandardowego typu MIME do reklamowania dekodera dźwięku LG AC3.
    • 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 wysyła 12-kanałowy dźwięk w formacie PCM (#10322.
  • DRM
    • Upewnij się, że sesja DRM jest zawsze poprawnie aktualizowana w przypadku wyszukiwania natychmiast 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 (tj. OutlineColour ustawia tło wskazówki) (#8435).
    • CEA-708: analiza danych na potrzeby wielu bloków obsługi i ignorowanie blokad niepowiązanych z wybranym numerem usługi.
    • Usuń plik RawCcExtractor, który był używany tylko do obsługi wewnętrznego formatu napisów Google.
  • Moduły wyodrębniania danych:
    • Dodano obsługę AVI (#2092).
    • Matroska: przeanalizuj DiscardPadding dla utworów Opus.
    • MP4: przeanalizuj szybkość transmisji bitów z boksów esds.
    • Ogg: zezwól na zduplikowane identyfikatory Opus i nagłówki komentarzy (#10038).
  • Interfejs:
    • Napraw dostarczanie zdarzeń do OnClickListener ustawionych na PlayerView, jeśli useController=false(#9605). Poprawiono też wyświetlanie zdarzeń do OnLongClickListener we wszystkich konfiguracjach widoku.
    • Rozwiązanie problemu z nieprawidłowym traktowaniem sekwencji zdarzeń dotknięcia, które wychodzą z granic zbioru PlayerView przed ACTION_UP, jako kliknięcia (#9861).
    • Rozwiązaliśmy problem z ułatwieniami dostępu w usłudze PlayerView, który polegał na tym, że kliknięcie może spowodować przełączenie odtwarzania zamiast ukrycia elementów sterujących (#8627).
    • Przeredaguj TrackSelectionView i TrackSelectionDialogBuilder, aby działały w interfejsie Player zamiast ExoPlayer. Dzięki temu widoki mogą być używane z innymi implementacjami Player, a zależność między modułem interfejsu a modułem ExoPlayer zostaje usunięta. To przełomowa zmiana.
    • 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 AudioChannelConfiguration DTS. Spowoduje to ponowne włączenie przekazywania dźwięku w strumieniach DTS (#10159).
    • Nie zezwalaj na przekazywanie danych null do DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. Instancje DefaultCompositeSequenceableLoaderFactory można przekazywać w sposób jawny w razie potrzeby.
  • HLS:
    • Wróć do szczegółowego przygotowania, 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.
  • Płynne strumieniowanie:
    • Nie zezwalaj na przekazywanie danych null do SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. W razie potrzeby instancje DefaultCompositeSequenceableLoaderFactory można przekazać jawnie.
  • RTSP:
    • Dodaj czytnik RTP dla H263 (#63).
    • Dodaj czytnik RTP dla MPEG4 (#35).
    • Dodaj czytnik RTP na potrzeby HEVC (#36).
    • Dodaj czytnik RTP na potrzeby AMR. Obecnie obsługiwane są tylko jednokanałowe, nieprzeplatane strumienie AMR. Złożony ładunek RTP AMR nie jest obsługiwany. (nr 46).
    • Dodaj czytnik RTP dla VP8 (#47).
    • Dodaj czytnik RTP na potrzeby WAV (#56).
    • Popraw nagłówek podstawowej autoryzacji RTSP. (#9544).
    • Przestań sprawdzać obowiązkowe pola 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.
    • Obejście problemu z przerwami w obsłudze przerw w OkHttp.
  • Sesja:
    • Zastąp MediaSession.MediaItemFiller wartością MediaSession.Callback.onAddMediaItems, aby umożliwić asynchroniczne rozpoznawanie żądań.
    • Obsługuj metody setMediaItems(s), gdy MediaController łączy się ze starszą sesją multimediów.
    • Usuń MediaController.setMediaUri i MediaSession.Callback.onSetMediaUri. Tę samą funkcję można osiągnąć za pomocą właściwości MediaController.setMediaItem i MediaSession.Callback.onAddMediaItems.
    • Przekierowuj starsze połączenia MediaController, aby odtwarzać multimedia na MediaSession.Callback.onAddMediaItems zamiast onSetMediaUri.
    • Aby dostosować powiadomienie, dodaj MediaNotification.Provider i DefaultMediaNotificationProvider.
    • Aby pobrać obrazy dzieł sztuki, dodaj BitmapLoader i SimpleBitmapLoader.
    • Dodaj MediaSession.setCustomLayout(), by 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.
    • Napraw NPE w MediaControllerImplLegacy (#59).
    • Zaktualizuj informacje o pozycji sesji w przypadku zmiany osi czasu(nr 51).
    • Napraw NPE w MediaControllerImplBase po zwolnieniu kontrolera (#74).
  • Odtwarzanie reklam / IMA:
    • Zmniejsz częstotliwość odpytywania reklam z co 100 do 200 ms, aby dostosować ustawienia do rekomendacji 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ń wycofane symbole:
    • Usuń Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Użyj w zamian zasady Player.Listener.onTracksChanged(Tracks).
    • Usuń Player.getCurrentTrackGroups i Player.getCurrentTrackSelections. Użyj w zamian zasady Player.getCurrentTracks. Możesz też nadal używać metod ExoPlayer.getCurrentTrackGroups i ExoPlayer.getCurrentTrackSelections, ale te metody pozostają wycofane.
    • 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). Użyj w zamian zasady DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Usuń Transformer.Builder.setContext. Wartość Context powinna zostać przekazana 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-alfa03 zawiera te zatwierdzenia.

Odpowiada to wersji ExoPlayer 2.17.1.

  • Dźwięk:
    • Usunęliśmy błąd podczas sprawdzania funkcji audio Dolby Atmos (E-AC3-JOC) w HLS.
  • Moduły wyodrębniania danych:
    • 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 interakcję SingleSampleMediaSource.Factory.setTrackId i MediaItem.SubtitleConfiguration.Builder.setId, aby nadać priorytet polu SubtitleConfiguration, i wróć do wartości Factory, jeśli nie jest ustawiona (#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.

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

Odpowiada to wersji ExoPlayer 2.17.0.

  • Biblioteka podstawowa:
    • Dodaj chronioną metodę DefaultRenderersFactory.getCodecAdapterFactory(), aby podklasy klasy DefaultRenderersFactory, które zastępują buildVideoRenderers() lub buildAudioRenderers(), miały dostęp do fabryki kodeka i przekazywały ją do MediaCodecRenderer utworzonych przez siebie instancji.
    • Propaguj pola nagłówka ICY name i genre odpowiednio do MediaMetadata.station i MediaMetadata.genre, aby użytkownicy docierali do aplikacji przez Player.Listener.onMediaMetadataChanged() (#9677).
    • Usuń klucze null z DefaultHttpDataSource#getResponseHeaders.
    • Uśpienie i ponowienie próby, jeśli nie uda się utworzyć instancji MediaCodec. Pozwala to obejść problem, który występuje na niektórych urządzeniach przy przełączaniu platformy z bezpiecznego kodeka na inny kodek (#8696).
    • Dodaj MediaCodecAdapter.getMetrics(), aby umożliwić użytkownikom uzyskiwanie danych z usługi MediaCodec. (#9766).
    • Napraw rozwiązywanie 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 profil SimpleExoPlayer.renderers jako prywatny. Mechanizmy renderowania są dostępne na stronie ExoPlayer.getRenderer.
    • Zaktualizowaliśmy niektóre stałe AnalyticsListener.EventFlags, by pasowały do wartości w tabeli Player.EventFlags.
    • Podziel AnalyticsCollector na interfejs i domyślną implementację, aby umożliwić usunięcie go przez R8, gdy aplikacja jej nie potrzebuje.
  • Wybór ścieżki:
    • Obsługuj flagi preferowanych ról wideo przy wyborze utworu (#9402).
    • Zaktualizuj logikę wyboru ścieżki wideo, aby podczas wybierania wielu ścieżek wideo do adaptacji uwzględniała preferowane typy MIME i flagi ról (#9519).
    • Zaktualizuj logikę wyboru ścieżki wideo i ścieżki audio, aby wybierać tylko te formaty w przypadku wyborów adaptacyjnych o tym samym poziomie 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).
    • Wybieraj treści audio (np. „domyślna” ścieżka dźwiękowa lub ścieżka w języku systemu operacyjnego) zamiast technicznych ograniczeń 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).
    • Nie zezwalaj na duplikaty komponentów TrackGroup w atrybucie TrackGroupArray. Elementy TrackGroup można zawsze odróżnić, ustawiając element id w konstruktorze TrackGroup. Rozwiązano problem, który występował podczas wznawiania odtwarzania po uruchomieniu aplikacji w tle z zastąpieniem aktywnej ś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:
    • Napraw logikę zastępczą dekodera w Dolby Vision, by w razie potrzeby używać zgodnego dekodera H264/H265.
  • Dźwięk:
    • Napraw logikę działania awaryjnego dekodera dla Dolby Atmos (E-AC3-JOC), aby w razie potrzeby używać zgodnego dekodera E-AC3.
    • Zmień interfejsy API AudioCapabilities tak, aby wymagały jawnego przekazywania AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES zamiast null.
    • Możesz dostosować obliczenie rozmiaru bufora AudioTrack, wstawiając wartość AudioTrackBufferSizeProvider do DefaultAudioSink. (#8891).
    • Jeśli żądany rozmiar bufora przekracza 1 MB, ponów próbę utworzenia pliku AudioTrack. (#9712).
  • Moduły wyodrębniania danych:
    • WAV: dodanie obsługi strumieni RF64 (#9543).
    • Napraw nieprawidłową analizę jednostek NAL H.265 SPS (#9719).
    • Analizuj komentarze 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).
    • Nie zezwalaj usłudze Cea708Decoder na odczyt większego rozmiaru bloku usługi niż zadeklarowany.
  • DRM:
    • Usuń playbackLooper z konta DrmSessionManager.(pre)acquireSession. Gdy aplikacja DrmSessionManager jest używana przez aplikację w niestandardowym elemencie MediaSource, zamiast tego do DrmSessionManager.setPlayer należy przekazać playbackLooper.
  • Odtwarzanie reklam / IMA:
    • Dodaj obsługę dynamicznego wstawiania reklam (DAI) IMA (#8213).
    • Dodaj metodę do AdPlaybackState, aby umożliwić zresetowanie grupy reklam i jej ponowne odtworzenie (#9615).
    • Egzekwuj szybkość odtwarzania wynoszącą 1,0 podczas odtwarzania reklamy (#9018).
    • Rozwiązanie problemu polegającego na tym, że w przypadku grupy reklam, której nie udało się wczytać, odtwarzanie zostało natychmiast zresetowane (#9929).
  • Interfejs:
    • Popraw kolor cyfr w przyciskach przewijania do tyłu i do przodu w usłudze StyledPlayerView podczas korzystania z niektórych motywów (#9765).
    • Poprawnie przetłumacz 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).
    • Przestań interpretować rolę ścieżki main jako C.SELECTION_FLAG_DEFAULT.
    • Napraw zasadę wykluczania podstawowego adresu URL w przypadku plików manifestu, które nie deklarują przestrzeni nazw DVB (#9856).
    • Obsługuj względne adresy URL typu MPD.Location (#9939).
  • HLS:
    • Prawidłowo wypełnij pole Format.label w przypadku strumieni HLS tylko audio (#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ługuj precyzyjne przewijanie klatki kluczowej w HLS (#2882).
  • RTSP:
    • Udostępnij interfejs API klienta, aby zastąpić identyfikator SocketFactory używany w przypadku każdego połączenia z serwerem (#9606).
    • Preferuj metodę uwierzytelniania DIGEST zamiast metody PODSTAWOWEJ, jeśli obie są obecne (#9800).
    • Obsługa, gdy czas ścieżki RTSP jest niedostępny (#9775).
    • Zignoruj nieprawidłowe wartości nagłówka RTP-Info (#9619).
  • Transformer:
    • Zwiększ wymaganą wersję interfejsu API min. do 21.
    • TransformationException służy teraz do opisywania błędów występujących podczas przekształcania.
    • Dodaj TransformationRequest, aby określić opcje przekształcenia.
    • Zezwalaj na rejestrowanie wielu detektorów.
    • Rozwiązywanie problemów z blokowaniem Transformera, gdy dane wyjściowe kodeka są częściowo odczytywane.
    • Popraw potencjalny NPE w Transformer.getProgress podczas zwalniania żądań Muxer.
    • Dodaj aplikację w wersji demonstracyjnej do stosowania przekształceń.
  • Rozszerzenie MediaSession:
    • Domyślnie MediaSessionConnector 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ługuj metadane audio, w tym grafikę za pomocą funkcji DefaultMediaItemConverter(#9663).
  • Rozszerzenie FFmpeg:
    • Spraw, aby funkcja build_ffmpeg.sh zależała od 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 są niezgodne z aplikacjami kierowanymi na Androida 12 i podczas tworzenia aplikacji PendingIntent ulegają awarii z IllegalArgumentException (#9528).
  • Usuń wycofane symbole:
    • Usuń Player.EventListener. Użyj w zamian zasady Player.Listener.
    • Usuń MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory i MediaSourceFactory#setDrmUserAgent. Użyj MediaSourceFactory#setDrmSessionManagerProvider.
    • Usuń MediaSourceFactory#setStreamKeys. Użyj MediaItem.Builder#setStreamKeys.
    • Usuń MediaSourceFactory#createMediaSource(Uri). Użyj MediaSourceFactory#createMediaSource(MediaItem).
    • Usuń setTag z usług DashMediaSource, HlsMediaSource i SsMediaSource. Użyj w zamian zasady MediaItem.Builder#setTag.
    • Usuń DashMediaSource#setLivePresentationDelayMs(long, boolean). Użyj 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. Nie można już zrezygnować z egzekwowania zasad.
    • Usuń ActionFile i ActionFileUpgradeUtil. 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. Użyj konstruktora ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • Usuń ProgressiveMediaSource.Factory#setTag oraz ProgressiveMediaSource.Factory#setCustomCacheKey. Zamiast nich używaj MediaItem.Builder#setTag i MediaItem.Builder#setCustomCacheKey.
    • Usuń konstruktory DefaultRenderersFactory(Context, @ExtensionRendererMode int) i DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Zamiast tego używaj konstruktora DefaultRenderersFactory(Context) oraz DefaultRenderersFactory#setExtensionRendererMode i DefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Usuń wszystkie publiczne konstruktory CronetDataSource. Użyj CronetDataSource.Factory.
  • Zmień tylko IntDefs na @Target(TYPE_USE). Może to zakłócić kompilację przypadków użycia w kotlinie, co można poprawić, przenosząc adnotację do typu (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags (w com.google.android.exoplayer2.ext.flac pakiecie)
    • @FlacExtractor.Flags (w com.google.android.exoplayer2.extractor.flac pakiecie)
    • @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

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

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 na Androida na poziomie aplikacji, który można łatwo dostosować i rozszerzyć.
  • Funkcja sesji multimediów, aby pokazać i kontrolować odtwarzanie. Ten nowy moduł sesji korzysta z tego samego interfejsu Player co ExoPlayer.
  • Komponenty do tworzenia interfejsów do odtwarzania multimediów.
  • Funkcja pakowania modułów w innych bibliotekach do użytku z ExoPlayer, np. wstawiania reklam za pomocą pakietu IMA SDK.

Więcej informacji znajdziesz w projekcie GitHub Media3.

Oprogramowanie ExoPlayer było wcześniej hostowane w oddzielnym projekcie GitHub. W Media3 nazwa pakietu to androidx.media3.exoplayer. Planujemy dalej obsługiwać projekt GitHub ExoPlayer i udostępniać go przez jakiś czas, aby dać aplikacjom czas na migrację do Media3. Media3 ma zamienniki wszystkich modułów ExoPlayer z wyjątkiem starszych rozszerzeń media2 i mediasession, które zostały zastąpione nowym modułem media3-session. Zapewnia to bezpośrednią integrację między odtwarzaczami a sesjami multimediów bez konieczności używania adaptera/klasy łącznika.