Media3

Support-Bibliotheken für Media-Anwendungsfälle.
Letzte Aktualisierung Stabile Version Releasekandidat Beta-Ausgabe Alpharelease
2. Juli 2025 1.7.1 - 1.8.0-beta01 1.8.0-alpha01

Abhängigkeiten deklarieren

Wenn Sie eine Abhängigkeit von Media3 hinzufügen möchten, müssen Sie Ihrem Projekt das Google Maven-Repository hinzufügen. Weitere Informationen finden Sie im Maven-Repository von Google.

Fügen Sie der Datei build.gradle für Ihre App oder Ihr Modul die Abhängigkeiten für die benötigten Artefakte hinzu:

Cool

dependencies {
    def media3_version = "1.6.1"

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

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

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

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

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

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

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

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

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

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

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

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

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

Kotlin

dependencies {
    val media3_version = "1.6.1"

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

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

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

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

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

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

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

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

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

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

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

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

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

Weitere Informationen zu Abhängigkeiten finden Sie unter Build-Abhängigkeiten hinzufügen.

Feedback

Ihr Feedback hilft uns, Jetpack zu verbessern. Im Media3-Issue-Tracker finden Sie Antworten auf Fragen, bekannte Probleme und Funktionsanfragen. Außerdem können Sie dort neue Probleme melden.

Version 1.8.0

Version 1.8.0-beta01

2. Juli 2025

androidx.media3:media3-*:1.8.0-beta01 wird veröffentlicht. Version 1.8.0-beta01 enthält diese Commits.

  • Gemeinsame Mediathek:
    • Unterstützung für das Ersetzen des Players in ForwardingSimpleBasePlayer hinzugefügt.
  • ExoPlayer:
    • Unterstützung für die Verwendung der virtuellen Geräte-ID aus dem Context, die an ExoPlayer.Builder übergeben wird, hinzufügen.
    • Dynamische Planung im Scrubbing-Modus standardmäßig aktivieren
    • Vermeide unnötiges Neuladen einer Quelle, wenn du zum Ende eines Elements springst.
    • Standardmäßig MediaCodec.BUFFER_FLAG_DECODE_ONLY im Scrubbing-Modus verwenden
    • Wird IllegalStateException ausgelöst, wenn PreloadMediaSource von einem ExoPlayer mit einem Wiedergabethread wiedergegeben wird, der sich vom Preload-Thread unterscheidet (#2495).
    • cloneAndMove zu ShuffleMode mit einer Standardimplementierung hinzufügen (#2226).
    • Das Standardverhalten von Renderer.getMinDurationToProgressUs wird so geändert, dass ein größerer Wert zurückgegeben wird, wenn kein Aufruf von render erforderlich ist.
    • Es wurde ein Fehler behoben, durch den die interne Planung den letzten Frame verzögerte, wenn während der Pause zum Ende gesucht wurde. Der Fehler wird derzeit nur behoben, wenn ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled aktiviert ist.
  • Transformer:
    • CodecDbLite hinzugefügt, um chipsatzspezifische Optimierungen der Video-Codierungseinstellungen zu ermöglichen.
    • Fügen Sie dem DefaultEncoderFactory das Flag setEnableCodecDbLite hinzu, um die Optimierung der CodecDB Lite-Einstellungen zu aktivieren. Dieses Flag ist standardmäßig auf „false“ gesetzt.
  • Extraktoren:
    • Unterstützung für das Suchen in fragmentierten MP4-Dateien mit mehreren sidx-Atomen hinzugefügt. Dieses Verhalten kann mit dem Flag FLAG_MERGE_FRAGMENTED_SIDX auf FragmentedMp4Extractor aktiviert werden (#9373).
    • Leere Suchtabellen in FLAC-Dateien (einschließlich solcher, die nur Platzhalter-Suchpunkte enthalten) werden ignoriert und es wird auf die binäre Suche zurückgegriffen, wenn die Dauer der Datei bekannt ist (#2327).
    • Die Verarbeitung von H.265-SEI-Einheiten wurde korrigiert, sodass unbekannte SEI-Typen vollständig übersprungen werden. (#2456)
    • Aktualisieren Sie WavExtractor, damit die SubFormat-Daten der Header-Erweiterung für das Audioformat verwendet werden, wenn eine Datei vom Typ WAVE_FORMAT_EXTENSIBLE geparst wird.
    • MP4: Unterstützung für die Felder ipcm und fpcm zum Definieren von PCM-Rohaudiotracks (64-Bit-Gleitkomma-PCM wird nicht unterstützt).
    • MP4: Verarbeiten Sie den Rotationsanteil von tkhd-Transformationsmatrizen, die das Video sowohl drehen als auch spiegeln. So wird dafür gesorgt, dass mit der nach vorn gerichteten iPhone-Kamera aufgenommene gespiegelte Videos richtig ausgerichtet, aber falsch an der Y-Achse gespiegelt werden (#2012).
  • Audio:
    • Unterstützung für alle linearen PCM-Beispielformate in ChannelMappingAudioProcessor und TrimmingAudioProcessor hinzugefügt.
    • Unterstützung für Audio-Lücken in CompositionPlayer hinzugefügt.
    • Entferne den fälschlichen Anruf an BaseAudioProcessor#flush() von BaseAudioProcessor#reset().
  • Video:
    • Die reibungslose Videobildwiedergabe beim Start wurde verbessert, wenn Audio-Samples nicht genau an der angeforderten Position beginnen.
    • Die Problemumgehung für abgelöste Oberflächen wurde auf Realme-Geräte ausgeweitet (#2059).
  • Text:
    • Ein Wiedergabestopp wurde behoben, der auftrat, wenn ein Untertitelsegment zuerst nicht geladen werden konnte, später aber erfolgreich geladen wurde, gefolgt von mehreren leeren Untertitelsegmenten (#2517).
  • Metadaten:
    • Die Unterstützung für das Abrufen der Medienlänge und von Timeline für MetadataRetriever wurde hinzugefügt und zur instanzbasierten AutoCloseable API migriert. Verwenden Sie die neue Builder, um eine Instanz für eine MediaItem zu erstellen. Rufen Sie dann retrieveTrackGroups(), retrieveTimeline() und retrieveDurationUs() auf, um ListenableFutures für die Metadaten abzurufen. Die bisherigen statischen Methoden sind jetzt veraltet (#2462).
  • Bild:
    • Beschränken Sie die decodierten Bitmaps auf die Displaygröße in BitmapFactoryImageDecoder, um zu vermeiden, dass eine App mit Canvas: trying to draw too large bitmap. aus PlayerView abstürzt, wenn versucht wird, sehr große Bilder (z.B. 50 MP) anzuzeigen.
    • Ändern Sie die Signatur von DefaultRenderersFactory.getImageDecoderFactory(), sodass sie einen Context-Parameter akzeptiert.
    • Richten Sie die maximale Bitmap-Ausgabegröße, die in CompositionPlayer verwendet wird, an der Größe aus, die bereits in Transformer verwendet wird. Das bedeutet, dass bei CompositionPlayer die Displaygröße beim Decodieren von Bitmaps nicht berücksichtigt wird, anders als bei ExoPlayer.
  • Muxer:
    • Ein Fehler wurde behoben, durch den für Audio-Samples in fragmentierten MP4-Dateien nicht die richtigen Sample-Flags festgelegt wurden.
  • Sitzung:
    • Es wurde ein Fehler behoben, bei dem der Aufruf von setSessionExtras über den Hauptthread beim Ausführen des Players über einen anderen Anwendungs-Thread als den Hauptthread zu einem IllegalStateException geführt hat (#2265).
    • Benachrichtigungen werden nicht automatisch angezeigt, wenn ein Player mit Media-Elementen eingerichtet wird, ohne sie vorzubereiten oder abzuspielen (#2423https://github.com/androidx/media/issues/2423). Dieses Verhalten kann über MediaSessionService.setShowNotificationForIdlePlayer konfiguriert werden.
    • Fügen Sie allen oder ausgewählten Controllern benutzerdefinierte PlaybackException hinzu.
    • Ein Fehler wurde behoben, durch den das Suchen in einem Livestream auf einem MediaController zu einem IllegalArgumentException führen konnte.
    • Bei Livestreams solltest du keine Wiedergabeposition mehr veröffentlichen und die Möglichkeit zum Suchen im aktuellen Element für Media-Controller der Plattform deaktivieren, um Positionsartefakte in der Android Auto-Benutzeroberfläche (und anderen Controllern, die diese Informationen aus der Media-Sitzung der Plattform verwenden) zu vermeiden (#1758).
  • Cronet-Erweiterung:
    • Automatische Cookie-Verarbeitung hinzufügen (#5975).
  • HLS-Erweiterung:
    • Die Playlist-Analyse wurde korrigiert, sodass \f (Seitenvorschub) in Attributwerten mit Anführungszeichen akzeptiert wird (#2420).
    • Unterstützung für das Aktualisieren von Interstitials mit derselben ID (#2427).
    • Ein Fehler wurde behoben, bei dem Fehler beim Laden von Playlists manchmal nicht weitergegeben wurden, wenn bei einem Livestream keine Segmente mehr zum Laden vorhanden waren (#2401https://github.com/androidx/media/issues/2401).
    • Untertitel-Renditionen nach NAME-Tag gruppieren, ähnlich wie Audio-Renditionen bereits gruppiert werden (#1666).
  • DASH-Erweiterung:
    • Es wurde ein Fehler behoben, bei dem das Verkürzen der Dauer eines DASH-Zeitraums eine Ausnahme auslösen konnte, wenn Samples über die neue Dauer hinaus bereits von der Rendering-Pipeline gelesen wurden (#2440).
    • Ein Fehler wurde behoben, bei dem Weiterleitungen bei Verwendung von CMCD-Suchparametern nicht gefolgt wurde (#2475).
  • RTSP-Erweiterung:
    • Der Fehler RtspClient wurde behoben, sodass der Standort-URI verwendet wird, der bei der Verarbeitung einer HTTP 302-Antwort angegeben wurde (#2398).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Fehler behoben, bei dem DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange keine Auswirkungen auf Audio-Decoder-Erweiterungen hatte (#2258).
  • Cast-Erweiterung:
    • Unterstützung für setVolume() und getVolume() hinzugefügt (#2279).
    • Verhindern, dass CastPlayer in den STATE_BUFFERING wechselt, wenn die Zeitachse leer ist.
  • Test-Tools:
    • Fügen Sie advance(player).untilPositionAtLeast und untilMediaItemIndex zu TestPlayerRunHelper hinzu, um den Spieler voranzubringen, bis eine bestimmte Position erreicht ist. In den meisten Fällen sind diese Methoden zuverlässiger als die vorhandenen untilPosition- und untilStartOfMediaItem-Methoden.
    • Verschieben Sie FakeDownloader in das Modul test-utils-robolectric, damit es in anderen Tests wiederverwendet werden kann.

Version 1.8.0-alpha01

19. Mai 2025

androidx.media3:media3-*:1.8.0-alpha01 wird veröffentlicht. Version 1.8.0-alpha01 enthält diese Commits.

  • ExoPlayer:
    • Die Methode ExoPlayer.setScrubbingModeEnabled(boolean) wurde hinzugefügt. Dadurch wird der Player für viele häufige Suchvorgänge optimiert, z. B. wenn ein Nutzer einen Scrubbing-Balken zieht. Das Verhalten des Scrubbing-Modus kann mit setScrubbingModeParameters(..) auf ExoPlayer und ExoPlayer.Builder angepasst werden.
    • Anpassen der Toleranz für die Suche nach Bruchteilen im Scrubbing-Modus zulassen.
    • Die Codec-Betriebsrate im Scrubbing-Modus wurde erhöht.
    • Es wurde ein Fehler behoben, bei dem Vorbereitungsfehler im Inhalt von AdsMediaSource möglicherweise nie gemeldet wurden (#2337).
    • Speicherleck in MergingMediaSource behoben, das z. B. beim Sideloading von Untertiteln verwendet wird (#2338).
    • Ermögliche, dass CmcdConfiguration.Factory null zurückgibt, um das CMCD-Logging für bestimmte Media-Elemente zu deaktivieren (#2386).
    • Die Standardpuffergröße für Bilder wurde von 128 KB (Kopierfehler aus Text-Tracks) auf 26 MB erhöht. Das reicht für Ultra-HDR-Bilder mit 50 MP aus (#2417).
    • Füge PreCacheHelper hinzu, damit Apps ein einzelnes Medium mit einer bestimmten Startposition und Dauer vorab im Cache speichern können.
  • Transformer:
    • Wenn Sie eine anfängliche Lücke (die über addGap() hinzugefügt wurde) mit stummem Audio füllen möchten, müssen Sie jetzt experimentalSetForceAudioTrack(true) in EditedMediaItemSequence.Builder explizit festlegen. Wenn sich die Lücke in der Mitte der Sequenz befindet, ist dieses Flag nicht erforderlich.
    • Verschieben Sie die Muxer-Schnittstelle von media3-transformer nach media3-muxer.
    • Die Einstellung MediaItem.Builder().setImageDuration(long) ist jetzt erforderlich, um ein Media-Element als Bild zu importieren.
    • Füge Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean) hinzu. Diese enthält eine MP4-Schnittliste, die den Playern mitteilt, dass sie Samples zwischen dem Keyframe vor dem Schnittstartpunkt und dem Schnittstartpunkt ignorieren sollen.
    • Die Composition Demo-App wurde aktualisiert, um Kotlin und Jetpack Compose zu verwenden. Außerdem wurde ein benutzerdefiniertes VideoCompositorSettings hinzugefügt, um Sequenzen in einem 2×2- oder BiB-Layout anzuordnen.
  • Extraktoren:
    • MP3: Verwenden Sie Dauer und Datengröße aus nicht suchbaren Xing-, VBRI- und ähnlichen Metadaten mit variabler Bitrate, wenn aufgrund von FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194) auf die Suche mit konstanter Bitrate zurückgegriffen wird.
  • Audio:
    • Konstantes Power-Upmixing/Downmixing in DefaultAudioMixer zulassen.
    • ChannelMappingAudioProcessor, TrimmingAudioProcessor und ToFloatPcmAudioProcessor öffentlich machen (#2339).
    • Verwenden Sie AudioTrack#getUnderrunCount() in AudioTrackPositionTracker, um Unterläufe in DefaultAudioSink zu erkennen, anstatt eine Schätzung nach dem Best-Effort-Prinzip zu verwenden.
    • Die Glättung von Audio-Zeitstempeln wurde verbessert, um unerwartete Positionsabweichungen des Audioausgabegeräts zu berücksichtigen.
    • Es wurde ein Fehler behoben, bei dem die A/V-Synchronisierung in den ersten 10 Sekunden nach dem Fortsetzen der Wiedergabe nach einer Pause unterbrochen wurde, wenn das Gerät mit Bluetooth-Geräten verbunden war.
    • Es wurde ein Fehler behoben, durch den für AnalyticsListener.onAudioPositionAdvancing nicht die Zeit angegeben wurde, zu der die Audioausgabe begonnen hat, sondern die Zeit der ersten Messung.
  • Video:
    • Experimentelle ExoPlayer-API hinzugefügt, um das Flag MediaCodec.BUFFER_FLAG_DECODE_ONLY beim Einreihen von Eingabepuffern nur für die Decodierung zu verwenden. Dieses Flag weist den Decoder an, die reinen Decodierungspuffer zu überspringen, was zu einem schnelleren Suchen führt. Aktivieren Sie die Funktion mit DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag.
    • Verbesserte Codec-Leistungsprüfungen für Software-Video-Codecs. Dies kann dazu führen, dass einige zusätzliche Tracks als EXCEEDS_CAPABILITIES markiert werden.
    • Problem behoben, bei dem es auf einigen Geräten zu VP9 Widevine-Wiedergabefehlern kam (#2408).
  • Text:
    • Das Problem, dass bei SSA- und SubRip-Dateien kein Cue für den Fortschritt angezeigt wurde, wenn Untertitel aktiviert wurden, wurde behoben (#2309).
    • Das Problem, dass die Wiedergabe beim Wechsel von einem Stream mit Untertitel-Fehler zu einem Livestream mit einem leeren Untertitel-Track hängen bleibt, wurde behoben (#2328).
    • Es wurde ein Problem behoben, bei dem CEA-608-Untertitel bei der Wiedergabe von H.262-Streams mit B-Frames verstümmelt dargestellt wurden (#2372).
    • Unterstützung für SSA-Untertitel mit CodecId = S_TEXT/SSA in Matroska-Dateien hinzugefügt. Bisher wurde in MatroskaExtractor nur CodecId = S_TEXT/ASS unterstützt, was die „erweiterte“ (v4+) Variante von SubStation Alpha-Untertiteln darstellen soll. Die Parsing-Logik von ExoPlayer ist jedoch für beide Varianten gleich (#2384).
    • Unterstützung für das Attribut layer in SubStation Alpha-Untertiteldateien (SSA) hinzugefügt, mit dem die Z-Reihenfolge von Cues definiert wird, wenn mehrere gleichzeitig auf dem Bildschirm angezeigt werden (#2124).
  • Wirkung:
    • Fügen Sie Presentation.createForShortSide(int) hinzu, um ein Presentation zu erstellen, bei dem die kürzeste Seite immer dem angegebenen Wert entspricht, unabhängig von der Ausrichtung der Eingabe.
  • Muxer:
    • Die writeSampleData() API verwendet jetzt die muxerspezifische BufferInfo-Klasse anstelle von MediaCodec.BufferInfo.
    • Fügen Sie Muxer.Factory#supportsWritingNegativeTimestampsInEditList hinzu, das standardmäßig auf „false“ gesetzt ist.
  • IMA-Erweiterung:
    • Ein Fehler wurde behoben, durch den ein Ladefehler in einer Anzeige versehentlich eine andere Anzeigengruppe ungültig machen konnte.
    • Es wurde ein Fehler behoben, durch den die Wiedergabe von Anzeigengruppen nach dem Ende eines VOD-Fensters unterbrochen wurde. Anzeigengruppen mit einer Startzeit nach dem Zeitraum werden nicht mehr in die MediaPeriodQueue eingereiht (#2215).
  • Sitzung:
    • Es wurde ein Fehler behoben, bei dem das Übergeben von „null“ in getLibraryRoot einer MediaBrowser, die mit einer Legacy-MediaBrowserServiceCompat verbunden ist, zu einer NullPointerException führte.
    • Ein Fehler wurde behoben, durch den die alte Sitzungs-App beim Senden benutzerdefinierter Aktionen, eines Suchergebnisses oder einer „getItem“-Anfrage mit einem ClassNotFoundException abgestürzt ist.
    • Es wurde ein Fehler behoben, durch den MediaItem.LocalConfiguration.uri für die MediaMetadata der Plattform-Sitzungen freigegeben wurde. Wenn Sie einen URI absichtlich freigeben möchten, damit Controller die Medien noch einmal anfordern können, legen Sie stattdessen MediaItem.RequestMetadata.mediaUri fest.
  • UI:
    • Es wurde ein Fehler in Compose behoben, der zu einer Lücke zwischen dem Festlegen der anfänglichen Schaltflächenstatus und dem Beobachten der Statusänderung (z.B. Symbolformen oder Aktivierung) geführt hat. Änderungen, die außerhalb des Beobachtungszeitraums am Player vorgenommen wurden, werden jetzt berücksichtigt (#2313).
    • Fügen Sie dem media3-ui-compose-Modul Status-Holder und Composables für SeekBackButtonState und SeekForwardButtonState hinzu.
    • Unterstützung für den Scrubbing-Modus von ExoPlayer für PlayerControlView hinzugefügt. Wenn diese Option aktiviert ist, wird der Player in den Scrubbing-Modus versetzt, sobald der Nutzer beginnt, die Scrubbing-Leiste zu ziehen. Bei jeder Bewegung wird ein player.seekTo-Aufruf ausgegeben. Der Scrubbing-Modus wird beendet, wenn der Nutzer den Finger vom Bildschirm nimmt. Diese Integration kann entweder mit time_bar_scrubbing_enabled = true in XML oder mit der Methode setTimeBarScrubbingEnabled(boolean) aus Java/Kotlin aktiviert werden.
    • PlayerSurface soll ein Argument vom Typ „nullable“ Player akzeptieren.
  • Downloads:
    • Unterstützung für partielle Downloads für progressive Streams hinzugefügt. Apps können mit DownloadHelper einen progressiven Stream vorbereiten und mit Angabe der Start- und Endpositionen der zeitbasierten Medien, die der Download abdecken soll, eine DownloadRequest vom Helfer anfordern. Die zurückgegebene DownloadRequest enthält den aufgelösten Bytebereich, mit dem ein ProgressiveDownloader erstellt und der Inhalt entsprechend heruntergeladen werden kann.
    • Fügen Sie DownloadHelper.Factory hinzu, durch die die statischen DownloadHelper.forMediaItem()-Methoden ersetzt werden.
    • Fügen Sie Factory für SegmentDownloader-Implementierungen hinzu.
    • Unterstützung für partielle Downloads für adaptive Streams hinzugefügt. Apps können einen adaptiven Stream mit DownloadHelper vorbereiten und eine DownloadRequest vom Helfer anfordern, indem sie die zeitbasierten Start- und Endpositionen der Medien angeben, die der Download abdecken soll. Der zurückgegebene DownloadRequest enthält den aufgelösten Zeitraum, mit dem ein konkreter SegmentDownloader erstellt und der Inhalt entsprechend heruntergeladen werden kann.
  • HLS-Erweiterung:
    • Unterstützung von X-ASSET-LIST und Livestreams mit HlsInterstitialsAdsLoader.
  • RTSP-Erweiterung:
    • Unterstützung für das Parsen von SessionDescriptions mit Zeilen mit nachfolgenden Leerzeichen wurde hinzugefügt (#2357).
  • Cast-Erweiterung:
    • Unterstützung für getDeviceVolume(), setDeviceVolume(), getDeviceMuted() und setDeviceMuted() hinzugefügt (#2089).
  • Test-Tools:
    • transformer.TestUtil.addAudioDecoders(String...), transformer.TestUtil.addAudioEncoders(String...) und transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...) wurden entfernt. Verwenden Sie stattdessen ShadowMediaCodecConfig, um Shadow-Encoder und ‑Decoder zu konfigurieren.
    • Das Präfix „exotest“ wurde in den von ShadowMediaCodecConfig gemeldeten Codec-Namen durch „media3“ ersetzt.
  • Entfernen Sie die folgenden veralteten Symbole:
    • Der verworfene Konstruktor SegmentDownloaderSegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) und die entsprechenden Konstruktoren in den Unterklassen DashDownloader, HlsDownloader und SsDownloader wurden entfernt.
    • Die eingestellten Player.hasNext() und Player.hasNextWindow() wurden entfernt. Verwenden Sie stattdessen Player.hasNextMediaItem().
    • Die verworfene Player.next() wurde entfernt. Verwenden Sie stattdessen Player.seekToNextMediaItem().
    • Die verworfene Player.seekToPreviousWindow() wurde entfernt. Verwenden Sie stattdessen Player.seekToPreviousMediaItem().
    • Die verworfene Player.seekToNextWindow() wurde entfernt. Verwenden Sie stattdessen Player.seekToNextMediaItem().
    • Die verworfene BaseAudioProcessor wurde im Modul exoplayer entfernt. Verwende BaseAudioProcessor im Modul common.
    • Entfernen Sie den verworfenen Konstruktor MediaCodecVideoRenderer MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider).

Version 1.7.0

Version 1.7.1

16. Mai 2025

Diese Version hat denselben Code wie 1.6.1 und wird veröffentlicht, damit sie als „neuere“ Version als 1.7.0 angezeigt wird. 1.7.0 war eine Alphaversion, die versehentlich als stabil gekennzeichnet wurde (siehe unten).

Version 1.7.0

16. Mai 2025

Diese Version sollte 1.7.0-alpha01 sein, wurde aber auf maven.google. com versehentlich mit 1.7.0 (d.h.stabil) getaggt. Bitte verwenden Sie sie nicht. Sie können bei Version 1.6.1 bleiben oder auf Version 1.7.1 aktualisieren (die denselben Code wie Version 1.6.1 hat).

Version 1.6.0

1.6.1

14. April 2025

androidx.media3:media3-*:1.6.1 wird veröffentlicht. Version 1.6.1 enthält diese Commits.

  • Gemeinsame Mediathek:
    • Die Methode PlaybackParameters.withPitch(float) wurde hinzugefügt, um das Kopieren eines PlaybackParameters mit einem neuen pitch-Wert zu vereinfachen (#2257).
  • ExoPlayer:
    • Ein Problem wurde behoben, bei dem der Übergang von Media-Elementen aufgrund eines behebaren Renderer-Fehlers während der Initialisierung des nächsten Media-Elements fehlgeschlagen ist (#2229).
    • Ein Problem wurde behoben, bei dem ProgressiveMediaPeriod eine IllegalStateException auslöst, wenn PreloadMediaSource versucht, getBufferedDurationUs() aufzurufen, bevor sie vorbereitet wurde (#2315).
    • Das Senden von CmcdData in Manifestanfragen für DASH, HLS und SmoothStreaming wurde korrigiert (#2253).
    • Prüfen Sie, ob AdPlaybackState.withAdDurationsUs(long[][]) auch nach dem Entfernen von Anzeigengruppen verwendet werden kann. Der Nutzer muss weiterhin ein Array mit Zeiträumen für entfernte Anzeigengruppen übergeben, das leer oder null sein kann (#2267).
  • Extraktoren:
    • MP4: Parsen Sie alternate_group aus dem Feld tkhd und stellen Sie es als Mp4AlternateGroupData-Eintrag im Format.metadata jedes Tracks bereit (#2242).
  • Audio:
    • Ein Problem beim Offload wurde behoben, bei dem die Position beim Abspielen einer Playlist mit kurzen Inhalten hängen bleiben konnte (#1920).
  • Sitzung:
    • Das Aggregations-Zeitlimit für MediaSession-Plattform-Callbacks wurde von 500 auf 100 Millisekunden gesenkt. Außerdem wurde ein experimenteller Setter hinzugefügt, mit dem Apps diesen Wert konfigurieren können.
    • Es wurde ein Problem behoben, bei dem Benachrichtigungen wieder angezeigt wurden, nachdem sie vom Nutzer geschlossen worden waren (#2302).
    • Ein Fehler wurde behoben, bei dem in der Sitzung eine Timeline mit einem einzelnen Element zurückgegeben wurde, obwohl der umhüllte Player leer war. Das passiert, wenn der umhüllte Player COMMAND_GET_TIMELINE nicht unterstützt, COMMAND_GET_CURRENT_MEDIA_ITEM aber schon, und der umhüllte Player leer ist (#2320).
    • Ein Fehler wurde behoben, bei dem der Aufruf von MediaSessionService.setMediaNotificationProvider nach anderen Interaktionen mit dem Dienst wie setForegroundServiceTimeoutMs stillschweigend ignoriert wurde (#2305).
  • UI:
    • Aktivieren Sie PlayerSurface, um mit ExoPlayer.setVideoEffects und CompositionPlayer zu arbeiten.
    • Es wurde ein Fehler behoben, bei dem PlayerSurface nicht mit einem neuen Player neu zusammengesetzt werden konnte.
  • HLS-Erweiterung:
    • Ein Problem wurde behoben, bei dem die Chunk-Dauer in CmcdData für HLS-Media nicht festgelegt wurde. Dies führte zu einem Zusicherungsfehler bei der Verarbeitung verschlüsselter Media-Segmente (#2312).
  • RTSP-Erweiterung:
    • Unterstützung für URI mit RTSPT-Schema als Möglichkeit zum Konfigurieren der RTSP-Sitzung für die Verwendung von TCP hinzugefügt (#1484).
  • Cast-Erweiterung:
    • Unterstützung für Playlist-Metadaten hinzugefügt (#2235).

1.6.0

26. März 2025

androidx.media3:media3-*:1.6.0 wird veröffentlicht. Version 1.6.0 enthält diese Commits.

  • Gemeinsame Mediathek:
    • Fügen Sie AudioManagerCompat und AudioFocusRequestCompat hinzu, um die entsprechenden Klassen in androidx.media zu ersetzen.
    • Führen Sie ein Upgrade von Kotlin von 1.9.20 auf 2.0.20 durch und verwenden Sie das Compose Compiler Gradle-Plug-in. Aktualisieren Sie die KotlinX Coroutines-Bibliothek von Version 1.8.1 auf Version 1.9.0.
    • Entfernen Sie die Methode Format.toBundle(boolean excludeMetadata) und verwenden Sie stattdessen Format.toBundle().
    • Fehler in SimpleBasePlayer behoben, bei dem durch Festlegen eines neuen currentMediaItemIndex in State nach setPlaylist mit null MediaMetadata die Metadaten nicht neu ausgewertet werden (#1940).
    • Der Zugriff auf SimpleBasePlayer.State wird von „protected“ zu „public“ geändert, um Updates in anderen Klassen zu vereinfachen (#2128).
  • ExoPlayer:
    • MediaExtractorCompat wurde hinzugefügt, eine neue Klasse, die ähnliche Funktionen wie die Plattform MediaExtractor bietet.
    • Experimentelle Unterstützung für das Vorbereiten von ExoPlayer für die Wiedergabe mit MediaCodecVideoRenderer hinzugefügt. Sie können DefaultRenderersFactory über experimentalSetEnableMediaCodecVideoRendererPrewarming konfigurieren, um einen sekundären MediaCodecVideoRenderer bis ExoPlayer bereitzustellen. Wenn diese Option aktiviert ist, verarbeitet ExoPlayer das Video aufeinanderfolgender Media-Elemente während der Wiedergabe vorab, um die Latenz beim Übergang zwischen Media-Elementen zu verringern.
    • Reduzieren Sie die Standardwerte für bufferForPlaybackMs und bufferForPlaybackAfterRebufferMs in DefaultLoadControl auf 1.000 bzw. 2.000 ms.
    • Initialisiere DeviceInfo und die Lautstärke des Geräts asynchron (falls mit setDeviceVolumeControlEnabled aktiviert). Diese Werte sind nicht sofort nach ExoPlayer.Builder.build() verfügbar. Player.Listener benachrichtigt über Änderungen über onDeviceInfoChanged und onDeviceVolumeChanged.
    • Die ursprüngliche Audio-Sitzungs-ID ist nicht mehr sofort nach dem Erstellen des Players verfügbar. Bei Bedarf können Sie sich die erste Aktualisierung mit AnalyticsListener.onAudioSessionIdChanged vorlesen lassen.
    • Berücksichtige die Sprache bei der Auswahl eines Videotracks. Standardmäßig wird ein „Haupt“-Videotrack ausgewählt, der der Sprache des ausgewählten Audiotracks entspricht, sofern verfügbar. Explizite Einstellungen für die Videosprache können mit TrackSelectionParameters.Builder.setPreferredVideoLanguage(s) angegeben werden.
    • Fügen Sie der Methode DefaultTrackSelector.selectVideoTrack() den Parameter selectedAudioLanguage hinzu.
    • Der retryCount-Parameter wurde MediaSourceEventListener.onLoadStarted und den entsprechenden MediaSourceEventListener.EventDispatcher-Methoden hinzugefügt.
    • Ein Fehler wurde behoben, bei dem es bei Playlist-Elementen oder Zeiträumen in DASH-Streams mit mehreren Zeiträumen mit einer Dauer, die nicht mit dem tatsächlichen Inhalt übereinstimmt, am Ende des Elements zu Frame-Freezes kommen konnte (#1698).
    • Verschieben Sie BasePreloadManager.Listener in ein PreloadManagerListener auf oberster Ebene.
    • RenderersFactory.createSecondaryRenderer kann implementiert werden, um sekundäre Renderer für das Vorwärmen bereitzustellen. Durch das Vorwärmen können Medienübergänge während der Wiedergabe schneller erfolgen.
    • Das Senden von CmcdData für Manifestanfragen in adaptiven Streamingformaten wie DASH, HLS und SmoothStreaming wurde aktiviert (#1951).
    • Geben Sie MediaCodecInfo des Codecs an, der in MediaCodecRenderer.onReadyToInitializeCodec initialisiert wird (#1963).
    • Ändern Sie AdsMediaSource, damit die AdPlaybackStates durch Anhängen von Anzeigengruppen erweitert werden kann. Es wurden ungültige Änderungen erkannt, die eine Ausnahme auslösen.
    • Es wurde ein Problem behoben, durch das beim Übergang zu Inhaltsmedien nach einer Mid-Roll-Anzeige möglicherweise zusätzliche Frames nur zum Decodieren in schneller Folge angezeigt wurden.
    • DefaultRenderersFactory fügt zwei MetadataRenderer-Instanzen hinzu, damit Apps standardmäßig zwei verschiedene Metadatenschemas empfangen können.
    • Es wurde neu bewertet, ob das laufende Laden eines Chunks abgebrochen werden sollte, wenn die Wiedergabe pausiert wird (#1785).
    • Die Option ClippingMediaSource wurde hinzugefügt, um das Erstellen von Clips in nicht suchbaren Medien zu ermöglichen.
    • Ein Fehler wurde behoben, durch den das Suchen mit Pre-Warming den Übergang zum nächsten Medienelement blockieren konnte.
    • Es wurde ein Fehler behoben, durch den ExoPlayer.isLoading() true blieb, obwohl es zu STATE_IDLE oder STATE_ENDED gewechselt war (#2133).
    • Fügen Sie lastRebufferRealtimeMs zu LoadControl.Parameter hinzu (#2113).
  • Transformer:
    • Unterstützung für das Transmuxing in alternative abwärtskompatible Formate hinzugefügt.
    • Unterstützung für die Transcodierung und das Transmuxing von Dolby Vision (Profil 8) wurde hinzugefügt.
    • Aktualisieren Sie die Parameter von VideoFrameProcessor.registerInputStream und VideoFrameProcessor.Listener.onInputStreamRegistered, um Format zu verwenden.
    • Generieren Sie statische HDR-Metadaten, wenn Sie DefaultEncoderFactory verwenden.
    • Aktivieren Sie die Unterstützung für die Diagnose der Android-Plattform mit MediaMetricsManager. Der Transformer leitet Bearbeitungsereignisse und Leistungsdaten an die Plattform weiter. So können auf dem Gerät Informationen zur Systemleistung und zum Debugging bereitgestellt werden. Diese Daten können auch von Google erhoben werden, wenn der Nutzer des Geräts die Weitergabe von Nutzungs- und Diagnosedaten aktiviert hat. Apps können die Teilnahme an der Plattformdiagnose für Transformer mit Transformer.Builder.setUsePlatformDiagnostics(false) deaktivieren.
    • Teile InAppMuxer in InAppMp4Muxer und InAppFragmentedMp4Muxer auf. Mit InAppMp4Muxer wird eine nicht fragmentierte MP4-Datei erstellt, mit InAppFragmentedMp4Muxer eine fragmentierte MP4-Datei.
    • Verschieben Sie die Muxer-Schnittstelle von media3-muxer nach media3-transformer.
    • Fügen Sie MediaProjectionAssetLoader hinzu, das Medien aus einem MediaProjection für die Bildschirmaufzeichnung bereitstellt, und fügen Sie der Transformer-Demo-App Unterstützung für die Bildschirmaufzeichnung hinzu.
    • Fügen Sie #getInputFormat() der Codec-Schnittstelle hinzu.
    • Übertrage die Verantwortung für die Freigabe des GlObjectsProvider nach Möglichkeit auf den Anrufer in DefaultVideoFrameProcessor und DefaultVideoCompositor.
  • Extraktoren:
    • AVI: Die Verarbeitung von Dateien mit Audio, das mit konstanter Bitrate komprimiert wurde und bei denen im Streamheader die Anzahl der Byte anstelle der Anzahl der Chunks gespeichert ist, wurde korrigiert.
    • Die Verarbeitung von NAL-Einheiten mit Längen, die in 1 oder 2 Bytes (statt 4) ausgedrückt werden, wurde korrigiert.
    • Problem mit ArrayIndexOutOfBoundsException in MP4-Bearbeitungslisten behoben, wenn die Bearbeitungsliste mit einem nicht synchronisierten Frame ohne vorherigen synchronisierten Frame beginnt (#2062).
    • Problem behoben, bei dem TS-Streams auf einigen Geräten hängen bleiben konnten (#2069).
    • FLAC: Unterstützung für 32‑Bit-FLAC-Dateien hinzugefügt. Bisher konnten diese Inhalte mit IllegalStateException: Playback stuck buffering and not loading nicht wiedergegeben werden (#2197).
  • Audio:
    • Der Fehler wurde behoben, sodass onAudioPositionAdvancing jetzt aufgerufen wird, wenn die Wiedergabe fortgesetzt wird (zuvor wurde sie aufgerufen, wenn die Wiedergabe pausiert wurde).
    • Umgehen Sie SonicAudioProcessor nicht, wenn SpeedChangingAudioProcessor mit Standardparametern konfiguriert ist.
    • Ein Unterlauf in Sonic#getOutputSize() wurde behoben, der dazu führen konnte, dass DefaultAudioSink nicht mehr reagierte.
    • Korrigieren Sie MediaCodecAudioRenderer.getDurationToProgressUs() und DecoderAudioRenderer.getDurationToProgressUs(), damit die Suchvorgänge die angegebenen Zeiträume richtig zurücksetzen.
    • androidx.media3.common.audio.SonicAudioProcessor abschließen.
    • Unterstützung für Float-PCM zu ChannelMappingAudioProcessor und TrimmingAudioProcessor hinzufügen.
  • Video:
    • Ändere MediaCodecVideoRenderer.shouldUsePlaceholderSurface in „protected“, damit Anwendungen die Verwendung von Platzhalter-Oberflächen blockieren können (#1905).
    • Es wurde eine experimentelle ExoPlayer AV1-Beispielabhängigkeitsanalyse hinzugefügt, um das Suchen zu beschleunigen. Aktivieren Sie sie mit der neuen DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies API.
    • Es wurde eine experimentelle ExoPlayer-API hinzugefügt, um späte MediaCodecVideoRenderer-Decodereingabepuffer zu verwerfen, von denen keine Abhängigkeiten bestehen. Aktivieren Sie die Funktion mit DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs.
    • Ein Problem wurde behoben, bei dem ein Player ohne Oberfläche sofort bereit war und alle ausstehenden Frames sehr langsam decodiert wurden (#1973).
    • Xiaomi- und OPPO-Geräte aus dem Modus „Abgenommenes Display“ ausschließen, um Bildschirmflackern zu vermeiden (#2059).
  • Text:
    • Unterstützung für VobSub-Untertitel hinzugefügt (#8260).
    • Das eifrige Laden aller Untertiteldateien, die mit MediaItem.Builder.setSubtitleConfigurations konfiguriert sind, wird beendet. Stattdessen wird nur eine Datei geladen, wenn sie durch die Auswahl des Tracks ausgewählt wird (#1721).
    • TTML: Unterstützung für das Referenzieren von tts:origin und tts:extent mit style wurde hinzugefügt (#2953).
    • Beschränken Sie WebVTT- und SubRip-Zeitstempel auf genau 3 Dezimalstellen. Bisher haben wir eine beliebige Anzahl von Dezimalstellen falsch geparst, aber immer davon ausgegangen, dass der Wert in Millisekunden angegeben ist. Das hat zu falschen Zeitstempeln geführt (#1997).
    • Wiedergabe hängt, wenn eine Playlist gekürzte Elemente mit CEA-608- oder CEA-708-Untertitel enthält.
    • Fehler bei IllegalStateException behoben, wenn eine SSA-Datei einen Cue mit der Dauer null enthält (Start- und Endzeit sind gleich) (#2052).
    • Unterdrücken (und protokollieren) von Fehlern beim Parsen von Untertiteln, wenn Untertitel in denselben Container wie Audio und Video gemuxt werden (#2052).
    • Der Umgang mit Multibyte-UTF-8-Zeichen in WebVTT-Dateien mit CR-Zeilenenden wurde korrigiert (#2167).
  • DRM:
    • Der Fehler MediaCodec$CryptoException: Operation not supported in this configuration beim Abspielen von ClearKey-Inhalten auf Geräten mit API < 27 wurde behoben (#1732).
  • Wirkung:
    • Die Funktionalität von OverlaySettings wurde in StaticOverlaySettings verschoben. OverlaySettings kann abgeleitet werden, um dynamische Overlays zu ermöglichen.
  • Muxer:
    • MuxerException wurde aus der Muxer-Schnittstelle entfernt, um einen sehr langen vollständig qualifizierten Namen zu vermeiden.
    • Die Methode setSampleCopyEnabled() wurde sowohl in Mp4Muxer.Builder als auch in FragmentedMp4Muxer.Builder in setSampleCopyingEnabled() umbenannt.
    • Mp4Muxer.addTrack() und FragmentedMp4Muxer.addTrack() geben jetzt eine int-Track-ID anstelle einer TrackToken zurück.
    • Mp4Muxer und FragmentedMp4Muxer implementieren die Muxer-Schnittstelle nicht mehr.
    • Mp4Muxer-Stichproben-Batching und ‑Kopieren standardmäßig deaktivieren.
    • Ein Fehler in FragmentedMp4Muxer wurde behoben, der viele Fragmente erstellte, wenn nur der Audiotrack geschrieben wurde.
  • Sitzung:
    • Der Status des Vordergrunddiensts wird für weitere 10 Minuten beibehalten, wenn die Wiedergabe pausiert, beendet oder fehlgeschlagen ist. So können Nutzer die Wiedergabe innerhalb dieses Zeitlimits fortsetzen, ohne dass auf verschiedenen Geräten Einschränkungen für Dienste im Vordergrund drohen. Beachten Sie, dass der Aufruf von player.pause() nicht mehr verwendet werden kann, um den Dienst im Vordergrund vor stopSelf() zu beenden. Verwenden Sie stattdessen MediaSessionService.pauseAllPlayersAndStopSelf(), wenn Sie onTaskRemoved überschreiben.
    • Benachrichtigung sichtbar lassen, wenn die Wiedergabe in einen Fehler- oder Stoppstatus wechselt. Die Benachrichtigung wird nur entfernt, wenn die Playlist gelöscht oder der Player freigegeben wird.
    • Die Verarbeitung der MediaSession-Aktionen ACTION_PLAY und ACTION_PAUSE der Android-Plattform wurde verbessert. Es wird nur eine der beiden Aktionen entsprechend den verfügbaren Befehlen festgelegt und es wird akzeptiert, wenn nur eine der beiden Aktionen festgelegt ist.
    • Fügen Sie Context als Parameter zu MediaButtonReceiver.shouldStartForegroundService hinzu (#1887).
    • Es wurde ein Fehler behoben, bei dem durch den Aufruf einer Player-Methode für ein MediaController, das mit einer alten Sitzung verbunden war, Änderungen aus einem ausstehenden Update verloren gingen.
    • MediaSession.setSessionActivity(PendingIntent) akzeptiert jetzt „null“ (#2109).
    • Es wurde ein Fehler behoben, durch den eine alte Benachrichtigung sichtbar blieb, wenn die Playlist gelöscht wurde (#2211).
  • UI:
    • Fügen Sie dem media3-ui-compose-Modul Status-Holder und Composables für PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState und PlaybackSpeedState hinzu.
  • Downloads:
    • Fehler in CacheWriter behoben, durch den Datenquellen offen und Cachebereiche gesperrt bleiben, wenn die Datenquelle einen anderen Exception als IOException (#9760) ausgibt.
  • HLS-Erweiterung:
    • Fügen Sie eine erste Version von HlsInterstitialsAdsLoader hinzu. Der Anzeigen-Loader liest die HLS-Interstitials einer HLS-Mediaplaylist und ordnet sie dem AdPlaybackState zu, das an AdsMediaSource übergeben wird. Diese erste Version unterstützt nur HLS-VOD-Streams mit X-ASSET-URI-Attributen.
    • Fügen Sie HlsInterstitialsAdsLoader.AdsMediaSourceFactory hinzu. Apps können damit AdsMediaSource-Instanzen erstellen, die auf bequeme und sichere Weise ein HlsInterstitialsAdsLoader verwenden.
    • Das SUPPLEMENTAL-CODECS-Tag wird aus der HLS-Playlist geparst, um Dolby Vision-Formate zu erkennen (#1785).
    • Die Bedingung für die Suche nach zu synchronisierenden Positionen in einem HLS-Stream wurde gelockert (#2209).
  • DASH-Erweiterung:
    • AC-4 Level-4-Formatunterstützung für DASH hinzufügen (#1898).
    • Problem bei der Berechnung des Updateintervalls für das Einfügen von Anzeigen in Live-Streams mit mehreren Zeiträumen behoben (#1698).
    • Das Attribut scte214:supplementalCodecs wird aus dem DASH-Manifest geparst, um Dolby Vision-Formate zu erkennen (#1785).
    • Die Verarbeitung von Periodenübergängen in Livestreams wurde verbessert, wenn die Periode Mediensamples enthält, die über die angegebene Periodendauer hinausgehen (#1698).
    • Ein Problem wurde behoben, bei dem mit adaptation-set-switching gekennzeichnete Anpassungssätze mit unterschiedlichen Sprachen oder Rollen-Flags zusammengeführt wurden (#2222).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Das MPEG-H-Decodermodul wurde hinzugefügt, das den integrierten MPEG-H-Decoder zum Decodieren von MPEG-H-Audio verwendet (#1826).
  • MIDI-Erweiterung:
    • Benutzerdefinierte AudioSink- und AudioRendererEventListener-Instanzen in MidiRenderer einbinden
  • Cast-Erweiterung:
    • Aktualisieren Sie die play-services-cast-framework-Abhängigkeit auf Version 21.5.0, um einen FLAG_MUTABLE-Absturz in Apps zu beheben, die auf API 34 oder höher ausgerichtet sind und auf Geräten mit installierten, aber deaktivierten Google Play-Diensten ausgeführt werden (#2178).
  • Demo-App:
    • demo-compose mit zusätzlichen Schaltflächen erweitern und die PlayerSurface-Integration durch Unterstützung von Skalierung und Verschluss verbessern.
  • Entfernen Sie die folgenden veralteten Symbole:
    • Die eingestellte Methode AudioMixer.create() wurde entfernt. Verwenden Sie stattdessen DefaultAudioMixer.Factory().create().
    • Entfernen Sie die folgenden veralteten Transformer.Builder-Methoden:
      • setTransformationRequest(): Verwenden Sie stattdessen setAudioMimeType(), setVideoMimeType() und setHdrMode().
      • setAudioProcessors(), legen Sie den Audioprozessor in einem EditedMediaItem.Builder.setEffects() fest und übergeben Sie ihn stattdessen an Transformer.start().
      • setVideoEffects(), setze den Videoeffekt in einem EditedMediaItem.Builder.setEffects() und übergib ihn stattdessen an Transformer.start().
      • setRemoveAudio(). Verwenden Sie stattdessen EditedMediaItem.Builder.setRemoveAudio(), um das Audio aus dem an Transformer.start() übergebenen EditedMediaItem zu entfernen.
      • setRemoveVideo(). Verwende EditedMediaItem.Builder.setRemoveVideo(), um das Video aus dem EditedMediaItem zu entfernen, das an Transformer.start() übergeben wird.
      • setFlattenForSlowMotion(). Verwenden Sie stattdessen EditedMediaItem.Builder.setFlattenForSlowMotion(), um das an Transformer.start() übergebene EditedMediaItem zu reduzieren.
      • setListener(). Verwenden Sie stattdessen addListener(), removeListener() oder removeAllListeners().
    • Entfernen Sie die folgenden veralteten Transformer.Listener-Methoden:
      • onTransformationCompleted(MediaItem). Verwenden Sie stattdessen onCompleted(Composition, ExportResult).
      • onTransformationCompleted(MediaItem, TransformationResult). Verwenden Sie stattdessen onCompleted(Composition, ExportResult).
      • onTransformationError(MediaItem, Exception). Verwenden Sie stattdessen onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationException). Verwenden Sie stattdessen onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationResult, TransformationException). Verwenden Sie stattdessen onError(Composition, ExportResult, ExportException).
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest). Verwenden Sie stattdessen onFallbackApplied(Composition, TransformationRequest, TransformationRequest).
    • Entfernen Sie die eingestellte Klasse TransformationResult. Verwenden Sie stattdessen ExportResult.
    • Entfernen Sie die eingestellte Klasse TransformationException. Verwenden Sie stattdessen ExportException.
    • Entfernen Sie die eingestellte Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Verwenden Sie stattdessen Transformer.PROGRESS_STATE_NOT_STARTED.
    • Entfernen Sie die eingestellte Transformer.setListener(). Verwenden Sie stattdessen Transformer.addListener(), Transformer.removeListener() oder Transformer.removeAllListeners().
    • Entfernen Sie die eingestellte Transformer.startTransformation(). Verwenden Sie stattdessen Transformer.start(MediaItem, String).
    • Entfernen Sie die eingestellte SingleFrameGlShaderProgram. Verwenden Sie stattdessen BaseGlShaderProgram.
    • Entfernen Sie Transformer.flattenForSlowMotion. Verwenden Sie stattdessen EditedMediaItem.flattenForSlowMotion.
    • ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent und ExoPlayer.DeviceComponent entfernt.
    • androidx.media3.exoplayer.audio.SonicAudioProcessor wurde entfernt.
    • Die folgenden nicht mehr unterstützten DownloadHelper-Methoden wurden entfernt:
      • Konstruktor DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), verwenden Sie stattdessen DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList).
      • getRendererCapabilities(RenderersFactory): Eine entsprechende Funktion kann erreicht werden, indem Sie ein DefaultRendererCapabilitiesList mit einem RenderersFactory erstellen und DefaultRendererCapabilitiesList.getRendererCapabilities() aufrufen.
    • Die Methode PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat) wurde entfernt. Verwenden Sie stattdessen PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) und übergeben Sie (MediaSession.Token) compatToken.getToken().

1.6.0-rc02

19. März 2025

Verwenden Sie die stabile Version 1.6.0.

1.6.0-rc01

12. März 2025

Verwenden Sie die stabile Version 1.6.0.

1.6.0-beta01

26. Februar 2025

Verwenden Sie die stabile Version 1.6.0.

Version 1.6.0-alpha03

6. Februar 2025

Verwenden Sie die stabile Version 1.6.0.

Version 1.6.0-alpha02

30. Januar 2025

Verwenden Sie die stabile Version 1.6.0.

Version 1.6.0-alpha01

20. Dezember 2024

Verwenden Sie die stabile Version 1.6.0.

Version 1.5

Version 1.5.1

19. Dezember 2024

androidx.media3:media3-*:1.5.1 wird veröffentlicht. Version 1.5.1 enthält diese Commits.

  • ExoPlayer:
    • Deaktivieren Sie die Verwendung der asynchronen Entschlüsselung in MediaCodec, um die gemeldeten Probleme mit dem Codec-Zeitlimit bei dieser Plattform-API zu vermeiden (#1641).
  • Extraktoren:
    • MP3: Die Wiedergabe darf nicht vorzeitig beendet werden, wenn das Inhaltsverzeichnis eines VBRI-Frames nicht alle MP3-Daten in einer Datei abdeckt (#1904).
  • Video:
    • Rollback der Verwendung von MediaCodecAdapter-Werten für das bereitgestellte Pixel-Seitenverhältnis bei der Verarbeitung von onOutputFormatChanged (#1371).
  • Text:
    • Es wurde ein Fehler in ReplacingCuesResolver.discardCuesBeforeTimeUs behoben, bei dem der Cue, der bei timeUs aktiv war (vorher gestartet, aber noch nicht beendet), fälschlicherweise verworfen wurde (#1939).
  • Metadaten:
    • Extrahieren der Datenträger-/Tracknummerierung und des Genres aus Vorbis-Kommentaren in MediaMetadata (#1958).

Version 1.5.0

27. November 2024

androidx.media3:media3-*:1.5.0 wird veröffentlicht. Version 1.5.0 enthält diese Commits.

  • Gemeinsame Mediathek:
    • Füge ForwardingSimpleBasePlayer hinzu, das das Weiterleiten an einen anderen Player mit kleinen Anpassungen ermöglicht und gleichzeitig für vollständige Konsistenz und Listener-Verarbeitung sorgt (#1183).
    • Ersetzen Sie SimpleBasePlayer.State.playlist durch die Methode getPlaylist().
    • Fügen Sie einen Override für SimpleBasePlayer.State.Builder.setPlaylist() hinzu, um direkt eine Timeline und die aktuelle Tracks und Metadata anzugeben, anstatt eine Playliststruktur zu erstellen.
    • Erhöhen Sie minSdk auf 21 (Android Lollipop). Dies entspricht allen anderen AndroidX-Bibliotheken.
    • Fügen Sie das androidx.media3:media3-common-ktx-Artefakt hinzu, das Kotlin-spezifische Funktionen bietet, die auf der Common-Bibliothek basieren.
    • Fügen Sie der media3-common-ktx-Bibliothek die suspend-Erweiterungsfunktion Player.listen hinzu, um eine Coroutine zu starten, die auf Player.Events wartet.
    • Entfernen Sie @DoNotInline-Annotationen aus manuell ausgelagerten inneren Klassen, die dazu dienen, Laufzeitfehler bei der Klassenüberprüfung zu vermeiden. In den aktuellen Versionen von R8 werden solche Inline-Aufrufe jetzt automatisch ausgelagert, um Laufzeitfehler zu vermeiden. Die manuelle Auslagerung ist also nicht mehr erforderlich. Alle Gradle-Nutzer der Bibliothek müssen bereits eine Version des Android-Gradle-Plug-ins verwenden, in der eine R8-Version enthalten ist, die dies unterstützt, aufgrund von compileSdk = 35. Nutzer der Bibliothek mit Build-Systemen, die nicht auf Gradle basieren, müssen dafür sorgen, dass ihr R8-äquivalenter Schritt zum Verkleinern/Verschleiern einen ähnlichen automatischen Out-of-Lining-Prozess durchführt, um Laufzeitfehler bei der Klassenüberprüfung zu vermeiden. Diese Änderung wurde bereits in anderen AndroidX-Bibliotheken vorgenommen.
  • ExoPlayer:
    • MediaCodecRenderer.onProcessedStreamChange() kann jetzt für jedes Medienelement aufgerufen werden. Bisher wurde sie für die erste nicht aufgerufen. Verwenden Sie MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart(), um diese Funktion zu aktivieren.
    • Fügen Sie PreloadMediaSource.PreloadControl.onPreloadError hinzu, damit PreloadMediaSource.PreloadControl-Implementierungen Maßnahmen ergreifen können, wenn ein Fehler auftritt.
    • Fügen Sie BasePreloadManager.Listener hinzu, um Preload-Ereignisse an Apps weiterzugeben.
    • Ändern des SNTP-Client-Timeouts und Wiederholen alternativer Adressen bei Timeout zulassen (#1540).
    • Entfernen Sie MediaCodecAdapter.Configuration.flags, da das Feld immer null war.
    • Der Nutzer kann den integrierten Lautsprecher für die Wiedergabe auf Wear OS ab API 35 auswählen, sofern das Gerät dies unterstützt.
    • Den blockierenden Aufruf an Context.getSystemService(Context.AUDIO_SERVICE) bis zur Aktivierung der Audiofokus-Verarbeitung verschieben. Dadurch wird sichergestellt, dass der blockierende Aufruf nicht erfolgt, wenn die Verarbeitung des Audiofokus nicht aktiviert ist (#1616).
    • Wiedergabe unabhängig von der gepufferten Dauer zulassen, wenn das Laden fehlschlägt (#1571).
    • Fügen Sie AnalyticsListener.onRendererReadyChanged() hinzu, um zu signalisieren, wann die Wiedergabe auf einzelnen Renderern bereit ist.
    • Der Fehler MediaCodec.CryptoException wird manchmal als „unerwarteter Laufzeitfehler“ gemeldet, wenn MediaCodec im asynchronen Modus ausgeführt wird (Standardverhalten bei API 31 und höher).
    • Übergeben Sie bufferedDurationUs anstelle von bufferedPositionUs mit PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Außerdem wird DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS in DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS geändert. Apps müssen dann anstelle einer Position einen Wert übergeben, der eine bestimmte Dauer ab der Standardstartposition angibt, für die die entsprechende Media-Quelle mit diesem IntDef vorab geladen werden muss.
    • Fügen Sie die ForwardingRenderer-Implementierung hinzu, die alle Methodenaufrufe an einen anderen Renderer weiterleitet (1703).
    • Vorabladen von Playlists für das nächste Element in der Playlist hinzufügen Apps können das Vorabladen aktivieren, indem sie ExoPlayer.setPreloadConfiguration(PreloadConfiguration) aufrufen. Das Vorabladen ist standardmäßig deaktiviert. Wenn Sie sich für diese Option entscheiden, wird das Vorabladen durch DefaultLoadControl eingeschränkt. Es wird nur gestartet und fortgesetzt, wenn der Player nicht für die Wiedergabe geladen wird. Apps können dieses Verhalten ändern, indem sie LoadControl.shouldContinuePreloading() entsprechend implementieren (z. B. durch Überschreiben dieser Methode in DefaultLoadControl). Bei der Standardimplementierung von LoadControl wird das Vorabladen deaktiviert, wenn eine App eine benutzerdefinierte Implementierung von LoadControl verwendet.
    • Die Methode MediaSourceEventListener.EventDispatcher.dispatchEvent() wurde hinzugefügt, um das Aufrufen von Ereignissen von Unterklassen-Listenern zu ermöglichen (1736).
    • Fügen Sie DefaultPreloadManager.Builder hinzu, mit dem die DefaultPreloadManager- und ExoPlayer-Instanzen mit einheitlich freigegebenen Konfigurationen erstellt werden.
    • Entfernen Sie den Parameter Renderer[] aus LoadControl.onTracksSelected(), da die DefaultLoadControl-Implementierung die Streamtypen aus ExoTrackSelection[] abrufen kann.
    • Die Methode DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) ist veraltet und wurde als „final“ markiert, um Überschreibungen zu verhindern. Verwenden Sie stattdessen die neue DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • MediaSourceEventListener-Ereignisse aus sekundären Quellen in MergingMediaSource melden Dies führt dazu, dass für per Sideloading hinzugefügte Untertitel (die mit MediaItem.LocalConfiguration.subtitleConfigurations hinzugefügt wurden) die Ereignisse „loadstart“, „error“, „cancelled“ und „completed“ gemeldet werden. Das kann so aussehen, als würden doppelte Ladeereignisse von AnalyticsListener ausgegeben.
    • Verhindern, dass Fehler bei Untertiteln und Metadaten die Wiedergabe vollständig stoppen. Stattdessen wird der problematische Titel deaktiviert und die Wiedergabe der verbleibenden Titel wird fortgesetzt (#1722).
      • Bei der neuen Untertitelverarbeitung (während der Extraktion) werden zugehörige Parse-Fehler (z.B. ungültige Untertiteldaten) und Ladefehler (z.B. HTTP 404) über onLoadError-Callbacks ausgegeben.
      • Bei der alten Untertitelverarbeitung (während des Renderns) werden nur zugehörige Ladefehler über onLoadError-Callbacks ausgegeben, während Parsing-Fehler stillschweigend ignoriert werden (dies ist das bisherige Verhalten).
    • Ein Fehler wurde behoben, bei dem es bei Playlist-Elementen oder Zeiträumen in DASH-Streams mit mehreren Zeiträumen mit einer Dauer, die nicht mit dem tatsächlichen Inhalt übereinstimmt, am Ende des Elements zu Frame-Freezes kommen konnte (#1698).
    • Setter für SntpClient hinzufügen, um die maximale verstrichene Zeit seit der letzten Aktualisierung festzulegen, nach der der Client neu initialisiert wird (#1794).
  • Transformer:
    • Füge SurfaceAssetLoader hinzu, das das Einreihen von Videodaten in die Warteschlange für Transformer über einen Surface unterstützt.
    • ImageAssetLoader meldet nicht unterstützte Eingaben über AssetLoader.onError, anstatt eine IllegalStateException auszulösen.
    • Die Einstellung der Bilddauer über MediaItem.Builder.setImageDurationMs ist für den Bildexport obligatorisch.
    • Unterstützung für den Export von Lücken in Sequenzen von bearbeiteten Audio-MediaItems hinzugefügt.
  • Titelauswahl:
    • DefaultTrackSelector: Objektbasierte Audioinhalte sollten gegenüber kanalbasierten Audioinhalten bevorzugt werden, wenn andere Faktoren gleich sind.
  • Extraktoren:
    • Mit Mp4Extractor und FragmentedMp4Extractor können H264-Samples identifiziert werden, die nicht als Referenz für nachfolgende Samples verwendet werden.
    • Option zum Aktivieren der indexbasierten Suche in AmrExtractor hinzugefügt.
    • MP3-Dateien mit mehr als 128 KB zwischen gültigen Frames werden als gekürzt (statt als ungültig) behandelt. Das bedeutet, dass die Wiedergabe von Dateien mit Nicht-MP3-Daten am Ende, bei denen keine anderen Metadaten die Länge der MP3-Bytes angeben, jetzt am Ende der MP3-Daten beendet wird, anstatt mit ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563) zu fehlschlagen.
    • Die Verarbeitung von Preroll-Samples für Media-Startpositionen, die keine Keyframes sind, wurde bei der Verarbeitung von Bearbeitungslisten in MP4-Dateien korrigiert (#1659).
    • Die Berechnung der Frame-Rate wurde verbessert, indem die Media-Dauer aus dem Feld mdhd in Mp4Extractor und FragmentedMp4Extractor verwendet wird (#1531).
    • Falsche Skalierung von media_time in MP4-Bearbeitungslisten korrigieren Während segment_duration bereits korrekt mit der Zeitskala des Films skaliert wurde, wird media_time jetzt ordnungsgemäß mit der Zeitskala des Tracks skaliert, wie im MP4-Formatstandard angegeben (#1792).
    • Behandlung von Frames in falscher Reihenfolge bei der endIndices-Berechnung für MP4-Dateien mit Bearbeitungsliste (#1797).
    • Die Analyse der Medienlänge im mdhd-Feld von MP4-Dateien wurde korrigiert, um -1-Werte zu verarbeiten (#1819).
    • Unterstützung für die Identifizierung des h263-Felds in MP4-Dateien für H.263-Videos hinzugefügt (#1821).
    • Unterstützung für das AC-4 Level-4 ISO-Basismediendateiformat hinzugefügt (#1265).
  • DataSource:
    • Aktualisierung von HttpEngineDataSource, damit die Verwendung ab Version S-Extension 7 anstelle von API-Level 34 möglich ist (#1262).
    • DataSourceContractTest: Bestätigen, dass DataSource.getUri() den aufgelösten URI zurückgibt (wie dokumentiert). Wenn dies vom angeforderten URI abweicht, kann dies in Tests mit der neuen Methode DataSourceContractTest.TestResource.Builder.setResolvedUri() angegeben werden.
    • DataSourceContractTest: Es wird geprüft, ob DataSource.getUri() und getResponseHeaders() ihren „open“-Wert nach einem fehlgeschlagenen Aufruf von open() (aufgrund einer nicht gefundenen Ressource) und vor einem nachfolgenden close()-Aufruf zurückgeben.
      • Durch Überschreiben von DataSourceContractTest.getNotFoundResources() können Testunterklassen mehrere „nicht gefunden“-Ressourcen und alle erwarteten Header bereitstellen. So kann zwischen HTTP 404 (mit Headern) und „Server nicht gefunden“ (ohne Header) unterschieden werden.
  • Audio:
    • Konfiguriert automatisch CTA-2075-Lautheitsmetadaten für den Codec, sofern sie in den Media vorhanden sind.
    • Sorge für einen gleichmäßigen Lautstärkeabfall beim Suchen.
    • Problem mit Knackgeräuschen behoben, die bei der Suche auftreten können.
    • Die Anhäufung von Rundungsfehlern im Time-Stretching-/Pitch-Shifting-Algorithmus von Sonic wurde behoben.
    • Fehler in SpeedChangingAudioProcessor beheben, der zu fehlenden Ausgabeframes führt.
  • Video:
    • MediaCodecVideoRenderer vermeidet das Decodieren von Samples, die weder gerendert noch von anderen Samples als Referenz verwendet werden.
    • Bei API 35 und höher kann MediaCodecAdapter jetzt ein null Surface in configure empfangen und Aufrufe einer neuen Methode detachOutputSurface zum Entfernen eines zuvor festgelegten Surface, wenn der Codec dies unterstützt (MediaCodecInfo.detachedSurfaceSupported).
    • Verwenden Sie die bereitgestellten Werte für das Pixel-Seitenverhältnis MediaCodecAdapter, falls verfügbar, wenn Sie onOutputFormatChanged verarbeiten (#1371).
    • Es wurde eine Behelfslösung für ein Geräteproblem auf dem Galaxy Tab S7 FE hinzugefügt, das dazu führt, dass sichere H264-Streams mit 60 fps als nicht unterstützt markiert werden (#1619).
    • Es wurde eine Problemumgehung für Codecs hinzugefügt, die nach dem letzten Sample hängen bleiben, ohne ein End-of-Stream-Signal zurückzugeben.
  • Text:
    • Fügen Sie eine benutzerdefinierte VoiceSpan hinzu und füllen Sie sie für WebVTT-Voice-Spans aus (#1632).
    • Achte darauf, dass WebVTT in HLS mit sehr großen Untertitel-Zeitstempeln (die einen 64-Bit-long überlaufen, wenn sie als Mikrosekunden dargestellt und mit der 90,000-MPEG-Zeitbasis multipliziert werden) angezeigt werden (#1763).
    • Unterstützung von CEA-608-Untertiteln in Dolby Vision-Inhalten (#1820).
    • Das Problem, dass die Wiedergabe bei DASH-Streams mit mehreren Zeiträumen hängen bleibt, wenn CEA-608-Untertitel aktiviert sind, wurde behoben (#1863).
  • Metadaten:
    • Weisen Sie Tracks mit icy- oder vnd.dvb.ait-Inhalten den Typ C.TRACK_TYPE_METADATA zu.
  • Bild:
    • Fügen Sie ExternallyLoadedImageDecoder hinzu, um die Integration in externe Bibliotheken zum Laden von Bildern wie Glide oder Coil zu vereinfachen.
  • DataSource:
    • FileDescriptorDataSource wurde hinzugefügt, ein neues DataSource, das zum Lesen aus einem FileDescriptor verwendet werden kann (#3757).
  • Wirkung:
    • Es wurde eine DefaultVideoFrameProcessor-Problemumgehung für die geringfügige SurfaceTexture-Skalierung hinzugefügt. SurfaceTexture kann eine kleine Skalierung enthalten, die einen 1-Texel-Rahmen am Rand eines zugeschnittenen Puffers abschneidet. Das Problem wurde behoben und die Ausgabe entspricht nun eher den Erwartungen.
    • Beschleunigen Sie DefaultVideoFrameProcessor.queueInputBitmap(). Dadurch geht der Export von Bildern in Videos mit Transformer schneller.
  • IMA-Erweiterung:
    • Ein Fehler wurde behoben, bei dem das Löschen der Playlist zu einem ArrayIndexOutOfBoundsException in ImaServerSideAdInsertionMediaSource führen konnte.
    • Es wurde ein Fehler behoben, bei dem serverseitig eingefügte DAI-Streams ohne Preroll bei der Wiedergabe nach dem letzten Mid-Roll zu einem ArrayIndexOutOfBoundsException führen konnten (#1741).
  • Sitzung:
    • Füge MediaButtonReceiver.shouldStartForegroundService(Intent) hinzu, damit Apps einen eingehenden Play-Befehl zum Fortsetzen der Wiedergabe unterdrücken können, indem sie diese Methode überschreiben. Standardmäßig wird der Dienst immer gestartet und die Wiedergabe kann nicht unterdrückt werden, ohne dass das System den Dienst mit einem ForegroundServiceDidNotStartInTimeException (#1528) abstürzen lässt.
    • Ein Fehler wurde behoben, der dazu führte, dass benutzerdefinierte Befehle, die von einem MediaBrowser gesendet wurden, an die MediaSessionCompat.Callback anstatt an die MediaBrowserServiceCompat-Variante der Methode gesendet wurden, wenn eine Verbindung zu einem Legacy-Dienst bestand. Dadurch konnte MediaBrowser den tatsächlichen Rückgabewert, der vom alten Dienst zurückgesendet wurde, nicht empfangen (#1474).
    • Behandlung von IllegalArgumentException, das von Geräten bestimmter Hersteller ausgelöst wird, wenn der Broadcast-Empfänger für Media-Button-Intents festgelegt wird (#1730).
    • Befehlsschaltflächen für Media-Elemente hinzufügen Dadurch wird die Media3 API für das hinzugefügt, was als Custom browse actions mit der alten Bibliothek mit MediaBrowserCompat bekannt war. Hinweis: Mit Media3 sind Befehlsschaltflächen für Media-Elemente sowohl für MediaBrowser als auch für MediaController verfügbar. Weitere Informationen finden Sie unter Benutzerdefinierte Browse-Aktionen von AAOS.
    • Es wurde ein Fehler behoben, bei dem ein Media3-Controller manchmal nicht zulassen konnte, dass eine Sitzungs-App einen Dienst im Vordergrund startet, nachdem play() angefordert wurde.
    • Beschränken Sie CommandButton.Builder.setIconUri so, dass nur Content-URIs akzeptiert werden.
    • Übergeben Sie Verbindungshinweise eines Media3-Browsers an das ursprüngliche MediaBrowserCompat, wenn Sie eine Verbindung zu einem Legacy-MediaBrowserCompat herstellen. Der Dienst kann die als Stammhinweise übergebenen Verbindungshinweise mit dem ersten Aufruf von onGetRoot() empfangen.
    • Ein Fehler wurde behoben, bei dem ein MediaBrowser, das mit einem Legacy-Browserdienst verbunden war, keinen vom Dienst gesendeten Fehler empfangen hat, nachdem der Browser einen parentid abonniert hatte.
    • Das Interoperabilitätsverhalten wurde verbessert, sodass ein Media3-Browser, der mit einem Legacy-MediaBrowserService verbunden ist, die untergeordneten Elemente eines parentId nicht zweimal anfordert, wenn er einen übergeordneten Dienst abonniert.
  • UI:
    • Das gestreckte/zugeschnittene Video im PlayerView-in-Compose-AndroidView-Workaround aktivieren, da es Probleme mit XML-basierten gemeinsamen Übergängen gibt. Apps, die PlayerView innerhalb von AndroidView verwenden, müssen PlayerView.setEnableComposeSurfaceSyncWorkaround aufrufen, um die Funktion zu aktivieren (#1237, #1594).
    • Füge setFullscreenButtonState zu PlayerView hinzu, um Updates des Symbols der Vollbildschaltfläche auf Anfrage zu ermöglichen, d.h. außerhalb des Bandes und nicht reaktiv auf eine Klickinteraktion (#1590, #184).
    • Es wurde ein Fehler behoben, bei dem die Option „Keine“ in der Textauswahl nicht funktionierte, wenn app-definierte Einstellungen für die Auswahl von Text-Tracks vorhanden waren.
  • DASH-Erweiterung:
    • Unterstützung für Zeiträume hinzugefügt, die in der Mitte eines Segments beginnen (#1440).
  • Smooth Streaming-Erweiterung:
    • Ein Bad magic number for Bundle-Fehler beim Abspielen von SmoothStreaming-Streams mit Text-Tracks wurde behoben (#1779).
  • RTSP-Erweiterung:
    • Entfernung von Nutzerinformationen für URLs mit codierten @-Zeichen korrigiert (#1138).
    • Absturz beim Parsen von RTP-Paketen mit Header-Erweiterungen behoben (#1225).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Fügen Sie das IAMF-Decodermodul hinzu, das die Wiedergabe von MP4-Dateien mit IAMF-Tracks unterstützt. Dazu wird die native libiamf-Bibliothek verwendet, um Audio zu synthetisieren.
      • Die Wiedergabe ist mit einem Stereolayout sowie mit 5.1 mit Räumlichkeit und optionaler Erfassung von Kopfbewegungen möglich. Die Unterstützung der binauralen Wiedergabe ist derzeit jedoch nicht verfügbar.
    • Unterstützung von 16‑KB-Seiten für Decoder-Erweiterungen unter Android 15 hinzugefügt (#1685).
  • Cast-Erweiterung:
    • Die Zeitachse wird nach dem Trennen der CastSession nicht mehr bereinigt. So kann die Sender-App die Wiedergabe nach dem Trennen der Verbindung lokal fortsetzen.
    • Füllen Sie DeviceInfo von CastPlayer aus, wenn ein Context angegeben ist. Dadurch kann die MediaSession mit einer RoutingSession verknüpft werden, was für die Integration von Output Switcher erforderlich ist (#1056).
  • Test-Tools:
    • DataSourceContractTest enthält jetzt Tests, um Folgendes zu überprüfen:
      • Der Eingabestream read position wurde aktualisiert.
      • Der Ausgabepuffer offset wird korrekt angewendet.
  • Demo-App
    • Beheben Sie die Speicherlecks in der Demo-App für Kurzvideos (#1839).
  • Entfernen Sie die folgenden veralteten Symbole:
    • Die eingestellten Player.hasPrevious und Player.hasPreviousWindow() wurden entfernt. Verwenden Sie stattdessen Player.hasPreviousMediaItem().
    • Die eingestellte Methode Player.previous() wurde entfernt. Verwenden Sie stattdessen Player.seekToPreviousMediaItem().
    • Die eingestellte Methode DrmSessionEventListener.onDrmSessionAcquired wurde entfernt.
    • Entfernen Sie eingestellte DefaultEncoderFactory-Konstruktoren. Verwenden Sie stattdessen DefaultEncoderFactory.Builder.

Version 1.5.0-rc02

19. November 2024

Verwenden Sie die stabile Version 1.5.0.

Version 1.5.0-rc01

13. November 2024

Verwenden Sie die stabile Version 1.5.0.

Version 1.5.0-beta01

30. Oktober 2024

Verwenden Sie die stabile Version 1.5.0.

Version 1.5.0-alpha01

10. September 2024

Verwenden Sie die stabile Version 1.5.0.

Version 1.4.0

Version 1.4.1

27. August 2024

androidx.media3:media3-*:1.4.1 wird veröffentlicht. Version 1.4.1 enthält diese Commits.

  • ExoPlayer:
    • Preload-Callbacks werden asynchron in PreloadMediaSource verarbeitet (#1568).
    • Wiedergabe unabhängig von der gepufferten Dauer zulassen, wenn das Laden fehlschlägt (#1571).
  • Extraktoren:
    • MP3: Der Searched too many bytes-Fehler wird behoben, indem nachfolgende Nicht-MP3-Daten basierend auf dem Längenfeld in einem Info-Frame korrekt ignoriert werden (#1480).
  • Text:
    • TTML: Die Verarbeitung von Prozentwerten für tts:fontSize wurde korrigiert, damit sie korrekt von übergeordneten Knoten mit Prozentwerten für tts:fontSize übernommen werden.
    • Das Problem IndexOutOfBoundsException in LegacySubtitleUtil wurde behoben, da der Fall, in dem die angeforderte Startzeit der Ausgabe größer oder gleich der Endzeit des Ereignisses in Subtitle ist, nicht korrekt behandelt wurde (#1516).
  • DRM:
    • Fehler android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE auf Geräten mit API 31 oder höher beheben, wenn L1-Widevine-Inhalte wiedergegeben werden. Dieser Fehler wird durch eine unvollständige Implementierung der Framework-Methode MediaDrm.requiresSecureDecoder (#1603) verursacht.
  • Wirkung:
    • Fügen Sie GlObjectsProvider eine release()-Methode hinzu.
  • Sitzung:
    • Wandle ein Doppeltippen auf KEYCODE_HEADSETHOOK in die Aktion „Zum nächsten Titel springen“ um, wie dokumentiert (#1493).
    • Behandle KEYCODE_HEADSETHOOK als „Play“-Befehl in MediaButtonReceiver, wenn du entscheidest, ob du ihn ignorieren möchtest, um einen ForegroundServiceDidNotStartInTimeException (#1581) zu vermeiden.
  • RTSP-Erweiterung:
    • Ungültige Media-Beschreibungen beim SDP-Parsing überspringen (#1087).

Version 1.4.0

25. Juli 2024

androidx.media3:media3-*:1.4.0 wird veröffentlicht. Version 1.4.0 enthält diese Commits.

  • Gemeinsame Mediathek:
    • Leiten Sie mutmaßliche No-Op-Suchaufrufe an die geschützten Methoden BasePlayer.seekTo() und SimpleBasePlayer.handleSeek() weiter, anstatt sie zu ignorieren. Wenn Sie diese Methoden in einem benutzerdefinierten Player implementieren, müssen Sie diese zusätzlichen Aufrufe möglicherweise mit mediaItemIndex == C.INDEX_UNSET verarbeiten.
    • Die Kompilierungsabhängigkeit von der erweiterten Java 8-Desugarisierung wurde entfernt (#1312).
    • Achten Sie darauf, dass die an MediaItem.Builder.setImageDurationMs() übergebene Dauer für ein MediaItem, das kein Bild ist, ignoriert wird (wie dokumentiert).
    • Fügen Sie Format.customData hinzu, um benutzerdefinierte Informationen zu Format-Instanzen zu speichern, die von der App bereitgestellt werden.
  • ExoPlayer:
    • Fügen Sie BasePreloadManager hinzu, um das Vorladen für mehrere Quellen basierend auf den Prioritäten zu koordinieren, die durch ihr rankingData definiert werden. Sie können diese Klasse erweitern, um sie anzupassen. Fügen Sie DefaultPreloadManager hinzu, das PreloadMediaSource verwendet, um Media-Samples der Quellen in den Arbeitsspeicher vorzuladen, und eine Ganzzahl rankingData, die den Index eines Elements auf der Benutzeroberfläche angibt.
    • Fügen Sie PlayerId zu den meisten Methoden von LoadControl hinzu, damit LoadControl-Implementierungen mehrere Spieler unterstützen.
    • Entfernen Sie Buffer.isDecodeOnly() und C.BUFFER_FLAG_DECODE_ONLY. Dieses Flag muss nicht festgelegt werden, da Renderer und Decoder entscheiden, ob Puffer basierend auf dem Zeitstempel übersprungen werden. Bei benutzerdefinierten Renderer-Implementierungen sollte geprüft werden, ob die Pufferzeit mindestens BaseRenderer.getLastResetPositionUs() beträgt, um zu entscheiden, ob eine Probe angezeigt werden soll. Benutzerdefinierte SimpleDecoder-Implementierungen können bei Bedarf isAtLeastOutputStartTimeUs() prüfen oder andere Puffer mit DecoderOutputBuffer.shouldBeSkipped markieren, um sie zu überspringen.
    • Ermöglicht, dass von TargetPreloadStatusControl.getTargetPreloadStatus(T) ein Nullwert zurückgegeben wird, um anzugeben, dass kein MediaSource mit dem angegebenen rankingData vorab geladen werden soll.
    • Fügen Sie remove(MediaSource) zu BasePreloadManager hinzu.
    • Fügen Sie reset() zu BasePreloadManager hinzu, um alle Quellen freizugeben, die gehalten werden, und die Vorablademanager-Instanz beizubehalten.
    • Fügen Sie ExoPlayer.setPriority() (und Builder.setPriority()) hinzu, um den Prioritätswert zu definieren, der in PriorityTaskManager und für die MediaCodec-Wichtigkeit ab API 35 verwendet wird.
    • Problem mit der Aktualisierung der letzten Rebuffer-Zeit behoben, das zu einem falschen bs-Schlüssel (Buffer Starvation) in CMCD führte (#1124).
    • Fügen Sie PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) hinzu, um anzugeben, dass die Quelle bis zum Ende geladen wurde. So können die Implementierungen von DefaultPreloadManager und PreloadMediaSource.PreloadControl die nächste Quelle vorab laden oder andere Aktionen ausführen.
    • Ein Fehler wurde behoben, durch den das Überspringen von Stille am Ende von Elementen eine Wiedergabeausnahme auslösen konnte.
    • Fügen Sie clear zu PreloadMediaSource hinzu, um den Zeitraum für das Vorabladen zu verwerfen.
    • Füge den neuen Fehlercode PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED hinzu, der verwendet wird, wenn Codec-Ressourcen für Aufgaben mit höherer Priorität freigegeben werden.
    • AdsMediaSource kann Pre-Roll-Anzeigen laden, bevor die Vorbereitung der ersten Inhalte abgeschlossen ist (#1358).
    • Ein Fehler wurde behoben, durch den die Wiedergabe zu STATE_ENDED wechselte, wenn ein DASH-Livestream mit mehreren Zeiträumen neu vorbereitet wurde, nachdem der ursprüngliche Zeitraum bereits aus dem Manifest entfernt worden war.
    • Benennen Sie onTimelineRefreshed() in onSourcePrepared() und onPrepared() in onTracksSelected() in PreloadMediaSource.PreloadControl um. Benennen Sie auch die IntDefs in DefaultPreloadManager.Stage entsprechend um.
    • Experimentelle Unterstützung für dynamische Planung hinzugefügt, um die Arbeit besser an CPU-Aktivierungszyklen auszurichten und das Aktivieren zu verzögern, bis Renderer Fortschritte machen können. Sie können diese Funktion aktivieren, indem Sie experimentalSetDynamicSchedulingEnabled() bei der Einrichtung Ihrer ExoPlayer-Instanz verwenden.
    • Fügen Sie Renderer.getDurationToProgressUs() hinzu. Ein Renderer kann diese Methode implementieren, um ExoPlayer die Dauer zurückzugeben, um die die Wiedergabe voranschreiten muss, damit der Renderer fortfahren kann. Wenn ExoPlayer mit experimentalSetDynamicSchedulingEnabled() festgelegt ist, ruft ExoPlayer diese Methode auf, wenn die Zeit für die Planung der Arbeitsaufgabe berechnet wird.
    • Fügen Sie MediaCodecAdapter#OnBufferAvailableListener hinzu, um eine Benachrichtigung zu erhalten, wenn Ein- und Ausgabepuffer für die Verwendung durch MediaCodecRenderer verfügbar sind. MediaCodecRenderer signalisiert ExoPlayer beim Empfang dieser Callbacks. Wenn ExoPlayer mit experimentalSetDynamicSchedulingEnabled() festgelegt ist, plant ExoPlayer seinen Arbeitszyklus, da Renderer Fortschritte machen können.
    • Verwenden Sie für LoadControl-Methoden eine Datenklasse anstelle einzelner Parameter.
    • Fügen Sie ExoPlayer.isReleased() hinzu, um zu prüfen, ob Exoplayer.release() aufgerufen wurde.
    • Fügen Sie ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() hinzu, um die maximale Position zu konfigurieren, für die seekToPrevious() nach dem vorherigen Element sucht (#1425).
    • Einige Inkonsistenzen beim Audiofokus wurden behoben, z.B. dass kein vollständiger oder vorübergehender Fokusverlust gemeldet wurde, während der Player pausiert war (#1436).
    • Behebe potenzielle IndexOutOfBoundsException, die dadurch entstehen, dass Extractor nach dem ersten Vorbereitungsschritt zusätzliche Tracks melden (#1476).
    • Effects in ExoPlayer.setVideoEffect() erhält die Zeitstempel ohne Renderer-Offset (#1098).
    • Mögliche IllegalArgumentException beim Behandeln von Player-Fehlern behoben, die beim Vorlesen eines anderen Playlist-Elements aufgetreten sind (#1483).
  • Transformer:
    • Fügen Sie audioConversionProcess und videoConversionProcess zu ExportResult hinzu, um anzugeben, wie der jeweilige Track in der Ausgabedatei erstellt wurde.
    • Die H.264-Level-Prüfungen für die Optimierung von Zuschnitten werden gelockert.
    • Unterstützung für den Wechsel zwischen SDR- und HDR-Eingabemedien in einer Sequenz wurde hinzugefügt.
    • Unterstützung für Audioeffekte auf Kompositionsebene hinzugefügt
    • Unterstützung für das Transcodieren von Ultra-HDR-Bildern in HDR-Videos hinzugefügt
    • Ein Problem wurde behoben, bei dem DefaultAudioMixer nach dem Zurücksetzen und Wiederverwenden nicht die richtige Anzahl von Byte ausgegeben hat.
    • Ein Decoderfehler wurde behoben, bei dem die Anzahl der Audiokanäle bei der Verarbeitung von PCM-Eingaben auf Stereo begrenzt war.
    • Wenn Sie in ExoPlayerAssetLoader Tracks auswählen, ignorieren Sie die Einschränkungen für die Anzahl der Audiokanäle, da sie nur für die Wiedergabe gelten.
    • Ersetzen Sie die androidx.media3.transformer.Muxer-Schnittstelle durch androidx.media3.muxer.Muxer und entfernen Sie androidx.media3.transformer.Muxer.
    • Das Laden von HEIC-Bildern über Content-URI-Schemas wurde korrigiert. (#1373).
    • Passe die Dauer des Audiotracks in AudioGraphInput an, um die AV-Synchronisierung zu verbessern.
    • Entfernen Sie das Feld „ExportResult.processedInputs“. Wenn Sie dieses Feld für Codec-Details verwenden, nutzen Sie stattdessen DefaultDecoderFactory.listener. Bei einer Codec-Ausnahme sind die Codec-Details in der ExportException.codecInfo verfügbar.
  • Extraktoren:
    • MPEG-TS: Führe die Änderung aus, sodass der letzte Frame gerendert wird, indem du die letzte Zugriffseinheit eines Streams an die Sample-Warteschlange übergibst (#7909). Es wurden Korrekturen vorgenommen, um die Probleme zu beheben, die bei HLS-Streams mit nur I-Frames(#1150) und H.262-HLS-Streams (#1126) aufgetreten sind.
    • MP3: Bevorzugen Sie die Datengröße aus einem Info-Frame gegenüber der Größe, die vom zugrunde liegenden Stream gemeldet wird (z.B. Dateigröße oder HTTP-Content-Length-Header). So werden nicht abspielbare Trailerdaten (z.B. Albumcover) aus den Berechnungen für die Suche mit konstanter Bitrate ausgeschlossen, wodurch die Suche genauer wird (#1376).
    • MP3: Verwenden Sie die Frame-Anzahl und andere Daten in einem Info-Frame (falls vorhanden), um eine durchschnittliche Bitrate für die Suche mit konstanter Bitrate zu berechnen, anstatt die Bitrate des Frames nach dem Info-Frame zu extrapolieren, die künstlich klein sein kann, z.B. PCUT-Frame (#1376).
    • Die Extraktion des PCM-Audioformats in AVI-Containern wurde korrigiert.
  • Audio:
    • DTS:X Profile 2-Codierungsattribute für die Passthrough-Wiedergabe korrigieren (#1299).
    • Bei der ausgelagerten Wiedergabe muss das Tracking-Feld für den Abschluss des Streams in DefaultAudioSink zurückgesetzt werden, bevor AudioTrack.stop() aufgerufen wird, damit AudioTrack.StreamEventCallback#onPresentationEnded korrekt erkennt, wann alle ausstehenden Daten wiedergegeben wurden.
    • Ein Fehler in SilenceSkippingAudioProcessor wurde behoben, bei dem Übergänge zwischen verschiedenen Audioformaten (z. B. von Stereo zu Mono) dazu führen konnten, dass der Prozessor eine Ausnahme ausgibt (#1352).
    • Implementieren Sie MediaCodecAudioRenderer.getDurationToProgressUs(), damit ExoPlayer seine Hauptarbeitsloop dynamisch für den Zeitpunkt plant, zu dem der MediaCodecAudioRenderer Fortschritte machen kann.
  • Video:
    • Ein Problem wurde behoben, durch das Listener.onRenderedFirstFrame() beim Wechseln von Oberflächen während der Wiedergabe zu früh angezeigt wurde.
    • Die Fallback-Logik für den Dolby Vision-Decoder wurde korrigiert, sodass bei Bedarf ein kompatibler AV1-Decoder verwendet wird (#1389).
    • Es wurde eine Codec-Ausnahme behoben, die durch das Aktivieren eines Video-Renderers während der Wiedergabe verursacht werden konnte.
  • Text:
    • Es wurde ein Problem behoben, durch das Untertitel, die vor einer Suchposition beginnen, übersprungen wurden. Dieses Problem wurde erst in Media3 1.4.0-alpha01 eingeführt.
    • Das Standardverhalten für das Parsen von Untertiteln wird so geändert, dass es während der Extraktion und nicht während des Renderns erfolgt (siehe Architekturdiagramm von ExoPlayer für den Unterschied zwischen Extraktion und Rendern).
      • Diese Änderung kann durch Aufrufen von both MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) und TextRenderer.experimentalSetLegacyDecodingEnabled(true) überschrieben werden. In der Dokumentation zur Anpassung erfahren Sie, wie Sie diese Komponenten in eine ExoPlayer-Instanz einbinden. Diese Methoden und die Unterstützung für die alte Untertiteldecodierung werden in einer zukünftigen Version entfernt.
      • Apps mit benutzerdefinierten SubtitleDecoder-Implementierungen müssen aktualisiert werden, um stattdessen SubtitleParser zu implementieren (und SubtitleParser.Factory anstelle von SubtitleDecoderFactory).
    • PGS: Die Run-Length-Decodierung wurde korrigiert, um 0 als Farbindex anstelle eines Literal-Farbwerts (#1367) aufzulösen.
    • CEA-708: Ignoriere den Wert rowLock. In der CEA-708-E S-2023-Spezifikation wird angegeben, dass sowohl rowLock als auch columnLock als „true“ angenommen werden sollten, unabhängig von den im Stream vorhandenen Werten (columnLock wird nicht unterstützt, daher wird effektiv immer „false“ angenommen).
      • Diese Änderung war ursprünglich in den Versionshinweisen für 1.3.0-alpha01 enthalten, wurde aber vor dem Release von 1.3.0-rc01 versehentlich rückgängig gemacht. Das Problem wurde behoben und die Änderung ist wieder vorhanden.
    • CEA-708: Vermeiden Sie, dass durch die naive Verarbeitung des Befehls „Stiftposition festlegen“ durch ExoPlayer doppelte Zeilenumbrüche hinzugefügt werden (#1315).
    • Behebung eines IllegalArgumentException aus LegacySubtitleUtil, wenn ein WebVTT-Untertitelbeispiel keine Cues enthält, z.B. als Teil eines DASH-Streams (#1516).
  • Metadaten:
    • Die Zuordnung von MP4-Dateien zu ID3-Sortiertags wurde korrigiert. Bisher wurden die MP4-Tags „album sort“ (soal), „artist sort“ (soar) und „album artist sort“ (soaa) fälschlicherweise den ID3-Tags TSO2, TSOA und TSOP zugeordnet (#1302).
    • Das Lesen von numerischen gnre- (Genre) und tmpo-Tags (Tempo) in MP4-Dateien (/iTunes) wurde korrigiert, wenn der Wert mehr als ein Byte lang ist.
    • ID3-Frame TCON an MediaMetadata.genre weitergeben (#1305).
  • Bild:
    • Unterstützung für nicht quadratische DASH-Miniaturansichtraster hinzugefügt (#1300).
    • Unterstützung für AVIF für API 34+ hinzugefügt
    • Lassen Sie null als Parameter für ExoPlayer.setImageOutput() zu, um einen zuvor festgelegten ImageOutput zu löschen.
  • DataSource:
    • Implementieren Sie die Unterstützung für android.resource://package/id-Rohressourcen-URIs, wobei package sich vom Paket der aktuellen Anwendung unterscheidet. Bisher war nicht dokumentiert, dass dies funktioniert, aber es ist eine effizientere Möglichkeit, auf Ressourcen in einem anderen Paket zuzugreifen als über den Namen.
    • Prüfen Sie in den DataSpec-Konstruktoren, ob url nicht null ist. Dieser Parameter wurde bereits als „nicht null“ annotiert.
    • Ermöglichen Sie ByteArrayDataSource, einen URI während open() in ein Byte-Array aufzulösen, anstatt ihn bei der Erstellung fest zu codieren (#1405).
  • DRM:
    • Das Festlegen eines LoadErrorHandlingPolicy für DefaultDrmSessionManagerProvider ist jetzt möglich (#1271).
  • Wirkung:
    • Mehrere Geschwindigkeitsänderungen innerhalb desselben EditedMediaItem oder Composition in SpeedChangeEffect werden unterstützt.
    • Unterstützung für HLG- und PQ-Ausgabe aus Ultra HDR-Bitmap-Eingabe.
    • Unterstützung für EGL_GL_COLORSPACE_BT2020_HLG_EXT hinzugefügt, wodurch die HLG-Oberflächenausgabe in ExoPlayer.setVideoEffect und DebugSurfaceView von Transformer verbessert wird.
    • Aktualisieren Sie die Implementierung der Overlay-Matrix, damit sie mit der Dokumentation übereinstimmt. Dazu müssen Sie die in setOverlayFrameAnchor() angewendeten x- und y-Werte tauschen. Wenn Sie OverlaySettings.Builder.setOverlayFrameAnchor() verwenden, tauschen Sie die x- und y-Werte, indem Sie sie mit -1 multiplizieren.
    • Ein Fehler wurde behoben, bei dem TimestampWrapper bei Verwendung mit ExoPlayer#setVideoEffects abgestürzt ist (#821).
    • Ändern Sie den Standard-SDR-Farbarbeitsbereich von linearen Farben zu elektrischem BT.709-SDR-Video. Außerdem gibt es eine dritte Option, um den ursprünglichen Farbraum beizubehalten.
    • Es ist jetzt möglich, eine unbestimmte Z-Reihenfolge für EditedMediaItemSequences zu definieren (#1055).
    • Behalten Sie einen einheitlichen Luminanzbereich für verschiedene HDR-Inhalte bei (HLG-Bereich).
    • Unterstützung für Ultra HDR-Overlays (Bitmap) bei HDR-Inhalten hinzugefügt
    • Zulassen, dass SeparableConvolution-Effekte vor API 26 verwendet werden.
    • Entferne ungenutzte OverlaySettings.useHdr, da der dynamische Bereich von Overlay und Frame übereinstimmen muss.
    • HDR-Unterstützung für TextOverlay hinzufügen Die Luminanz des Text-Overlays kann mit OverlaySettings.Builder.setHdrLuminanceMultiplier() angepasst werden.
  • IMA-Erweiterung:
    • Die Promote API, die für die Wiedergabe von DAI-Anzeigenstreams in Apps erforderlich ist, ist jetzt stabil.
    • Fügen Sie replaceAdTagParameters(Map <String, String>) zu ImaServerSideAdInsertionMediaSource.AdLoader hinzu, damit Anzeigen-Tag-Parameter zur Laufzeit ersetzt werden können.
    • Ein Fehler wurde behoben, durch den VideoAdPlayer.VideoAdPlayerCallback.onError() nicht aufgerufen wurde, wenn während der Anzeigenwiedergabe ein Playerfehler aufgetreten ist (#1334).
    • Die IMA SDK-Version wurde auf 3.33.0 aktualisiert, um einen NullPointerException bei Verwendung von data://-Anzeigen-Tag-URIs zu beheben (#700).
  • Sitzung:
    • Ändere den Standardwert von CommandButton.enabled in true und sorge dafür, dass der Wert für Controller auch dann „false“ bleiben kann, wenn der zugehörige Befehl verfügbar ist.
    • Fügen Sie Symbolkonstanten für CommandButton hinzu, die anstelle von benutzerdefinierten Symbolressourcen verwendet werden sollen.
    • Fügen Sie MediaSessionService.isPlaybackOngoing() hinzu, damit Apps abfragen können, ob der Dienst in onTaskRemoved() beendet werden muss (#1219).
    • Füge MediaSessionService.pauseAllPlayersAndStopSelf() hinzu, um die Wiedergabe aller Sitzungen anzuhalten, und rufe stopSelf() auf, um den Lebenszyklus von MediaSessionService zu beenden.
    • Überschreiben Sie MediaSessionService.onTaskRemoved(Intent), um eine sichere Standardimplementierung bereitzustellen, die den Dienst im Vordergrund ausführt, wenn die Wiedergabe läuft, oder den Dienst andernfalls beendet.
    • Die Fortschrittsanzeige in der Medienbenachrichtigung für Livestreams wird ausgeblendet, wenn die Dauer nicht in den Metadaten der Plattform-Sitzung festgelegt wird (#1256).
    • Die Konvertierung von MediaMetadata zu MediaDescriptionCompat muss so erfolgen, dass bei der Auswahl von Metadateneigenschaften dieselbe bevorzugte Reihenfolge und Logik wie in media1 verwendet wird.
    • MediaSession.sendError() hinzugefügt, damit nicht schwerwiegende Fehler an den Media3-Controller gesendet werden können. Wenn Sie den Benachrichtigungscontroller verwenden (siehe MediaSession.getMediaNotificationControllerInfo()), wird der benutzerdefinierte Fehler verwendet, um den PlaybackState der Plattformsitzung mit den angegebenen Fehlerinformationen in einen Fehlerstatus zu versetzen (#543).
    • Fügen Sie MediaSession.Callback.onPlayerInteractionFinished() hinzu, um Sitzungen darüber zu informieren, dass eine Reihe von Spielerinteraktionen von einem bestimmten Controller abgeschlossen ist.
    • Fügen Sie SessionError hinzu und verwenden Sie es in SessionResult und LibraryResult anstelle des Fehlercodes, um weitere Informationen zum Fehler und zur Behebung des Fehlers (falls möglich) bereitzustellen.
    • Veröffentliche den Code für die Media3 Controller Test App, mit der Interaktionen mit Apps getestet werden können, die eine Mediensitzung veröffentlichen.
    • Extras, die an MediaSession[Builder].setSessionExtras() von Media3 übergeben werden, an PlaybackStateCompat.getExtras() eines Media1-Controllers weitergeben.
    • Schwerwiegende und nicht schwerwiegende Fehler der Plattform-Sitzung zuordnen. Ein PlaybackException wird einem schwerwiegenden Fehlerstatus des PlaybackStateCompat zugeordnet. Ein SessionError, das mit MediaSession.sendError(ControllerInfo, SessionError) an den Media-Benachrichtigungscontroller gesendet wird, wird in PlaybackStateCompat einem nicht schwerwiegenden Fehler zugeordnet. Das bedeutet, dass Fehlercode und ‑meldung festgelegt sind, der Status der Plattform-Sitzung jedoch nicht STATE_ERROR ist.
    • Ermöglicht es, die Sitzungsaktivität pro Controller festzulegen, um die globale Sitzungsaktivität zu überschreiben. Die Sitzungsaktivität kann für einen Controller bei der Verbindung definiert werden, indem ein ConnectionResult mit AcceptedResultBuilder.setSessionActivivty(PendingIntent) erstellt wird. Sobald die Verbindung hergestellt ist, kann die Sitzungsaktivität mit MediaSession.setSessionActivity(ControllerInfo, PendingIntent) aktualisiert werden.
    • Die Fehlerreplikation von Aufrufen von MediaLibrarySession.Callback wurde verbessert. Die Fehlerreplikation kann jetzt mit MediaLibrarySession.Builder.setLibraryErrorReplicationMode() konfiguriert werden, um den Fehlertyp auszuwählen oder die Fehlerreplikation zu deaktivieren, die standardmäßig aktiviert ist.
  • UI:
    • Unterstützung für die Bildanzeige in PlayerView hinzufügen, wenn eine Verbindung zu einem ExoPlayer besteht (#1144).
    • Es wurde die Möglichkeit hinzugefügt, verschiedene Symbole in PlayerControlView über XML-Attribute anzupassen, um unterschiedliche Drawables pro PlayerView-Instanz zu ermöglichen und nicht nur globale Überschreibungen (#1200).
    • Behebung eines Plattformfehlers, der bei Verwendung von SurfaceView in einem Compose-AndroidView auf API 34 zu gestreckten/zugeschnittenen Videos führt (#1237).
  • Downloads:
    • Achten Sie darauf, dass DownloadHelper keine nicht veröffentlichten Renderer-Instanzen weitergibt, da dies letztendlich dazu führen kann, dass eine App mit IllegalStateException: Too many receivers, total of 1000, registered for pid abstürzt (#1224).
  • Cronet-Erweiterung:
    • Behebe das Problem SocketTimeoutException in CronetDataSource. In einigen Versionen von Cronet ist die vom Callback bereitgestellte Anfrage nicht immer dieselbe. Dies führt dazu, dass der Callback nicht abgeschlossen wird und die Anfrage ein Zeitlimit überschreitet (https://issuetracker.google.com/328442628).
  • HLS-Erweiterung:
    • Es wurde ein Fehler behoben, bei dem ausstehende EMSG-Samples, die auf eine Unterbrechung warteten, in HlsSampleStreamWrapper mit einem falschen Offset delegiert wurden, was zu einem IndexOutOfBoundsException oder einem IllegalArgumentException führte (#1002).
    • Ein Fehler wurde behoben, durch den nicht primäre Playlists für LL-HLS-Streams immer wieder neu geladen wurden (#1240).
    • Es wurde ein Fehler behoben, durch den die Aktivierung von CMCD für HLS mit Initialisierungssegmenten zu Source Error und IllegalArgumentException führte.
    • Behebung eines Fehlers, durch den nicht primäre Playlists während der Livewiedergabe nicht aktualisiert wurden (#1240).
    • Ein Fehler wurde behoben, bei dem die Aktivierung von CMCD für HLS-Livestreams zu ArrayIndexOutOfBoundsException führte ( (#1395).
  • DASH-Erweiterung:
    • Es wurde ein Fehler behoben, durch den beim erneuten Vorbereiten eines Livestreams mit mehreren Zeiträumen der Fehler IndexOutOfBoundsException (#1329) angezeigt werden konnte.
    • Unterstützung für dashif:Laurl-Lizenz-URLs hinzugefügt (#1345).
  • Cast-Erweiterung:
    • Fehler behoben, durch den der Albumtitel des MediaQueueItem in das Media3-Media-Item in den Künstler konvertiert wurde (#1255).
  • Test-Tools:
    • Implementieren Sie onInit() und onRelease() in FakeRenderer.
    • Ändern Sie TestPlayerRunHelper.runUntil()/playUntil()-Methoden, sodass sie bei nicht schwerwiegenden Fehlern (z.B. bei Fehlern, die an AnalyticsListener.onVideoCodecError() gemeldet werden) fehlschlagen. Verwenden Sie die neue TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()-Methodenkette, um dieses Verhalten zu deaktivieren.
  • Demo-App:
    • Verwenden Sie DefaultPreloadManager in der Demo-App für Kurzformen.
    • Wiederholungsmodus kann mit Intent-Argumenten über die Befehlszeile festgelegt werden (#1266).
    • Verwenden Sie HttpEngineDataSource als HttpDataSource, wenn das Gerät dies unterstützt.
  • Entfernen Sie die folgenden veralteten Symbole:
    • Entfernen Sie CronetDataSourceFactory. Verwenden Sie stattdessen CronetDataSource.Factory.
    • Entfernen Sie einige DataSpec-Konstruktoren. Verwenden Sie stattdessen DataSpec.Builder.
    • Entfernen Sie die Methode setContentTypePredicate(Predicate) aus DefaultHttpDataSource, OkHttpDataSource und CronetDataSource. Verwenden Sie stattdessen die entsprechende Methode für jedes XXXDataSource.Factory.
    • Entfernen Sie OkHttpDataSource-Konstruktoren und OkHttpDataSourceFactory. Verwenden Sie stattdessen OkHttpDataSource.Factory.
    • Entfernen Sie PlayerMessage.setHandler(Handler). Verwenden Sie stattdessen setLooper(Looper).
    • Entfernen Sie das Feld „Timeline.Window.isLive“. Verwenden Sie stattdessen die Methode isLive().
    • Entfernen Sie DefaultHttpDataSource-Konstruktoren. Verwenden Sie stattdessen DefaultHttpDataSource.Factory.
    • Entfernen Sie DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Verwenden Sie stattdessen DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS.
    • Entfernen Sie MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Verwenden Sie stattdessen MediaCodecInfo.canReuseCodec(Format, Format).
    • Entfernen Sie die Methode DrmSessionManager.DUMMY und getDummyDrmSessionManager(). Verwenden Sie stattdessen DrmSessionManager.DRM_UNSUPPORTED.
    • Entferne AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). Verwenden Sie stattdessen die Überladungen, die ein DecoderReuseEvaluation akzeptieren.
    • Entfernen Sie die Konstanten RendererSupport.FormatSupport IntDef und FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE und FORMAT_UNSUPPORTED_TYPE. Verwenden Sie stattdessen die entsprechenden IntDef- und Konstanten in androidx.media3.common.C (z.B. C.FORMAT_HANDLED).
    • Entfernen Sie die Bundleable-Schnittstelle. Dazu gehört auch das Entfernen aller konstanten Bundleable.Creator<Foo> CREATOR-Felder. Aufrufer sollten stattdessen die Methoden Bundle toBundle() und static Foo fromBundle(Bundle) für jeden Typ verwenden.

Version 1.4.0-rc01

10. Juli 2024

Verwenden Sie die stabile Version 1.4.0.

Version 1.4.0-beta01

26. Juni 2024

Verwenden Sie die stabile Version 1.4.0.

Version 1.4.0-alpha02

7. Juni 2024

Verwenden Sie die stabile Version 1.4.0.

Version 1.4.0-alpha01

17. April 2024

Verwenden Sie die stabile Version 1.4.0.

Version 1.3.0

Version 1.3.1

11. April 2024

androidx.media3:media3-*:1.3.1 wird veröffentlicht. Version 1.3.1 enthält diese Commits.

  • Gemeinsame Mediathek:
    • Fügen Sie Format.labels hinzu, um lokalisierte oder andere alternative Labels zuzulassen.
  • ExoPlayer:
    • Das Problem, dass PreloadMediaPeriod die Streams nicht beibehalten kann, wenn sie neu geladen wird, wurde behoben.
    • Wende bei der erneuten Auswahl von Tracks das richtige TrackSelectionResult für den Wiedergabezeitraum an.
    • Renderer mit Early-Enablement sollten erst nach dem Fortschreiten des Wiedergabezeitraums gestartet werden, wenn zwischen Media-Elementen gewechselt wird (#1017).
    • Der ProGuard-Regel für -keepclasseswithmembers wurde der fehlende Rückgabetyp hinzugefügt. DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformer:
    • Es wurde eine Problemumgehung für Ausnahmen hinzugefügt, die aufgrund von MediaMuxer ausgelöst werden, da negative Präsentationszeitstempel vor API 30 nicht unterstützt werden.
  • Titelauswahl:
    • DefaultTrackSelector: Bevorzuge Videotracks mit einer „angemessenen“ Framerate (>=10 fps) gegenüber solchen mit einer niedrigeren oder nicht festgelegten Framerate. So wird sichergestellt, dass der Player den „echten“ Videotrack in MP4-Dateien auswählt, die aus Bewegungsfotos extrahiert wurden. Diese können zwei HEVC-Tracks enthalten, von denen einer eine höhere Auflösung, aber eine sehr geringe Anzahl von Frames hat (#1051).
  • Extraktoren:
    • Ein Problem wurde behoben, bei dem das Padding beim Lesen von Chunks mit ungerader Größe aus WAV-Dateien nicht übersprungen wurde (#1117).
    • MP3: Füllen Sie Format.averageBitrate aus Metadaten-Frames wie XING und VBRI.
    • MPEG-TS: Eine Änderung wurde rückgängig gemacht, die dafür sorgen sollte, dass der letzte Frame gerendert wird. Dazu wurde die letzte Zugriffseinheit eines Streams an die Sample-Warteschlange übergeben (#7909). Das liegt daran, dass die Änderung neue Probleme mit reinen I-Frame-HLS-Streams (#1150) und H.262-HLS-Streams (#1126) verursacht.
  • Audio:
    • Wiedergabe-Engine-Wiederherstellung ermöglichen, indem das Offloading deaktiviert wird, wenn die Initialisierung des Audiotracks im Offload-Modus fehlschlägt.
  • Video:
    • Es wurde eine Problemumgehung für ein Geräteproblem auf dem Galaxy Tab S7 FE, dem Chromecast mit Google TV und dem Lenovo M10 FHD Plus hinzugefügt, durch das H265-Streams mit 60 fps als nicht unterstützt markiert werden.
    • Es wurde ein Workaround hinzugefügt, der dafür sorgt, dass der erste Frame beim Tunneling immer gerendert wird, auch wenn das Gerät dies nicht automatisch wie von der API gefordert tut (#1169). (#966).
    • Es wurde ein Problem behoben, bei dem die Verarbeitung von HDR-Farbinformationen zu einem fehlerhaften Verhalten des Codecs führte und adaptive Formatwechsel für SDR-Videotracks verhindert wurden (#1158).
  • Text:
    • WebVTT: Verhindern, dass direkt aufeinanderfolgende Cues fälschlicherweise zusätzliche CuesWithTiming-Instanzen aus WebvttParser.parse erstellen (#1177).
  • DRM:
    • Umgehe einen NoSuchMethodError, der vom MediaDrm-Framework anstelle von ResourceBusyException oder NotProvisionedException auf einigen Android 14-Geräten ausgelöst werden kann (#1145).
  • Wirkung:
    • Verbessertes Tone-Mapping von PQ zu SDR durch Konvertieren von Farbräumen.
  • Sitzung:
    • Ein Problem wurde behoben, bei dem die aktuelle Position zurückspringt, wenn der Controller das aktuelle Element ersetzt (#951).
    • Ein Problem wurde behoben, bei dem MediaMetadata mit nur nicht leeren extras nicht zwischen Media-Controllern und Sitzungen übertragen wurde (#1176).
  • UI:
    • Als Fallback wird der Name der Sprache des Audiotracks verwendet, wenn Locale keinen Anzeigenamen ermitteln kann (#988).
  • DASH-Erweiterung:
    • Füllen Sie alle Label-Elemente aus dem Manifest in Format.labels ein (#1054).
  • RTSP-Erweiterung:
    • Leere Werte für Sitzungsinformationen (i-Tags) beim SDP-Parsing überspringen (#1087).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • Die MIDI-Erweiterung ist standardmäßig als lokale Abhängigkeit deaktiviert, da ein zusätzliches Maven-Repository konfiguriert werden muss. Nutzer, die dieses Modul aus einer lokalen Abhängigkeit benötigen, können es wieder aktivieren.

Version 1.3.0

6. März 2024

androidx.media3:media3-*:1.3.0 wird veröffentlicht. Version 1.3.0 enthält diese Commits.

  • Gemeinsame Mediathek:
    • Implementieren Sie die Unterstützung für android.resource://package/[type/]name-Rohressourcen-URIs, wobei sich package vom Paket der aktuellen Anwendung unterscheidet. Das hat immer funktioniert, war aber bisher nicht richtig implementiert.
    • MIME-Typen, die vom App-Code festgelegt oder aus Medien gelesen werden, werden normalisiert, sodass sie nur aus Kleinbuchstaben bestehen.
    • Definieren Sie Anzeigen mit einem vollständigen MediaItem anstelle eines einzelnen Uri in AdPlaybackState.
    • Erhöhen Sie minSdk auf 19 (Android KitKat). Dies entspricht allen anderen AndroidX-Bibliotheken und ist erforderlich, damit wir auf die neuesten Versionen unserer AndroidX-Abhängigkeiten aktualisieren können.
    • Füllen Sie sowohl artworkUri als auch artworkData in MediaMetadata.Builder.populate(MediaMetadata) aus, wenn mindestens eines der beiden Elemente nicht null ist (#964).
  • ExoPlayer:
    • Fügen Sie PreloadMediaSource und PreloadMediaPeriod hinzu, damit Apps vor der Wiedergabe eine Content-Media-Quelle an einer bestimmten Startposition vorab laden können. PreloadMediaSource bereitet die Inhaltsmedienquelle für den Empfang von Timeline vor, bereitet den Zeitraum an der angegebenen Startposition vor und speichert ihn im Cache, wählt Tracks aus und lädt die Media-Daten für den Zeitraum. Apps steuern den Preload-Fortschritt durch die Implementierung von PreloadMediaSource.PreloadControl und legen die vorab geladene Quelle für die Wiedergabe im Player fest.
    • Fügen Sie ExoPlayer.setImageOutput hinzu, damit Apps ImageRenderer.ImageOutput festlegen können.
    • DefaultRenderersFactory stellt dem Player jetzt standardmäßig ein ImageRenderer mit null ImageOutput und ImageDecoder.Factory.DEFAULT zur Verfügung.
    • Das Player.Listener.onPositionDiscontinuity-Ereignis wird ausgegeben, wenn Stille übersprungen wird (#765).
    • Experimentelle Unterstützung für das Parsen von Untertiteln während der Extraktion hinzugefügt. Sie können diese Option mit MediaSource.Factory.experimentalParseSubtitlesDuringExtraction() aktivieren.
    • Adaptive Media-Quellen mit PreloadMediaSource unterstützen.
    • Implementieren Sie HttpEngineDataSource, eine HttpDataSource mit der HttpEngine API.
    • Unterklassenbildung verhindern CompositeSequenceableLoader Diese Komponente wurde bereits erweiterbar gemacht, aber nie in der Bibliothek untergeordnet. Anpassungen können vorgenommen werden, indem eine Instanz mit dem Decorator-Muster umschlossen und eine benutzerdefinierte CompositeSequenceableLoaderFactory implementiert wird.
    • Ein Problem wurde behoben, bei dem durch Wiederholen derselben Zeit die Metadaten dieses Elements gelöscht wurden (#1007).
    • Benennen Sie die experimentalSetSubtitleParserFactory-Methoden für BundledChunkExtractor.Factory und DefaultHlsExtractorFactory in setSubtitleParserFactory um und verbieten Sie die Übergabe von null. Verwenden Sie die neuen experimentalParseSubtitlesDuringExtraction(boolean)-Methoden, um das Parsing-Verhalten zu steuern.
    • Unterstützung für die Anpassung des SubtitleParser.Factory hinzugefügt, das während der Extraktion verwendet wird. Dies kann mit MediaSource.Factory.setSubtitleParserFactory() erreicht werden.
    • Fügen Sie allen Format.id-Feldern, die aus MergingMediaSource generiert werden, das Quellpräfix hinzu. So lässt sich ermitteln, welche Quelle eine Format generiert hat (#883).
    • Der reguläre Ausdruck, der zum Validieren benutzerdefinierter CMCD-Schlüsselnamen (Common Media Client Data) verwendet wird, wurde korrigiert. Er prüft jetzt nur noch auf Bindestriche (#1028).
    • Doppelte Codierung von CMCD-Abfrageparametern beenden (#1075).
  • Transformer:
    • Unterstützung für das Zusammenführen von H.265/HEVC-SEF-Zeitlupenvideos hinzugefügt
    • Die Transmuxing-Geschwindigkeit wurde erhöht, insbesondere bei Bearbeitungen vom Typ „Video entfernen“.
    • Fügen Sie eine API hinzu, damit die Ausgabedatei mit einem Videobild beginnt. Dadurch kann die Ausgabe von Zuschneidevorgängen besser mit Player-Implementierungen kompatibel sein, die den ersten Videoframes erst dann anzeigen, wenn ihr Präsentationszeitstempel (#829) erreicht ist.
    • Unterstützung für die Optimierung von MP4-Zuschneidevorgängen für einzelne Assets wurde hinzugefügt.
    • Unterstützung hinzugefügt, um sicherzustellen, dass ein Videobild den ersten Zeitstempel in der Ausgabedatei hat. Es wurde ein Fehler behoben, bei dem Ausgabedateien auf iOS-basierten Playern mit einem schwarzen Frame begannen (#829).
  • Titelauswahl:
    • Fügen Sie DefaultTrackSelector.selectImageTrack hinzu, um die Auswahl von Bild-Tracks zu aktivieren.
    • Fügen Sie TrackSelectionParameters.isPrioritizeImageOverVideoEnabled hinzu, um festzulegen, ob ein Bild-Track ausgewählt werden soll, wenn sowohl ein Bild- als auch ein Video-Track verfügbar sind. Der Standardwert ist false. Das bedeutet, dass die Auswahl eines Videotracks priorisiert wird.
  • Extraktoren:
    • Dem MP4-Extractor wurde zusätzliches AV1C-Parsing hinzugefügt, um die Werte ColorInfo.colorSpace, ColorInfo.colorTransfer und ColorInfo.colorRange abzurufen (#692).
    • MP3: Verwenden Sie die Suche mit konstanter Bitrate (CBR) für Dateien mit einem Info-Header (das CBR-Äquivalent des Xing-Headers). Bisher haben wir die Suchtabelle aus dem Info-Header verwendet. Dies führt jedoch zu einer weniger präzisen Suche als wenn wir sie ignorieren und davon ausgehen, dass die Datei CBR ist.
    • MPEG2-TS: Unterstützung für DTS, DTS-LBR und DTS:X Profile2 hinzugefügt (#275).
    • Audiotypen aus TS-Deskriptoren extrahieren und Rollenflags zuordnen, damit Nutzer fundiertere Entscheidungen bei der Auswahl von Audiotracks treffen können (#973).
  • Audio:
    • Der Algorithmus zum Überspringen von Stille wurde verbessert. Die Lautstärke wird jetzt sanfter angepasst. Außerdem wurde die minimale Stille beibehalten und die Dauer der Stille ist jetzt natürlicher (#7423).
    • Übersprungene Stummschaltungen werden deterministischer gemeldet (#1035).
  • Video:
    • Ändern Sie den MediaCodecVideoRenderer-Konstruktor, der ein VideoFrameProcessor.Factory-Argument verwendet, und ersetzen Sie ihn durch einen Konstruktor, der ein VideoSinkProvider-Argument verwendet. Apps, die ein benutzerdefiniertes VideoFrameProcessor.Factory einfügen möchten, können ein CompositingVideoSinkProvider instanziieren, das das benutzerdefinierte VideoFrameProcessor.Factory verwendet, und den Video-Sink-Provider an MediaCodecVideoRenderer übergeben.
  • Text:
    • Die Serialisierung von Bitmap-Hinweisen wurde korrigiert, um den Fehler Tried to marshall a Parcel that contained Binder objects bei Verwendung von DefaultExtractorsFactory.setTextTrackTranscodingEnabled zu beheben (#836).
    • CEA-708: Ignoriere den Wert rowLock. In der CEA-708-E S-2023-Spezifikation wird angegeben, dass sowohl rowLock als auch columnLock als „true“ angenommen werden sollten, unabhängig von den im Stream vorhandenen Werten (columnLock wird nicht unterstützt, daher wird effektiv immer „false“ angenommen).
  • Bild:
    • Unterstützung für DASH-Thumbnails hinzugefügt Rasterbilder werden zugeschnitten und einzelne Thumbnails werden ImageOutput kurz vor dem jeweiligen Präsentationszeitpunkt bereitgestellt.
  • DRM:
  • IMA-Erweiterung:
    • Ein Problem wurde behoben, durch das DASH- und HLS-Anzeigen ohne die entsprechende Dateiendung nicht abgespielt werden konnten.
  • Sitzung:
    • Doppelklickerkennung für TV-Apps deaktivieren (#962).
    • Ein Problem wurde behoben, bei dem MediaItem.RequestMetadata mit nur nicht leeren Extras nicht zwischen Media-Controllern und Sitzungen übertragen wurde.
    • Fügen Sie MediaLibrarySession.Builder einen Konstruktor hinzu, der nur ein Context anstelle eines MediaLibraryService akzeptiert.
  • HLS-Erweiterung:
    • Reduzieren Sie die Sichtbarkeit von HlsMediaPeriod auf „package-private“. Von außerhalb des HLS-Pakets sollte nicht direkt von diesem Typ abgeleitet werden.
    • Die Auflösung wird effizienter zum Beginn eines Segments gesucht (#1031).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • MIDI-Decoder: SysEx-Ereignismeldungen ignorieren (#710).
  • Test-Tools:
    • Pausiere die Wiedergabe in TestPlayerRunHelper.playUntilPosition nicht. Beim Test wird die Wiedergabe fortgesetzt, aber der Fortschritt wird angehalten, bis der Test Zusicherungen und weitere Aktionen hinzufügen kann.
  • Demo-App:
    • Füge ein Shortform-Demomodul hinzu, um die Verwendung von PreloadMediaSource im Anwendungsfall für Shortform-Inhalte zu demonstrieren.

Version 1.3.0-rc01

22. Februar 2024

Verwenden Sie die stabile Version 1.3.0.

Version 1.3.0-beta01

7. Februar 2024

Verwenden Sie die stabile Version 1.3.0.

Version 1.3.0-alpha01

15. Januar 2024

Verwenden Sie die stabile Version 1.3.0.

Version 1.2.0

Version 1.2.1

9. Januar 2024

  • ExoPlayer:
    • Ein Problem wurde behoben, durch das bei manuellen Suchvorgängen außerhalb des Bereichs LiveConfiguration.min/maxOffset der Offset immer wieder auf min/maxOffset zurückgesetzt wurde.
    • Problem behoben, bei dem die OPUS- und VORBIS-Channel-Layouts für 3, 5, 6, 7 und 8 Channels falsch waren (#8396).
    • Ein Problem wurde behoben, durch das bei der Auswahl von Tracks nach dem Zurückspulen auf null in einem Livestream der Stream fälschlicherweise an der Standardposition gestartet wurde (#9347).
    • Das Problem wurde behoben, dass neue Instanzen von CmcdData.Factory negative Werte für bufferedDurationUs aus Chunk-Quellen erhalten haben, was zu einem IllegalArgumentException (#888) geführt hat.
  • Transformer:
    • Problem umgehen, bei dem der Encoder bei der Konfiguration aufgrund einer hohen Betriebsrate einen Fehler ausgibt.
  • Extraktoren:
    • Markieren Sie sekundäre (nicht abspielbare) HEVC-Tracks in JPEG-Bewegungsfotos als ROLE_FLAG_ALTERNATE, damit sie aufgrund ihrer höheren Auflösung nicht automatisch für die Wiedergabe ausgewählt werden.
    • Falsche Keyframe-Erkennung für TS H264-Streams korrigieren (#864).
    • Die Schätzung der Dauer von TS-Streams, die länger als 47.721 Sekunden sind, wurde korrigiert (#855).
  • Audio:
    • Die Verarbeitung von EOS für SilenceSkippingAudioProcessor wurde korrigiert, wenn sie mehrmals aufgerufen wird (#712).
  • Video:
    • Es wurde eine Problemumgehung für ein Geräteproblem auf dem Galaxy Tab S7 FE, Chromecast mit Google TV und Lenovo M10 FHD Plus hinzugefügt, das dazu führt, dass AVC-Streams mit 60 fps als nicht unterstützt markiert werden (#693).
  • Metadaten:
    • Ein Fehler wurde behoben, bei dem MediaMetadata nur aus Vorbis-Kommentaren mit Großbuchstabenschlüsseln (#876) ausgefüllt wurde.
    • OutOfMemoryError wird abgefangen, wenn sehr große ID3-Frames geparst werden. Die Wiedergabe kann also ohne die Tag-Informationen fortgesetzt werden, anstatt dass sie komplett fehlschlägt.
  • DRM:
    • Die Problemumgehung für die fälschliche ClearKey-Lizenz-URL https://default.url wurde auf API 33 und höher ausgeweitet. Zuvor wurde sie nur auf API 33 angewendet (#837).
    • Problem mit ERROR_DRM_SESSION_NOT_OPENED beim Wechsel von verschlüsselten zu unverschlüsselten Inhalten ohne an den Player angehängte Oberfläche behoben. Der Fehler ist aufgetreten, weil ein sicherer Decoder fälschlicherweise zum Abspielen der unverschlüsselten Inhalte verwendet wurde.
  • Sitzung:
    • Fügen Sie die benutzerdefinierten Schlüssel und Werte in MediaMetadataCompat bis MediaMetadata.extras und MediaMetadata.extras bis MediaMetadataCompat ein (#756, #802).
    • Problem mit der Übertragung notifyChildrenChanged für Legacy-Controller behoben (#644).
    • Ein Fehler wurde behoben, bei dem das Festlegen einer negativen Zeit für einen deaktivierten setWhen-Timer der Benachrichtigung auf einigen Geräten zu einem Absturz führte (#903).
    • Behebe IllegalStateException, wenn der Media-Benachrichtigungscontroller die Verbindung noch nicht abgeschlossen hat, wenn das erste Benachrichtigungsupdate angefordert wird (#917).
  • UI:
    • Ein Problem wurde behoben, bei dem die Schaltflächen zum Vor- und Zurückspulen nicht sichtbar waren, wenn sie mit Material Design in einem BottomSheetDialogFragment verwendet wurden (#511).
    • Das Problem, dass die Zahlen auf der Schnellvorlauftaste des PlayerControlView falsch ausgerichtet waren (#547), wurde behoben.
  • DASH-Erweiterung:
    • „f800“ als Kanalanzahl 5 für Dolby im DASH-Manifest parsen (#688).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • MIDI: Problem behoben, bei dem beim Vorwärtsspulen die Program Change-Ereignisse übersprungen wurden (#704).
    • Migrieren Sie zu FFmpeg 6.0 und aktualisieren Sie das unterstützte NDK auf r26b (#707, #867).
  • Cast-Erweiterung:
    • Die Erstellung von Timeline wurde bereinigt, damit die App nicht abstürzt, wenn das Laden von Media auf dem Cast-Gerät fehlschlägt (#708).

Version 1.2.0

15. November 2023

  • Gemeinsame Mediathek:
    • Fügen Sie den Methoden in der Log.Logger-Schnittstelle einen @Nullable Throwable-Parameter hinzu. Der Parameter message für diese Methoden enthält keine Informationen mehr zu Throwable, das an die Log.{d,i,w,e}()-Methoden übergeben wurde. Implementierungen müssen diese Informationen daher bei Bedarf manuell anhängen (möglicherweise mit Logger.appendThrowableString(String, Throwable)).
    • Ein Kotlin-Kompatibilitätsproblem wurde behoben, bei dem generische Typ-Parameter, die Nullwerte zulassen, und Array-Elementtypen, die Nullwerte zulassen, nicht als solche erkannt wurden. Beispiele sind die Methodenparameter TrackSelectorResult und SimpleDecoder (#6792).
    • Ändern Sie das Standardverhalten der Benutzeroberfläche und der Benachrichtigungen in Util.shouldShowPlayButton, um eine Schaltfläche zum Abspielen anzuzeigen, wenn die Wiedergabe vorübergehend unterdrückt wird (z.B. aufgrund eines vorübergehenden Verlusts des Audiofokus). Das bisherige Verhalten kann beibehalten werden, indem Sie PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) oder MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) verwenden (#11213).
    • Führen Sie ein Upgrade von androidx.annotation:annotation-experimental auf 1.3.1 durch, um das Problem unter https://issuetracker.google.com/251172715 zu beheben.
    • Verschieben Sie ExoPlayer.setAudioAttributes zur Player-Schnittstelle.
  • ExoPlayer:
    • Problem mit der Suche in AC4-Streams behoben, das dadurch verursacht wurde, dass „decode-only“-Samples nicht richtig identifiziert wurden (#11000).
    • Wiedergabe auf ungeeigneten Audioausgabegeräten (z.B. dem integrierten Lautsprecher auf Wear OS-Geräten) unterdrücken, wenn diese Funktion über ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput aktiviert ist. Der Grund für die Unterdrückung der Wiedergabe wird als Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT aktualisiert, wenn die Wiedergabe versucht wird, aber keine geeigneten Audioausgänge verfügbar sind oder wenn alle geeigneten Ausgänge während der Wiedergabe getrennt werden. Der Grund für die Unterdrückung wird entfernt, wenn eine geeignete Ausgabe verbunden ist.
    • Fügen Sie MediaSource.canUpdateMediaItem und MediaSource.updateMediaItem hinzu, um MediaItem-Updates nach der Erstellung über Player.replaceMediaItem(s) zu akzeptieren.
    • MediaItem-Updates für alle MediaSource-Klassen, die von der Bibliothek bereitgestellt werden, über Player.replaceMediaItem(s) zulassen (#33, #9978).
    • Benennen Sie MimeTypes.TEXT_EXOPLAYER_CUES in MimeTypes.APPLICATION_MEDIA3_CUES um.
    • Fügen Sie PngExtractor hinzu, um eine ganze PNG-Datei als ein Beispiel in TrackOutput zu senden und zu lesen.
    • Die Methode SequenceableLoader.continueLoading(long) in der Schnittstelle SequenceableLoader wurde verbessert, um SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo enthält neben dem vorhandenen playbackPositionUs zusätzliche Parameter, darunter playbackSpeed und lastRebufferRealtimeMs.
    • Erweitere die Methode ChunkSource.getNextChunk(long, long, List, ChunkHolder) in der Schnittstelle ChunkSource zu ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Dem CMCD-Logging (Common Media Client Data) wurden zusätzliche Felder hinzugefügt: „buffer starvation“ (bs), „deadline“ (dl), „playback rate“ (pr) und „startup“ (su) (#8699).
    • Luma- und Chroma-Bit-Tiefe zu ColorInfo hinzufügen (#491).
    • Dem CMCD-Logging (Common Media Client Data) wurden zusätzliche Felder hinzugefügt: nächste Objektanfrage (nor) und nächste Bereichsanfrage (nrr) (#8699).
    • Funktion zum Übertragen von CMCD-Daten (Common Media Client Data) mithilfe von Abfrageparametern hinzugefügt (#553).
    • Behebe das Problem ConcurrentModificationException in ExperimentalBandwidthMeter (#612).
    • Fügen Sie CompositeMediaSource.getMediaTimeForChildMediaTime den Parameter MediaPeriodId hinzu.
    • Unterstützung von ClippingMediaSource (und anderen Quellen mit Zeitversatz für Zeitraum/Zeitfenster) in ConcatenatingMediaSource2 (#11226).
    • Ändern Sie BaseRenderer.onStreamChanged() so, dass auch ein MediaPeriodId-Argument empfangen wird.
  • Transformer:
    • EXIF-Rotationsdaten für Bildeingaben parsen.
    • Entfernen Sie den Annotationstyp TransformationRequest.HdrMode und die zugehörigen Konstanten. Verwenden Sie stattdessen Composition.HdrMode und die zugehörigen Konstanten.
    • Vereinfachen Sie die OverlaySettings, um Probleme mit der Drehung zu beheben.
    • Die Parameter frameRate und durationUs von SampleConsumer.queueInputBitmap wurden in TimestampIterator geändert.
  • Titelauswahl:
    • Fügen Sie DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness hinzu, um die nicht nahtlose Anpassung explizit zuzulassen oder zu verbieten. Die Standardeinstellung bleibt beim aktuellen Verhalten von true.
  • Extraktoren:
    • MPEG-TS: Achten Sie darauf, dass der letzte Frame gerendert wird, indem Sie die letzte Zugriffseinheit eines Streams an die Sample-Warteschlange übergeben (#7909).
    • Tippfehler bei der Bestimmung von rotationDegrees behoben. projectionPosePitch wurde in projectionPoseRoll geändert (#461).
    • Die Annahme, dass Extractor-Instanzen direkt mit instanceof geprüft werden können, wird entfernt. Wenn Sie zur Laufzeit auf die Implementierungsdetails eines Extractor zugreifen möchten, müssen Sie zuerst Extractor.getUnderlyingInstance aufrufen.
    • Fügen Sie BmpExtractor hinzu.
    • Fügen Sie WebpExtractor hinzu.
    • Fügen Sie HeifExtractor hinzu.
    • QuickTime Classic-Unterstützung für Mp4Extractor hinzufügen
  • Audio:
    • Unterstützung für 24-/32-Bit-Big-Endian-PCM in MP4 und Matroska hinzugefügt und PCM-Codierung für lpcm in MP4 geparst.
    • Unterstützung für das Extrahieren von Vorbis-Audio in MP4 hinzugefügt.
    • Füge AudioSink.getFormatOffloadSupport(Format) hinzu, um den Grad der Offload-Unterstützung abzurufen, die die Senke für das Format über eine DefaultAudioOffloadSupportProvider bieten kann. Es wird das neue AudioOffloadSupport zurückgegeben, das isFormatSupported, isGaplessSupported und isSpeedChangeSupported enthält.
    • Fügen Sie AudioSink.setOffloadMode() hinzu, über das die Offload-Konfiguration auf der Audio-Senke konfiguriert wird. Der Standardwert ist AudioSink.OFFLOAD_MODE_DISABLED.
    • Die Auslagerung kann über setAudioOffloadPreference in TrackSelectionParameters aktiviert werden. Wenn die festgelegte Einstellung „Aktivieren“ lautet, das Gerät das Offload für das Format unterstützt und die Titelauswahl ein einzelner Audiotrack ist, wird das Audio-Offload aktiviert.
    • Wenn audioOffloadModePreference auf AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED gesetzt ist, wird mit DefaultTrackSelector nur ein Audiotrack ausgewählt und nur, wenn das Format dieses Tracks im Offload unterstützt wird. Wenn kein Audiotrack für den Offload unterstützt wird, wird kein Track ausgewählt.
    • Die Unterstützung für unterbrechungsfreies Offload wird für Geräte vor API-Level 33 deaktiviert, da es nach dem Übergang zwischen Titeln zu Problemen mit der Wiedergabeposition kommt.
    • Entfernen Sie den Parameter enableOffload aus der Methodensignatur DefaultRenderersFactory.buildAudioSink.
    • Entfernen Sie die Methode DefaultAudioSink.Builder.setOffloadMode.
    • Entfernen Sie den intdef-Wert DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Unterstützung für Opus-Metadaten für lückenlose Wiedergabe während der Offload-Wiedergabe hinzugefügt.
    • Renderer-Wiederherstellung durch Deaktivieren des Offloads ermöglichen, wenn der erste Schreibvorgang fehlgeschlagen ist (#627).
    • Standardmäßig die Offload-Planung für die Offload-Wiedergabe nur von Audio aktivieren.
    • Löschen Sie ExoPlayer.experimentalSetOffloadSchedulingEnabled und AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • onExperimentalSleepingForOffloadChanged wurde in onSleepingForOffloadChanged und onExperimentalOffloadedPlayback in onOffloadedPlayback umbenannt.
    • Verschieben Sie die mit dem Audio-Offload-Modus verknüpften TrackSelectionParameters-Schnittstellen und ‑Definitionen in eine innere AudioOffloadPreferences-Klasse.
    • Fügen Sie onAudioTrackInitialized- und onAudioTrackReleased-Callbacks zu AnalyticsListener, AudioRendererEventListener und AudioSink.Listener hinzu.
    • Problem mit DTS Express-Audio-Pufferunterlauf behoben (#650).
    • Fehler behoben, bei dem die Funktion „capabilities check“ für E-AC3-JOC den Fehler IllegalArgumentException zurückgegeben hat (#677).
  • Video:
    • MediaCodecVideoRenderer erlauben, eine benutzerdefinierte VideoFrameProcessor.Factory zu verwenden.
    • Es wurde ein Fehler behoben, bei dem der erste Frame nicht gerendert werden konnte, wenn der Audiostream mit negativen Zeitstempeln beginnt (#291).
  • Text:
    • Entfernen Sie ExoplayerCuesDecoder. Text-Tracks mit sampleMimeType = application/x-media3-cues werden jetzt direkt von TextRenderer verarbeitet, ohne dass eine SubtitleDecoder-Instanz erforderlich ist.
  • Metadaten:
    • MetadataDecoder.decode wird für „decode-only“-Samples nicht mehr aufgerufen, da die Implementierung ohnehin „null“ zurückgeben muss.
  • Wirkung:
    • VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)-Bitmap-Eingabe nach Zeitstempel hinzufügen.
    • Ändern Sie VideoFrameProcessor.registerInputStream() in einen nicht blockierenden Aufruf. Apps müssen VideoFrameProcessor.Listener#onInputStreamRegistered() implementieren.
    • Die Parameter frameRate und durationUs von VideoFrameProcessor.queueInputBitmap wurden in TimestampIterator geändert.
  • IMA-Erweiterung:
    • Es wurde ein Fehler behoben, durch den bei einem DASH-Livestream mit mehreren Zeiträumen, der nicht das erste Element in einer Playlist ist, eine Ausnahme ausgelöst werden konnte (#571).
    • StreamManager vor dem Aufrufen von AdsLoader.destroy() freigeben
    • IMA SDK-Version auf 3.31.0 aktualisiert.
  • Sitzung:
    • Legen Sie das Verhalten des Benachrichtigungsdienstes im Vordergrund auf FOREGROUND_SERVICE_IMMEDIATE in DefaultMediaNotificationProvider fest (#167).
    • Verwenden Sie nur android.media.session.MediaSession.setMediaButtonBroadcastReceiver() über API 31, um Probleme mit der eingestellten API auf Samsung-Geräten zu vermeiden (#167).
    • Verwenden Sie den Media-Benachrichtigungs-Controller als Proxy, um verfügbare Befehle und das benutzerdefinierte Layout festzulegen, mit denen die Benachrichtigung und die Plattform-Sitzung gefüllt werden.
    • Konvertieren Sie Ereignisse von Medientasten, die von MediaSessionService.onStartCommand() in Media3 empfangen werden, anstatt sie an die Plattformsitzung und zurück an Media3 weiterzuleiten. Dadurch ist der Anrufer-Controller immer der Controller für Medienbenachrichtigungen und Apps können Anrufe, die über die Benachrichtigung eingehen, auf allen unterstützten API-Ebenen auf dieselbe Weise erkennen.
    • Es wurde ein Fehler behoben, durch den MediaController.getCurrentPosition() nicht weiterging, wenn eine Verbindung zu einem alten MediaSessionCompat bestand.
    • Fügen Sie MediaLibrarySession.getSubscribedControllers(mediaId) hinzu, um die Bedienung zu vereinfachen.
    • Überschreiben Sie MediaLibrarySession.Callback.onSubscribe(), um die Verfügbarkeit der übergeordneten ID zu bestätigen, für die der Controller abonniert ist. Wenn die Anfrage erfolgreich ist, wird das Abo akzeptiert und notifyChildrenChanged() wird sofort aufgerufen, um den Browser zu informieren (#561).
    • Sitzungsdemomodul für Automotive OS hinzugefügt und Sitzungsdemo für Android Auto aktiviert.
    • Legen Sie die Warteschlange der Framework-Sitzung nicht fest, wenn COMMAND_GET_TIMELINE für den Controller für Medienbenachrichtigungen nicht verfügbar ist. Wenn Android Auto als Clientcontroller die Daten aus der Framework-Sitzung liest, hat dies zur Folge, dass die Schaltfläche queue in der Benutzeroberfläche von Android Auto nicht angezeigt wird (#339).
    • Verwenden Sie standardmäßig DataSourceBitmapLoader anstelle von SimpleBitmapLoader (#271, #327).
    • Fügen Sie MediaSession.Callback.onMediaButtonEvent(Intent) hinzu, damit Apps die Standardbehandlung von Media-Button-Ereignissen überschreiben können.
  • UI:
    • Füge eine Player.Listener-Implementierung für Wear OS-Geräte hinzu, die die Wiedergabeunterdrückung aufgrund von Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT verarbeitet, indem ein Systemdialogfeld gestartet wird, in dem ein Nutzer einen geeigneten Audioausgang (z.B. Bluetooth-Kopfhörer) verbinden kann. Die Wiedergabe wird automatisch fortgesetzt, wenn innerhalb eines konfigurierbaren Zeitlimits (Standard: 5 Minuten) ein geeignetes Gerät verbunden wird.
  • Downloads:
    • Deklarieren Sie den Typ des Dienstes im Vordergrund „dataSync“ für DownloadService, um die Kompatibilität mit Android 14 zu gewährleisten. Wenn Sie diesen Dienst verwenden, muss die App auch dataSync als foregroundServiceType im Manifest hinzufügen und die Berechtigung FOREGROUND_SERVICE_DATA_SYNC (#11239) hinzufügen.
  • HLS-Erweiterung:
    • Die HLS-Live-Playlist wird in einem Intervall aktualisiert, das aus der letzten Ladebeginnzeit und nicht aus der letzten Ladeabschlusszeit berechnet wird (#663).
  • DASH-Erweiterung:
    • Mehrere DASH-IDs desselben Typs in der Segmentvorlagen-URL zulassen.
    • Experimentelle Unterstützung für das Parsen von Untertiteln während der Extraktion hinzugefügt. Das Zusammenführen von sich überschneidenden Untertiteln wird besser unterstützt, einschließlich der Behebung von Flackern beim Übergang zwischen Untertitelsegmenten. Sie können diese Funktion mit DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288) aktivieren.
  • RTSP-Erweiterung:
    • Eine Race-Bedingung wurde behoben, die beim Fallback auf TCP zu IndexOutOfBoundsException oder in einigen Situationen zu einer hängenden Wiedergabe führen konnte.
    • Prüfe den Status bei der RTSP-Einrichtung, wenn der Ladestatus von RtspMediaPeriod zurückgegeben wird (#577).
    • Benutzerdefinierte RTSP-Anfragemethoden im öffentlichen Header der Options-Antwort ignorieren (#613).
    • Verwenden Sie den RTSP-Setup-Antwort-Zeitlimitwert im Zeitintervall für das Senden von RTSP-Optionsanfragen für Keep-Alive (#662).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • Das MIDI-Decodierermodul wird veröffentlicht. Es bietet Unterstützung für die Wiedergabe von Standard-MIDI-Dateien mithilfe der Jsyn-Bibliothek zur Audiosynthese.
    • Fügen Sie DecoderOutputBuffer.shouldBeSkipped hinzu, um Ausgabepuffer direkt zu kennzeichnen, die nicht präsentiert werden müssen. Diese Methode wird gegenüber C.BUFFER_FLAG_DECODE_ONLY bevorzugt, da diese eingestellt wird.
    • Fügen Sie Decoder.setOutputStartTimeUs und SimpleDecoder.isAtLeastOutputStartTimeUs hinzu, damit Decoder reine Decodierungs-Samples vor der Startzeit verwerfen können. Diese Methode sollte gegenüber Buffer.isDecodeOnly bevorzugt werden, da diese verworfen wird.
    • Fehler beim Veröffentlichen des MIDI-Decoder-Artefakts im Maven-Repository behoben. Das Artefakt wird in media3-exoplayer-midi umbenannt (#734).
  • Leanback-Erweiterung:
    • Es wurde ein Fehler behoben, bei dem das Deaktivieren einer Oberfläche zu einem ArithmeticException im Leanback-Code führen konnte (#617).
  • Test-Tools:
    • TestExoPlayerBuilder und FakeClock mit Espresso-UI-Tests und Compose-UI-Tests kompatibel machen Damit wird ein Fehler behoben, bei dem die Wiedergabe während Espresso- oder Compose-Ansichtsinteraktionen nicht deterministisch voranschreitet.
  • Entfernen Sie die folgenden veralteten Symbole:
    • Entfernen Sie TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) und TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Verwenden Sie Composition.Builder.setHdrMode(int) und übergeben Sie Composition stattdessen an Transformer.start(Composition, String).
    • Die verworfene Methode DownloadNotificationHelper.buildProgressNotification wurde entfernt. Verwenden Sie stattdessen eine nicht verworfene Methode, die den Parameter notMetRequirements akzeptiert.

Version 1.2.0-rc01

1. November 2023

Verwenden Sie die stabile Version 1.2.0.

Version 1.2.0-beta01

19. Oktober 2023

Verwenden Sie die stabile Version 1.2.0.

Version 1.2.0-alpha02

29. September 2023

Verwenden Sie die stabile Version 1.2.0.

Version 1.2.0-alpha01

17. August 2023

Verwenden Sie die stabile Version 1.2.0.

Version 1.1.0

Version 1.1.1

16. August 2023

  • Gemeinsame Mediathek:
    • Entfernen Sie die versehentlich hinzugefügte multidex-Abhängigkeit aus allen Modulen (#499).
  • ExoPlayer:
    • Ein Problem in PlaybackStatsListener wurde behoben, bei dem nach dem Löschen der Playlist fälschlicherweise PlaybackStats erstellt wurden.
    • Zusätzliche Felder für die Protokollierung von Common Media Client Data (CMCD) hinzugefügt: Streamingformat (sf), Streamtyp (st), Version (v), höchste Bitrate (tb), Objektdauer (d), gemessener Durchsatz (mtp) und Objekttyp (ot) (#8699).
  • Audio:
    • Es wurde ein Fehler behoben, durch den Player.getState() bei der Wiedergabe sehr kurzer Dateien nie in STATE_ENDED überging (#538).
  • Audio-Offload:
    • Füge dem Bitstream gemäß RFC 7845 den Ogg-ID-Header und die Kommentar-Header-Seiten für die ausgelagerte Opus-Wiedergabe voran.
  • Video:
    • H.265/HEVC: Das Parsen von SPS-Informationen zu kurz- und langfristigen Referenzbildern wurde korrigiert.
  • Text:
    • CEA-608: Die Logik für das Kürzen von Cues wurde so geändert, dass nur sichtbarer Text berücksichtigt wird. Bisher wurden Einrückung und Tabulatorversatz berücksichtigt, wenn die Cue-Länge auf 32 Zeichen begrenzt wurde (was technisch gesehen der Spezifikation entsprach) (#11019).
  • IMA-Erweiterung:
    • IMA SDK-Version auf 3.30.3 aktualisiert.
  • Sitzung:
    • Fügen Sie dem Status des Controllers ein benutzerdefiniertes Layout hinzu und stellen Sie eine Getter-Methode für den Zugriff darauf bereit. Wenn sich das benutzerdefinierte Layout ändert, wird MediaController.Listener.onCustomLayoutChanged aufgerufen. Apps, die verschiedenen Media3-Controllern unterschiedliche benutzerdefinierte Layouts senden möchten, können dies in MediaSession.Callback.onConnect tun. Verwenden Sie dazu ein AcceptedResultBuilder, um dafür zu sorgen, dass das benutzerdefinierte Layout für den Controller verfügbar ist, wenn die Verbindung hergestellt wurde.
    • Es wurde ein Problem behoben, bei dem MediaLibraryServiceLegacyStub einen Fehler an eine Result gesendet hat, die dies nicht unterstützt hat, was zu einem UnsupportedOperationException (#78) geführt hat.
    • Die Art und Weise, wie PlayerWrapper eine VolumeProviderCompat erstellt, wurde korrigiert, indem volumeControlType sowohl über alte Befehle (COMMAND_ADJUST_DEVICE_VOLUME und COMMAND_SET_DEVICE_VOLUME) als auch über neue Befehle (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS und COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) ermittelt wird (#554).

Version 1.1.0

5. Juli 2023

  • Gemeinsame Mediathek:
    • Grund für die Unterdrückung für ungeeignete Audio-Route und „Wiedergabe bei Verfügbarkeit“ hinzufügen Grund für die Unterdrückung „Zu lang“ ändern. (#15).
    • Befehle zum Player hinzufügen:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Dem Player wurden überlastete Methoden hinzugefügt, mit denen Nutzer Lautstärke-Flags angeben können:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Builder für DeviceInfo hinzugefügt und vorhandener Konstruktor eingestellt.
    • Fügen Sie DeviceInfo.routingControllerId hinzu, um die ID des Routing-Controllers für die Remote-Wiedergabe anzugeben.
    • Player.replaceMediaItem(s) als Tastenkombination zum Hinzufügen und Entfernen von Elementen an derselben Position hinzugefügt (#8046).
  • ExoPlayer:
    • ExoPlayer darf nur dann die Methoden zur Steuerung der Gerätelautstärke verwenden, wenn dies explizit aktiviert wurde. Mit ExoPlayer.Builder.setDeviceVolumeControlEnabled haben Sie Zugriff auf Folgendes:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) und setDeviceVolume(int, int)
      • increaseDeviceVolume(int) und increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) und decreaseDeviceVolume(int, int)
    • Fügen Sie FilteringMediaSource hinzu, damit verfügbare Tracktypen aus einem MediaSource gefiltert werden können.
    • Unterstützung für die Einbeziehung von Common Media Client Data (CMCD) in die ausgehenden Anfragen der adaptiven Streamingformate DASH, HLS und SmoothStreaming. Die folgenden Felder wurden integriert: br, bl, cid, rtp und sid (#8699). API-Struktur und API-Methoden:
      • Das CMCD-Logging ist standardmäßig deaktiviert. Verwenden Sie MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory), um es zu aktivieren.
      • Alle Schlüssel sind standardmäßig aktiviert. Überschreiben Sie CmcdConfiguration.RequestConfig.isKeyAllowed(String key), um zu filtern, welche Schlüssel protokolliert werden.
      • Überschreiben Sie CmcdConfiguration.RequestConfig.getCustomData(), um das benutzerdefinierte Schlüssel-Logging zu aktivieren.
    • Dem Manifest der Hauptdemo wurde eine zusätzliche Aktion hinzugefügt, um das Starten der Demo-App mit einer benutzerdefinierten *.exolist.json-Datei zu vereinfachen (#439).
    • Fügen Sie ExoPlayer.setVideoEffects() hinzu, um Effect während der Videowiedergabe zu verwenden.
    • Aktualisieren Sie SampleQueue, um sourceId als long anstatt als int zu speichern. Dadurch ändern sich die Signaturen der öffentlichen Methoden SampleQueue.sourceId und SampleQueue.peekSourceId.
    • Fügen Sie den LoadControl-Methoden shouldStartPlayback und onTracksSelected Parameter hinzu, mit denen diese Methoden den relevanten MediaPeriod zugeordnet werden können.
    • Ändern Sie die Signatur von ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>), indem Sie einen Zeitachsenparameter hinzufügen, der die Zeiträume mit den UIDs enthält, die als Schlüssel in der Karte verwendet werden. Dies ist erforderlich, um Probleme mit der Gleichzeitigkeit bei Livestreams mit mehreren Zeiträumen zu vermeiden.
    • EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) und BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs) einstellen. Stattdessen kann die Variante der Methoden ohne mediaTimeOffsetUs aufgerufen werden. Auch bei den verworfenen Varianten wird der Offset nicht mehr zu startTimeUs und endTimeUs der MediaLoadData-Objekte hinzugefügt, die vom Dispatcher gesendet werden.
    • Benennen Sie ExoTrackSelection.blacklist in excludeTrack und isBlacklisted in isTrackExcluded um.
    • Inkonsistentes Verhalten zwischen ExoPlayer.setMediaItem(s) und addMediaItem(s) bei Aufruf für eine leere Playlist wurde behoben.
  • Transformer:
    • Entfernen Sie Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Verwenden Sie stattdessen ExoPlayerAssetLoader.Factory(MediaSource.Factory) und Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Entfernen Sie Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Es wurde ein Fehler behoben, durch den die Transformation hängen bleiben konnte (was zu einem Muxer-Timeout führte), wenn das Ende des Videostreams zu dem Zeitpunkt signalisiert wurde, als ein Eingabe-Frame noch auf die Verarbeitung wartete.
    • Verwenden Sie für Codec-Abfragen MediaCodecList anstelle von findDecoder/EncoderForFormat-Dienstprogrammen, um die Unterstützung zu erweitern.
    • Entferne die B-Frame-Konfiguration in DefaultEncoderFactory, da sie auf einigen Geräten nicht funktioniert.
  • Titelauswahl:
    • Fügen Sie DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange hinzu, das standardmäßig deaktiviert ist. Wenn diese Option aktiviert ist, wird durch DefaultTrackSelector eine neue Titelauswahl ausgelöst, wenn sich die Renderer-Funktionen geändert haben.
  • Extraktoren:
    • Ogg: Fehler beim Suchen in Dateien mit langer Dauer behoben (#391).
    • FMP4: Das Problem wurde behoben, dass TimestampAdjuster einen falschen Zeitstempel-Offset mit der Metadaten-Sample-Zeit aus dem emsg-Atom initialisiert hat (#356).
  • Audio:
    • Ein Fehler wurde behoben, bei dem einige Wiedergaben fehlschlugen, wenn Tunneling aktiviert und AudioProcessors aktiv waren, z.B. beim nahtlosen Zuschneiden (#10847).
    • Opus-Frames in Ogg-Pakete für die direkte Wiedergabe (Offload) einbetten.
    • Die aktuelle Position während des Schlafs wird durch Offload-Planung extrapoliert.
    • Fügen Sie Renderer.release() und AudioSink.release() hinzu, um die Ressourcen am Ende des Lebenszyklus des Players freizugeben.
    • Änderungen der Audiofunktionen in DefaultAudioSink beobachten Fügen Sie im Konstruktor von DefaultAudioSink den erforderlichen Parameter context hinzu, mit dem sich DefaultAudioSink als Listener für AudioCapabilitiesReceiver registriert und die audioCapabilities-Property aktualisiert, wenn eine Änderung der Funktionen gemeldet wird.
    • Änderungen an den Audiofunktionen über ein neues Ereignis in der AudioSink.Listener-Schnittstelle und eine neue Schnittstelle RendererCapabilities.Listener weitergeben, die onRendererCapabilitiesChanged-Ereignisse auslöst.onAudioCapabilitiesChanged
    • Fügen Sie ChannelMixingAudioProcessor hinzu, um Skalierung/Mixing auf Audiochannels anzuwenden.
    • Füge den neuen int-Wert DISCARD_REASON_AUDIO_BYPASS_POSSIBLE zu DecoderDiscardReasons hinzu, um den Audio-Decoder zu verwerfen, wenn der Bypass-Modus nach einer Änderung der Audiofunktionen möglich ist.
    • Unterstützung für die direkte Wiedergabe von DTS Express und DTS:X wurde hinzugefügt (#335).
  • Video:
    • Sorgen Sie dafür, dass MediaCodecVideoRenderer ein VideoSize mit einer Breite und Höhe von 0 meldet, wenn der Renderer deaktiviert ist. Player.Listener.onVideoSizeChanged wird entsprechend aufgerufen, wenn sich Player.getVideoSize() ändert. Durch diese Änderung hat die Videogröße von ExoPlayer mit MediaCodecVideoRenderer eine Breite und Höhe von 0, wenn Player.getCurrentTracks keine Videos unterstützt oder die Größe des unterstützten Videotracks noch nicht bestimmt wurde.
  • DRM:
    • Die Sichtbarkeit mehrerer interner Methoden in DefaultDrmSession wurde reduziert, da sie voraussichtlich nicht von außerhalb des DRM-Pakets aufgerufen werden:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Eine neue Muxer-Bibliothek wird hinzugefügt, mit der eine MP4-Containerdatei erstellt werden kann.
  • IMA-Erweiterung:
    • Aktivieren Sie DASH-Livestreams mit mehreren Zeiträumen für die dynamische Anzeigenbereitstellung. Die aktuelle Implementierung unterstützt noch keine Suche in Livestreams (#10912).
    • Es wurde ein Fehler behoben, durch den in Livestreams eine neue Anzeigengruppe eingefügt wurde, weil die berechnete Inhaltsposition in aufeinanderfolgenden Zeitachsen leicht variierte.
  • Sitzung:
    • Fügen Sie die Hilfsmethode MediaSession.getControllerForCurrentRequest hinzu, um Informationen zum Controller abzurufen, der derzeit eine Player-Methode aufruft.
    • Füge androidx.media3.session.MediaButtonReceiver hinzu, damit Apps die Wiedergabe mit Media-Schaltflächen-Ereignissen fortsetzen können, die beispielsweise von einem Bluetooth-Headset gesendet werden (#167).
    • Fügen Sie MediaSession.Callback.onAddMediaItems eine Standardimplementierung hinzu, damit angeforderte MediaItems an Player übergeben werden können, wenn sie LocalConfiguration haben (z.B. URI) (#282).
    • Für Android 12 und niedriger werden in der kompakten Benachrichtigungsansicht für Medien standardmäßig Schaltflächen für die Befehle „Zum vorherigen Titel springen“ und „Zum nächsten Titel springen“ hinzugefügt (#410).
    • Fügen Sie MediaSession.Callback.onAddMediaItems eine Standardimplementierung hinzu, damit angeforderte MediaItems an Player übergeben werden können, wenn sie LocalConfiguration haben (z.B. URI) (#282).
    • Für Android 12 und niedriger werden in der kompakten Benachrichtigungsansicht für Medien standardmäßig Schaltflächen für die Befehle „Zum vorherigen Titel springen“ und „Zum nächsten Titel springen“ hinzugefügt (#410).
  • UI:
    • Fügen Sie die Util-Methoden shouldShowPlayButton und handlePlayPauseButtonAction hinzu, um benutzerdefinierte UI-Elemente mit einer Schaltfläche zum Abspielen/Pausieren zu erstellen.
  • RTSP-Erweiterung:
    • Verwende für MPEG4-LATM den Standardwert für „profile-level-id“, falls er in der SDP-Nachricht der Describe-Antwort fehlt (#302).
    • Verwende den Basis-URI für die Auflösung des relativen Pfads aus der RTSP-Sitzung, falls er im DESCRIBE-Antwortheader vorhanden ist (#11160).
  • DASH-Erweiterung:
    • Entfernen Sie den Media-Zeitversatz aus MediaLoadData.startTimeMs und MediaLoadData.endTimeMs für DASH-Streams mit mehreren Zeiträumen.
    • Ein Fehler wurde behoben, bei dem das erneute Vorbereiten einer Live-DASH-Media-Quelle mit mehreren Zeiträumen einen IndexOutOfBoundsException-Fehler verursacht hat (#10838).
  • HLS-Erweiterung:
    • Fügen Sie HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) hinzu, um ein Zeitlimit für den Ladethread festzulegen, bis die Initialisierung von TimestampAdjuster abgeschlossen ist. Wenn die Initialisierung nicht vor dem Zeitlimit abgeschlossen wird, wird ein PlaybackException ausgelöst, um zu verhindern, dass die Wiedergabe endlos verzögert wird. Das Zeitlimit ist standardmäßig auf null gesetzt (#323).
  • Test-Tools:
    • Prüfen Sie, ob das URI-Schema in DataSourceContractTest unabhängig von der Groß-/Kleinschreibung ist.
  • Entfernen Sie die folgenden veralteten Symbole:
    • Entfernen Sie DefaultAudioSink-Konstruktoren und verwenden Sie stattdessen DefaultAudioSink.Builder.
    • Entfernen Sie HlsMasterPlaylist und verwenden Sie stattdessen HlsMultivariantPlaylist.
    • Entfernen Sie Player.stop(boolean). Verwenden Sie stattdessen Player.stop() und Player.clearMediaItems() (wenn reset gleich true ist).
    • Zwei verworfene SimpleCache-Konstruktoren wurden entfernt. Verwenden Sie stattdessen einen nicht verworfenen Konstruktor, der ein DatabaseProvider-Objekt akzeptiert, um eine bessere Leistung zu erzielen.
    • Entfernen Sie den DefaultBandwidthMeter-Konstruktor und verwenden Sie stattdessen DefaultBandwidthMeter.Builder.
    • Entfernen Sie DefaultDrmSessionManager-Konstruktoren und verwenden Sie stattdessen DefaultDrmSessionManager.Builder.
    • Entfernen Sie zwei verworfene HttpDataSource.InvalidResponseCodeException-Konstruktoren und verwenden Sie einen nicht verworfenen Konstruktor, der zusätzliche Felder(cause, responseBody) akzeptiert, um die Fehlerprotokollierung zu verbessern.
    • Entfernen Sie DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash und DownloadHelper.forSmoothStreaming und verwenden Sie stattdessen DownloadHelper.forMediaItem.
    • Entfernen Sie den eingestellten DownloadService-Konstruktor und verwenden Sie einen nicht eingestellten Konstruktor, der die Option zum Bereitstellen eines channelDescriptionResourceId-Parameters enthält.
    • Entfernen Sie die eingestellten Stringkonstanten für Zeichensätze (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME und UTF16LE_NAME) und verwenden Sie stattdessen Kotlin-Zeichensätze aus dem Paket kotlin.text, java.nio.charset.StandardCharsets oder com.google.common.base.Charsets.
    • Entfernen Sie den eingestellten Konstruktor WorkManagerScheduler und verwenden Sie stattdessen einen nicht eingestellten Konstruktor, der die Option bietet, einen Context-Parameter anzugeben.
    • Entfernen Sie die verworfenen Methoden createVideoSampleFormat, createAudioSampleFormat, createContainerFormat und createSampleFormat, die zum Instanziieren der Format-Klasse verwendet wurden. Verwenden Sie stattdessen Format.Builder, um Instanzen von Format zu erstellen.
    • Entfernen Sie die verworfenen Methoden copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate und copyWithVideoSize und verwenden Sie stattdessen Format.buildUpon() und Setter-Methoden.
    • Entfernen Sie das verworfene ExoPlayer.retry() und verwenden Sie stattdessen prepare().
    • Entfernen Sie den verworfenen DefaultTrackSelector-Konstruktor ohne Argumente und verwenden Sie stattdessen DefaultTrackSelector(Context).
    • Entfernen Sie den verworfenen Konstruktor OfflineLicenseHelper und verwenden Sie stattdessen OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Entfernen Sie den eingestellten Konstruktor DownloadManager und verwenden Sie stattdessen den Konstruktor, der ein Executor akzeptiert.
    • Entfernen Sie die verworfenen Cue-Konstruktoren und verwenden Sie stattdessen Cue.Builder.
    • Entfernen Sie den verworfenen Konstruktor OfflineLicenseHelper und verwenden Sie stattdessen OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Vier nicht mehr weitergeführte AnalyticsListener-Methoden entfernen:
      • onDecoderEnabled. Verwenden Sie stattdessen onAudioEnabled und/oder onVideoEnabled.
      • onDecoderInitialized. Verwenden Sie stattdessen onAudioDecoderInitialized und/oder onVideoDecoderInitialized.
      • onDecoderInputFormatChanged. Verwenden Sie stattdessen onAudioInputFormatChanged und/oder onVideoInputFormatChanged.
      • onDecoderDisabled. Verwenden Sie stattdessen onAudioDisabled und/oder onVideoDisabled.
    • Entfernen Sie die verworfenen Player.Listener.onSeekProcessed und AnalyticsListener.onSeekProcessed und verwenden Sie stattdessen onPositionDiscontinuity mit DISCONTINUITY_REASON_SEEK.
    • Entfernen Sie ExoPlayer.setHandleWakeLock(boolean) und verwenden Sie stattdessen setWakeMode(int).
    • Entfernen Sie das verworfene DefaultLoadControl.Builder.createDefaultLoadControl() und verwenden Sie stattdessen build().
    • Entfernen Sie das verworfene MediaItem.PlaybackProperties und verwenden Sie stattdessen MediaItem.LocalConfiguration. Das nicht mehr unterstützte Feld MediaItem.playbackProperties hat jetzt den Typ MediaItem.LocalConfiguration.

Version 1.1.0-rc01

21. Juni 2023

Verwenden Sie die stabile Version 1.1.0.

Version 1.1.0-beta01

7. Juni 2023

Verwenden Sie die stabile Version 1.1.0.

Version 1.1.0-alpha01

10. Mai 2023

Verwenden Sie die stabile Version 1.1.0.

Version 1.0.0

Version 1.0.2

18. Mai 2023

androidx.media3:media3-*:1.0.2 wird veröffentlicht. Version 1.0.2 enthält diese Commits.

Dieser Release entspricht ExoPlayer 2.18.7.

Diese Version enthält die folgenden Änderungen seit der Version 1.0.1:

  • Core-Bibliothek:
    • Fügen Sie Buffer.isLastSample() hinzu, um anzugeben, ob Buffer das Flag C.BUFFER_FLAG_LAST_SAMPLE enthält.
    • Es wurde ein Problem behoben, bei dem der letzte Frame möglicherweise nicht gerendert wurde, wenn das letzte Sample mit Frames aus der Warteschlange entfernt wurde, ohne das Sample „end of stream“ (Ende des Streams) zu lesen. (#11079).
  • Extraktoren:
    • Die Verarbeitung von H.265-SPS in MPEG-TS-Dateien wurde korrigiert, indem die bereits von RTSP- und MP4-Extraktoren verwendete Parsing-Logik wiederverwendet wurde (#303).
  • Text:
    • SSA: Unterstützung für UTF-16-Dateien wurde hinzugefügt, wenn sie mit einer Bytereihenfolge-Marke (Byte Order Mark, BOM) beginnen (#319).
  • Sitzung:
    • Ein Problem wurde behoben, bei dem MediaController seine verfügbaren Befehle nicht aktualisiert hat, wenn es mit einem alten MediaSessionCompat verbunden war, das seine Aktionen aktualisiert hat.
    • Es wurde ein Fehler behoben, der verhinderte, dass MediaLibraryService für einen Aufruf von der System-UI an Callback.onGetLibraryRoot mit params.isRecent == true auf API 30 (#355) „null“ zurückgab.
    • Speicherleck von MediaSessionService oder MediaLibraryService behoben (#346).
    • Ein Fehler wurde behoben, bei dem eine kombinierte Timeline- und Positionsaktualisierung in einem MediaSession dazu führen konnte, dass ein MediaController eine IllegalStateException auslöste.

Version 1.0.1

18. April 2023

androidx.media3:media3-*:1.0.1 wird veröffentlicht. Version 1.0.1 enthält diese Commits.

Dieser Release entspricht ExoPlayer 2.18.6.

  • Core-Bibliothek:
    • Überschreibung des Ziel-Livestreams beim Suchen zur Standardposition zurücksetzen (#11051).
    • Es wurde ein Fehler behoben, durch den die Wiedergabe hängen blieb, wenn leere Beispielstreams in den Medien vorhanden waren.
  • Sitzung:
    • Ein Fehler wurde behoben, bei dem mehrere identische Warteschlangenelemente, die von einem Legacy-MediaSessionCompat veröffentlicht wurden, zu einer Ausnahme in MediaController führten (#290).
    • Die Weiterleitung von MediaSession.broadcastCustomCommand an das alte MediaControllerCompat.Callback.onSessionEvent wurde hinzugefügt (#293).
    • Ein Fehler wurde behoben, bei dem durch Aufrufen von MediaSession.setPlayer die verfügbaren Befehle nicht aktualisiert wurden.
    • Ein Problem wurde behoben, bei dem TrackSelectionOverride-Instanzen, die von einem MediaController gesendet wurden, ignoriert wurden, wenn sie auf eine Gruppe mit Format.metadata verwiesen haben (#296).
    • Problem beheben, bei dem Player.COMMAND_GET_CURRENT_MEDIA_ITEM verfügbar sein muss, um über die alte MediaSessionCompat auf Metadaten zuzugreifen.
    • Ein Problem wurde behoben, bei dem MediaSession-Instanzen in einem Hintergrundthread Abstürze verursacht haben, wenn sie in MediaSessionService verwendet wurden (#318).
    • Ein Problem wurde behoben, bei dem ein Media-Button-Receiver von der Bibliothek deklariert wurde, ohne dass die App dies beabsichtigt hatte (#314).
  • DASH:
    • Die Verarbeitung leerer Segmentzeitachsen wurde korrigiert (#11014).
  • RTSP:
    • Versuchen Sie es noch einmal mit TCP, wenn die RTSP-Einrichtung mit UDP mit dem RTSP-Fehler 461 „UnsupportedTransport“ (#11069) fehlschlägt.

Version 1.0.0

22. März 2023

androidx.media3:media3-*:1.0.0 wird veröffentlicht. Version 1.0.0 enthält diese Commits.

Dieser Release entspricht ExoPlayer 2.18.5.

Seit Version 1.0.0-rc02 hat sich nichts geändert.

Version 1.0.0-rc02

2. März 2023

androidx.media3:media3-*:1.0.0-rc02 wird veröffentlicht. Version 1.0.0-rc02 enthält diese Commits.

Dieser Release entspricht dem ExoPlayer 2.18.4-Release.

  • Core-Bibliothek:
    • Fehlerbehebung bei der Erkennung des Netzwerktyps unter API 33 (#10970).
    • Behebe das Problem mit NullPointerException beim Aufrufen von ExoPlayer.isTunnelingEnabled (#10977).
  • Downloads:
    • Die maximale Differenz der Startzeit von zwei Segmenten, die zusammengeführt werden sollen, kann in SegmentDownloader und Unterklassen konfiguriert werden (#248).
  • Audio:
    • Problem mit der lückenlosen MP3-Wiedergabe auf Samsung-Geräten behoben (#8594).
    • Ein Fehler wurde behoben, durch den Wiedergabegeschwindigkeiten, die unmittelbar nach dem Deaktivieren von Audio festgelegt wurden, möglicherweise durch eine vorherige Geschwindigkeitsänderung überschrieben wurden (#10882).
  • Video:
    • HEVC-HDR10-Format wird HEVCProfileMain10HDR10 anstelle von HEVCProfileMain10 zugeordnet.
    • Es wurde eine Problemumgehung für ein Geräteproblem auf dem Chromecast mit Google TV und dem Lenovo M10 FHD Plus hinzugefügt, das dazu führt, dass AVC-Streams mit 60 fps als nicht unterstützt markiert werden (#10898).
    • Probleme mit der Frame-Ausgabe bei der Wiedergabe von Medien mit einer Framerate, die viel höher als die Aktualisierungsrate des Displays ist, wurden behoben.
  • Besetzung:
    • Problem mit vorübergehendem STATE_IDLE beim Übergang zwischen Media-Elementen behoben (#245).
  • RTSP:
    • Die beim Parsen ungültiger RTSP-Describe-Antwortnachrichten ausgelöste IllegalArgumentException wird abgefangen (#10971).
  • Sitzung:
    • Es wurde ein Fehler behoben, bei dem die Schaltfläche „Wiedergabe/Pause“ in Benachrichtigungen nicht mit dem Playerstatus aktualisiert wurde (#192).
  • IMA-Erweiterung:
    • Ein Fehler wurde behoben, der verhinderte, dass DAI-Streams ohne Anzeigen gestartet wurden, da das erste (und im Fall ohne Anzeigen das einzige) LOADED-Ereignis nicht empfangen wurde.

Version 1.0.0-rc01

16. Februar 2023

androidx.media3:media3-*:1.0.0-rc01 wird veröffentlicht. Version 1.0.0-rc01 enthält diese Commits.

Dieser Release entspricht ExoPlayer 2.18.3.

  • Core-Bibliothek:
    • Die Decoder-Reihenfolgelogik des Renderers wird so angepasst, dass die Einstellungen von MediaCodecSelector eingehalten werden, auch wenn ein Decoder meldet, dass er die Medien möglicherweise nicht leistungsstark wiedergeben kann. Beispielsweise wird bei der Standardauswahl ein Hardware-Decoder mit nur funktionaler Unterstützung einem Software-Decoder vorgezogen, der das Format vollständig unterstützt (#10604).
    • Fügen Sie ExoPlayer.Builder.setPlaybackLooper hinzu, um einen vorhandenen Wiedergabethread für eine neue ExoPlayer-Instanz festzulegen.
    • Download-Manager-Helfer können gelöscht werden (#10776).
    • Fügen Sie dem Parameter BasePlayer.seekTo den Befehl hinzu, der für die Suche verwendet wurde.
    • Verwenden Sie das Design beim Laden von Drawables unter API 21 und höher (#220).
    • ConcatenatingMediaSource2 hinzugefügt, mit der mehrere Media-Elemente in einem einzigen Fenster kombiniert werden können (#247).
  • Extraktoren:
    • Löst beim Parsen von „trak“-Atomen einen ParserException anstelle eines NullPointerException aus, wenn in der Beispieltabellenbox (stbl) eine erforderliche Beispielbeschreibung (stsd) fehlt.
    • Behebung eines Problems, bei dem Samples beim direkten Suchen nach einem Synchronisationsframe in fMP4 nicht korrekt übersprungen wurden (#10941).
  • Audio:
    • Verwende die Bitrate des komprimierten Audioformats, um die Mindestpuffergröße für AudioTrack bei direkter Wiedergabe (Passthrough) zu berechnen.
  • Text:
    • Es wurde ein ungültiger (negativer) Index an Subtitle.getEventTime übergeben, wenn eine Untertiteldatei keine Cues enthält.TextRenderer
    • SubRip: Unterstützung für UTF-16-Dateien hinzugefügt, wenn sie mit einer Byte Order Mark beginnen.
  • Metadaten:
    • Mehrere durch Null getrennte Werte aus ID3-Frames parsen, wie in ID3 v2.4 zulässig.
    • Fügen Sie MediaMetadata.mediaType hinzu, um den Inhaltstyp oder den Typ des Ordners anzugeben, der in den Metadaten beschrieben wird.
    • Fügen Sie MediaMetadata.isBrowsable als Ersatz für MediaMetadata.folderType hinzu. Der Ordner wird im nächsten Release eingestellt.
  • DASH:
    • Vollständiges Parsen für Bildanpassungssätze wurde hinzugefügt, einschließlich der Anzahl der Kacheln (#3752).
  • UI:
    • Beheben Sie das Problem mit dem eingestellten PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener), damit Änderungen an der Sichtbarkeit an den registrierten Listener übergeben werden (#229).
    • Die Reihenfolge der Steuerelemente für den mittleren Player in PlayerView wurde korrigiert, wenn ein RTL-Layout (Right-to-Left, von rechts nach links) verwendet wird (#227).
  • Sitzung:
    • Fügen Sie die abstrakte Klasse SimpleBasePlayer hinzu, um die Player-Schnittstelle für benutzerdefinierte Player zu implementieren.
    • Hilfsmethode zum Konvertieren des Plattform-Sitzungstokens in Media3 hinzugefügt SessionToken (#171).
    • Verwende onMediaMetadataChanged, um Updates der Media-Session der Plattform auszulösen (#219).
    • Fügen Sie die Mediensitzung als Argument von getMediaButtons() des DefaultMediaNotificationProvider hinzu und verwenden Sie zur besseren Übersicht unveränderliche Listen (#216).
    • onSetMediaItems-Callback-Listener hinzugefügt, um die Möglichkeit zu bieten, die Liste MediaItem, den Startindex und die Position nach Sitzung zu ändern/festzulegen, bevor sie im Player festgelegt werden (#156).
    • Doppeltippen für Media-Schaltflächenereignisse, die nicht über Bluetooth gesendet werden, vermeiden (#233).
    • QueueTimeline wurde robuster gemacht, falls ein fragwürdiger alter Sitzungsstatus vorliegt (#241).
  • Metadaten:
    • Mehrere durch Null getrennte Werte aus ID3-Frames parsen, wie in ID3 v2.4 zulässig.
    • Fügen Sie MediaMetadata.mediaType hinzu, um den Inhaltstyp oder den Typ des Ordners anzugeben, der in den Metadaten beschrieben wird.
    • Fügen Sie MediaMetadata.isBrowsable als Ersatz für MediaMetadata.folderType hinzu. Der Ordner wird im nächsten Release eingestellt.
  • Cast-Erweiterung:
    • Die Cast SDK-Version wurde auf 21.2.0 aktualisiert.
  • IMA-Erweiterung:
    • Entfernen Sie den Player-Listener von ImaServerSideAdInsertionMediaSource im Anwendungs-Thread, um Threading-Probleme zu vermeiden.
    • Fügen Sie dem ImaServerSideAdInsertionMediaSource.AdsLoader.Builder das Attribut focusSkipButtonWhenAvailable hinzu, um die Skip-Schaltfläche auf TV-Geräten zu fokussieren, und legen Sie es standardmäßig auf „true“ fest.
    • Fügen Sie der ImaServerSideAdInsertionMediaSource.AdsLoader eine Methode focusSkipButton() hinzu, um den Fokus programmatisch auf die Schaltfläche „Überspringen“ zu legen.
    • IMA SDK-Version auf 3.29.0 aktualisiert.
  • Demo-App:
    • Benachrichtigungsberechtigung für Downloadbenachrichtigungen zur Laufzeit anfordern (#10884).

Version 1.0.0-beta03

22. November 2022

androidx.media3:media3-*:1.0.0-beta03 wird veröffentlicht. Version 1.0.0-beta03 enthält diese Commits.

Diese Version entspricht der ExoPlayer-Version 2.18.2.

  • Core-Bibliothek:
    • Fügen Sie ExoPlayer.isTunnelingEnabled hinzu, um zu prüfen, ob Tunneling für die aktuell ausgewählten Tracks aktiviert ist (#2518).
    • WrappingMediaSource wurde hinzugefügt, um das Umbrechen eines einzelnen MediaSource zu vereinfachen (#7279).
    • Verwerfe den Backbuffer, bevor die Wiedergabe aufgrund von zu wenig verfügbarem Arbeitsspeicher hängen bleibt.
    • Schließe den Tracing-Block „doSomeWork“, wenn die Auslagerung aktiviert ist.
    • Problem mit der Sitzungsanalyse bei schnellen Suchvorgängen in PlaybackStatsListener behoben (#180).
    • Fehlenden onMediaItemTransition-Callback beim Aufrufen von seekToNext oder seekToPrevious in einer Playlist mit einem einzelnen Element senden (#10667).
    • Fügen Sie Player.getSurfaceSize hinzu, um die Größe der Oberfläche zurückzugeben, auf der das Video gerendert wird.
    • Fehler behoben, bei dem das Entfernen von Listenern während der Player-Freigabe zu einem IllegalStateException führen konnte (#10758).
  • Build:
    • Mindestversion von compileSdkVersion erzwingen, um Kompilierungsfehler zu vermeiden (#10684).
    • Veröffentlichen Sie den Block nicht, wenn er in einem anderen Gradle-Build enthalten ist.
  • Titelauswahl:
    • Andere Tracks als Dolby Vision bevorzugen, wenn das Display diese Technologie nicht unterstützt. (#8944).
  • Downloads:
    • Potenzielle Endlosschleife in ProgressiveDownloader behoben, die durch gleichzeitiges Herunterladen und Abspielen mit demselben PriorityTaskManager verursacht wurde (#10570).
    • Downloadbenachrichtigung sofort anzeigen lassen (#183).
    • Die Anzahl paralleler Downloads wird auf 1 begrenzt, um die Erstellung zu vieler Threads zu vermeiden (#10458).
  • Video:
    • Verwende einen alternativen Decoder für Dolby Vision, wenn das Display diese Funktion nicht unterstützt. (#9794).
  • Audio:
    • Verwenden Sie SingleThreadExecutor, um AudioTrack-Instanzen freizugeben, damit beim gleichzeitigen Freigeben mehrerer Player keine OutOfMemory-Fehler auftreten (#10057).
    • Fügt AudioOffloadListener.onExperimentalOffloadedPlayback für den Offload-Status von AudioTrack hinzu. (#134).
    • Machen Sie AudioTrackBufferSizeProvider zu einer öffentlichen Schnittstelle.
    • Füge ExoPlayer.setPreferredAudioDevice hinzu, um das bevorzugte Audioausgabegerät festzulegen (#135).
    • Benennen Sie androidx.media3.exoplayer.audio.AudioProcessor in androidx.media3.common.audio.AudioProcessor um.
    • 8‑Kanal- und 12‑Kanal-Audio auf allen Android-Versionen den Kanalmasken 7.1 bzw. 7.1.4 zuordnen (#10701).
  • Metadaten:
    • MetadataRenderer kann jetzt so konfiguriert werden, dass Metadaten gerendert werden, sobald sie verfügbar sind. Erstellen Sie eine Instanz mit MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), um anzugeben, ob der Renderer Metadaten frühzeitig oder synchron mit der Position des Players ausgeben soll.
  • DRM:
    • Umgehen eines Fehlers in der ClearKey-Implementierung von Android 13, der eine nicht leere, aber ungültige Lizenz-URL zurückgibt.
    • Der setMediaDrmSession failed: session not opened-Fehler beim Wechseln zwischen DRM-Schemata in einer Playlist (z.B. von Widevine zu ClearKey) wurde behoben.
  • Text:
    • CEA-608: Prüfen Sie, ob Dienstumschaltbefehle in Feld 2 richtig verarbeitet werden (#10666).
  • DASH:
    • EventStream.presentationTimeOffset aus Manifesten parsen (#10460)
  • UI:
    • Verwenden Sie die aktuellen Überschreibungen des Players als Voreinstellung in TrackSelectionDialogBuilder (#10429).
  • Sitzung:
    • Achten Sie darauf, dass Befehle immer in der richtigen Reihenfolge ausgeführt werden, auch wenn für einige eine asynchrone Auflösung erforderlich ist (#85).
    • Fügen Sie DefaultMediaNotificationProvider.Builder hinzu, um DefaultMediaNotificationProvider-Instanzen zu erstellen. Der Builder kann die Benachrichtigungs-ID, die Benachrichtigungskanal-ID und den vom Anbieter verwendeten Benachrichtigungskanalnamen konfigurieren. Fügen Sie außerdem die Methode DefaultMediaNotificationProvider.setSmallIcon(int) hinzu, um das kleine Symbol für Benachrichtigungen festzulegen. (#104).
    • Befehle, die vor MediaController.release() gesendet werden, dürfen nicht verloren gehen (#99).
    • SimpleBitmapLoader kann Bitmaps aus file://-URIs laden (#108).
    • Behebe die Assertion, die verhindert, dass MediaController in einem Zeitraum über eine Anzeige hinweg sucht (#122).
    • Wenn die Wiedergabe endet, wird die MediaSessionService im Vordergrund beendet und eine Benachrichtigung wird angezeigt, um die Wiedergabe des zuletzt wiedergegebenen Media-Elements neu zu starten (#112).
    • Starte keinen Dienst im Vordergrund mit einem ausstehenden Intent zum Pausieren (#167).
    • Blenden Sie das Symbol, das mit der von DefaultNotificationProvider erstellten Benachrichtigung verknüpft ist, unter API 26 und API 27 manuell aus. Unter API 28 und höher wird das Symbol automatisch ausgeblendet (#131).
    • Fehler behoben, bei dem eine zweite Binder-Verbindung von einer alten MediaSession zu einem Media3-MediaController IllegalStateExceptions verursacht hat (#49).
  • RTSP:
    • H263-Fragmentpaketverarbeitung hinzufügen (#119).
    • Unterstützung für MP4A-LATM hinzugefügt (#162).
  • IMA:
    • Es wurde ein Zeitlimit für das Laden von Anzeigeninformationen hinzugefügt, um Fälle zu berücksichtigen, in denen das IMA SDK beim Laden einer Anzeige hängen bleibt (#10510).
    • Das Überspringen von Mid-Roll-Anzeigen beim Vorspulen zum Ende des Inhalts wird verhindert. (#10685)
    • Die Fensterdauer für Livestreams mit serverseitig eingefügten Anzeigen, z. B. IMA DAI, wird korrekt berechnet (#10764).
  • FFmpeg-Erweiterung:
    • Es wurden neue erforderliche Flags hinzugefügt, um FFmpeg-Bibliotheken mit NDK 23.1.7779620 und höher zu verknüpfen (#9933).
  • AV1-Erweiterung:
    • Die CMake-Version wurde aktualisiert, um Inkompatibilitäten mit den neuesten Android Studio-Releases zu vermeiden (#9933).
  • Cast-Erweiterung:
    • Implementiere getDeviceInfo(), um CastPlayer identifizieren zu können, wenn die Wiedergabe mit einem MediaController gesteuert wird (#142).
  • Transformer:
    • Es wurde ein Muxer-Watchdog-Timer hinzugefügt, um zu erkennen, wenn das Generieren einer Ausgabeprobe zu langsam ist.
  • Entfernen Sie die folgenden veralteten Symbole:
    • Entfernen Sie Transformer.Builder.setOutputMimeType(String). Diese Funktion wurde entfernt. Der MIME-Typ ist immer MP4, wenn der Standard-Muxer verwendet wird.

Version 1.0.0-beta02

21. Juli 2022

androidx.media3:media3-*:1.0.0-beta02 wird veröffentlicht. Version 1.0.0-beta02 enthält diese Commits.

Dieser Release entspricht ExoPlayer 2.18.1.

  • Core-Bibliothek:
    • Achten Sie darauf, dass durch das Ersetzen von ShuffleOrder durch ExoPlayer.setShuffleOrder ein Aufruf von Player.Listener#onTimelineChanged mit reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED erfolgt (#9889).
    • Bei progressiven Media werden nur ausgewählte Tracks in der gepufferten Position berücksichtigt. (#10361)
    • Benutzerdefinierte Logger für die gesamte ExoPlayer-Logausgabe zulassen (#9752).
    • Die Implementierung von setDataSourceFactory in DefaultMediaSourceFactory wurde korrigiert, da sie in einigen Fällen nicht funktionierte (#116).
  • Extraktoren:
    • Das Parsen von H265-Referenzbildgruppen mit kurzer Zeitdauer wurde korrigiert (#10316).
    • Die Bitraten von esds-Boxen werden jetzt richtig geparst (#10381).
  • DASH:
    • ClearKey-Lizenz-URL aus Manifesten parsen (#10246).
  • UI:
    • Achte darauf, dass TalkBack die aktuell aktive Geschwindigkeitsoption im Menü für die Wiedergabesteuerung ansagt (#10298).
  • RTSP:
    • Verarbeitung fragmentierter VP8-Pakete hinzugefügt (#110).
  • Leanback-Erweiterung:
    • playWhenReady-Änderungen in LeanbackAdapter anhören (10420)
  • Besetzung:
    • Verwende die MediaItem, die an die Playlist-Methoden übergeben wurde, als Window.mediaItem in CastTimeline (#25, #8212).
    • Unterstützung von Player.getMetadata() und Listener.onMediaMetadataChanged() mit CastPlayer (#25).

Version 1.0.0-beta01

16. Juni 2022

androidx.media3:media3-*:1.0.0-beta01 wird veröffentlicht. Version 1.0.0-beta01 enthält diese Commits.

Dies entspricht der ExoPlayer-Version 2.18.0.

  • Core-Bibliothek:
    • Aktivieren Sie die Unterstützung für die Android-Plattformdiagnose über MediaMetricsManager. ExoPlayer leitet Wiedergabeereignisse und Leistungsdaten an die Plattform weiter, was dazu beiträgt, Informationen zur Systemleistung und zum Debugging auf dem Gerät bereitzustellen. Diese Daten können auch von Google erhoben werden, wenn der Nutzer des Geräts die Weitergabe von Nutzungs- und Diagnosedaten aktiviert hat. Apps können die Teilnahme an der Plattformdiagnose für ExoPlayer mit ExoPlayer.Builder.setUsePlatformDiagnostics(false) deaktivieren.
    • Es wurde ein Fehler behoben, durch den Tracks bei Verwendung von MergingMediaSource zu oft zurückgesetzt wurden, z. B. beim Sideloading von Untertiteln und beim Ändern der ausgewählten Untertitel während der Wiedergabe (#10248).
    • Die Erkennung des 5G-NSA-Netzwerktyps auf API 29 und 30 wird eingestellt. Bei diesen Wiedergaben wird von einem 4G-Netzwerk ausgegangen.
    • Das Übergeben von null an MediaSource.Factory.setDrmSessionManagerProvider und MediaSource.Factory.setLoadErrorHandlingPolicy nicht zulassen. Instanzen von DefaultDrmSessionManagerProvider und DefaultLoadErrorHandlingPolicy können bei Bedarf explizit übergeben werden.
    • Fügen Sie MediaItem.RequestMetadata hinzu, um Metadaten darzustellen, die zum Abspielen von Media erforderlich sind, wenn der genaue LocalConfiguration nicht bekannt ist. Entferne auch MediaMetadata.mediaUrl, da es jetzt in RequestMetadata enthalten ist.
    • Fügen Sie Player.Command.COMMAND_SET_MEDIA_ITEM hinzu, damit Spieler ein einzelnes Element festlegen können.
  • Titelauswahl:
    • Fasse die Klasse TrackSelectionOverrides in TrackSelectionParameters zusammen und stufe TrackSelectionOverride in eine Klasse der obersten Ebene hoch.
    • Benennen Sie TracksInfo in Tracks und TracksInfo.TrackGroupInfo in Tracks.Group um. Player.getCurrentTracksInfo und Player.Listener.onTracksInfoChanged wurden in Player.getCurrentTracks und Player.Listener.onTracksChanged umbenannt. Dazu gehört auch, den Methodennamen Player.Listener.onTracksChanged wieder zu verwenden, aber mit anderen Parametertypen.
    • Ändern Sie DefaultTrackSelector.buildUponParameters und DefaultTrackSelector.Parameters.buildUpon so, dass DefaultTrackSelector.Parameters.Builder anstelle von DefaultTrackSelector.ParametersBuilder zurückgegeben wird.
    • Fügen Sie DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities hinzu, das standardmäßig aktiviert ist. Wenn diese Option aktiviert ist, werden für DefaultTrackSelector bevorzugt Audiotracks verwendet, deren Kanalanzahl die Ausgabefunktionen des Geräts nicht überschreitet. Auf Mobilgeräten wird bei DefaultTrackSelector Stereo-/Mono-Audioformaten gegenüber Mehrkanal-Audioformaten der Vorzug gegeben, es sei denn, das Mehrkanalformat kann räumlich wiedergegeben werden (Android 12L+) oder ist ein Dolby-Surround-Sound-Format. Außerdem wird auf Geräten, die die räumliche Audioausgabe unterstützen, mit DefaultTrackSelector nach Änderungen an den Spatializer-Eigenschaften gesucht und bei Änderungen eine neue Titelauswahl ausgelöst. Geräte mit dem television-UI-Modus sind von diesen Einschränkungen ausgeschlossen und das Format mit der höchsten Anzahl an Kanälen wird bevorzugt. Damit diese Funktion aktiviert werden kann, muss die DefaultTrackSelector-Instanz mit einem Context erstellt werden.
  • Video:
    • Benennen Sie DummySurface in PlaceholderSurface um.
    • AV1-Unterstützung für MediaCodecVideoRenderer.getCodecMaxInputSize hinzugefügt
  • Audio:
    • Der LG AC3-Audiodecoder wirbt mit einem nicht standardmäßigen MIME-Typ.
    • Ändern Sie den Rückgabetyp von AudioAttributes.getAudioAttributesV21() von android.media.AudioAttributes in eine neue Wrapper-Klasse AudioAttributesV21, um eine langsame ART-Überprüfung bei API < 21 zu verhindern.
    • Fragen Sie die Plattform ab (API 29+) oder gehen Sie von der Anzahl der Audio-Encodierungskanäle für die Audio-Passthrough-Funktion aus, wenn die Anzahl der Audio-Kanäle des Formats nicht festgelegt ist. Dies ist bei der HLS-Chunkless-Vorbereitung (10204) der Fall.
    • Konfiguriere AudioTrack mit der Kanalmaske AudioFormat.CHANNEL_OUT_7POINT1POINT4, wenn der Decoder 12‑Kanal-PCM-Audio ausgibt (#10322.
  • DRM
    • Die DRM-Sitzung wird beim Suchen unmittelbar nach einer Formatänderung immer korrekt aktualisiert (10274).
  • Text:
    • Ändern Sie Player.getCurrentCues() so, dass CueGroup anstelle von List<Cue> zurückgegeben wird.
    • SSA: Unterstützung der Stileinstellung OutlineColour bei BorderStyle == 3 (d.h. OutlineColour legt den Hintergrund des Cues fest) (#8435).
    • CEA-708: Daten in mehrere Serviceblöcke parsen und Blöcke ignorieren, die nicht mit der aktuell ausgewählten Servicenummer verknüpft sind.
    • Entfernen Sie RawCcExtractor, das nur für ein Google-internes Untertitelformat verwendet wurde.
  • Extraktoren:
    • Unterstützung für AVI hinzugefügt (#2092).
    • Matroska: DiscardPadding nach Opus-Tracks parsen.
    • MP4: Bitraten aus esds-Feldern parsen.
    • Ogg: Doppelte Opus-ID- und Kommentarheader zulassen (#10038).
  • UI:
    • Die Zustellung von Ereignissen an OnClickListener, die in PlayerView festgelegt sind, wird korrigiert, wenn useController=false (#9605). Außerdem wurde die Übermittlung von Ereignissen an OnLongClickListener für alle Ansichtskonfigurationen korrigiert.
    • Es wurde ein Problem behoben, bei dem eine Folge von Touch-Ereignissen, die die Grenzen von PlayerView vor ACTION_UP verlassen, fälschlicherweise als Klick behandelt wurden (#9861).
    • Das Problem mit der Bedienungshilfe PlayerView wurde behoben. Durch Tippen wird jetzt nicht mehr die Wiedergabe umgeschaltet, sondern die Steuerelemente werden ausgeblendet (#8627).
    • Schreibe TrackSelectionView und TrackSelectionDialogBuilder so um, dass sie mit der Player-Schnittstelle anstelle von ExoPlayer funktionieren. Dadurch können die Ansichten mit anderen Player-Implementierungen verwendet werden und die Abhängigkeit des UI-Moduls vom ExoPlayer-Modul wird entfernt. Dies ist eine funktionsgefährdende Änderung.
    • Erzwungene Text-Tracks werden nicht in der PlayerView-Track-Auswahl angezeigt und ein geeigneter erzwungener Text-Track bleibt ausgewählt, wenn „Keine“ ausgewählt ist (#9432).
  • DASH:
    • Parsen der Kanalanzahl aus DTS-AudioChannelConfiguration-Elementen. Dadurch wird das Audio-Passthrough für DTS-Streams wieder aktiviert (#10159).
    • Das Übergeben von null an DashMediaSource.Factory.setCompositeSequenceableLoaderFactory nicht zulassen. Instanzen von DefaultCompositeSequenceableLoaderFactory können bei Bedarf explizit übergeben werden.
  • HLS:
    • Wenn das Attribut „CODECS“ der Playlist den Audio-Codec nicht enthält (#10065), wird auf die Vorbereitung in Chunks zurückgegriffen.
    • Die Übergabe von null an HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory und HlsMediaSource.Factory.setPlaylistTrackerFactory nicht zulassen. Instanzen von DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory oder ein Verweis auf DefaultHlsPlaylistTracker.FACTORY können bei Bedarf explizit übergeben werden.
  • Smooth Streaming:
    • Das Übergeben von null an SsMediaSource.Factory.setCompositeSequenceableLoaderFactory nicht zulassen. Instanzen von DefaultCompositeSequenceableLoaderFactory können bei Bedarf explizit übergeben werden.
  • RTSP:
    • RTP-Reader für H263 hinzugefügt (#63).
    • RTP-Leser für MPEG4 hinzufügen (#35).
    • RTP-Leser für HEVC hinzugefügt (#36).
    • RTP-Reader für AMR hinzufügen. Derzeit werden nur Mono-Channel-AMR-Streams ohne Interleaving unterstützt. Die zusammengesetzte AMR-RTP-Nutzlast wird nicht unterstützt. (#46)
    • RTP-Leser für VP8 hinzufügen (#47).
    • RTP-Leser für WAV hinzufügen (#56).
    • RTSP-Header für die grundlegende Autorisierung korrigieren. (#9544).
    • Die Prüfung von Pflichtfeldern im SDP wird eingestellt, da ExoPlayer sie nicht benötigt (#10049).
    • Es wird eine geprüfte Ausnahme ausgelöst, wenn die RTSP-Zeitangabe geparst wird (#10165).
    • RTP-Leser für VP9 hinzugefügt (#47).
    • RTP-Reader für OPUS hinzufügen (#53).
  • Datenquellen:
    • Benennen Sie DummyDataSource in PlaceholderDataSource um.
    • Problemumgehung für die Unterbrechungsbehandlung von OkHttp.
  • Sitzung:
    • Ersetzen Sie MediaSession.MediaItemFiller durch MediaSession.Callback.onAddMediaItems, um die asynchrone Auflösung von Anfragen zu ermöglichen.
    • Unterstützung von setMediaItems(s)-Methoden, wenn MediaController eine Verbindung zu einer alten Mediensitzung herstellt.
    • Entfernen Sie MediaController.setMediaUri und MediaSession.Callback.onSetMediaUri. Dieselbe Funktionalität kann mit MediaController.setMediaItem und MediaSession.Callback.onAddMediaItems erreicht werden.
    • Leite alte MediaController-Anrufe zur Medienwiedergabe an MediaSession.Callback.onAddMediaItems statt an onSetMediaUri weiter.
    • Fügen Sie MediaNotification.Provider und DefaultMediaNotificationProvider hinzu, um die Benachrichtigung anzupassen.
    • Fügen Sie BitmapLoader und SimpleBitmapLoader zum Herunterladen von Artwork-Bildern hinzu.
    • Fügen Sie MediaSession.setCustomLayout() hinzu, um die Abwärtskompatibilität mit der alten Sitzung zu gewährleisten.
    • Fügen Sie MediaSession.setSessionExtras() hinzu, um die Funktionsparität mit der alten Sitzung zu erreichen.
    • Benenne MediaSession.MediaSessionCallback in MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback in MediaLibrarySession.Callback und MediaSession.Builder.setSessionCallback in setCallback um.
    • NPE in MediaControllerImplLegacy behoben. (#59)
    • Aktualisieren der Informationen zur Sitzungsposition in der Zeitachse bei Änderungen(#51).
    • NPE in MediaControllerImplBase nach dem Loslassen des Controllers behoben (#74).
  • Anzeigenwiedergabe / IMA:
    • Die Abrufrate für Anzeigen wird von 100 ms auf 200 ms gesenkt, um den Empfehlungen des Media Rating Council (MRC) zu entsprechen.
  • FFmpeg-Erweiterung:
    • Aktualisieren Sie die CMake-Version auf 3.21.0+, um einen CMake-Fehler zu vermeiden, der dazu führt, dass die Gradle-Synchronisierung von Android Studio fehlschlägt (#9933).
  • Entfernen Sie die folgenden veralteten Symbole:
    • Entfernen Sie Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Verwenden Sie stattdessen Player.Listener.onTracksChanged(Tracks).
    • Entfernen Sie Player.getCurrentTrackGroups und Player.getCurrentTrackSelections. Verwenden Sie stattdessen Player.getCurrentTracks. Sie können ExoPlayer.getCurrentTrackGroups und ExoPlayer.getCurrentTrackSelections weiterhin verwenden, obwohl diese Methoden weiterhin als veraltet gelten.
    • Entfernen Sie die Konstanten DownloadHelper, DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT und DEFAULT_TRACK_SELECTOR_PARAMETERS. Verwenden Sie nach Möglichkeit getDefaultTrackSelectorParameters(Context) und andernfalls DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Entfernen Sie den Konstruktor DefaultTrackSelector(ExoTrackSelection.Factory). Verwenden Sie stattdessen DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Entfernen Sie Transformer.Builder.setContext. Die Context sollte stattdessen an den Transformer.Builder-Konstruktor übergeben werden.

Version 1.0.0-alpha03

14. März 2022

androidx.media3:media3-*:1.0.0-alpha03 wird veröffentlicht. Version 1.0.0-alpha03 enthält diese Commits.

Dies entspricht der ExoPlayer-Version 2.17.1.

  • Audio:
    • Fehler beim Prüfen der Audiofunktionen für Dolby Atmos (E-AC3-JOC) in HLS behoben.
  • Extraktoren:
    • FMP4: Das Problem wurde behoben, dass die Metadaten von „emsg“-Samples für Streams mit „emsg“-Atomen der Versionen 0 und 1 in der falschen Reihenfolge ausgegeben werden konnten (#9996).
  • Text:
    • Beheben Sie die Interaktion von SingleSampleMediaSource.Factory.setTrackId und MediaItem.SubtitleConfiguration.Builder.setId, um das Feld SubtitleConfiguration zu priorisieren und auf den Wert Factory zurückzugreifen, wenn er nicht festgelegt ist (#10016).
  • Anzeigenwiedergabe:
    • Audio-Underruns zwischen Anzeigenzeiträumen in HLS-Livestreams mit SSAI beheben.

Version 1.0.0-alpha02

2. März 2022

androidx.media3:media3-*:1.0.0-alpha02 wird veröffentlicht. Version 1.0.0-alpha02 enthält diese Commits.

Dies entspricht der ExoPlayer-Version 2.17.0.

  • Core Library:
    • Füge die geschützte Methode DefaultRenderersFactory.getCodecAdapterFactory() hinzu, damit Unterklassen von DefaultRenderersFactory, die buildVideoRenderers() oder buildAudioRenderers() überschreiben, auf die Codec-Adapter-Factory zugreifen und sie an MediaCodecRenderer-Instanzen übergeben können, die sie erstellen.
    • Leite die ICY-Headerfelder name und genre an MediaMetadata.station bzw. MediaMetadata.genre weiter, damit sie die App über Player.Listener.onMediaMetadataChanged() (#9677) erreichen.
    • Nullschlüssel aus DefaultHttpDataSource#getResponseHeaders entfernen.
    • Wenn das Erstellen einer MediaCodec-Instanz fehlschlägt, wird eine Pause eingelegt und der Vorgang wird wiederholt. Damit wird ein Problem umgangen, das auf einigen Geräten auftritt, wenn eine Oberfläche von einem sicheren Codec zu einem anderen Codec gewechselt wird (#8696).
    • Fügen Sie MediaCodecAdapter.getMetrics() hinzu, damit Nutzer Messwertdaten aus MediaCodec abrufen können. (#9766).
    • Problem mit der Maven-Abhängigkeitsauflösung behoben (#8353).
    • Die automatische Geschwindigkeitsanpassung wird für Livestreams deaktiviert, die weder Low-Latency-Funktionen noch eine Nutzereinstellung für die Geschwindigkeit haben (#9329).
    • Benennen Sie DecoderCounters#inputBufferCount in queuedInputBufferCount um.
    • SimpleExoPlayer.renderers privat machen Auf Renderers kann über ExoPlayer.getRenderer zugegriffen werden.
    • Einige AnalyticsListener.EventFlags-Konstantenwerte wurden aktualisiert, damit sie mit den Werten in Player.EventFlags übereinstimmen.
    • Teile AnalyticsCollector in eine Schnittstelle und eine Standardimplementierung auf, damit sie von R8 entfernt werden kann, wenn eine App sie nicht benötigt.
  • Titelauswahl:
    • Unterstützung bevorzugter Video-Rollen-Flags bei der Titelauswahl (#9402).
    • Die Logik für die Auswahl von Videotracks wurde aktualisiert, um bevorzugte MIME-Typen und Rollen-Flags bei der Auswahl mehrerer Videotracks für die Anpassung zu berücksichtigen (#9519).
    • Die Logik für die Auswahl von Video- und Audiotracks wurde aktualisiert, sodass nur Formate für adaptive Auswahlen ausgewählt werden, die dasselbe Niveau an Decoder- und Hardwareunterstützung haben (#9565).
    • Die Logik für die Auswahl von Videotracks wurde aktualisiert, um effizientere Codecs zu bevorzugen, wenn mehrere Codecs von primären, hardwarebeschleunigten Decodern unterstützt werden (#4835).
    • Bevorzuge Einstellungen für Audioinhalte (z. B. den „Standard“-Audio-Track oder einen Track, der der Sprache des Systemgebietsschemas entspricht) gegenüber technischen Einschränkungen bei der Trackauswahl (z. B. bevorzugter MIME-Typ oder maximale Anzahl von Kanälen).
    • Ein Problem bei der Auswahl von Tracks wurde behoben. Wenn eine Trackgruppe überschrieben wurde, wurden andere Trackgruppen desselben Typs nicht deaktiviert (#9675).
    • Ein Problem bei der Auswahl von Tracks wurde behoben, bei dem eine Mischung aus nicht leeren und leeren Track-Überschreibungen nicht korrekt angewendet wurde (#9649).
    • Doppelte TrackGroup in einem TrackGroupArray verbieten. TrackGroups können immer durch Festlegen eines id im TrackGroup-Konstruktor unterschieden werden. Dadurch wird ein Absturz behoben, der beim Fortsetzen der Wiedergabe nach dem Minimieren der App mit einer aktiven Track-Überschreibung aufgetreten ist (#9718).
    • Die Logik in AdaptiveTrackSelection wurde so geändert, dass die Qualität auch bei ausreichender Netzwerkbandbreite erhöht werden kann, wenn die Wiedergabe sehr nah am Live-Edge liegt (#9784).
  • Video:
    • Die Decoder-Fallback-Logik für Dolby Vision wurde korrigiert, sodass bei Bedarf ein kompatibler H264/H265-Decoder verwendet wird.
  • Audio:
    • Die Fallback-Logik des Decoders für Dolby Atmos (E-AC3-JOC) wurde korrigiert, sodass bei Bedarf ein kompatibler E-AC3-Decoder verwendet wird.
    • Bei AudioCapabilities-APIs muss jetzt explizit AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES anstelle von null übergeben werden.
    • Die Berechnung der AudioTrack-Puffergröße kann angepasst werden, indem ein AudioTrackBufferSizeProvider in DefaultAudioSink eingefügt wird. (#8891).
    • Wiederholen Sie die Erstellung von AudioTrack, wenn die angeforderte Puffergröße > 1 MB war. (#9712).
  • Extraktoren:
    • WAV: Unterstützung für RF64-Streams hinzugefügt (#9543).
    • Falsches Parsen von H.265-SPS-NAL-Einheiten behoben (#9719).
    • Vorbis-Kommentare (einschließlich METADATA_BLOCK_PICTURE) in Ogg Opus- und Ogg Vorbis-Dateien parsen.
  • Text:
    • Fügen Sie ein MediaItem.SubtitleConfiguration.id-Feld hinzu, das in das Format.id-Feld des Untertitel-Tracks übernommen wird, der aus der Konfiguration erstellt wurde (#9673).
    • Grundlegende Unterstützung für WebVTT-Untertitel in Matroska-Containern hinzugefügt (#9886).
    • Verhindern Sie, dass Cea708Decoder mehr als die deklarierte Größe eines Serviceblocks liest.
  • DRM:
    • Entfernen Sie playbackLooper aus DrmSessionManager.(pre)acquireSession. Wenn ein DrmSessionManager von einer App in einem benutzerdefinierten MediaSource verwendet wird, muss das playbackLooper stattdessen an DrmSessionManager.setPlayer übergeben werden.
  • Anzeigenwiedergabe / IMA:
    • Unterstützung für die IMA-Lösung für die dynamische Anzeigenbereitstellung hinzugefügt (#8213).
    • Eine Methode für AdPlaybackState hinzufügen, um eine Anzeigengruppe zurückzusetzen, damit sie noch einmal abgespielt werden kann (#9615).
    • Wiedergabegeschwindigkeit von 1,0 während der Anzeigenwiedergabe erzwingen ( #9018).
    • Ein Problem wurde behoben, bei dem eine Anzeigengruppe, die nicht geladen werden konnte, zu einem sofortigen Zurücksetzen der Wiedergabe geführt hat (#9929).
  • UI:
    • Die Farbe der Zahlen auf den Schaltflächen zum StyledPlayerView Zurückspulen und Vorspulen wurde bei Verwendung bestimmter Designs korrigiert (#9765).
    • Strings für die Wiedergabegeschwindigkeit korrekt übersetzen (#9811).
  • DASH:
    • Fügen Sie dem Representation(#9579) geparste wichtige und zusätzliche Properties hinzu.
    • Unterstützung der Trackrolle forced-subtitle ( #9727)
    • Die Rolle des main-Tracks nicht mehr als C.SELECTION_FLAG_DEFAULT interpretieren.
    • Die Ausschlusslogik für die Basis-URL für Manifeste, in denen der DVB-Namespace nicht deklariert wird, wurde korrigiert (#9856).
    • Unterstützung relativer MPD.Location-URLs (#9939).
  • HLS:
    • Format.label für reine Audio-HLS-Streams korrekt ausfüllen (#9608).
    • Verwenden Sie standardmäßig die chunklose Vorbereitung, um die Startzeit zu verkürzen. Wenn Ihre Renditionen gemischte Untertitel-Tracks enthalten, die nicht in der Master-Playlist deklariert sind, sollten Sie sie der Master-Playlist hinzufügen, damit sie für die Wiedergabe verfügbar sind, oder die chunklose Vorbereitung mit HlsMediaSource.Factory.setAllowChunklessPreparation(false) deaktivieren.
    • Unterstützung der Keyframe-genauen Suche in HLS (#2882).
  • RTSP:
    • Stellen Sie eine Client-API bereit, um die SocketFactory zu überschreiben, die für jede Serververbindung verwendet wird (#9606).
    • Die DIGEST-Authentifizierungsmethode wird gegenüber BASIC bevorzugt, wenn beide vorhanden sind (#9800).
    • Behandlung, wenn das Timing von RTSP-Tracks nicht verfügbar ist (#9775).
    • Ungültige RTP-Info-Headerwerte ignorieren (#9619).
  • Transformer:
    • Die erforderliche Mindest-API-Version wird auf 21 erhöht.
    • TransformationException wird jetzt verwendet, um Fehler zu beschreiben, die während einer Transformation auftreten.
    • Fügen Sie TransformationRequest hinzu, um die Transformationsoptionen anzugeben.
    • Es können mehrere Zuhörer registriert werden.
    • Das Problem, dass der Transformer hängen bleibt, wenn die Codec-Ausgabe teilweise gelesen wird, wurde behoben.
    • Mögliche NPE in Transformer.getProgress behoben, wenn beim Freigeben des Muxers eine Ausnahme ausgelöst wird.
    • Demo-App zum Anwenden von Transformationen hinzufügen
  • MediaSession-Erweiterung:
    • Standardmäßig wird die Playlist jetzt beim Stoppen von MediaSessionConnector gelöscht. Apps, die möchten, dass die Playlist beibehalten wird, können setClearMediaItemsOnStop(false) für den Connector aufrufen.
  • Cast-Erweiterung:
    • Es wurde ein Fehler behoben, der verhinderte, dass CastPlayer onIsPlayingChanged korrekt aufrief (#9792).
    • Unterstützung von Audio-Metadaten, einschließlich Artworks, mit DefaultMediaItemConverter (#9663).
  • FFmpeg-Erweiterung:
    • build_ffmpeg.sh von den Binärdienstprogrammen von LLVM anstelle von GNU abhängig machen (#9933).
  • Android 12-Kompatibilität:
    • Führen Sie ein Upgrade der Cast-Erweiterung durch, sodass sie von com.google.android.gms:play-services-cast-framework:20.1.0 abhängt. Ältere Versionen von play-services-cast-framework sind nicht mit Apps kompatibel, die auf Android 12 ausgerichtet sind, und stürzen mit einem IllegalArgumentException ab, wenn PendingIntents erstellt werden (#9528).
  • Entfernen Sie die folgenden veralteten Symbole:
    • Entfernen Sie Player.EventListener. Verwenden Sie stattdessen Player.Listener.
    • Entfernen Sie MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory und MediaSourceFactory#setDrmUserAgent. Verwenden Sie stattdessen MediaSourceFactory#setDrmSessionManagerProvider.
    • Entfernen Sie MediaSourceFactory#setStreamKeys. Verwenden Sie stattdessen MediaItem.Builder#setStreamKeys.
    • Entfernen Sie MediaSourceFactory#createMediaSource(Uri). Verwenden Sie stattdessen MediaSourceFactory#createMediaSource(MediaItem).
    • Entferne setTag aus DashMediaSource, HlsMediaSource und SsMediaSource. Verwenden Sie stattdessen MediaItem.Builder#setTag.
    • Entfernen Sie DashMediaSource#setLivePresentationDelayMs(long, boolean). Verwenden Sie MediaItem.Builder#setLiveConfiguration und MediaItem.LiveConfiguration.Builder#setTargetOffsetMs, um das Manifest zu überschreiben, oder DashMediaSource#setFallbackTargetLiveOffsetMs, um einen Fallback-Wert anzugeben.
    • Entfernen Sie (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Die Deaktivierung der Thread-Durchsetzung ist nicht mehr möglich.
    • Entfernen Sie ActionFile und ActionFileUpgradeUtil. Verwenden Sie ExoPlayer 2.16.1 oder früher, um mit ActionFileUpgradeUtil Legacy-Aktionsdateien in DefaultDownloadIndex zusammenzuführen.
    • Entfernen Sie ProgressiveMediaSource#setExtractorsFactory. Verwenden Sie stattdessen den ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)-Konstruktor.
    • Entferne ProgressiveMediaSource.Factory#setTag und ProgressiveMediaSource.Factory#setCustomCacheKey. Verwenden Sie stattdessen MediaItem.Builder#setTag und MediaItem.Builder#setCustomCacheKey.
    • Entfernen Sie die Konstruktoren DefaultRenderersFactory(Context, @ExtensionRendererMode int) und DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Verwenden Sie stattdessen den DefaultRenderersFactory(Context)-Konstruktor, DefaultRenderersFactory#setExtensionRendererMode und DefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Entfernen Sie alle öffentlichen CronetDataSource-Konstruktoren. Verwenden Sie stattdessen CronetDataSource.Factory.
  • Ändern Sie nur die folgenden IntDefs in @Target(TYPE_USE). Dies kann die Kompilierung von Verwendungen in Kotlin unterbrechen. Das Problem lässt sich beheben, indem Sie die Annotation zum Annotieren des Typs (Int) verschieben.
    • @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 (im Paket com.google.android.exoplayer2.ext.flac)
    • @FlacExtractor.Flags (im Paket com.google.android.exoplayer2.extractor.flac)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

Version 1.0.0-alpha01

27. Oktober 2021

androidx.media3:media3-*:1.0.0-alpha01 wird veröffentlicht. Version 1.0.0-alpha01 enthält diese Commits.

Neue Funktionen

Media3 ist der neue Ort für Media-Support-Bibliotheken, einschließlich ExoPlayer. Die erste Alphaversion enthält frühe, funktionale Implementierungen von Bibliotheken für die Implementierung von Media-Anwendungsfällen, darunter:

  • ExoPlayer, ein Mediaplayer auf Anwendungsebene für Android, der sich einfach anpassen und erweitern lässt.
  • Funktionen für Mediensitzungen zum Bereitstellen und Steuern der Wiedergabe. Dieses neue Sitzungsmodul verwendet dieselbe Player-Schnittstelle wie ExoPlayer.
  • UI-Komponenten zum Erstellen von Benutzeroberflächen für die Medienwiedergabe.
  • Module, die Funktionen in anderen Bibliotheken für die Verwendung mit ExoPlayer umschließen, z. B. das Einfügen von Anzeigen über das IMA SDK.

Weitere Informationen finden Sie im Media3-GitHub-Projekt.

ExoPlayer wurde zuvor in einem separaten ExoPlayer-GitHub-Projekt gehostet. In Media3 lautet der Paketname androidx.media3.exoplayer. Wir planen, das ExoPlayer-GitHub-Projekt noch eine Weile weiter zu pflegen und zu veröffentlichen, damit Apps Zeit für die Migration zu Media3 haben. Media3 bietet Ersatz für alle ExoPlayer-Module, mit Ausnahme der alten Media2- und Mediasession-Erweiterungen, die durch das neue media3-session-Modul ersetzt werden. Dadurch ist eine direkte Integration zwischen Playern und Mediensitzungen möglich, ohne dass eine Adapter-/Connector-Klasse verwendet werden muss.