Media3

Supportbibliotheken für Medienanwendungsfälle.
Letzte Aktualisierung Stabile Release Releasekandidat Beta-Release Alpha-Release
21. Oktober 2026 1.11.1 - - 1.12.0-alpha01

Abhängigkeiten deklarieren

Für eine Abhängigkeit von Media3 musst du deinem Projekt das Google Maven-Repository hinzufügen. Weitere Informationen finden Sie im Google-Repository bei Maven.

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

Cool

dependencies {
    def media3_version = "1.11.1"

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

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

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

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

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

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

    // For inspecting media files
    implementation "androidx.media3:media3-inspector:$media3_version"
    // For extracting and processing video frames
    implementation "androidx.media3:media3-inspector-frame:$media3_version"

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

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

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

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

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

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

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

Kotlin

dependencies {
    val media3_version = "1.11.1"

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

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

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

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

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

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

    // For inspecting media files
    implementation("androidx.media3:media3-inspector:$media3_version")
    // For extracting and processing video frames
    implementation("androidx.media3:media3-inspector-frame:$media3_version")

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

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

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

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

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

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

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

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 findest du Antworten auf Fragen, bekannte Probleme und Feature Requests. Außerdem kannst du dort neue Probleme melden.

Version 1.12.0

Version 1.12.0-alpha01

21. Oktober 2026

Version 1.12.0-alpha01 enthält die folgenden Commits.

  • Common Library:
    • C.COLOR_SPACE_DISPLAY_P3 hinzugefügt und Unterstützung für den Display-P3-Farbraum in den ISO-Farbzuordnungen MediaFormatUtil und ColorInfo hinzugefügt.
    • Es wurde eine zentrale Flags-Registry hinzugefügt, um experimentelle Funktions-Flags und gestaffelte Roll-outs (Flags.setCanaryModeEnabled) zu verwalten. Viele vorhandene @ExperimentalApi-Methoden wurden migriert, um die neue Flags API zu verwenden.
    • Fügen Sie MediaMetadata.playlistId, MediaMetadata.Builder.setPlaylistId(String), MediaMetadata.categories und MediaMetadata.Builder.setCategories(List<String>) hinzu.
    • Ersetzen Sie androidx.media3.common.util.NonNullApi durch JSpecify org.jspecify.annotations.NullMarked.
  • ExoPlayer:
    • Es wurde ein Problem behoben, bei dem die DASH-Wiedergabe mit mehreren Perioden hängen blieb, wenn der erste Block der nächsten Periode nicht geladen werden konnte (#3396).
    • Bericht wasCanceled = true in AnalyticsListener.onLoadError und MediaSourceEventListener.onLoadError, wenn die Wiederholungsversuche für das Laden erschöpft sind.
    • Unterstützung für die Registrierung mehrerer VideoFrameMetadataListener-Instanzen mit ExoPlayer.addVideoFrameMetadataListener und ExoPlayer.removeVideoFrameMetadataListener, wobei ExoPlayer.setVideoFrameMetadataListener und ExoPlayer.clearVideoFrameMetadataListener eingestellt werden.
    • Fügen Sie Unterstützung für Anzeigen in Inhalten mit mehreren Zeiträumen (z.B. DASH) hinzu, indem Sie die AdPlaybackState für jeden Zeitraum aufteilen und versetzen.
    • Race-Bedingung in PreCacheHelper behoben, bei der das Abbrechen einer laufenden Vorbereitungsanfrage trotzdem Hintergrunddownloads starten konnte.
    • Begrenzen Sie setLoadOnlySelectedTracks(true) für ProgressiveMediaSource und DefaultMediaSourceFactory, um nur nicht ausgewählte Video- und Bildtracks herauszufiltern. Audio- und Texttracks werden immer geladen, um einen nahtlosen Wechsel der Tracks ohne erneutes Zwischenspeichern zu ermöglichen.
    • setLoadOnlySelectedTracks(true) standardmäßig auf ProgressiveMediaSource und DefaultMediaSourceFactory aktivieren. Das spart Arbeitsspeicher und ermöglicht genauere Berechnungen der DefaultLoadControl-Pufferzuweisung, wenn nicht alle Tracks ausgewählt sind. Beachten Sie, dass dies zu zusätzlicher Zwischenspeicherung führen kann, wenn nicht ausgewählte Video- oder Bildtracks während der Wiedergabe neu aktiviert werden.
    • Es wurde ein Problem behoben, bei dem Player.getCurrentPosition() veraltete Werte zurückgeben konnte (Aktualisierung nur wenige Male pro Sekunde), wenn die dynamische Planung aktiviert war (#3286).
    • Es wurde ein Problem behoben, bei dem eine unerwartete Verringerung oder ein Zurücksetzen der Position des AudioTrack-Wiedergabekopfs fälschlicherweise als Ganzzahlüberlauf behandelt werden konnte, was dazu führte, dass die Wiedergabe beim Zwischenspeichern ins Stocken geriet (#3407).
    • Experimentelle DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean) entfernen.
    • Vermeidung unnötiger erneuter Aktivierungen des Renderers und von Störungen bei der Rückkehr von Interstitials oder Anzeigen zu Inhalten, die am Ende abgeschnitten wurden (#3371).
    • Es wurde ein Problem behoben, bei dem ein Renderer-Fehler bei einem anstehenden Playlist-Element die aktuelle Wiedergabe vorzeitig unterbrechen konnte, wenn Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION aktiviert war.
    • Es wurde ein NullPointerException behoben, der auftreten konnte, wenn ExoPlayer Renderer auf einen nicht vorbereiteten Medienzeitraum umgestellt hat, wenn Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION aktiviert ist.
    • Es wurde ein Problem behoben, bei dem Videoframes während der dynamischen Planung unerwartet übersprungen oder verworfen werden konnten, wenn Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS aktiviert war.
    • Ein ArrayIndexOutOfBoundsException in Analytics-Listenern wurde behoben, der auftrat, wenn die Wiedergabe während einer Anzeige in einem Livestream beendet wurde (#3423).
    • Ein Problem wurde behoben, bei dem PreloadMediaSource unerwartet ein Vorablade-Ereignis posten konnte, wenn preload() nie aufgerufen wurde (#3408).
    • Es wurde ein Problem behoben, bei dem Format.subsampleOffsetUs für Metadatentracks ignoriert wurde, was zu falschen Wiedergabezeitstempeln in decodierten SCTE-35-Splice-Befehlen führte (#3413).
    • Ein Speicherleck in PreloadMediaSource und DefaultPreloadManager wurde behoben, das auftrat, wenn preload() mehrmals für dieselbe Quelle aufgerufen wurde (#3445).
    • Behebung eines NullPointerException beim Freigeben von AdsMediaSource, während eine Aktualisierung der Inhaltszeitachse aussteht (#3442).
    • Es wurde ein Problem behoben, bei dem die Wiedergabe von progressiven Medien zur falschen Position springen konnte, wenn ein Ladevorgang nach einer Suche (oder beim Starten der Wiedergabe an einer Position ungleich null) fehlschlug und wiederholt wurde (#3440).
    • Problemumgehung für den H.264-Decoder des Xiaomi TV Stick 4K (MiTV-AYFR0) hinzugefügt, der bei nahtlosen Auflösungsänderungen einfriert (#3457).
    • Behebung eines NullPointerException in SteeringManifestTracker, wenn der Tracker beendet wird, bevor ein geposteter Ladeabschluss oder ein Fehler-Callback ausgeführt wird (#3443).
    • Unterstützung der Wiedergabe von zeitgesteuerten HAGC-Metadaten (ST 2094-50) aus mebx-Boxed-Metadatentracks in MP4-Dateien.
    • Ein Problem wurde behoben, bei dem Medienzeiträume in einer Playlist, die langsam vorbereitet wurden, übersprungen werden konnten.
  • CompositionPlayer:
    • Unterstützung für die Konfiguration der Framerate der Videoframe-Aggregation mit Composition.Builder.setVideoFrameAggregationParameters für Wiedergabe-Workflows.
    • Frame-Drops in Kompositionen mit mehreren Sequenzen, die durch Zeitstempelquantisierung oder Rundungsabweichungen verursacht werden, können behoben werden, indem bei der Frame-Aggregation der Frame mit dem nächstgelegenen Zeitstempel ausgewählt wird. Dies ist nur ab API 29 möglich, da pro Videosequenz ein zusätzlicher Frame im Flug gehalten werden muss.
  • Transformer:
    • Unterstützung der Konfiguration der Framerate der Videoframe-Aggregation mit Composition.Builder.setVideoFrameAggregationParameters für Exportworkflows.
    • Frame-Drops in Kompositionen mit mehreren Sequenzen, die durch Zeitstempelquantisierung oder Rundungsabweichungen verursacht werden, können behoben werden, indem bei der Frame-Aggregation der Frame mit dem nächstgelegenen Zeitstempel ausgewählt wird. Dies ist nur ab API 29 möglich, da pro Videosequenz ein zusätzlicher Frame im Flug gehalten werden muss.
    • Transformer#setAudioMimeType(AUDIO_RAW) wird berücksichtigt, wenn AudioProcessors verwendet wird. Vor dieser Korrektur führte das Anfordern von MimeTypes.AUDIO_RAW und das Anwenden eines AudioProcessor zu einer komprimierten Ausgabe.
  • Titelauswahl:
    • Es wurde ein Problem behoben, bei dem auf einigen Geräten ein SDR-Track fälschlicherweise einem unterstützten Dolby Vision-Track vorgezogen wurde (#3135).
  • Extraktoren:
    • Mp4Extractor: Fehler beim Parsen der dOps-Box für Opus in MP4 behoben, bei dem PreSkip, InputSampleRate und OutputGain nicht von Big-Endian in Little-Endian konvertiert wurden, was dazu führte, dass die ersten ca. 299 ms des Audios verworfen wurden, wenn keine Bearbeitungsliste vorhanden ist (#3431).
    • Entfernen Sie Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES, Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265, FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES und FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265, da das Parsen der GOP-internen Beispielabhängigkeit für H.264 und H.265 standardmäßig aktiviert ist.
    • Mp4Extractor: Es wurde ein Fehler beim Parsen von Standortmetadaten aus xyz-Boxen mit Höhenangaben behoben, um Mp4LocationData zu füllen.
    • ExtractorUtil.getFramesPerEncodedSample wurde hinzugefügt, um die Anzahl der Audioframes pro Sample für codierte Audioformate zu berechnen (#3367).
    • Fügen Sie FLAG_READ_XMP_METADATA zu Mp4Extractor hinzu, um XMP-Metadaten aus UUID-Boxen auf oberster Ebene zu extrahieren.
    • Beschädigte AC-3-, DTS- und LPCM-Audiodaten bei der Wiedergabe von DVD-ähnlichen MPEG-PS-Inhalten werden korrigiert, indem der private_stream_1-Substream-Header aus jedem PES-Paket in PsExtractor entfernt wird, bevor die Nutzlast an den Audioleser übergeben wird (#3327).
    • Fehler in FragmentedMp4Extractor behoben, wenn eine tfdt-Box der Version 1 einen negativen baseMediaDecodeTime codiert (#3412).
    • MPEG-TS: Unterstützung für das Parsen von H.264- und H.265-Frame-Packing-Anordnungs-SEI-Nachrichten zum Ausfüllen von Format.stereoMode (#3419).
    • Konfigurationsdaten für Dolby Vision-Profil 20 parsen und nicht unterstützte Dolby Vision-Profile ablehnen, anstatt sie als Standard-HEVC mit falschen Farben wiederzugeben (#3427).
    • MP3: Die Anpassung der Metadaten für die Verzögerung und das Padding des LAME/Xing-Encoders wurde rückgängig gemacht, da sie mit vielen MediaCodec-MP3-Decodern nicht kompatibel ist (#3425).
    • Matroska: NullPointerException beim Parsen verschachtelter ChapterAtom-Elemente korrigiert (#3438).
    • Ogg: Ein Fehler wurde behoben, bei dem ein Paket, dessen Größe ein Vielfaches von 255 Byte ist und das an einer Seitengrenze endet, mit dem folgenden Paket zusammengeführt wird.
    • MP4: mebx-Boxen mit zeitgesteuerten Metadatentracks in Mp4Extractor und FragmentedMp4Extractor parsen. Tracks mit einem it35-Schlüssel werden als MimeTypes.APPLICATION_ITUT_T35 angezeigt (wodurch die HAGC-Wiedergabe aktiviert wird). Andere mebx-Tracks werden ignoriert, es sei denn, FLAG_EMIT_RAW_MEBX_DATA ist festgelegt. In diesem Fall werden alle mebx-Tracks als Roh-MimeTypes.APPLICATION_MEBX ausgegeben.
    • Ogg: Unterstützung für das Extrahieren von Opus-End-Padding für die lückenlose Wiedergabe (#2576) und Korrektur von Beispielzeitstempeln nach dem Springen zu einer Seite, die mit einem fortgesetzten Paket beginnt.
    • Ogg: Behebung von Dekodierungsfehlern und Zeitstempelsprüngen von ca. 1 Sekunde in verketteten Ogg Opus-Streams durch Ignorieren von Opus-ID- und Kommentar-Header-Paketen in der Mitte des Streams.
  • Prüfer:
    • Unterstützung für das Abrufen von XMP-Metadaten aus MP4-Dateien mit MetadataRetriever.
    • Unterstützung für das Extrahieren von mebx-Boxed-Timed-Metadaten-Tracks in MediaExtractorCompat als MimeTypes.APPLICATION_MEBX.
  • Prüf-Frame:
    • Behebung des Problems, dass beim Extrahieren von Ultra-HDR-Frames mit FrameExtractor Farben mit großem Farbraum (BT.2020) im SDR-Basisbild abgeschnitten werden. Farben außerhalb des Farbraums werden jetzt sanft in den sRGB-Farbraum komprimiert, anstatt abgeschnitten zu werden.
  • Audio:
    • Problemumgehung für Geräte hinzugefügt, die android.media.AudioDeviceCallback im falschen Thread aufrufen (#3386).
    • Potenzielle festhängende Wiedergaben nach Titelübergängen mit komprimiertem Offload wurden behoben.
    • Problem auf Amazon Fire TV-Sticks umgehen, bei dem AC-3-Audio bei Übergängen zwischen Zeiträumen einfrieren konnte (#3448).
    • Unterstützung für das Kürzen des Encoder-Paddings am Ende des Streams für die lückenlose Wiedergabe von Ogg und WebM/Matroska Opus (#2576).
    • Es wurde ein Problem behoben, bei dem die Aktualisierungen der lückenlosen Verzögerung und des Padding bei dynamischem Offload während der Titelübergänge auf den eingehenden Titel und nicht auf den wiedergegebenen Titel angewendet wurden.
    • Das End-Padding des Encoders wird bei einzelnen Streams und dem letzten Stream in einer Playlist gekürzt, zusätzlich zu den lückenlosen Übergängen in der Mitte der Playlist (#2576).
    • Vermeide unnötige Kopien des Audio-Buffers in TrimmingAudioProcessor, nachdem das Kürzen der Encoder-Verzögerung am Anfang des Streams abgeschlossen ist und kein Padding am Ende des Streams gekürzt werden muss.
  • Video:
    • Die Meldung von verspäteten Videoframes mit identischen Release-Zeitstempeln wurde korrigiert, sodass sie als verworfen und nicht als übersprungen gemeldet werden.
  • Text:
    • Füge MediaItem.SubtitleConfiguration.timeOffsetUs hinzu, um die Zeitstempel von per Sideloading geladenen Untertiteln relativ zu den Medien zu verschieben. Der Offset kann während der Wiedergabe mit Player.replaceMediaItem(int, MediaItem) geändert werden, ohne die Wiedergabe zu unterbrechen (#1976).
    • SubRip: Unterstützung für das Einfügen eines CharsetDetector in DefaultSubtitleParserFactory hinzugefügt, um die Zeichencodierung von eigenständigen SubRip-Untertiteln ohne Byte Order Mark zu erkennen (#2247).
  • Auswirkung:
    • SoundSeparationAudioProcessor für die Trennung von Audioquellen mit dem StudioSound GMSCore-Modul implementieren.
  • Muxer:
    • Fehler beim Schreiben der dOps-Box für Opus in Mp4Muxer und FragmentedMp4Muxer behoben, bei dem PreSkip, InputSampleRate und OutputGain in Little-Endian statt Big-Endian geschrieben wurden (#3431).
    • Unterstützung für das Schreiben der GPS-Höhe in Mp4LocationData mit Mp4Muxer.
    • Fügen Sie Muxer.Factory.create(ParcelFileDescriptor) hinzu, um das direkte Multiplexing in ein ParcelFileDescriptor zu ermöglichen.
    • Standardmäßig wird die Box tfdt (Track Fragment Base Media Decode Time) in traf-Boxen fragmentierter MP4-Dateien geschrieben, um Zeitstempel für die Mediendecodierung bereitzustellen.
    • Unterstützung für das Schreiben von E-AC-3- und E-AC-3-JOC-Containerboxen (Dolby Atmos) dec3 in Mp4Muxer.
    • Unterstützung für das WebM-Format zu MediaMuxerCompat hinzugefügt.
    • Schreibt die mfra-Box (Movie Fragment Random Access) am Ende fragmentierter MP4-Dateien, um die Suche in FragmentedMp4Extractor mit FLAG_READ_MFRA_FOR_SEEK_MAP zu ermöglichen.
    • Absturz in Mp4Writer und FragmentedMp4Writer behoben, der auftrat, wenn ein EOS-Beispiel vor allen anderen Beispielen geschrieben wurde.
    • Behebung der Container-Compliance beim Muxen von Dolby-Inhalten in MP4- oder fragmentierte MP4-Dateien durch Angabe der mit dby1 kompatiblen Marke im Container-Header (#3369).
    • Unterstützung für 32-Bit-Float-PCM-Audiotracks in Mp4Muxer und FragmentedMp4Muxer (#3389).
    • Nicht unterstützte Dolby Vision-Profile in Mp4Muxer und FragmentedMp4Muxer beim Hinzufügen von Tracks ablehnen.
    • Unterstützung für 24-Bit- und 32-Bit-Integer-PCM-Audiotracks in Mp4Muxer und FragmentedMp4Muxer.
  • IMA-Erweiterung:
    • Leiten Sie die Ereignisse zum Pausieren und Fortsetzen des Players an das IMA SDK in ImaServerSideAdInsertionMediaSource weiter.
  • Sitzung:
    • Fügen Sie MediaConstants.EXTRAS_KEY_PLAYLIST_ID, MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE, MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI und MediaConstants.EXTRAS_KEY_CATEGORIES hinzu, um Playlist- und Elementmetadaten aus alten Metadaten und Beschreibungen zu füllen, sowie MediaConstants.EXTRAS_KEY_SUGGESTED_TYPE und MediaConstants.EXTRAS_KEY_TTL_SECONDS für den Vorschlag LibraryParams.extras.
    • Behebung eines Absturzes von SecurityException beim Erstellen oder Freigeben eines MediaSession auf Geräten, die strenge PendingIntent-Limits erzwingen.
    • Ein Problem wurde behoben, bei dem MediaSession.getControllerForCurrentRequest() bei Wiedergabeanfragen unter Android 12 (API 31 und 32) null zurückgegeben hat, wenn MediaSessionService noch nicht im Vordergrund war.
    • Behebung eines Absturzes von IllegalArgumentException, wenn ein MediaController eine Verbindung zu einer Legacy-Sitzung herstellt, die eine negative maximale Lautstärke meldet.
    • Es wurde ein Problem behoben, bei dem der Aufruf von MediaController.setMediaItem oder setMediaItems gefolgt von play() für ein pausiertes Legacy-MediaSessionCompat einen nicht unterstützten onPrepareFrom*-Callback anstelle von onPlayFrom* oder onPlay() ohne erneute Initialisierung der angeforderten Mediendatei auslösen konnte.
    • Fehlerbehebung bei NullPointerException in der Legacy-Version von MediaBrowser beim Empfang einer benutzerdefinierten Befehlsantwort (#3432).
    • IllegalArgumentException-Absturz beim Empfang von Legacy-Metadaten mit doppelten Schlüsseln im zugrunde liegenden Bundle behoben.
    • Ausgehende MediaControllerCompat.TransportControls-Aufrufe, die innerhalb derselben Looper-Iteration beim Steuern eines alten MediaSessionCompat erfolgen, werden zusammengefasst. Wenn Sie beispielsweise setMediaItem, prepare und play zusammen aufrufen, wird jetzt ein einzelner onPlayFrom*-Callback gesendet.
  • UI:
    • Fehler bei der Positionierung von Satzzeichen in RTL-Untertiteln und bei der Beibehaltung des Span-Bereichs behoben, wenn der bidirektionale Textumbruch aktiviert ist (#3454, #3455).
    • Fügen Sie dem media3-ui-compose-Modul die Klassen TrackSelectionState und TrackSelectionParametersState und die entsprechenden Composable-Status-Remember-Funktionen hinzu.
    • Führen Sie PresentationState.videoAspectRatio ein und lassen Sie Modifier.resizeWithContentScale aspectRatio: Float? anstelle von sourceSizeDp: Size? verwenden.
    • Füge dem media3-ui-compose-Modul die Klasse CuesState und die komponierbare Funktion rememberCuesState hinzu, um die aktuellen Cues des Players zu erfassen.
    • Unterstützung für den Scrubbing-Modus in ProgressSlider hinzugefügt, wenn es auf ExoPlayer oder CompositionPlayer basiert.
    • Unterstützung für showArtwork zu PresentationState hinzugefügt und damit das Rendering des bereitgestellten optionalen artwork-Kompositionselements in ContentFrame und Player zeitlich gesteuert. Fügen Sie das Artwork-Composable hinzu, das als Standardwert für den artwork-Slot verwendet werden soll.
    • Fügen Sie PlayPauseButtonState neue Felder hinzu (showBuffering, showRetry, showReplay) und verwenden Sie sie in PlayPauseButton, um mehr Symbole und eine Pufferanzeige zu rendern.
    • Die Klasse PlaybackState wurde hinzugefügt, um die Beobachtung des benutzerdefinierten Wiedergabestatus zu ermöglichen, und BufferingIndicator wurde als schaltflächenunabhängige Komponente eingeführt.
    • Es wurde ein Problem behoben, bei dem PlayerView und PlayerControlView Anzeigenmarkierungen an den Periodengrenzen für Live-Post-Roll-Platzhalter in Livestreams mit mehreren Perioden anzeigten.
    • Die zusammensetzbaren Slots von Player, ContentFrame, PlayerDefaults und MiniController erhalten den Player oder die Sichtbarkeit der Steuerelemente nicht mehr als Parameter. Erfassen Sie sie stattdessen aus dem aufrufenden Bereich (z. B. ist topControls jetzt @Composable BoxScope.() -> Unit). Dies ist eine funktionsgefährdende Änderung an einer instabilen API.
    • Fügen Sie den Parameter alignment zu ContentFrame, Player und Modifier.resizeWithContentScale hinzu, um den skalierten Inhalt innerhalb seines Containers zu positionieren, und schneiden Sie den Inhalt von ContentFrame auf seine Grenzen zu, damit das mit ContentScale.Crop skalierte Video nicht mehr außerhalb davon gezeichnet wird.
    • Unterstützung für die Livestream-UI in ProgressSlider, ProgressStateWithTickCount und ProgressStateWithTickInterval hinzugefügt, indem isLive und liveOffsetMs verfügbar gemacht werden. LiveButton-Composable zu media3-ui-compose-material3 hinzugefügt (#2213).
  • Ktor-Erweiterung:
    • Ein Problem wurde behoben, bei dem KtorDataSource Verbindungsfehler während des Streams als Ende der Eingabe behandeln konnte, anstatt eine HttpDataSourceException auszugeben (#3460).
  • HLS-Erweiterung:
    • VIDEO-RANGE (PQ und HLG) auf EXT-X-STREAM-INF und EXT-X-I-FRAME-STREAM-INF in Format.colorInfo parsen (#3441).
    • NullPointerException beim Parsen von MPEG-TS-EXT-X-MAP-Initialisierungssegmenten mit PES-Medien-Samples wurde behoben (#3456).
    • Regression behoben, bei der Format.id und Format.metadata für exponierte HLS-Tracks null waren (#3402).
    • Anzeigen mit Asset-Listen auf X-PLAYOUT-LIMIT kürzen und diejenigen überspringen, die vollständig außerhalb des Limits liegen. Den Offset für die Fortsetzung des Inhalts auf 0 setzen, wenn ein Interstitial X-RESUME-OFFSET auslässt und die Dauer unbekannt ist, auch wenn X-PLAYOUT-LIMIT festgelegt ist.
    • Es wurde ein Problem behoben, bei dem durch das Schließen eines X-ASSET-LIST-Interstitials die Beiträge anderer Interstitials in derselben Anzeigengruppe zum Fortsetzen des Inhalts überschrieben wurden.
  • DASH-Erweiterung:
    • Unterstützung für das Parsen von Ereignissen zum Einfügen (urn:mpeg:dash:event:alternativeMPD:insert:2025) und Ersetzen (urn:mpeg:dash:event:alternativeMPD:replace:2025) alternativer MPDs in DashManifestParser und Bereitstellung als AlternativeMpdEvent-Instanzen in Period.alternativeMpdEvents. Dies ist eine funktionsgefährdende Änderung für Apps, die eine Unterklasse von DashManifestParser sind: DashManifestParser.buildPeriod akzeptiert jetzt einen zusätzlichen List<AlternativeMpdEvent>-Parameter und die vorherige Überladung wurde entfernt. Apps, die DashManifestParser.parseEventStream(XmlPullParser) überschreiben, müssen stattdessen DashManifestParser.parseEventStream(XmlPullParser, String) überschreiben, da Ersteres eingestellt wurde und in einer zukünftigen Version privat gemacht wird.
    • CICP-Farbinformationen (ColourPrimaries, TransferCharacteristics, MatrixCoefficients und VideoFullRangeFlag) aus den Deskriptoren EssentialProperty und SupplementalProperty in Format.colorInfo parsen (#3426).
    • Unterstützung von durch Leerzeichen getrennten Listen mit @id-Werten in Trickmodus-Deskriptor-Attributen (http://dashif.org/guidelines/trickmode) (@value) (#3315).
    • Unterstützung für das Parsen von <ProducerReferenceTime> in DashManifestParser, das Bereitstellen in AdaptationSet.producerReferenceTimes und das Verwenden zum Ausfüllen von Timeline.Window.presentationStartTimeMs und Timeline.Window.windowStartTimeMs für VOD-Streams.
    • Unterstützung für DASH Content Steering hinzugefügt (#1689).
    • Es wurde ein NullPointerException behoben, der beim Parsen eines DASH-Manifests mit einem fehlenden Attribut im <UTCTiming>-Element auftreten konnte (#3436).
  • RTSP-Erweiterung:
    • Es wurde ein IllegalStateException-Absturz behoben, der bei der Verarbeitung verzögerter Netzwerkantworten nach dem Schließen des RTSP-Clients auftrat.
    • Problem behoben, bei dem schnelles Scrubbing fälschlicherweise den TCP-Protokoll-Fallback-Mechanismus auslösen konnte.
    • Es wurde ein IllegalStateException-Absturz behoben, der auftreten konnte, wenn verzögerte Netzwerkantworten verarbeitet wurden, nachdem der RTSP-Client den Status während der Neuauswahl des Tracks, des Sitzungsabbruchs oder der URI-Weiterleitung zurückgesetzt hatte.
    • Problem behoben, bei dem ein erneutes Suchen vor dem Neustart der Wiedergabe zu einem Absturz von IllegalStateException führen konnte.
    • Es wurde ein Problem behoben, bei dem das Zurückspulen während eines bereits ausstehenden Suchvorgangs zu Audioausfällen und zum Einfrieren der Videowiedergabe führen konnte.
    • Ein Problem wurde behoben, bei dem H.264- und H.265-Keyframe-Zugriffseinheiten, die mit einem Aggregations- oder Nicht-IDR-Paket enden, nicht als Keyframes gekennzeichnet wurden, was dazu führte, dass die Wiedergabe im Zwischenspeicher hängen blieb (#3434).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Opus-Erweiterung: JNI-Absturz beim Decodieren ungültiger Opus-Daten behoben.
    • Opus-Erweiterung: Es wurde ein Problem behoben, bei dem das Padding zum Verwerfen ignoriert wurde, wenn das Pre-Skip-Padding und das Padding zum Verwerfen auf dasselbe Paket fielen (#2576).
  • Cast-Erweiterung:
    • SessionAvailabilityListener.SessionUnavailableReason wird eingeführt, um den Grund für die Nichtverfügbarkeit der Sitzung darzustellen, und es wird eine überladene Methode für SessionAvailabilityListener.onCastSessionUnavailable bereitgestellt, um sie offenzulegen.
    • Ein Problem wurde behoben, bei dem die Wiedergabe nach dem Beenden einer Cast-Sitzung unerwartet lokal fortgesetzt wurde.
    • Fehler protokollieren, wenn RemoteMediaClient-Vorgänge (z. B. Wiedergabe, Pause, Geschwindigkeitsänderung, Wiederholungsmodus, Lautstärke, Stummschaltung oder Titelauswahl) in RemoteCastPlayer fehlschlagen (#3373).
    • ArrayIndexOutOfBoundsException in RemoteCastPlayer wurde korrigiert, wenn sich die Cast-Empfängerwarteschlange ändert oder verkleinert, während ein Suchvorgang aussteht (#3372).
    • Ein Problem mit dem Standard-Cast-Empfänger wurde behoben, bei dem auf der Zeitachse nur Mediendateien in der unmittelbaren Umgebung des aktiven Elements und nicht die gesamte Playlist angezeigt wurden (#3129).
    • Die Zeitachse und die Wiedergabeposition werden sofort aktualisiert, wenn die Playlist geändert (setMediaItems, addMediaItems, moveMediaItems, removeMediaItems) oder in RemoteCastPlayer gesucht wird. Außerdem werden aufeinanderfolgende Playlist-Vorgänge in die Warteschlange gestellt, damit sie zuverlässig in der richtigen Reihenfolge ausgeführt werden (#2639, #3272).
    • Ein Problem wurde behoben, bei dem das Aufrufen von addMediaItems für eine leere Warteschlange in RemoteCastPlayer dazu führte, dass die Medieninhalte auf dem Cast-Empfänger nicht geladen wurden (#2402).
    • Ein Problem in RemoteCastPlayer wurde behoben, bei dem die Zeitachse gelöscht wurde, wenn das Ende der Cast-Empfängerwarteschlange erreicht wurde, anstatt die Playlist beizubehalten.
    • Es wurde ein Problem behoben, bei dem playWhenReady, repeatMode und playbackParameters nicht übertragen oder angewendet wurden, wenn sie vor dem Laden von Mediendateien auf RemoteCastPlayer festgelegt wurden (z. B. während der Übertragung der Wiedergabe von lokal auf remote in CastPlayer) (#889).
  • Demo-App:
    • Unterstützung für DRM-geschützte Mediendateien und einen zusätzlichen HLS-Beispielstream zum Katalog der Demo-App für die Sitzung hinzufügen.
    • Konfiguriere RemoteCastPlayer mit einem CastTrackSelector in der Demo-App für die Sitzung, um die Auswahl von Untertiteln und Audiotracks beim Streamen zu ermöglichen.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Entfernen Sie DashUtil.buildDataSpec(Representation, RangedUri, int) und DashUtil.buildDataSpec(Representation, String, RangedUri, int). Verwenden Sie stattdessen DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>).
  • Build:
    • Erhöhen Sie minSdk von Gradle auf 24.

Version 1.11.0

1.11.1

10. September 2026

  • ExoPlayer:
    • Verschiebe das Flag zum Aktivieren/Deaktivieren von HAGC-Metadaten für progressive Medien von MediaSource.Factory nach ExtractorsFactory. Die vorherige Methode setExperimentalEnableHagcPlayback wird entfernt und durch ExtractorsFactory.setParseHagcMetadata ersetzt. Außerdem wurde ein Problem behoben, bei dem das Deaktivieren für Matroska-/WebM-Container nicht funktionierte.
    • Ein Problem mit der Wiedergabe wurde behoben, das beim Vorwärmen eines nicht übergehenden sekundären Renderers auftrat.
    • Problem mit dem Vorwärmen behoben, bei dem der Surface an den primären Renderer zurückgegeben werden sollte, wenn ein Suchvorgang beide Renderer zurücksetzt und deaktiviert.
    • Fehler in ArrayIndexOutOfBoundsException behoben, bei dem die Standardposition durch eine Aktualisierung der Live-Zeitachse über eine serverseitig eingefügte Anzeige, die gerade wiedergegeben wird, hinaus verschoben wird (#3348).
    • Es wurde ein Problem im Scrubbing-Modus behoben, bei dem beim Suchen mit aktiviertem ScrubbingModeParameters.allowSkippingMediaCodecFlush kurzzeitig veraltete Videoframes angezeigt werden konnten.
  • Extraktoren:
    • Matroska: Ein Problem wurde behoben, bei dem Tracks, die nach Clustern platziert wurden, nicht zu einer suchbaren Zeitachse führten (#3377).
  • Audio:
    • Die Berechnung der Puffergröße in SilenceSkippingAudioProcessor wurde korrigiert, sodass die minimale Dauer der Stille nicht fälschlicherweise durch die Framegröße herunterskaliert wird (#3271).
    • Fehlerbehebung bei der Verarbeitung von 8-Bit-PCM in PcmAudioUtil, damit Samples wie von Android definiert als vorzeichenlos behandelt werden (#3271).
    • Problem mit der Auslagerung behoben, bei dem die Wiedergabe während der Pre-Roll- oder lückenlosen Übergänge aufgrund begrenzter Hardwarepuffergrößen ins Stocken geraten konnte.
    • Fehler in DefaultAudioSink behoben, bei dem die Anzahl der Releases nicht abnimmt, wenn der Wiedergabe-Thread nicht mehr aktiv ist (#3338).
  • Sitzung:
    • Fehler NullPointerException behoben, der auftrat, wenn ein laufender MediaController aus einem Player.Listener-Callback freigegeben wurde (#3375).
    • Deadlock im Hauptthread behoben, wenn ein Legacy-MediaBrowser eine Verbindung zu einem Dienst herstellt, der ein asynchrones Ergebnis von onGetLibraryRoot() oder onConnectAsync() zurückgibt (#3393).
  • HLS-Erweiterung:
    • Die Berechnung des Offsets für die Fortsetzung des Inhalts wurde korrigiert, wenn das Zielsegment für das Einrasten noch nicht in der Playlist enthalten ist (#3322).
    • Ein Problem wurde behoben, bei dem ein vollständig verbrauchter HlsMediaChunk versucht, den Ladevorgang zu wiederholen, wenn EOFException vom Extractor empfangen wird (#3350).
  • DASH-Erweiterung:
    • Fehlerhafte Berechnung des Beispielzeitstempels für Bildtracks mit einem presentationTimeOffset wurde behoben (#3334).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Opus: Speicherbeschädigung behoben, die auftrat, wenn mehrere OpusDecoder-Instanzen gleichzeitig initialisiert wurden.
    • MPEG-H: Speicherleck, Abschneiden von Nicht-ASCII-Zeichen und potenzieller nativer Absturz bei geringem Arbeitsspeicher beim Senden von Befehlen an den MpeghUiManager behoben (#3365).

Version 1.11.0

5. August 2026

  • Gemeinsame Bibliothek:
    • Fügen Sie Format.channelMask hinzu, um die Audiokanalmaske explizit darzustellen, und eine neue Util.getAudioTrackChannelConfig(Format)-Überladung, um sie sicher aufzulösen.
    • Upgrade von Kotlin von 2.0.20 auf 2.2.0.
  • ExoPlayer:
    • Ein zeitabhängiger Nebenläufigkeitsfehler wurde behoben, der in ExoPlayer zu einer IllegalStateException oder IndexOutOfBoundsException führen konnte.
    • Die Prüfungen der Anzahl der Anzeigengruppen in AdsMediaSource werden gelockert, damit die Anzahl der Anzeigengruppen sinken kann, wenn eine Anzeigengruppe vollständig verarbeitet wurde (hasUnplayedAds() ist false). Dadurch wird die dynamische Größenanpassung von Anzeigengruppen während der Zurücksetzungsworkflows berücksichtigt.
    • Füge getFlags() und FLAG_STRICT_DURATION zu SampleStream hinzu, damit Streams Flags melden können, und aktualisiere die Renderer, um diese Flags dynamisch zu prüfen.
    • Wenn die Streamformate keinen gültigen Wert liefern, wird auf die Frameraten-Schätzung in MediaCodecVideoRenderer und das Codec-Ausgabeformat in MediaCodecAudioRenderer zurückgegriffen, um die Codec-Betriebsrate zu berechnen. So werden unnötige Codec-Zurücksetzungen vermieden.
    • Entfernen Sie das Clipping von Inhalten für clientseitig eingefügte Anzeigen im Core Player. Stattdessen übernimmt AdsMediaSource die Clipping-Logik. Benutzerdefinierte clientseitig eingefügte Anzeigenquellen müssen aktualisiert werden, um das Content-Clipping intern zu implementieren.
    • Tracks mit einem wohlgeformten, aber nicht erkannten Codec-Profil oder ‑Level werden als supported=NO_EXCEEDS_CAPABILITIES und nicht als supported=YES markiert. Letzteres wird für Tracks mit fehlenden oder fehlerhaften Profil- oder Levelinformationen verwendet. So wird sichergestellt, dass diese Tracks (die wahrscheinlich nicht vom Gerät unterstützt werden) nicht ausgewählt werden, wenn es besser unterstützte Alternativen gibt.
    • Fügen Sie DefaultPreloadManager.SimpleRankingDataComparator hinzu, einen RankingDataComparator, der die Ränge der Mediendateien anhand ihrer Abstände zum Index der aktuell wiedergegebenen Mediendatei vergleicht. Apps können die Methode compare(Integer, Integer) überschreiben, wenn eine genauere Vergleichslogik erforderlich ist. Der benutzerdefinierte SimpleRankingDataComparator kann über einen neuen Konstruktor von DefaultPreloadManager.Builder eingefügt werden.
    • Reduzieren Sie das OOM-Risiko von DefaultLoadControl.prioritizeTimeOverSizeThresholds, indem Sie auf die Byte-Größenlimits des Zwischenspeichers zurückgreifen, wenn der verfügbare Heap-Speicher knapp ist.
    • Die Verarbeitung von Standbildern, wenn MediaItem.imageDurationUs nicht festgelegt ist, wurde angepasst: JPEG- und HEIC-Standbilder werden jetzt mit einer sehr kurzen Standarddauer „abgespielt“ (genauso wie PNG- und andere Bilder zuvor).
    • Füge MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter) hinzu, um BandwidthMeter mit MediaSource zu verbinden. Die verworfene Methode mit benutzerdefinierter Implementierung wird jedoch standardmäßig weiterhin aufgerufen. Es wird empfohlen, die neue Methode zu implementieren und BandwidthMeter.getTransferListener() zu verwenden, um die alte Methode zu ersetzen.
    • Fügen Sie in DefaultBandwidthMeter Unterstützung für eine benutzerdefinierte InitialBitrateSupplier hinzu. Dadurch können Apps ihre eigene Logik zur Bestimmung der anfänglichen Bitratenschätzung bereitstellen, die bei der Erstellung von DefaultBandwidthMeter und bei Änderungen des Netzwerktyps verwendet wird. Der Anbieter kann über DefaultBandwidthMeter.Builder.setInitialBitrateSupplier() festgelegt werden.
    • Dynamische Planung standardmäßig aktivieren. Die Wiedergabeschleife von ExoPlayer wird dynamisch und nicht in einem statischen Intervall ausgeführt.
    • Ein unnötiger Reset, der beim Zusammenführen von Tracks mit Pre-Roll-Samples zur aktiven Wiedergabe auftreten kann, wurde entfernt.
    • In DefaultBandwidthMeter optimieren Sie getInitialBitrateCountryGroupAssignment, um die Ländergruppenzuweisungen in einer 32-Bit-Ganzzahl statt in einem Array zurückzugeben. Dadurch wird die Codegröße reduziert und Zuweisungen werden vermieden.
    • Behebung von AudioTrack-Initialisierungsfehlern auf einigen Geräten, indem sichergestellt wird, dass die Wiederholungslogik immer eine Puffergröße von mindestens 1 Sekunde versucht, wenn andere Wiederholungen (durch Halbierung der Puffergröße) fehlschlagen (#3207).
    • Codec-Problem auf einigen Geräten behoben, bei dem der Codec alle Samples verschluckt hat, wenn er vor dem Empfang von Eingabepuffern geleert wurde.
    • Experimentelle ExoPlayer.Builder.enablePerStreamMediaProgression() hinzugefügt, um die Medienverarbeitung pro Stream zu ermöglichen. Dadurch wird die Startlatenz zwischen Playlistelementen reduziert und verhindert, dass die Wiedergabe bei sehr kurzen Inhalten hängen bleibt (#3122).
    • Race-Bedingung im Zusammenhang mit der Verwendung der Audiositzungs-ID behoben, bei der die von ExoPlayer automatisch generierte anfängliche Audiositzungs-ID anstelle des von setAudioSessionId festgelegten Werts verwendet wurde (#3241).
    • Experimentelle Unterstützung für die Wiedergabe von zeitgesteuerten HAGC-Metadaten (ST 2094-50) für progressive Medien (z.B. MP4, Matroska) hinzugefügt. Der Player führt HAGC-Metadatentracks automatisch mit dem zugehörigen Videotrack zusammen und liefert die Metadaten Out-of-Band an den Decoder auf Geräten mit API 37 oder höher. Dieses Verhalten kann über DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false) deaktiviert werden.
    • Format.selectionPriority hinzugefügt, das die relative Präferenz von Format bei der Titelauswahl darstellt (#3236).
    • Ein potenzielles Problem im Scrubbing-Modus wurde behoben, bei dem das Scrubbing beim Suchen nach dem „Ende des Streams“ hängen bleiben konnte.
  • CompositionPlayer:
    • Ein Problem wurde behoben, bei dem TrackSelector-Instanzen nicht freigegeben wurden.
  • Transformer:
    • Ein Problem wurde behoben, bei dem ExportResult.fileSizeBytes möglicherweise zu oft gemeldet wurde.
  • Trackauswahl:
    • BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR verfügbar machen und AdaptiveTrackSelection.Factory.setTrackFormatComparator hinzufügen, um die Sortierung benutzerdefinierter Formate und die Priorität der ABR-Auswahl über die Sortierung nach Bitrate hinaus zu ermöglichen.
    • Ein zeitabhängiges Problem mit der Nebenläufigkeit wurde behoben, bei dem schnelle sequenzielle Aktualisierungen der Parameter für die Titelauswahl dazu führen konnten, dass einige Aktualisierungen verloren gingen oder überschrieben wurden.
  • Extraktoren:
    • MP4, MP3 und FLAC: FLAG_DISABLE_ARTWORK_METADATA wurde hinzugefügt, damit angehängte Bilder und Cover-Metadaten beim Parsen des Containers verworfen werden können, um den Arbeitsspeicherverbrauch während der Laufzeit zu reduzieren (#2077). Dies kann auch zentral über DefaultExtractorsFactory.setDisableArtworkMetadata aktiviert werden.
    • MP4: Unterstützung für das Extrahieren von ITU-T T.35-Tracks (it35) mit zeitgesteuerten Metadaten hinzugefügt.
    • MP4: Unterstützung für das Extrahieren von Kapitelmetadaten (sowohl Nero- als auch QuickTime-Formate) hinzugefügt. QuickTime-Kapitel werden bevorzugt, wenn beide vorhanden sind. Die extrahierten Kapitelinformationen werden als Chapter-Einträge im Metadata des Tracks bereitgestellt, was eine native Kapitelnavigation in MP4-, M4A- und M4B-Dateien (z. B. Hörbücher und Podcasts) ermöglicht (#2803).
    • WAV, Matroska und MP4: Unterstützung für 64-Bit-Gleitkomma-PCM-Audio hinzugefügt (#3090).
    • Matroska: Verwende Codec-Bitstream-Metadaten, um genaue ColorInfo-Werte zu erhalten.
    • MP4: Unterstützung für die Suche in fragmentierten MP4-Dateien mit der mfra-Box hinzugefügt, wenn keine sidx-Box vorhanden ist. Geben Sie dazu FLAG_READ_MFRA_FOR_SEEK_MAP für FragmentedMp4Extractor an. Dies erfolgt jetzt standardmäßig in DefaultExtractorsFactory (#3088).
    • av1C-Daten mit nicht unterstützter Version ignorieren.
    • MP4: Unterstützung für Big-Endian-Gleitkomma-PCM in fpcm-Boxen hinzugefügt.
    • Matroska: Kapitelinformationen in Chapter-Einträge im Metadata eines Tracks parsen.
    • MPEG-TS: Die Extraktion von DTS-HD- und DTS Express-Streams wurde verbessert, indem der Core- und der Extension-Substream zu einem einzigen Sample kombiniert wurden. Dadurch wurden Wiedergabeprobleme behoben, bei denen die beiden zuvor als separate Samples ausgegeben wurden (#3147).
    • MP4: Endlosschleifen und Lesevorgänge außerhalb des zulässigen Bereichs beim Parsen leerer ilst-Metadaten-Tag-Elemente verhindern (#3191).
    • MPEG-TS: Es wird dafür gesorgt, dass der letzte Frame für Streams gerendert wird, bei denen das letzte PES-Paket eine bekannte Länge hat (#3206).
    • MP3: Die Bitratenberichte für Dateien mit Xing- und VBRI-Header wurden korrigiert.
    • Matroska: Tracks verarbeiten, die im letzten Cluster definiert sind (#3250).
    • Matroska: Unterstützung für ALAC hinzugefügt (#3268).
    • MP4: sgpd-Boxen mit variabler Länge in fragmentierten MP4-Dateien zulassen (#3243).
    • AVI: Ein Problem wurde behoben, bei dem die Wiedergabe von Dateien ohne Keyframe-Flags auf Audiotracks zu Audioverlust und OutOfMemoryError führte.
    • MP3: Verwendung von lückenlosen Dauern aus Xing/Info-Headern (#3183).
    • MP3: LAME/Xing-Encoder-Verzögerung und Padding-Metadaten anpassen, um sie an das decodierte PCM-Trimming anzupassen (#3200).
  • Audio:
    • In den Audiorenderern von ExoPlayer wurde ein Kulanzzeitraum von 100 ms für den Übergang vom Status „Bereit“ zum Status „Nicht bereit“ hinzugefügt, um vorübergehende Unterläufe zu entprellen und unerwartete Zwischenspeicherzustände während der aktiven Wiedergabe zu vermeiden (#3210).
    • Die Standardlogik für die PCM-Puffergröße in DefaultAudioTrackBufferSizeProvider wurde geändert, um einen festen 500-ms-Puffer zu verwenden und die Geräteabhängigkeit zu verringern.
    • MediaCodecAudioRenderer wurde aktualisiert, um die räumliche channelMask aus dem Plattform-Decoder zu extrahieren. Dadurch kann DefaultAudioSink diese explizite Maske verwenden, anstatt eine aus der Kanalanzahl abzuleiten.
    • Parameter von AudioSink.configure in Datenklasse konvertieren. Benutzerdefinierte Überschreibungen von ForwardingAudioSink.configure müssen zur neuen Methodensignatur migriert werden.
    • Unterstützung für das Beibehalten der Tonhöhe beim Zeitstrecken eines Audiostreams mit EditedMediaItem.Builder#setSpeed(SpeedParameters) hinzugefügt.
    • ToFloatPcmAudioProcessor wurde erweitert, um die Konvertierung von 8-Bit-PCM, 16-Bit-Big-Endian-PCM und 64-Bit-Gleitkomma-PCM in 32-Bit-Gleitkomma-PCM zu unterstützen (#3090).
    • Ändern Sie den Rückgabewert von DecoderAudioRenderer.getChannelMapping in ImmutableIntArray.
    • Fehler behoben, durch den die Wiedergabe hängen blieb, wenn eine Playlist mit lückenlosem Audio im komprimierten Offload-Modus abgespielt wurde.
    • Timeline und Zeitraum-UID werden an AudioSink.configure und AudioProcessor.StreamMetadata weitergeleitet, um den Audioprozessoren Playlist-Kontext bereitzustellen (#418).
    • Legen Sie die richtige AudioProcessor.StreamMetadata.positionOffsetUs fest, um eine zeitbasierte Audioverarbeitung zu ermöglichen (#418).
    • Unterstützung für 32-Bit- und 64-Bit-Gleitkomma-PCM im Big-Endian-Format hinzugefügt.
    • Der Fallback-Pfad von EAC3-JOC zu EAC3 für die Wiedergabe auf Google Pixel-Geräten wurde entfernt, da die Standard-EAC3-Decoder dieser Geräte keine EAC3-JOC-Streams decodieren können (#3257).
  • Video:
    • Die Logik für den Beitritt zu Videos wurde korrigiert, sodass verworfene Puffer während des Beitritts als übersprungen und nicht als verworfen gezählt werden.
    • Es wurde ein Problem behoben, bei dem die Rendering-Entscheidung beim Festlegen einer neuen Oberfläche sofort getroffen wurde, um Frame-Drops auf Geräten zu vermeiden, die keine Platzhalteroberflächen unterstützen.
    • Die Schätzung der Framerate in MediaCodecVideoRenderer wurde korrigiert, um sie genauer zu machen, indem verworfene oder übersprungene Frames berücksichtigt werden.
    • Konfiguration des Schwellenwerts für die vorzeitige Planung von Frames zulassen. Der Standardwert ist 50 ms, aber der Wert kann über MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold() angepasst werden.
    • Fehler in VideoFrameReleaseHelper behoben, bei dem Änderungen der Anzeige redundante Choreographer-Callbacks und übermäßige CPU-Aktivierungen im Hauptthread auslösen konnten.
  • Text:
    • TTML: Fallback auf displayAlign von style für Regionen (#2559).
    • TTML: Cue-Startzeit vom übergeordneten Element der <p>-Elemente übernehmen (#3246).
  • Metadaten:
    • Feld MediaMetadata.discSubtitle hinzufügen und aus ID3v2.4-TSST- und Vorbis-DISCSUBTITLE-Daten parsen.
    • Disc-Nummer und -Anzahl aus ID3-TPOS-Frame parsen.
  • Auswirkung:
    • Der Status „Neu zeichnen“ in FinalShaderProgramWrapper wird beim Leeren gelöscht, um zu verhindern, dass der Player beim Suchen einfriert.
  • Muxer:
    • Unterstützung für Track-Referenzen (die tref-Box) in Mp4Muxer über eine neue addTrackReference API hinzugefügt. So können Beziehungen zwischen Tracks hergestellt werden, z. B. die Verknüpfung eines Metadaten-Tracks mit dem Video-Track, den er beschreibt.
    • Fügen Sie OggMuxer hinzu, um das Muxing von OPUS- oder VORBIS-Medienstreams in das Dateiformat ogg zu ermöglichen.
    • WavMuxer für die WAV-Dateigenerierung hinzugefügt (unterstützt Ganzzahl- und Gleitkomma-PCM).
    • Fügen Sie setAttemptStreamableOutputEnabled zu InAppMp4Muxer.Factory hinzu, um das Schreiben kleinerer, nicht streamfähiger Dateien ohne reservierten Speicherplatz zu ermöglichen.
    • Unterstützung für IAMF-Audio in Mp4Muxer und FragmentedMp4Muxer hinzugefügt.
  • IMA-Erweiterung:
    • Fügen Sie ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot hinzu, um eine Anzeigenfläche für Pausenanzeigen bereitzustellen.
    • Fehler behoben, bei dem bei aufeinanderfolgenden überspringbaren VAST-Anzeigen die Schaltfläche „Überspringen“ sofort bei der zweiten Anzeige eingeblendet wurde (#3165).
  • Sitzung:
    • Behebung potenzieller Deadlocks und IllegalStateException-Abstürze in MediaNotificationManager bei Verwendung einer Sitzung mit einem Hintergrundthread-Player-Looper.
    • Strengere Threading-Anforderungen für MediaSession-Methoden erzwingen. Void-Methoden werden jetzt automatisch nach der Ausführung an den Looper-Thread der Anwendung gesendet und Zustandszugriffsfunktionen (Getter) lösen explizit eine IllegalStateException aus, wenn sie von einem anderen Thread als dem Looper der Anwendung aufgerufen werden.
    • Behebung eines Absturzes beim Zusammenführen von Zeitachsen außerhalb des zulässigen Bereichs (IllegalStateException in MediaUtils.mergePlayerInfo) durch Verfolgen der Statuskonsistenz pro Controller auf der Sitzungsseite.
    • Füge androidx.media3.session.MediaSessionManager hinzu, um die Abfrage aktiver Mediensitzungen und die Rückgabe von Media3-SessionToken-Instanzen zu unterstützen.
    • Ändern Sie das Standardverhalten von MediaSession.Callback.onConnect, wenn die Methode nicht überschrieben wird, um nur Lesezugriff auf nicht vertrauenswürdige Controller zu gewähren.
    • Unterstützung für das Überschreiben des Paketnamens beim Erstellen von MediaSession über eine neue API MediaSession.Builder#setPackageNameOverride hinzugefügt. Der Aufrufer muss die Berechtigung android.permission.OVERRIDE_MEDIA_SESSION_OWNER haben, um den Paketnamen der Sitzung zu überschreiben.
    • Fügen Sie MediaSession.Callback.onConnectAsync() hinzu. Mit der neuen Methode kann der Verbindungsversuch eines Controllers asynchron verarbeitet werden. Apps können sofort Future mit Futures.immediateFuture(ConnectionResult) zurückgeben, um das vorherige Verhalten zu erreichen. Es wird empfohlen, zur neuen Methode zu migrieren, da Callback.onConnect möglicherweise eingestellt wird.
    • Ein Problem wurde behoben, bei dem das Bluetooth-AVRCP-Browsing MediaLibraryService in API 36 und 37 nicht erkannt hat.
    • Es wurde ein Problem behoben, bei dem Cover in MediaSession doppelt herunterskaliert wurden, wenn die Bildgröße nahe am Plattformlimit lag. Dadurch wurden Benachrichtigungen unscharf (#3134).
    • Fehler ForegroundServiceStartNotAllowedException in MediaNotificationManager behoben, der dazu führte, dass die App abstürzte, wenn ein asynchroner Callback zum Laden einer Bitmap-Grafik versuchte, den Dienst im Vordergrund zu starten, während die App im Hintergrund ausgeführt wurde (#3270).
    • Ein Problem wurde behoben, bei dem PositionInfo-Objekte, die von einem MediaController empfangen wurden, ihre ursprünglichen Timeline-UIDs nicht hatten. Die Sitzung übersetzt und propagiert diese UIDs jetzt zuverlässig bei Statusaktualisierungen.
    • Absturz durch Abfangen von ForegroundServiceStartNotAllowedException in MediaSessionService.stopSelfSafely() behoben (#3310).
    • Unerwarteter onMediaItemTransition()-Callback für MediaController beim Springen innerhalb derselben Mediendatei wurde behoben (#3248).
  • UI:
    • Es wurde ein Problem behoben, bei dem der erste Frame in der falschen Größe gerendert wurde, wenn ContentFrame während der Wiedergabe neu zusammengesetzt wurde (#3238).
    • Fügen Sie die Klasse CurrentMediaItemState und das entsprechende rememberCurrentMediaItemState-Composable zum Modul media3-ui-compose hinzu. Dieser State Holder wird in demo-compose verwendet, um verschiedene Metadateninformationen zum aktuell wiedergegebenen MediaItem anzuzeigen.
    • Fügen Sie dem Modul media3-ui-compose die Klasse PlaylistState und die entsprechende rememberPlaylistState-Composable hinzu. Dieser State Holder wird in demo-compose verwendet, um verschiedene Metadateninformationen zum MediaItems anzuzeigen, das im Player festgelegt ist.
    • API für Vorspulen/Zeitlupe zu PlaybackSpeedState hinzugefügt. Verwende diese Funktion in demo-compose, um das Vorspulen durch langes Drücken zu demonstrieren.
    • Fügen Sie dem Modul media3-ui-compose-material3 die zusammensetzbare Funktion MiniController hinzu. Sie bietet eine kompakte Möglichkeit, die Player zu steuern, und zeigt gleichzeitig Titel, Künstler, Cover und Fortschritt des aktuellen Medienelements an.
    • Fügen Sie dem Modul media3-ui-compose die Klasse ErrorState und die entsprechende rememberErrorState-Composable hinzu. Füge das ErrorText-Composable zu media3-ui-compose-material3 hinzu und mache es zu einem Standard-Overlay auf dem Player.
    • Veröffentlichen Sie das PlayerDefaults-Objekt mit Composables für TopControls, CenterControls, BottomControls und ErrorOverlay.
    • Fügen Sie FocusRequester zum Player-Composable und seinen Inhalts-Slots hinzu.
    • Veröffentlichen Sie PlayerPool (common-ktx) und rememberPooledPlayer (ui-compose), um das Vorabladen von MediaItems in UI-Umgebungen mit Schiebefenstern zu unterstützen. Präsentiere diese Funktion in demo-compose mit einem neuen ShortFormPlayerScreen.
    • Fehler bei der Unterdrückung von Shutter in PlayerView und Compose PresentationState behoben, der zu Abstürzen auf Zeitachsen führte, die keine Suche nach Perioden-UIDs unterstützen (#3264).
  • Downloads:
    • HLS-Variablen in der Medien-Playlist werden aufgelöst, wenn sie für den Download abgerufen werden (#3258).
  • Ktor-Erweiterung:
    • Fügen Sie ein neues media3-datasource-ktor-Erweiterungsmodul hinzu, das einen KtorDataSource bereitstellt, der vom Ktor-HTTP-Stack unterstützt wird.
    • Fehler behoben, bei dem KtorDataSource beim Öffnen einer Verbindung den gesamten HTTP-Antworttext in den Arbeitsspeicher geladen hat (#3305).
  • HLS-Erweiterung:
    • Unterstützung für HLS Content Steering und Pathway Cloning hinzugefügt (#1689).
    • Fügen Sie setWithAssetListReset zu HlsInterstitialsAdsLoader hinzu, damit Apps vollständig verarbeitete Asset-Listen-Interstitials wieder in einen nicht verfügbaren Zustand zurücksetzen können, um sie bei Bedarf neu aufzulösen.
    • Das Attribut SCORE von EXT-X-STREAM-INF und EXT-X-I-FRAME-STREAM-INF parsen und in Format.selectionPriority einfügen (#3236).
    • Fehler behoben, bei dem geplante Aktualisierungen von HLS-Playlists fortgesetzt wurden, auch wenn die Playlist nicht mehr primär oder aktiv war (#3254).
    • Die Berechnung des Offsets für die Fortsetzung des Inhalts beim Auflösen von Asset-Listen für Interstitials wurde korrigiert (#3322).
    • Unerwartete Zeitstempel-Diskontinuität bei der Audiowiedergabe behoben, wenn die Live-Wiedergabe mit niedriger Latenz nach einem Fehler bei der Playlist-Anfrage fortgesetzt wird (#3311).
    • Fehler in HlsMediaPeriod.getStreamKeys() behoben, bei dem der ID3-Track in Audiowiedergaben als Untertitel betrachtet wird (#3333).
  • DASH-Erweiterung:
    • CEA-Untertitel werden je nach Sprache in verschiedene TrackGroups aufgeteilt (#3113).
    • Unterstützung für das Parsen mehrerer Location-Elemente aus dem Manifest (MPD) und für das Ausführen eines Fallbacks für den Standort in DashMediaSource, wenn das Laden des Manifests fehlschlägt, hinzugefügt.
    • Absturz (IndexOutOfBoundsException) beim Öffnen von Manifesten mit einem leeren <SegmentTimeline/>-Element behoben (#3326).
  • RTSP-Erweiterung:
    • Behebung vorübergehender Wiedergabestopps oder -fehler während der Vorbereitung der RTSP-Wiedergabe, die durch UDP-Portbindungsfehler verursacht wurden.
  • Cast-Erweiterung:
    • Neue CastParams-Klasse hinzugefügt, um die Konfiguration von Cast durch Aufrufen von Cast.initialize(CastParams) zu ermöglichen.
    • Neue Option CastParams.getShowSystemOutputSwitcherOnCastIconClick() hinzugefügt, die die Verwendung des SystemUI-Ausgabewählers anstelle der In-App-Auswahl für Cast-Geräte auslöst, sofern verfügbar.
    • MediaRouteButtonState und rememberMediaRouteButtonState wurden hinzugefügt, um die Sichtbarkeit der Medienroutenauswahl zu beobachten, und der Parameter state wurde zu MediaRouteButton hinzugefügt (#3172).
    • Ein Fehler wurde behoben, durch den RemoteCastPlayer nach einer Trackauswahl dauerhaft im Track-Maskierungsstatus hängen bleiben konnte, was dazu führte, dass nachfolgende Track-Updates vom Cast-Empfänger ignoriert wurden (#3237).
    • Fehler behoben, bei dem DefaultMediaItemConverter eine NullPointerException auslöst, wenn versucht wird, einer Übertragungssitzung beizutreten, die von einem Nicht-Media3-Sender gestartet wurde.
    • Verhindern, dass CastPlayer beim Ändern des aktiven Players MediaItems überträgt, die nicht abspielbar sind (#3199).
    • Fehler behoben, bei dem nicht konfigurierte Livestreams (liveConfiguration == UNSET) als STREAM_TYPE_BUFFERED in die Warteschlange gestellt wurden (#3318).
  • Test-Dienstprogramme:
    • Erweitern Sie DataSourceContractTest, um Unterstützung für POST-Anfragen mit Headern und Texten hinzuzufügen. Fügen Sie HttpDataSourceTestEnv einige POST-Ressourcen hinzu und fügen Sie in WebServerDispatcher Assertions für die erwartete HTTP-Methode, Header und den Text hinzu.
    • Assertions in DataSourceContractTest für von DataSource.open() zurückgegebene Längen verschärfen. Ressourcen, die zu C.LENGTH_UNSET führen können, sollten dies mit TestResource.Builder.setMayResolveToUnknownLength(boolean) angeben.
    • Fügen Sie setPlaybackLooper zu TestExoPlayerBuilder hinzu.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • androidx.media3.exoplayer.MetadataRetriever entfernen. Verwenden Sie stattdessen androidx.media3.inspector.MetadataRetriever.
    • androidx.media3.exoplayer.MediaExtractorCompat entfernen. Verwenden Sie stattdessen androidx.media3.inspector.MediaExtractorCompat.
    • Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA entfernen. Verwenden Sie stattdessen HeifExtractor, um Metadaten von Fotos mit Bewegtbild aus HEIC-Dateien zu extrahieren.
    • androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata entfernen. Verwenden Sie stattdessen androidx.media3.extractor.metadata.MotionPhotoMetadata.
    • androidx.media3.extractor.DummyTrackOutput entfernen. Verwenden Sie stattdessen androidx.media3.extractor.DiscardingTrackOutput.
    • androidx.media3.extractor.DummyExtractorOutput entfernen. Verwenden Sie stattdessen androidx.media3.extractor.NoOpExtractorOutput.
    • androidx.media3.common.C.generateAudioSessionIdV21 entfernen. Verwenden Sie stattdessen androidx.media3.common.util.Util.generateAudioSessionId.
  • Build
    • Die Anleitung für README.md zur lokalen Abhängigkeit von Media3 wurde aktualisiert, um Gradle Composite Builds (includeBuild) zu verwenden. Das Script core_settings.gradle wurde entfernt und die Properties androidxMediaModulePrefix und androidxMediaEnableMidiModule werden nicht mehr verwendet.

1.11.0-rc01

Verwenden Sie die stabile Version 1.11.0.

1.11.0-beta01

7. Juli 2026

Verwenden Sie die stabile Version 1.11.0.

1.11.0-alpha01

24. Juni 2026

Verwenden Sie die stabile Version 1.11.0.

Version 1.10.0

1.10.1

12. Mai 2026

  • Gemeinsame Bibliothek:
    • Fehler bei der Verarbeitung von onAudioSessionIdChanged in SimpleBasePlayer und ForwardingSimpleBasePlayer behoben.
  • ExoPlayer:
    • Race-Bedingung im Zusammenhang mit der Generierung der Audiositzungs-ID behoben, die im Tunnelmodus zu einem IllegalStateException führen konnte. (#3099).
    • Mögliche App-Abstürze bei der Wiederherstellung nach Decoderfehlern mit Renderer-Vorwärmung wurden behoben.
    • Es wurde ein Problem behoben, bei dem Videoartefakte durch die Bereitstellung von Initialisierungsdaten bei Verwendung eines AV1-basierten Dolby Vision-Codecs verursacht wurden (#3153).
  • Trackauswahl:
    • Die Logik für die Titelauswahl in VideoTrackInfo wurde angepasst, um Fallback-MIME-Typen aufzulösen und die Einstellungen für HDR- und Codec-Bewertungen in die Qualitätseinstellungen zu verschieben (#3135).
  • Extraktoren:
    • MP3: Xing-Datenlänge wird ignoriert, wenn sie länger als die bekannte Streamlänge ist (#3117).
    • Fehler ArrayIndexOutOfBoundsException in Mp4Extractor behoben, wenn FLAG_OMIT_TRACK_SAMPLE_TABLE festgelegt ist und der Track keine Sync-Sample-Box (stss) hat.
  • Audio:
    • Fehler behoben, bei dem Audioereignisse möglicherweise falsch weitergeleitet werden, wenn dem Player mehrere Audiorenderer hinzugefügt werden.
  • Video:
    • Logik für die Wiederverwendung von Codecs bei Änderungen der Framerate in APIs unter 30 angepasst, um Codec-Zurücksetzungen zu vermeiden, wenn sie nicht vorteilhaft sind (#3120).
    • Deaktivierung des Workarounds für die erzwungene Synchronisierung in queueSecureInputBuffer für API 31+. Der Workaround war ein künstlicher Engpass, der die Entschlüsselung seriell erzwang, um fehlerhafte Videos aufgrund eines Framework-Problems vor API 31 zu verhindern.
  • Bild:
    • Problem im Scrubbing-Modus behoben, bei dem Bildaktualisierungen nur wirksam wurden, wenn der Nutzer das Scrubbing beendete (#2815).
  • Sitzung:
    • Fehler behoben, bei dem ForegroundServiceStartNotAllowedException nicht über Threadgrenzen hinweg weitergegeben wurde, wenn der Anwendungsthread nicht der Hauptthread ist (#2499).
    • Es wurde ein Fehler behoben, durch den COMMAND_SEEK_TO_MEDIA_ITEM in einer MediaController nicht verfügbar war, wenn eine Verbindung zu einer reinen Plattformsitzung hergestellt wurde, die das Suchen nach anderen Elementen, aber keine Änderungen an der Playlist unterstützt.
    • Ein Problem wurde behoben, bei dem MediaController keine Mediendateien in Plattform-Mediensitzungen festlegen konnte, die keine PREPARE_FROM-Aktionen zulassen.
    • Fehler behoben, bei dem der eigene Prozess bei API 27 oder niedriger nicht mit Controller.isTrusted() gekennzeichnet wurde, wenn die Verbindung über Plattform-Controller hergestellt wurde.
  • HLS-Erweiterung:
    • Es wurde ein Fehler behoben, durch den während des Stream-Fallbacks ein ArrayIndexOutOfBoundsException ausgelöst wird, wenn die Trackauswahl eine Teilmenge der verfügbaren Tracks ist (#3161).
    • Es wurde ein Problem behoben, bei dem das Initialisierungssegment nicht über Medien-Playlist-Updates hinweg übertragen wurde, wenn das #EXT-X-MAP-Tag in nachfolgenden Updates nicht wiederholt wurde (#3105).
  • DASH-Erweiterung:
    • Absturz in SampleQueue beim Suchen in einem Chunk, der gerade abgebrochen wird, behoben.

1.10.0

26. März 2026

  • Gemeinsame Bibliothek:
    • Stufen Sie Player.mute() und Player.unmute() von UnstableApi auf „Stabil“ hoch.
    • Stufen Sie Format.pcmEncoding und C.PcmEncoding von UnstableApi auf „Stabil“ hoch.
    • Format.primaryTrackGroupId wurde hinzugefügt, um die primäre Gruppe eingebetteter Format-Instanzen zu identifizieren (#294).
  • ExoPlayer:
    • Füge AdsMediaSource Clipping-Funktionen hinzu.
    • Unterstützung für dynamische Planung in MediaCodecVideoRenderer hinzugefügt, um die Planung von Aufgaben und CPU-Aktivierungszyklen besser darauf abzustimmen, wann Videoframes verarbeitet werden können. Sie können dies mit experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() in DefaultRenderersFactory aktivieren.
    • Ermöglicht das Festlegen eines benutzerdefinierten DataSource.Factory in DefaultPreloadManager.Builder.
    • ExoPlayer kann ohne Robolectric simuliert werden, indem einige Standardkonstanten nach ExoPlayer.Builder verschoben werden. Das Mocking dieser komplexen Schnittstelle wird im Allgemeinen nicht empfohlen – nur wenn die Nutzung minimal/einfach/zufällig ist (#2985).
      • Dazu musste DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS von ExoPlayer zu ExoPlayer.Builder verschoben werden (ohne Einstellung).
    • Ein Fehler wurde behoben, bei dem ProgressiveMediaSource veraltete Zeitachseninformationen an den Player weitergibt und die in die Warteschlange gestellten Zeiträume unerwartet entfernt werden (#3016).
    • Ein Problem wurde behoben, bei dem ExoPlayer keinen verzögerten Audiofokus anforderte, wenn die Wiedergabe während eines Telefonanrufs angefordert wurde.
    • Fehler behoben, bei dem Übergänge von On-Demand- zu Live-Inhalten am Ende der On-Demand-Inhalte zu einer erneuten Zwischenspeicherung führen konnten (#3052).
    • Unterstützung für Dolby Vision Profile 10 hinzugefügt (#2830).
    • Fehler behoben, bei dem eine nicht initialisierte Pre-Roll-Anzeige einen ArrayIndexOutOfBoundsException erzeugte (#3125).
  • CompositionPlayer:
    • Unterstützung für EditedMediaItem.removeVideo hinzugefügt.
  • Transformer:
    • EditedMediaItem.Builder.setFrameRate() kann jetzt eine maximale Ausgabebildrate für Videos festlegen. Das ist besonders hilfreich, wenn die Mediengeschwindigkeit mit setSpeed() erhöht wird.
  • Trackauswahl:
    • Ändern Sie die Signatur von DefaultTrackSelector.selectAllTracks so, dass das Ausgabearray als Parameter enthalten ist, der mit Track-Überschreibungen vorab ausgefüllt ist.
    • Problem behoben, bei dem eingebettete Metadatentracks unabhängig davon ausgewählt wurden, ob der entsprechende primäre Track ausgewählt ist (#294).
    • Stabilisieren Sie die TrackSelectionParameters-Optionen für preferredVideoLanguages, preferredVideoLabels, preferredAudioLabels, preferredTextLabels und selectTextByDefault.
  • Extraktoren:
    • MP4: Unterstützung von Dateien mit großen uuid-Boxen vor anderen Boxen wie moov (#3046).
    • MP4: Unterstützung für VVC-Tracks (Versatile Video Coding) in MP4-Containern hinzugefügt.
  • Prüfer:
    • Funktionsgefährdende Änderung: FrameExtractor entfernen. Nutzer sollten jetzt das neue :media3-inspector-frame-Modul verwenden und Importe in androidx.media3.inspector.frame.FrameExtractor aktualisieren.
    • Ein neues Modul zum Extrahieren und Verarbeiten decodierter Videoframes einführen.
  • Audio:
    • Die zugrunde liegende Decodierungsbibliothek für die IAMF-Decodererweiterung wurde von libiamf in iamf_tools geändert.
    • Die IAMF-Decodierung unterstützt die binaurale Ausgabe entweder über den Decoder (bei Verwendung der IAMF-Decoder-Erweiterung) oder über den Android Spatializer.
    • Die Unterstützung für AC4Profile22 und andere ältere Profile wird jetzt korrekt entfernt, wenn die Unterstützung für AC-4-Decoder in Automotive-Szenarien bewertet wird (#2609).
    • Die Wiederholungslogik der AudioOutput-Initialisierung in DefaultAudioSink wurde verbessert (#2905).
    • Versuch, das Ausgabelayout der Lautsprecher (oder des Spatializers, falls zutreffend) beim Decodieren von IAMF sowohl mit der IAMF-Erweiterung als auch mit Media-Codec-Decodern abzugleichen, unterstützt durch neue Felder und Logik in AudioCapabilities und AudioCapabilitiesReceiver.
    • Fehler behoben, durch den die Wiedergabe hängen blieb, wenn eine Playlist mit lückenlosem Audio im komprimierten Offload-Modus abgespielt wurde.
  • Text:
    • VobSub: Verwende die SPU-Steuerbefehle START und STOP, um die Cue-Dauer abzuleiten, anstatt immer standardmäßig 5 Sekunden zu verwenden (#2935).
  • Metadaten:
    • Die Standardanzahl der Metadaten-Renderer wurde auf vier erhöht, um alle potenziellen Metadaten-Tracks abzudecken, die von HLS-Varianten und ‑Wiedergaben veröffentlicht werden (#3043).
  • Auswirkung:
    • LottieOverlay in ein neues :media3-effect-lottie-Modul verschieben (was auch die Umbenennung von androidx.media3.effect.LottieOverlay in androidx.media3.effect.lottie.LottieOverlay beinhaltete).
  • Lottie-Effekt:
    • Einführung eines neuen :media3-effect-lottie-Moduls, das Funktionen zum Anwenden von Lottie-Effekten auf Videoframes bietet.
  • IMA-Erweiterung:
    • Aktualisieren Sie die IMA SDK-Version auf 3.39.0, um Zugriff auf die neueste Ad Media Info API zu erhalten.
    • Ein Fehler wurde behoben, bei dem der MIME-Typ der Anzeige nicht mit dem im IMA-Ereignis LOADED angegebenen MIME-Typ übereinstimmte. Mit der Korrektur wird der MIME-Typ der Anzeige jetzt anhand der von IMA bereitgestellten Anzeigenmedieninformationen zugeordnet.
    • Fügen Sie setEnableCustomTabs zu ImaAdsLoader und ImaServerSideAdInsertionMediaSource hinzu, damit Nutzer festlegen können, ob Klick-URLs für Anzeigen über benutzerdefinierte Tabs gestartet werden.
    • Fügen Sie ImaAdTagUriBuilder hinzu, eine Klasse, die eine alternative Möglichkeit zum Erstellen eines adTagUri bietet. Es enthält die setPreferredLinearOrientation API. Dies ist eine API im Alphatest, mit der Sie die bevorzugte Ausrichtung für lineare Anzeigen festlegen können. Wenn Sie der Alphatestgruppe beitreten möchten, wenden Sie sich an Ihren Account-Partner.
  • Sitzung:
    • Ein Fehler wurde behoben, bei dem große Arrays in MediaMetadata.artworkData die App zum Absturz bringen können.
    • Verwenden Sie den Typ „int“ für das Argument @Player.Command in der Schnittstelle ActionFactory (#2933).
    • MediaSessionService und MediaLibraryService zu einem LifecycleService machen, damit lebenszyklusabhängige Vorgänge an den Lebenszyklus des Dienstes angehängt werden können (#187).
    • Befehle zum Ändern der Gerätelautstärke von MediaController und MediaBrowser für die lokale Wiedergabe werden nicht mehr unterstützt. Apps sollten die Lautstärke des lokalen Geräts nicht ändern. Falls erforderlich, können sie dafür AudioManager-APIs verwenden.
    • Erkennt veraltete Intent-Instanzen, die den Dienst als Dienst im Vordergrund gestartet haben. Dadurch wird verhindert, dass das System einen ForegroundServiceDidNotStartInTimeException auslöst. Dies ist eine funktionsgefährdende Änderung an einer instabilen API für Apps, die eine benutzerdefinierte MediaNotification.Provider implementieren, da eine neue erforderliche Methode vorhanden ist.
    • Builder für PendingIntent-Instanzen zur Verwendung mit Startbildschirm-Widgets hinzugefügt (#2933).
    • Statische Methoden zum Erstellen von Intent-Instanzen für Compose-basierte Startbildschirm-Widgets hinzugefügt (#2933).
    • Es wurde ein Fehler behoben, bei dem der Übergang zwischen Mediendateien nicht an Controller gemeldet wurde, wenn die Wiedergabe von einem bestimmten Mediendateiindex zu einem anderen mit derselben Mediendatei wechselte, weil die Wiedergabe unterbrochen wurde („AUTO“ und „SEEK“) (#2997).
    • Es wurde ein Problem behoben, bei dem sich die Problemumgehung für die Platzierung von System-UI-Buttons negativ auf andere UI-Oberflächen wie Android Auto oder Hersteller auswirkte, die die Problemumgehung nicht benötigten (#3041).
    • Problem behoben, bei dem der Zugriff auf Abos nicht synchronisiert wurde (#3056).
    • Problemumgehung für einen System‑UI-Fehler in API 29, bei dem Medien-Session-Artwork in einer bestimmten Größe die System‑UI zum Absturz bringen und einen Neustart des Geräts erzwingen kann (#3118).
    • Skalierung des Artwork-Symbols für Benachrichtigungen unter Android Q korrigiert (#3084).
  • UI:
    • Fügen Sie PlaybackSpeedControl-Composable zu media3-ui-compose hinzu, um die Wiedergabegeschwindigkeit anzuzeigen und zu ändern.
    • Fügen Sie media3-ui-compose-material3 das Composable PlaybackSpeedToggleButton hinzu, um die Wiedergabegeschwindigkeit zu steuern.
    • ProgressSlider Composable zu media3-ui-compose-material3 hinzugefügt, um den Spielerfortschritt anzuzeigen und Suchvorgänge durch Ziehen und Tippen auszuführen (#2288).
    • Großer Offscreen-Zwischenspeicher beim Animieren von PlayerControlView wird vermieden.
    • Fügen Sie media3-ui-compose-material3 das Compose-Element Player hinzu, das ein ContentFrame mit anpassbaren Steuerelementen kombiniert, die oben, in der Mitte und unten ausgerichtet sind.
    • Wiedergabeposition vor dem Bedienungshilfendienst verbergen, um eine kontinuierliche Aktualisierung der Ansage zu verhindern, wenn PlayerControlView sichtbar ist.
  • HLS-Erweiterung:
    • Unterstützung von X-PLAYOUT-LIMIT mit HLS-Interstitials (#2484).
    • Unterstützung des Attributs QUERYPARAM mit #EXT-X-DEFINE (#1854).
    • Optimierung des Parsings von HLS-Playlists durch Caching von regulären Ausdrucksabgleichen (#3008).
    • ID3-Metadatentrack (EMSG) in Audio-Renditions verfügbar machen (#3043).
    • Standort-Fallback bei Ladefehlern zulassen, wenn redundante Streams von verschiedenen Standorten verfügbar sind (#1988).
    • X-SNAP-Verhalten für HLS-Interstitials korrigiert, um die Start- und Fortsetzungsposition korrekt zu berechnen (#3013).
  • DASH-Erweiterung:
    • Problem behoben, bei dem Tracks mit nicht ausgerichteten Segmentstartzeiten zu Verzögerungen oder fehlenden Samples zu Beginn der Wiedergabe führten (#3057).
    • Fehler behoben, bei dem Zeitstempel von Inband-EMSG-v0-Metadaten nicht richtig festgelegt wurden (#3024).
  • RTSP-Erweiterung:
    • Es wurde eine Regression beim H.264- und H.265-Streaming behoben, bei der Samples derselben Zugriffseinheit, die sich über mehrere RTP-Pakete erstreckten, fälschlicherweise geparst wurden. Dies führte zu visuellen Artefakten und Fehlern im Video (#3121).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Unterstützung für den MPEG-H-UI-Manager zur MPEG-H-Decoder-Erweiterung hinzugefügt (#3066).
  • Cast-Erweiterung:
    • Füge die Methode RemoteCastPlayer.Builder#setTrackSelector hinzu, mit der die Titelauswahl für die Cast-Wiedergabe implementiert werden kann.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • ExperimentalFrameExtractor entfernen. Verwenden Sie stattdessen androidx.media3.inspector.frame.FrameExtractor.
    • ChannelMixingMatrix.create() entfernen. Verwenden Sie stattdessen ChannelMixingMatrix.createForConstantGain().
    • androidx.media3.extractor.metadata.flac.VorbisComment entfernen. Verwenden Sie stattdessen androidx.media3.extractor.metadata.vorbis.VorbisComment.
    • MediaSource.prepareSource(MediaSourceCaller, TransferListener) entfernen. Verwenden Sie stattdessen MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId).

1.10.0-rc03

25. März 2026

Verwenden Sie die stabile Version 1.10.0.

1.10.0-rc02

16. März 2026

Verwenden Sie die stabile Version 1.10.0.

1.10.0-rc01

10. März 2026

Verwenden Sie die stabile Version 1.10.0.

1.10.0-beta01

25. Februar 2026

Verwenden Sie die stabile Version 1.10.0.

1.10.0-alpha01

6. Februar 2026

Verwenden Sie die stabile Version 1.10.0.

Version 1.9.0

1.9.4

16. Mai 2026

Version 1.9.4 enthält die folgenden Commits.

  • Auswirkung:
    • Legen Sie GL_DRAW_BUFFER und GL_READ_BUFFER explizit fest, wenn Sie von einem oberflächenlosen Kontext wechseln.

1.9.3

16. März 2026

Version 1.9.3 enthält die folgenden Commits.

  • Audio:
    • Fehler behoben, durch den die Wiedergabe hängen blieb, wenn eine Playlist mit lückenlosem Audio im komprimierten Offload-Modus abgespielt wurde.

1.9.2

6. Februar 2026

Version 1.9.2 enthält die folgenden Commits.

  • ExoPlayer:
    • Fehler behoben, bei dem ProgressiveMediaSource veraltete Zeitachseninformationen an den Player weitergibt und die in der Warteschlange befindlichen Zeiträume unerwartet entfernt werden (#3016).
  • Sitzung:
    • Es wurde ein Problem behoben, bei dem sich die Problemumgehung für die Platzierung von System-UI-Buttons negativ auf andere UI-Oberflächen wie Android Auto oder Hersteller auswirkte, die die Problemumgehung nicht benötigten (#3041).
  • Cast-Erweiterung:
    • Fehler behoben, durch den die Übertragung von Cast zur lokalen Wiedergabe nicht funktionierte.

1.9.1

26. Januar 2026

Version 1.9.1 enthält diese Commits.

  • Common Library:
    • Unterstützung von Datums-/Uhrzeit-Strings mit nur Stunden im Zeitzonen-Offset (#2929).
  • ExoPlayer:
    • Lassen Sie die dynamische Planung das doSomeWork-Intervall erst nach dem Start des Audios verlangsamen, um eine reibungslosere A/V-Synchronisierung zu Beginn der Wiedergabe zu ermöglichen.
    • Fehler in DefaultLoadErrorHandlingPolicy behoben, bei dem FileNotFoundException und ähnliche Ausnahmetypen mehrmals wiederholt wurden.
    • Fehler bei der dynamischen Planung behoben, bei dem die berechnete Zeit für die nächste doSomeWork fälschlicherweise um die verstrichene Zeit der aktuellen Iteration von doSomeWork reduziert wurde. Wenn dieses Problem behoben wird, verlängert sich hoffentlich die CPU-Inaktivitätszeit und es wird Strom gespart.
    • Problem behoben, bei dem die Wiedergabe von Dolby Vision-Dateien fehlschlägt, wenn versucht wird, einen Fallback-AVC- oder HEVC-Codec zu verwenden.
    • Fehler behoben, bei dem das Laden nach dem Ende der Wiedergabe fortgesetzt wurde, wenn das aktuell wiedergegebene Element aus einer Playlist entfernt wurde (#2873).
    • Vermeiden Sie das Leaken von MediaItem-Instanzen, wenn Sie ExoPlayer.replaceMediaItem wiederholt für dasselbe Element verwenden (#2993).
    • Potenzielle ANR-Fehler, die durch die Freigabe von Notfall-Wakelocks verursacht werden, werden verhindert (#2979).
  • Extraktoren:
    • MP3: LAME ReplayGain-Daten parsen (#2840).
  • Audio:
    • Die Unterstützung für AC4Profile22 und andere ältere Profile wird jetzt korrekt entfernt, wenn die Unterstützung für AC-4-Decoder in Automotive-Szenarien bewertet wird (#2609).
  • Video:
    • Videocodecs auf Geräten mit einer API-Version unter 30 werden verworfen, wenn sich die Framerate des Inhalts ändert, um eine ruckelnde Wiedergabe zu vermeiden (#2941).
  • Text:
    • VobSub: Einige fehlende Untertitel wurden korrigiert, indem SPUs, die entweder nur eine einzelne Steuersequenz enthalten oder wichtige Informationen auf mehrere Steuersequenzen aufteilen, korrekt verarbeitet werden (#2935).
  • IMA-Erweiterung:
    • Fehlerkorrektur: Es wurde ein Problem behoben, bei dem der MIME-Typ der Anzeige nicht mit dem im IMA-LOADED-Ereignis angegebenen MIME-Typ übereinstimmte. Mit der Korrektur wird der MIME-Typ der Anzeige jetzt mithilfe des Anzeigen-Pod-Index und der Anzeigenposition zugeordnet.
    • Fügen Sie eine Null-Prüfung hinzu, bevor Sie auf das Ergebnis von getAdsManager() und AdEvent.getAd() zugreifen.
  • Sitzung:
    • Fehler behoben, bei dem das Beenden einer MediaController, die mit einer Plattformsitzung verbunden war, zum Absturz der App führte, wenn das Beenden während der Anzeigenwiedergabe erfolgte (#2948).
    • Fügen Sie zusätzliche Prüfungen für extras-Bundle-Instanzen in verschiedenen Klassen hinzu, um sich vor fehlerhaften Bundle-Instanzen zu schützen, die von anderen Prozessen gesendet werden.
    • Problem behoben, bei dem fehlende Befehle für COMMAND_SEEK_NEXT oder COMMAND_SEEK_BACK zu Lücken in der Systemmedienbenachrichtigung führen konnten (#2976).
    • Bitmap-Skalierung für Benachrichtigungssymbol aus dem Hauptthread verschoben (#2829).
    • Fehler behoben, bei dem „author“, „writer“ und „composer“ nicht als Fallback verwendet wurden, wenn von den alten MediaMetadataCompat und MediaDescriptionCompat konvertiert wurde (#3018).
  • Downloads:
    • Behebung potenzieller Endlosschleifen, wenn ein PriorityTooLowException von SegmentDownloader verarbeitet wird (für DASH, HLS und SmoothStreaming). Benutzerdefinierte Überschreibungen von SegmentDownloader mit der geschützten Methode execute müssen ihre Aufgabe in einem Supplier bereitstellen, damit sie neu erstellt werden kann (#2931).
  • HLS-Erweiterung:
    • Übergeben Sie das JSON-Dokument mit der Roh-Asset-Liste an den Listener.onAssetListLoadCompleted-Callback. Dies ist eine funktionsgefährdende Änderung in einer instabilen API, die erfordert, dass Apps, die diesen Callback implementieren, ein zusätzliches Argument vom Typ JSONObject hinzufügen (#2950).
  • RTSP-Erweiterung:
    • RTP-Pakete mit Zeitstempeln, die sich wiederholen, werden korrekt verarbeitet (#2930).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Behebung potenzieller NullPointerException, die auftreten können, wenn vor der Verarbeitung des ersten Videoframes gesucht wird (#2965).
  • Cast-Erweiterung:
    • Fehler behoben, der verhinderte, dass die RemoteCastPlayer-Zeitachse beim Ersetzen der Playlist korrekt aktualisiert wurde.

1.9.0

17. Dezember 2025

  • Common Library:
    • minSdk wurde auf 23 aktualisiert, um es an andere AndroidX-Bibliotheken anzupassen.
    • Fügen Sie PlayerTransferState hinzu, um den Wiedergabestatus zwischen Player-Instanzen zu übertragen.
    • Füge dem Player die Methoden void mute() und void unmute() hinzu, die die Lautstärke des Players vor und nach dem Festlegen auf null beibehalten und anschließend wiederherstellen.
    • Veröffentlichung der Dienstprogrammklassen WakeLockManager, WifiLockManager, AudioFocusManager, AudioBecomingNoisyManager und StuckPlayerDetector, die zuvor intern von ExoPlayer verwendet wurden, um die Wiederverwendung für andere Player zu ermöglichen (#1893).
    • Fehler bei der Verarbeitung von ForwardingPlayer-Listenern behoben, wenn der zugrunde liegende Delegat-Player die Referenzgleichheit zum Vergleichen von Listener-Instanzen verwendet (#2675).
    • Füge in der media3-common-ktx-Bibliothek eine Player.listenTo-Erweiterungsfunktion zum Aussetzen hinzu, die die jeweilige Player.Events angibt, auf die reagiert werden soll.
    • Ein Absturz in BasePlayer.getBufferedPercentage, der durch einen Ganzzahlüberlauf verursacht wurde, wenn die gemeldete gepufferte Position unplausibel viel größer als die gemeldete Dauer war, wurde behoben (#2750).
    • Die automatische Erkennung des TrackGroup-Tracktyps wurde korrigiert, indem der benutzerdefinierte Beispiel-MIME-Typ nicht ignoriert und nicht auf den potenziell falschen Tracktyp aus dem Container-MIME-Typ zurückgegriffen wird (#2860).
  • ExoPlayer:
    • Füge eine Erkennung für hängende Player hinzu, die einen StuckPlayerException-Player-Fehler auslöst, wenn der Player hängen bleibt. Dies geschieht in den folgenden Fällen, wobei jedes Standardzeitlimit bei Bedarf in ExoPlayer.Builder konfiguriert werden kann:
      • Nach 10 Minuten STATE_BUFFERING beim Versuch, die Wiedergabe zu starten, und keinem Fortschritt beim Zwischenspeichern.
      • Nach 10 Sekunden STATE_READY beim Versuch, die Wiedergabe zu starten, und kein Wiedergabefortschritt.
      • Nach 1 Minute STATE_READY über die deklarierte Dauer hinaus, ohne das Ende des Elements zu erreichen.
      • Nach 10 Minuten mit einem Grund für die Wiedergabeunterdrückung während des Wiedergabeversuchs.
    • Aktiviere standardmäßig die Verarbeitung von Wake-Locks, um Probleme mit der Zwischenspeicherung während der Hintergrundwiedergabe zu beheben. Dies entspricht dem Festlegen von ExoPlayer.Builder.setWakeMode auf C.WAKE_MODE_LOCAL.
    • Fügen Sie eine Logik hinzu, um die ID des virtuellen Geräts automatisch zu aktualisieren, wenn eine Änderung an der Context gemeldet wird, die ursprünglich an ExoPlayer.Builder übergeben wurde.
    • Fügen Sie ExoPlayer.setVirtualDeviceId hinzu, um die ID des virtuellen Geräts, die Sie von Context erhalten haben, manuell zu aktualisieren. Diese ID wird an ExoPlayer.Builder übergeben.
    • Achte darauf, dass Renderer nicht mehr als 10 Sekunden vor dem Ende des aktuellen Elements Daten aus dem nächsten Playlist-Element abrufen.
    • Fügen Sie setSeekBackIncrementMs, setSeekForwardIncrementMs und setMaxSeekToPreviousPositionMs zu ExoPlayer hinzu, um diese Einstellungen nach der Erstellung zu aktualisieren (#2736).
    • Fügen Sie in DefaultPreloadManager eine Pre-Caching-Funktion hinzu. Apps können jetzt DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) oder DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs) über TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData) zurückgeben, um anzugeben, dass ein Medienelement vorab im Cache gespeichert werden muss.
    • Pre-Caching-Funktion von DefaultPreloadManager in der Demo-App für Kurzvideos verwenden.
    • DefaultLoadControl.Builder-Setter für die lokale Wiedergabe hinzugefügt und Standardwerte von DefaultLoadControl angepasst, damit sie mit einer Vielzahl lokaler Dateien funktionieren.
    • Fehler behoben, bei dem der Player in STATE_READY oder STATE_BUFFERING verbleiben konnte, wenn eine leere Playlist festgelegt wurde.
    • Verbesserung der Preload Manager APIs:
      • Fügen Sie addMediaItems(List<MediaItem>, List<T>) und addMediaSources(List<MediaSource>, List<T>) hinzu, um die Mediendateien oder Medienquellen im Batch hinzuzufügen und anschließend automatisch invalidate() aufzurufen.
      • Füge removeMediaItems((List<MediaItem>) und removeMediaSources(List<MediaSource>) hinzu, um die Mediendateien oder Medienquellen im Batch zu entfernen. Achte darauf, dass der Preload-Manager nach dem Entfernen nicht mit dem Vorabladen beginnt oder das Vorabladen fortsetzt.
      • Lassen Sie zu, dass DefaultPreloadManager.setCurrentPlayingIndex(int) sich automatisch entwertet. Apps müssen invalidate() nicht mehr explizit aufrufen, nachdem der aktuelle Wiedergabeindex aktualisiert wurde.
    • Es wurde die Möglichkeit hinzugefügt, das Zurücksetzen von Keyframes für das Vorwärtsspringen innerhalb derselben Bildgruppe im Scrubbing-Modus zu überspringen.
    • Füge DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) hinzu, damit Apps einen Wert für die Zielpuffer-Bytes für einen Player mit der angegebenen playerName festlegen können. Der DefaultLoadControl kann jetzt Entscheidungen für jeden Player separat treffen, basierend auf den zugewiesenen Byte und den Zielpuffer-Byte.
    • Fügen Sie der AdPlaybackState.AdGroup SkipInfo hinzu, um Informationen zum Überspringen für jede Anzeige in der Anzeigengruppe zu übertragen.
    • Fehler behoben, bei dem der Aufruf von removeMediaItems(List) während der Wiedergabe einer Post-Roll-Anzeige zu einem Absturz führte (#2746).
    • Einige Ruckler bei der Wiedergabe von Playlists wurden behoben, bei denen Frames fälschlicherweise immer als letztes Sample festgelegt und gerendert wurden.
    • Wiederholungspfad aktivieren, wenn der Player keine Audiositzungs-ID generieren kann (#2382, #2678).
    • Unterstützung für die Steuerung der gesamten Pufferbytes für die Quellen in DefaultPreloadManager hinzugefügt, um zu verhindern, dass die gesamten Pufferbytes für das Vorabladen beliebig anwachsen. Wenn die Standardsteuerungslogik verwendet werden soll, können Apps die Zielpufferbytes für das Vorabladen über DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) für einen playerName von PlayerId.Preload.name („preload“) festlegen und die erstellte DefaultLoadControl über DefaultPreloadManager.Builder.setLoadControl(LoadControl) einfügen.
    • cloneAndSet(int, int) wurde mit einer Standardimplementierung zu ShuffleOrder hinzugefügt (#2834).
    • Inhaltsfortsetzungs-Offset wird angehängt, wenn die Anzeigenwiedergabe nach einer Anpassung der Suchposition oder einem automatischen Übergang übersprungen wird (#2484).
    • API zum Festlegen und Beobachten von Codec-Parametern für Audio- und Videotracks hinzugefügt. Diese Funktion ist für MediaCodec-basierte Renderer implementiert und erfordert API 29 oder höher.
      • Verwenden Sie ExoPlayer.setAudioCodecParameters() und ExoPlayer.setVideoCodecParameters(), um Parameter anzuwenden.
      • Verwenden Sie ExoPlayer.addAudioCodecParametersChangeListener() und ExoPlayer.addVideoCodecParametersChangeListener(), um auf Änderungen zu reagieren. Für die Beobachtung herstellerspezifischer Schlüssel ist API 31 oder höher erforderlich.
    • IllegalStateException wurde behoben, der durch das Festlegen einer leeren Medienquelle nach dem Springen zu einer Position ungleich null und dem anschließenden Vorbereiten des Players mit einer nicht leeren Medienquelle verursacht wurde.
    • Fehler behoben, bei dem das Springen zu anderen Mediendateien im Scrubbing-Modus zu IllegalStateException führen konnte.
    • Potenzieller NullPointerException in DefaultPlaybackSessionManager wurde behoben (#2885).
    • Verbesserungen bei der Suchleistung für geeignete Videos aktivieren.
    • Die Verwendung der asynchronen Entschlüsselung in MediaCodec wurde für API 36 und höher wieder aktiviert, da die Zeitüberschreitungsprobleme mit dieser Plattform-API behoben wurden (#1641).
    • Ändern Sie den Standardwert von MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs in 15 ms und aktivieren Sie das effizientere Verwerfen von Videoframes vor dem Decodieren für infrage kommende Videos.
    • Fügen Sie der automatischen Speicherberechnung in DefaultLoadControl ein maximales Speicherlimit hinzu. Dies sollte nur wirksam werden, wenn eine übermäßige Anzahl von Tracks ausgewählt wird (#2860).
    • Fehler behoben, bei dem die Wiedergabe bei der Wiedergabe in einer Playlist oder im Wiederholungsmodus beim Suchen im Scrub-Modus kurz vor dem Ende zum nächsten Medienelement springen konnte.
  • CompositionPlayer:
    • Veröffentlichen Sie CompositionPlayer unter einer neuen @ExperimentalApi-Annotation, um anzugeben, dass es zum Testen verfügbar ist, sich aber noch in der Entwicklung befindet. Einige APIs werden sich in zukünftigen Versionen wahrscheinlich erheblich ändern. Außerdem gibt es bekannte Probleme und Einschränkungen bei einigen Anwendungsfällen (einige davon sind nicht dokumentiert).
    • Unterstützung für COMMAND_SET_AUDIO_ATTRIBUTES und Audiofokus-Verarbeitung in CompositionPlayer hinzugefügt.
    • Unterstützung für Geschwindigkeitsänderungen in sekundären Sequenzen in CompositionPlayer hinzugefügt.
    • Unterstützung für EditedMediaItem.removeVideo hinzugefügt.
  • Transformer:
    • InAppMp4Muxer als Standard-Muxer verwenden.
    • Fügen Sie EditedMediaItem.Builder#setSpeed() hinzu und stellen Sie Effects#createExperimentalSpeedChangingEffects() ein.
    • Ersetzen Sie forceAudioTrack und forceVideoTrack durch trackTypes in EditedMediaItemSequence.
  • Titelauswahl:
    • Füge TrackSelectionParameters.selectTextByDefault hinzu, um die Auswahl eines beliebigen Texttracks zu bevorzugen, ohne andere spezifischere Einstellungen anzugeben.
    • preferredVideoLabels, preferredAudioLabels und preferredTextLabels wurden in TrackSelectionParameters hinzugefügt, um eine Präferenz für Tracks mit einem bestimmten Label anzugeben, z. B. solche, die aus HLS-NAME-Tags gelesen werden (#1666).
  • Extraktoren:
    • FLAC: Die Header-Erkennung wurde verschärft, um die Wahrscheinlichkeit zu verringern, dass in den codierten FLAC-Daten fehlerhafte Header gefunden werden, was zu Decodierungsfehlern führt (#558).
    • MP3: Lücken zwischen (und vor) ID3-Tags am Anfang von MP3-Dateien zulassen (#811, #5718).
    • MP3: Das Sniffing-Limit wurde auf 128 kB erhöht, um dem vorhandenen Suchlimit für ein Synchronisierungsbyte zu entsprechen (#2713).
    • MP3: FLAG_ENABLE_INDEX_SEEKING wurde so geändert, dass Suchinformationen bevorzugt aus Metadaten-Headern (wie Xing und VBRI) abgerufen werden, sofern verfügbar. Wenn keine anderen Suchinformationen vorhanden sind, wird auf die indexbasierte Suche zurückgegriffen. Dies verbessert die Leistung für Dateien mit Suchmetadaten (#2839).
    • MP3: Mp3Extractor wird so geändert, dass standardmäßig eine konstante Bitrate (CBR) angenommen wird, wenn keine Suchmetadaten (z.B. Xing, VBRI) gefunden werden, auch wenn FLAG_ENABLE_INDEX_SEEKING festgelegt ist. Dies basiert auf der Historie der MP3-Spezifikation, in der CBR Standard war und VBR explizite Header erfordert. Dies verbessert die sofortige Suchbarkeit von Dateien ohne Metadaten, kann jedoch die Genauigkeit von VBR-Dateien ohne Header beeinträchtigen. Die Indexsuche wird jetzt als Fallback verwendet, wenn die CBR-Annahme nicht suchbar ist (z.B. bei Streams unbekannter Länge) (#2848).
    • MP4: Unterscheidung zwischen den MIME-Typen audio/mpeg (MP3), audio/mpeg-L1 und audio/mpeg-L2 durch Prüfen des Layer-Werts des ersten Samples, bevor ein Track-Format vom Extractor ausgegeben wird (#2683).
    • MP4: Die Effizienz des Sniffings sehr großer Dateien wurde verbessert, indem davon ausgegangen wird, dass eine stbl-Box, die größer als 1 MB ist, bedeutet, dass die Datei nicht fragmentiert sein darf (#2650).
    • MP4: Unterstützung für die Metadaten ©mvn (Bewegungsname) und ©mvi (Bewegungsindex) hinzugefügt. Diese werden jetzt als TextInformationFrame-Objekte in Format.metadata mit den IDs MVNM bzw. MVIN ausgegeben (#2754).
    • MP4: Tracks mit fehlender stsd-Box werden ignoriert, anstatt dass das Parsen der gesamten Datei fehlschlägt.
    • Matroska: Unterstützung für die DTS-HD-Erkennung hinzugefügt (#6225).
    • Ein Problem in MatroskaExtractor wurde behoben, bei dem die Suche bei Dateien mit mehreren Tracks ungenau sein konnte. Cue-Punkte werden jetzt korrekt den jeweiligen Tracks zugeordnet, was eine detailliertere Suche ermöglicht.
    • MPEG-TS: IllegalArgumentException von ReorderingBufferQueue, verursacht durch PES-Pakete ohne Zeitstempel, wurde behoben (#2764).
    • Unterstützung für das Extrahieren von HEIC-Fotos mit Bewegtbild hinzugefügt. Der HeifExtractor kann jetzt HEIC-Dateien mit eingebetteten Video- und Audiotracks parsen.
  • Prüfer:
    • Es wurde ein neues :media3-inspector-Modul eingeführt, das als dedizierter Ort für Dienstprogramme zur Medienprüfung dient. Dieses Modul enthält jetzt ein neues androidx.media3.inspector.MetadataRetriever, das eine einheitliche API für die Metadaten- und Frame-Extraktion bietet. Die vorhandene androidx.media3.exoplayer.MetadataRetriever wird zugunsten dieser neuen Version eingestellt.
    • androidx.media3.inspector.FrameExtractor wurde eingeführt, eine neue öffentliche API für die Frame-Extraktion. Mit dieser AutoCloseable-Klasse können Sie Frames extrahieren und dabei HDR-Videos, Videoeffekte und die Auswahl eines benutzerdefinierten Decoders nutzen. Sie sollte über die Builder für eine bestimmte MediaItem erstellt werden.
    • FrameExtractor: Fügen Sie getThumbnail() hinzu, um einen repräsentativen Thumbnail-Frame aus einer Mediendatei zu extrahieren, ohne dass ein bestimmter Zeitstempel erforderlich ist.
    • androidx.media3.inspector.MediaExtractorCompat wurde hinzugefügt, ein direkter Ersatz für android.media.MediaExtractor der Plattform, mit dem rohe, codierte Medienbeispiele aus einer Mediendatei extrahiert werden können. Die vorhandene androidx.media3.exoplayer.MediaExtractorCompat wird jetzt zugunsten dieser neuen Klasse verworfen.
  • Audio:
    • AudioProcessor-Instanzen über das Suchen informieren.
    • Ermöglicht das Einfügen der neuen AudioOutputProvider-Schnittstelle in DefaultAudioSink.Builder, um benutzerdefinierte Audioausgabepfade zu unterstützen. Die Standardeinstellung ist AudioTrackAudioOutputProvider.
    • Suchvorgänge in GainProcessor verarbeiten.
    • AC-4-Decoderprofil und -Level-Funktionen bei der Bewertung der Unterstützung von Trackformaten nutzen (#2580).
    • Mögliche Verzögerungen durch die Verarbeitung von Callbacks für Routingänderungen zu Beginn der Wiedergabe werden vermieden (#2646).
    • Codec-Wiederverwendung für die Formate EAC3, EAC3-JOC und AC-4 zulassen (#1346).
    • Unterstützung für Float-PCM-Samples in Sonic hinzugefügt.
    • Unterstützung für 16-Bit-PCM-Samples in ToFloatPcmAudioProcessor hinzugefügt.
  • Video:
    • Deaktivieren Sie die Codecwiederverwendung für Dolby Vision-Inhalte mit unterschiedlichen Profilen.
    • Problemumgehung für falsch gemeldete Leistungspunkte für sichere Codecs wieder aktiviert (#2856).
  • Text:
    • Fehler beim Parsen von CEA-6/708-Untertiteln in Dolby Vision-Inhalten behoben (#2775).
  • Bild:
    • Ein Problem mit dem ScrubbingMode wurde behoben, bei dem der Player beim Scrubben eines DASH-Thumbnail-Tracks hängen blieb (#2815).
  • DRM:
    • Ändern Sie den Rückgabetyp der MediaDrmCallback-Methoden von byte[] in einen neuen MediaDrmCallback.Response-Typ, damit zusätzliche optionale Informationen zurückgegeben werden können. Dies ist eine funktionsgefährdende Änderung, die sich jedoch leicht beheben lässt, indem der vorherige byte[]-Rückgabewert vor der Rückgabe mit new Response umschlossen wird.
    • Fügen Sie AnalyticsListener.onDrmKeysLoaded wichtige Anfrageinformationen wie URL und Latenz hinzu (#1001).
    • Verschieben Sie die Daten der Bereitstellungsanfrage von einem URL-Parameter in den POST-Text.
  • Auswirkung:
    • Presentation.copyWithUnsetSideRoundedTo wurde hinzugefügt, um die nicht festgelegte Ausgabeseite zu runden, wenn Presentation mit einer einzelnen Seitenlänge erstellt wird.
  • Muxer:
    • Fügen Sie MediaMuxerCompat hinzu, einen direkten Ersatz für das Framework MediaMuxer.
    • Füge MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo() hinzu, um die Erstellung von Fotos mit Bewegtbild zu ermöglichen.
    • Fügen Sie WebmMuxer hinzu, um das Muxing von OPUS-, VORBIS-, VP8- und VP9-Medienstreams in ein webm-Dateiformat zu ermöglichen.
  • IMA-Erweiterung:
    • Benutzerdefinierte Proguard-Regeln wurden entfernt, damit Apps stattdessen die im IMA-Android-Archiv veröffentlichten Regeln verwenden können.
    • ImaServerSideAdInsertionUriBuilder.setNetworkCode wurde hinzugefügt, eine neue API zum Festlegen des Google Ad Manager-Netzwerkcodes für das IMA SDK, um Anzeigenkennungen gemäß den Google Ad Manager-Einstellungen zu verarbeiten. Netzwerkcodes sind optional, werden aber für Full-Service-Streamanfragen empfohlen. Informationen zum Ermitteln des Netzwerkcodes finden Sie in diesem Artikel.
    • Die IMA-Abhängigkeit wurde auf 3.37.0 erhöht. Dafür muss die Entzuckerung der Kernbibliothek aktiviert werden. Dies muss auch von abhängigen Apps aktiviert werden. Weitere Informationen finden Sie in den Konfigurationshinweisen von IMA. * Unterstützung von IMA DAI-Optionen für benutzerdefinierte Benutzeroberflächen im SSAI-URI-Builder. Zu den benutzerdefinierten UI-Optionen für die serverseitige Anzeigenbereitstellung gehören die Unterstützung für das Rendern von „Überspringbar“ und „Infos zur Anzeige“. Die Funktion ist derzeit für ausgewählte Publisher auf einer Zulassungsliste verfügbar. Durch diese Änderung wird auch die IMA SDK-Version auf 3.38.0 aktualisiert (Versionshinweise), um auf die API für benutzerdefinierte UI-Optionen zuzugreifen.
    • Problem behoben, bei dem ein Fehler bei der Vorbereitung von Inhalten nach einer Anzeige fälschlicherweise als Fehler bei der Anzeigenwiedergabe gemeldet wurde (#2656).
  • Sitzung:
    • Füge MediaSession.Callback.onPlaybackResumption einen neuen Parameter hinzu, um anzugeben, ob der Aufruf nur zum Erfassen von Informationen oder zum Starten der Wiedergabe erfolgt (#1764).
    • MediaSession.ControllerInfo.isTrusted wurde aktualisiert, sodass auch Controller aus der eigenen App als vertrauenswürdig deklariert werden (#2542).
    • MediaSessionService.triggerNotificationUpdate wurde hinzugefügt, um eine Benachrichtigungsaktualisierung manuell auszulösen (#1833).
    • Fügen Sie ProgressListener zu benutzerdefinierten Befehlsmethoden hinzu.
    • Ändern Sie den Standardwert für MediaLibrarySession.Builder.setLibraryErrorReplicationMode in „non fatal“.
    • MediaButtonReceiver.onForegroundServiceStartNotAllowedException wurde der Parameter Context hinzugefügt (#2625).
    • Lies die Lautstärkeregelungs-ID von der Plattform PlaybackInfo, anstatt sie über Binder abzurufen. So wird sichergestellt, dass Wiedergabetyp und Lautstärkeregelungs-ID atomar gelesen werden und zueinander passen.
    • Fehler behoben, bei dem ACTION_UP-Schlüsselereignisse herausgefiltert wurden, bevor sie zur benutzerdefinierten Verarbeitung an den Callback übergeben wurden. Dies sorgt für Parität mit dem, was media1 und die Plattform tun (#2637).
    • Fehler behoben, bei dem getCurrentTimeline() von PlayerWrapper aufgerufen wurde, obwohl der Befehl nicht verfügbar war (#2665).
    • Fehler behoben, bei dem eine Nachricht in der Nachrichtenwarteschlange des Haupt-Loopers verblieb, was nach Beendigung des Dienstes zu einem Speicherleck führte (#2692).
    • Wenn eine Verbindung zu einer Legacy-Sitzungs-App mit einem MediaBrowser besteht, werden benutzerdefinierte Befehle nur dann an die Sitzung gesendet, wenn die benutzerdefinierte Aktion als benutzerdefinierte Aktion in PlaybackStateCompat der Legacy-Sitzung beworben wird. Alle anderen benutzerdefinierten Aktionen werden an den Dienst gesendet.
    • onAudioSessionIdChanged wurde implementiert, um Media Controller zu benachrichtigen, wenn eine Audiositzungs-ID von der Sitzung festgelegt wird (#244).
    • Fehler behoben, bei dem KEYCODE_HEADSETHOOK den Player nicht gestartet hat, wenn das Medientastenereignis Intent in onStartCommand() eingegangen ist. Dies wurde behoben, indem „KEYCODE_HEADSETHOOK“ wie KEYCODE_MEDIA_PLAY_PAUSE behandelt wird (#2816).
    • Es wurde ein Fehler behoben, bei dem die Surface-Größe nicht zwischen der Sitzung und dem Controller kommuniziert wurde, was dazu führte, dass Videoeffekte in der Demositzung nicht angewendet werden konnten. Wenn Sie einen Controller verwenden, kann dies eine funktionsgefährdende Änderung sein, wenn Ihr Player einen setVideoSurfaceHolder-Aufruf nicht verarbeiten kann.
    • Die Weitergabe von CharSequence-Metadatenwerten, die nicht vom Typ String sind, wie z. B. Strings im Span-Stil, wurde korrigiert (#2853).
    • Füge CommandButton.executeAction hinzu, damit Controller die gewünschte Aktion leichter auslösen können. Außerdem können Sie Parameter für einige Player- und Sitzungsbefehle angeben, um festzulegen, welche Aktion ausgelöst werden soll.
    • Fügen Sie Abwärtskompatibilität für CommandButton-Instanzen hinzu, die Player.Command oder nicht benutzerdefinierte SessionCommand verwenden, um ihre Aktion zu definieren. Diese werden jetzt in den Mediensitzungen der Plattform korrekt dargestellt, z. B. für die System-UI oder Android Auto.
    • Ein Problem wurde behoben, bei dem derselbe Bitmap mehrmals komprimiert wurde, wenn ein MediaController mit einer Plattform-Mediensitzung verbunden wurde.
  • UI:
    • Fügen Sie dem Modul media3-ui-compose die Klasse ProgressStateWithTickInterval und die entsprechende rememberProgressStateWithTickInterval-Komposition hinzu. Dieser State Holder wird in demo-compose verwendet, um die aktuelle Position und Dauer in Textform anzuzeigen.
    • Fügen Sie MuteButtonState zu ui-compose hinzu, um die Stummschaltung der Player-Lautstärke zu verwalten. Dieser State Holder wird in demo-compose verwendet, um den Ein/Aus-Button für die Stummschaltung anzuzeigen.
    • Fügen Sie dem Modul media3-ui-compose die ProgressStateWithTickCount-Klassen und die entsprechende rememberProgressStateWithTickCount-Komposition hinzu. Dieser State Holder wird in demo-compose verwendet, um den Fortschritt als horizontale schreibgeschützte Fortschrittsanzeige darzustellen.
    • Fügen Sie ContentFrame Composable zu media3-ui-compose hinzu, das die Verwaltung von PlayerSurface mit der Größenänderung des Seitenverhältnisses und dem Abdecken mit einem Shutter kombiniert.
    • Problemumgehung für einen bekannten API 34-Plattformfehler, der dazu führt, dass Videos gestreckt oder zugeschnitten werden, wenn SurfaceView in einem Compose-AndroidView verwendet wird, und der sich daher auf ContentFrame- und PlayerSurface-Composables mit SURFACE_TYPE_SURFACE_VIEW auswirkt (#1237, #2811).
    • Erstelle ein neues media3-ui-compose-material3-Modul und füge ihm Composables im Material3-Design hinzu (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton).
    • Füge das Compose-Element TimeText zu media3-ui-compose-material3 hinzu, um den Fortschritt des Spielers in Textform anzuzeigen. Sie kann so konfiguriert werden, dass die aktuelle Position, die Dauer oder die verbleibende Zeit angezeigt wird.
    • Unterstützung für das Platzieren einer Schaltfläche für Medienrouten in der PlayerView hinzugefügt.
    • Verwenden Sie BidiFormatter, um die Zeichensetzung in RTL-Textuntertiteln korrekt anzuzeigen (#11214).
  • HLS-Erweiterung:
    • Attribute zum Überspringen von HLS-Interstitials parsen.
    • Ordnen Sie die Attribute für die Überspringungssteuerung aus der HLS-Playlist und dem Asset-Listendokument dem AdPlaybackState für den öffentlichen Zugriff zu.
    • Fehler behoben, bei dem die Startzeit der Playlist verworfen wurde, wenn das Tag „EXT-X-PROGRAM-START-DATE“, das die Startzeit definiert, aus einer Playlist entfernt wurde (#2760).
    • Verwenden Sie die binäre Suche, um den Segmentindex einer bestimmten Position in der Playlist zu finden (#2826).
    • Fügen Sie HlsInterstitialsAdsLoader.skipCurrentAd() und skipCurrentAdGroup() sowie die entsprechenden Methoden hinzu, um Anzeigen und Anzeigengruppen nach Index zu überspringen.
    • Fügen Sie HlsInterstitialsAdsLoader.Listener.onAdStarted hinzu, um den Beginn eines Anzeigenzeitraums zu melden (#2859).
    • Leerzeichen als Trennzeichen für Datum und Uhrzeit in ISO 8601-Datums-/Uhrzeitstrings akzeptieren.
    • Das Abrufen des nächsten Blocks für einen HlsMediaPlaylist ohne Segmente wird jetzt korrekt verarbeitet (#2821).
    • Verwenden Sie die Standardstartposition für Pre-Rolls bei Livestreams.
  • DASH-Erweiterung:
    • Fehler UnsupportedOperationException bei der Wiedergabe von DASH-Streams mit einem nicht hierarchischen data:-URI-Manifest behoben (#2688).
    • LiveConfiguration wird auf den Wert zurückgesetzt, der von der MediaItem der DashMediaSource bei der Veröffentlichung und bei der Aktualisierung der Mediendatei durch den Nutzer bereitgestellt wird (#2606).
    • Abstürze aufgrund ungültiger Manifestaktualisierungen, die nicht als Player-Fehler gemeldet wurden, werden vermieden (#2805).
  • RTSP-Erweiterung:
    • Fehler bei fehlenden RTP-Paketen bei der Verarbeitung fragmentierter NAL-Einheiten für H264 und H265 (#2613) beheben.
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • AV1-Erweiterung: Der AV1-Softwaredecoder verwendet jetzt die leistungsstarke dav1d-Bibliothek und ersetzt die vorherige libgav1-Implementierung für eine verbesserte Decodierungsgeschwindigkeit.
    • FFmpeg-Erweiterung: Ein Problem wurde behoben, das die Wiedergabe einiger FLAC-Dateien verhinderte. Dazu wurde sichergestellt, dass der STREAMINFO-Block korrekt geparst und an den Decoder übergeben wird (#2887).
  • Cast-Erweiterung:
    • Füge CastPlayer.Builder hinzu, damit CastPlayer sowohl die lokale Wiedergabe als auch die Wiedergabe über Google Cast ermöglicht. Wenn du das alte CastPlayer-Verhalten beibehalten möchtest, bei dem nur die Cast-Wiedergabe unterstützt wird, kannst du RemoteCastPlayer verwenden. Die vorhandenen CastPlayer-Konstruktoren behalten ihr altes Verhalten bei, werden aber zugunsten der CastPlayer- oder RemoteCastPlayer-Builder eingestellt.
    • Erzwingung eines MIME-Typs, der nicht null ist, in DefaultMediaItemConverter beenden.
    • Verwende MediaItem.mediaMetadata.mediaType, um den Cast-MEDIA_TYPE abzuleiten, der in DefaultCastOptionsProvider#toMediaQueueItem verwendet werden soll, falls verfügbar.
    • Eingehende Übertragungen von Remote- zu lokalen Geräten in DefaultCastOptionsProvider aktivieren.
    • Unterstützung für Cast in der Session-Demo hinzugefügt.
    • Unterstützung für die Anzeige einer Schaltfläche für die Medienroute auf einer Composable-Benutzeroberfläche hinzugefügt.
    • Unterstützung für die Anzeige einer Schaltfläche für das Medienrouting in einem Aktionsleistenmenü hinzufügen.
    • Unterstützung für die Anzeige einer Schaltfläche für Medien-Streaming als Ansichts-UI hinzugefügt.
  • Testdienstprogramme:
    • Maximale Zeitdifferenz für den automatischen Übergang von FakeClock hinzufügen. Der Standardwert ist 1 Sekunde, kann aber über FakeClock.Builder konfiguriert werden.
    • Maximale Zeitdifferenz zwischen Nachrichten für RobolectricUtil.runMainLooperUntil (und runLooperUntil) hinzugefügt. Der Standardwert ist 1 Sekunde, kann aber über neue Überladungen dieser Methoden konfiguriert werden.
    • CapturingRenderersFactory von test-utils nach test-utils-robolectric verschieben.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Der verworfene DefaultPreloadManager-Konstruktor wurde entfernt. Verwenden Sie stattdessen DefaultPreloadManager.Builder.
    • Veraltete EditedMediaItemSequence-Konstruktoren wurden entfernt. Verwenden Sie stattdessen EditedMediaItemSequence.Builder.
    • BitmapFactoryImageDecoder.BitmapDecoder entfernen. Verwenden Sie stattdessen ExternallyLoadedImageDecoder.
    • Entfernen Sie das verworfene ShadowMediaCodecConfig.forAllSupportedMimeTypes(). Verwenden Sie stattdessen ShadowMediaCodecConfig.withAllDefaultSupportedCodecs().
    • Entfernen Sie das verworfene ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes(). Verwenden Sie stattdessen ShadowMediaCodecConfig.withNoDefaultSupportedCodecs().

1.9.0-rc01

1. Dezember 2025

Verwenden Sie die stabile Version 1.9.0.

1.9.0-beta01

20. November 2025

Verwenden Sie die stabile Version 1.9.0.

1.9.0-alpha01

22. Oktober 2025

Verwenden Sie die stabile Version 1.9.0.

Version 1.8.0

1.8.1

21. Mai 2026

Version 1.8.1 enthält die folgenden Commits.

  • Auswirkung:
    • Legen Sie GL_DRAW_BUFFER und GL_READ_BUFFER explizit fest, wenn Sie von einem oberflächenlosen Kontext wechseln.

Version 1.8.0

30. Juli 2025

Version 1.8.0 enthält diese Commits.

  • Common Library:
    • Unterstützung für das Ersetzen des Players in ForwardingSimpleBasePlayer hinzugefügt.
  • ExoPlayer:
    • Getter für den Zufallsmodus zur ExoPlayer-Schnittstelle hinzugefügt (#2522).
    • Es wird deutlicher eine Ausnahme ausgelöst, wenn von mehreren Threads auf DefaultAudioSink zugegriffen wird. Wenn dies aufgrund eines Aufrufs von RendererCapabilities.getFormatSupport außerhalb des Players geschieht, rufen Sie diese Methode im selben Thread wie den Wiedergabe-Thread von ExoPlayer auf oder verwenden Sie eine andere Instanz als die für die Wiedergabe verwendete (#1191).
    • Fehler behoben, bei dem Audioformate, die nicht Stereo sind, auf Fernsehern von DefaultTrackSelector als nicht unterstützt markiert wurden.
    • Achte darauf, dass der letzte Frame korrekt gerendert wird, wenn du das MediaCodec-Flag DECODE_ONLY verwendest, das im Scrubbing-Modus standardmäßig aktiviert ist.
    • Unterstützung für die Verwendung der virtuellen Geräte-ID aus dem Context, der an ExoPlayer.Builder übergeben wird, hinzugefügt.
    • Dynamische Planung im Scrubbing-Modus standardmäßig aktivieren.
    • Vermeide unnötiges Neuladen einer Quelle, wenn du zum Ende eines Elements springst.
    • Im Scrubbing-Modus wird standardmäßig MediaCodec.BUFFER_FLAG_DECODE_ONLY verwendet.
    • IllegalStateException wird ausgelöst, wenn PreloadMediaSource von einem ExoPlayer mit einem Wiedergabe-Thread abgespielt wird, der sich vom Vorabladen-Thread unterscheidet (#2495).
    • cloneAndMove wurde mit einer Standardimplementierung zu ShuffleMode hinzugefügt (#2226).
    • Ändern Sie das Standardverhalten von Renderer.getMinDurationToProgressUs, um einen größeren Wert zurückzugeben, wenn kein Aufruf von render erforderlich ist.
    • Fehler behoben, bei dem die interne Planung den letzten Frame verzögerte, wenn beim Pausieren zum Ende gesprungen wurde. Derzeit wird die Fehlerkorrektur nur wirksam, wenn ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled aktiviert ist.
    • Fügen Sie die Methode ExoPlayer.setScrubbingModeEnabled(boolean) hinzu. Dadurch wird der Player für häufige Suchvorgänge optimiert, z. B. wenn ein Nutzer eine Bildlaufleiste verschiebt. Das Verhalten des Scrubbing-Modus kann mit setScrubbingModeParameters(..) für ExoPlayer und ExoPlayer.Builder angepasst werden.
    • Anpassung der Toleranz für die Suche nach Bruchteilen im Scrubbing-Modus zulassen.
    • Erhöht die Codec-Betriebsrate im Scrubbing-Modus.
    • Fehler behoben, bei dem Vorbereitungsfehler im Inhalt von AdsMediaSource möglicherweise nie gemeldet wurden (#2337).
    • Speicherleck in MergingMediaSource behoben, das beispielsweise beim Sideloading von Untertiteln verwendet wird (#2338).
    • CmcdConfiguration.Factory kann jetzt null zurückgeben, um das CMCD-Logging für bestimmte Mediendateien zu deaktivieren (#2386).
    • Die Standardpuffergröße für Bilder wurde von 128 KB (Fehler beim Kopieren und Einfügen aus Texttracks) auf 26 MB erhöht. Das ist groß genug für Ultra HDR-Bilder mit 50 MP (#2417).
    • PreCacheHelper hinzugefügt, damit Apps ein einzelnes Medium mit einer bestimmten Startposition und Dauer im Cache speichern können.
    • Unterstützung für das Vorabladen von einer bestimmten Position in DefaultPreloadManager hinzugefügt.
  • Transformer:
    • Füge CodecDbLite hinzu, um chipsatzspezifische Optimierungen der Video-Codierungseinstellungen zu ermöglichen.
    • Fügen Sie das Flag setEnableCodecDbLite zu DefaultEncoderFactory hinzu, um die Optimierung der CodecDB Lite-Einstellungen zu aktivieren. Dieses Flag ist standardmäßig auf „false“ eingestellt.
    • Wenn Sie eine anfängliche Lücke (über addGap() hinzugefügt) mit Audio ohne Ton 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.
    • Schnittstelle Muxer von media3-transformer nach media3-muxer verschieben.
    • Die Einstellung MediaItem.Builder().setImageDuration(long) muss festgelegt werden, um eine Mediendatei als Bild zu importieren.
    • Füge Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean) hinzu, das beim Kürzen eine MP4-Bearbeitungsliste enthält, um Player anzuweisen, Samples zwischen dem Keyframe vor dem Startpunkt des Kürzens und dem Startpunkt des Kürzens zu ignorieren.
    • Aktualisieren Sie die Composition Demo-App, um Kotlin und Jetpack Compose zu verwenden, und fügen Sie einen benutzerdefinierten VideoCompositorSettings hinzu, um Sequenzen in einem 2x2- oder PiP-Layout anzuordnen.
  • Extraktoren:
    • Metadaten aus fragmentierten MP4-Dateien parsen (#2084)
    • JPEG: Unterstützung von Fotos mit Bewegtbild, die am Anfang kein EXIF-Segment haben (#2552).
    • 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 für 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).
    • Das Parsen von H.265-SEI-Einheiten wurde korrigiert, sodass nicht erkannte SEI-Typen vollständig übersprungen werden (#2456).
    • Aktualisieren Sie WavExtractor, um die SubFormat-Daten der Headererweiterung für das Audioformat beim Parsen einer Datei vom Typ WAVE_FORMAT_EXTENSIBLE zu verwenden.
    • MP4: Unterstützung für ipcm- und fpcm-Boxen hinzugefügt, die rohe PCM-Audiotracks definieren (64-Bit-Gleitkomma-PCM wird nicht unterstützt).
    • MP4: Der Rotationsanteil von tkhd-Transformationsmatrizen, die das Video sowohl rotieren als auch spiegeln, wird verarbeitet. So wird sichergestellt, dass gespiegelte Videos, die mit der Frontkamera des iPhones aufgenommen wurden, richtig herum angezeigt werden, aber fälschlicherweise auf der Y-Achse gespiegelt werden (#2012).
    • MP3: Dauer und Datengröße aus nicht suchbaren Xing-, VBRI- und ähnlichen Metadaten mit variabler Bitrate verwenden, wenn aufgrund von FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) auf die Suche mit konstanter Bitrate zurückgegriffen wird (#2194).
  • Audio:
    • Fehler behoben, bei dem AnalyticsListener.onAudioPositionAdvancing nicht aufgerufen wird, wenn die Audiowiedergabe sehr kurz vor dem Ende des Mediums gestartet wird.
    • Unterstützung für alle linearen PCM-Abtastformate in ChannelMappingAudioProcessor und TrimmingAudioProcessor hinzugefügt.
    • Unterstützung für Audiolücken in CompositionPlayer hinzugefügt.
    • Entfernen Sie den fehlerhaften Aufruf von BaseAudioProcessor#flush() aus BaseAudioProcessor#reset().
    • Erlaubt konstantes Upmixing/Downmixing der Leistung in DefaultAudioMixer.
    • ChannelMappingAudioProcessor, TrimmingAudioProcessor und ToFloatPcmAudioProcessor öffentlich machen (#2339).
    • Verwenden Sie AudioTrack#getUnderrunCount() in AudioTrackPositionTracker, um Unterläufe in DefaultAudioSink zu erkennen, anstatt eine Best-Effort-Schätzung zu verwenden.
    • Verbesserung der Glättung von Audiozeitstempeln bei unerwarteter Positionsabweichung vom Audioausgabegerät.
    • Fehler behoben, bei dem die A/V-Synchronisierung nach dem Fortsetzen der Wiedergabe die ersten 10 Sekunden lang nicht funktionierte, wenn eine Verbindung zu Bluetooth-Geräten bestand.
    • Fehler behoben, bei dem AnalyticsListener.onAudioPositionAdvancing nicht die Zeit meldete, zu der die Audiowiedergabe gestartet wurde, sondern die Zeit der ersten Messung.
    • Die Wiederherstellung von Mehrkanal-Audio nach dem Fallback auf Stereo-Audio auf einigen Geräten wurde korrigiert (#2258).
  • Video:
    • Der Workaround für getrennte Oberflächen wurde auf „lenovo“- und „motorola“-Geräte ausgeweitet (#2059).
    • Verbesserung der reibungslosen Freigabe von Videoframes beim Start, wenn Audio-Samples nicht genau an der angeforderten Position beginnen.
    • Der Workaround für getrennte Oberflächen wurde auf „realme“-Geräte ausgeweitet (#2059).
    • Experimentelle ExoPlayer API hinzugefügt, um das Flag MediaCodec.BUFFER_FLAG_DECODE_ONLY beim Einreihen von Eingabepuffern, die nur decodiert werden, in die Warteschlange einzuschließen. Dieses Flag signalisiert dem Decoder, die Nur-Decodierungs-Puffer zu überspringen, was zu einer schnelleren Suche führt. Aktivieren Sie sie mit DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Verbesserung der Codec-Leistungsprüfungen für Software-Videocodecs. Dies kann dazu führen, dass einige zusätzliche Tracks als EXCEEDS_CAPABILITIES markiert werden.
    • Fehler bei der VP9-Widevine-Wiedergabe auf einigen Geräten behoben (#2408).
  • Text:
    • Unterstützung für VobSub-Tracks in MP4-Dateien hinzugefügt (#2510).
    • Es wurde ein Problem behoben, bei dem die Wiedergabe hängen blieb, wenn ein Untertitelsegment anfangs nicht geladen werden konnte, später aber erfolgreich geladen wurde, gefolgt von mehreren leeren Untertitelsegmenten (#2517).
    • SSA und SubRip wurden korrigiert, sodass beim Aktivieren von Untertiteln ein Cue für den laufenden Vorgang angezeigt wird (#2309).
    • Behebung eines Fehlers, bei dem die Wiedergabe hängen blieb, wenn von einem Stream mit einem Untertitelfehler zu einem Livestream mit einer leeren Untertitelspur gewechselt wurde (#2328).
    • Fehlerhafte CEA-608-Untertitel bei der Wiedergabe von H.262-Streams mit B-Frames wurden korrigiert (#2372).
    • Unterstützung für SSA-Untertitel mit CodecId = S_TEXT/SSA in Matroska-Dateien hinzugefügt. Bisher wurde von 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 mehr als ein Cue gleichzeitig auf dem Bildschirm angezeigt wird (#2124).
  • Metadaten:
    • Unterstützung für das Abrufen der Mediendauer und Timeline zu MetadataRetriever hinzugefügt und zu einer instanzbasierten AutoCloseable-API migriert. Verwenden Sie die neue Builder, um eine Instanz für eine MediaItem zu erstellen, und rufen Sie dann retrieveTrackGroups(), retrieveTimeline() und retrieveDurationUs() auf, um ListenableFutures für die Metadaten abzurufen. Die vorherigen statischen Methoden sind jetzt verworfen (#2462).
  • Bild:
    • Begrenze decodierte Bitmaps auf die Anzeigegröße in BitmapFactoryImageDecoder, um zu vermeiden, dass eine App mit Canvas: trying to draw too large bitmap. von 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.
    • Die in CompositionPlayer verwendete maximale Bitmap-Ausgabegröße wird an die bereits in Transformer verwendete Größe angepasst. Das bedeutet, dass CompositionPlayer im Gegensatz zu ExoPlayer beim Decodieren von Bitmaps die Displaygröße nicht berücksichtigt.
  • DRM:
    • Neue Überladung von OfflineLicenseHelper.newWidevineInstance hinzugefügt, die ein MediaItem.DrmConfiguration akzeptiert, damit HTTP-Anfrageheader korrekt angewendet werden können (#2169).
  • Auswirkung:
    • Fügen Sie Presentation.createForShortSide(int) hinzu, um einen Presentation zu erstellen, der dafür sorgt, dass die kürzeste Seite immer dem angegebenen Wert entspricht, unabhängig von der Ausrichtung der Eingabe.
  • Muxer:
    • Ein Fehler wurde behoben, bei dem für Audio-Samples in fragmentierten MP4-Dateien nicht die richtigen Sample-Flags festgelegt wurden.
    • Die writeSampleData() API verwendet jetzt die Muxer-spezifische Klasse BufferInfo anstelle von MediaCodec.BufferInfo.
    • Fügen Sie Muxer.Factory#supportsWritingNegativeTimestampsInEditList hinzu, wobei der Standardwert „false“ ist.
  • IMA-Erweiterung:
    • Ein Fehler wurde behoben, durch den ein Ladefehler in einer Anzeige versehentlich eine andere Anzeigengruppe ungültig machen konnte.
    • Ein Fehler wurde behoben, bei dem Anzeigengruppen nach dem Ende eines VOD-Fensters die Wiedergabe blockierten. Anzeigengruppen mit einer Startzeit nach dem Fenster werden nicht mehr in die MediaPeriodQueue eingereiht (#2215).
  • Sitzung:
    • Fehler behoben, bei dem Verbindungen von nicht privilegierten Media3-Controllern von Drittanbietern ignoriert wurden.
    • Prüfung auf verfügbare Befehle beim Senden benutzerdefinierter Befehle an ein Legacy-MediaBrowserServiceCompat entfernt. Dies entspricht dem Verhalten älterer Controller/Browser, wenn sie mit einer älteren App verbunden sind.
    • Ein Fehler wurde behoben, durch den der erste Wiedergabefehler eines Spielers fälschlicherweise als persistente benutzerdefinierte Ausnahme behandelt wurde. Dadurch kann die Anwendung nicht wiederhergestellt werden.
    • Fehler behoben, bei dem einige Controller-Änderungen, die nicht von der Sitzung verarbeitet werden, zu IllegalStateExceptions führen können.
    • Fehler behoben, bei dem Controller-Aktionen, die nicht von der Sitzung verarbeitet werden, den Controller in einem ungültigen Zustand belassen können.
    • Warnung zu StrictMode-Verstoß bei unsicherem Start behoben (#2330).
    • Fehler behoben, bei dem der Aufruf von setSessionExtras aus dem Hauptthread, wenn der Player von einem anderen Anwendungsthread als dem Hauptthread ausgeführt wurde, zu einem IllegalStateException führte (#2265).
    • Es wird nicht automatisch eine Benachrichtigung angezeigt, wenn ein Player mit Medieninhalten eingerichtet ist, ohne dass diese vorbereitet oder abgespielt werden (#2423https://github.com/androidx/media/issues/2423). Dieses Verhalten kann über MediaSessionService.setShowNotificationForIdlePlayer konfiguriert werden.
    • Fügen Sie benutzerdefinierte PlaybackException für alle oder ausgewählte Controller hinzu.
    • Fehler behoben, bei dem das Suchen in einem Livestream auf einem MediaController einen IllegalArgumentException verursachen kann.
    • Bei Livestreams wird die Veröffentlichung einer Wiedergabeposition und die Möglichkeit, im aktuellen Element nach Plattform-Mediencontrollern zu suchen, beendet, um Positionsartefakte in der Android Auto-Benutzeroberfläche (und anderen Controllern, die diese Informationen aus der Plattform-Mediensitzung verwenden) zu vermeiden (#1758).
    • Es wurde ein Fehler behoben, bei dem die Übergabe von „null“ an getLibraryRoot einer MediaBrowser, die mit einer Legacy-MediaBrowserServiceCompat verbunden ist, eine NullPointerException erzeugte.
    • Es wurde ein Fehler behoben, bei dem das Senden von benutzerdefinierten Aktionen, eines Suchergebnisses oder einer getItem-Anfrage die alte Sitzungs-App mit einem ClassNotFoundException zum Absturz brachte.
    • Es wurde ein Fehler behoben, durch den MediaItem.LocalConfiguration.uri für die MediaMetadata der Plattformsitzung 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:
    • Fehler behoben, bei dem PlayerSurface in wiederverwendbaren Komponenten wie LazyColumn nicht richtig funktionierte (#2493).
    • Ein Compose-Fehler wurde behoben, der zu einer Lücke zwischen dem Festlegen der anfänglichen Schaltflächenzustände und dem Beobachten der Zustandsänderung (z.B. Symbolformen oder Aktivierung) führte. Alle Änderungen, die außerhalb des Beobachtungszeitraums am Player vorgenommen wurden, werden jetzt übernommen (#2313).
    • Füge dem Modul media3-ui-compose State Holder und Composables für SeekBackButtonState und SeekForwardButtonState hinzu.
    • Unterstützung für den Scrubbing-Modus von ExoPlayer zu PlayerControlView hinzugefügt. Wenn diese Option aktiviert ist, wird der Player in den Scrubbing-Modus versetzt, sobald der Nutzer die Scrubbing-Leiste zieht. Bei jeder Bewegung wird ein player.seekTo-Aufruf ausgegeben. Der Scrubbing-Modus wird beendet, wenn der Nutzer den Bildschirm nicht mehr berührt. Diese Integration kann entweder mit time_bar_scrubbing_enabled = true in XML oder mit der Methode setTimeBarScrubbingEnabled(boolean) aus Java/Kotlin aktiviert werden.
    • Sorgen Sie dafür, dass PlayerSurface ein Argument vom Typ Player akzeptiert, das null sein kann.
  • Downloads:
    • Unterstützung für den teilweisen Download von progressiven Streams hinzugefügt. Apps können einen progressiven Stream mit DownloadHelper vorbereiten und einen DownloadRequest vom Hilfsprogramm 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 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 den teilweisen Download von adaptiven Streams hinzugefügt. Apps können einen adaptiven Stream mit DownloadHelper vorbereiten und einen DownloadRequest vom Hilfsprogramm 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 entsprechende Inhalt heruntergeladen werden kann.
  • Cronet-Erweiterung:
    • Automatische Cookie-Verarbeitung hinzugefügt (#5975).
  • HLS-Erweiterung:
    • Fehler behoben, bei dem HlsSampleStreamWrapper versucht, im Zwischenspeicher zu suchen, wenn keine Chunks im Zwischenspeicher verfügbar sind #2598.
    • Fehler behoben, bei dem Änderungen an der Titelauswahl nach dem Laden von Teilen mit niedriger Latenz und Vorladehinweisen dazu führen konnten, dass die Wiedergabe hängen blieb oder einfror (#2299).
    • Verhindern Sie übermäßige Aktualisierungen, indem Sie die Hälfte der Zieldauer warten, wenn CAN-BLOCK-RELOAD=YES vom Server nicht berücksichtigt wird (#2317).
    • Fehler behoben, bei dem die Wiedergabe beim Starten eines Interstitial-Streams vor einer Mid-Roll-Anzeige ins Stocken geriet und die Auflösung der Asset-Liste für die falsche Anzeige versucht wurde (#2558).
    • Fehler beim Parsen von Playlists behoben, sodass \f (Form Feed) in Attributwerten in Anführungszeichen akzeptiert wird (#2420).
    • Unterstützung für das Aktualisieren von Interstitials mit derselben ID (#2427).
    • Fehler behoben, bei dem Fehler beim Laden von Playlists manchmal nicht weitergegeben werden, wenn ein Livestream keine Segmente mehr zum Laden hat (#2401https://github.com/androidx/media/issues/2401).
    • Untertitel-Renditions werden nach NAME-Tag gruppiert, ähnlich wie Audio-Renditions bereits gruppiert werden (#1666).
    • Unterstützung für X-ASSET-LIST und Livestreams mit HlsInterstitialsAdsLoader.
  • DASH-Erweiterung:
    • Problem behoben, bei dem das Trick-Play-Adaptationset mit dem Haupt-Adaptationset zusammengeführt wurde, um ein ungültiges TrackGroup zu bilden (#2148).
    • Fehler behoben, bei dem das Verkürzen der Dauer eines DASH-Zeitraums eine Ausnahme auslösen kann, wenn Samples, die über die neue Dauer hinausgehen, bereits von der Rendering-Pipeline gelesen wurden (#2440).
    • Fehler behoben, bei dem die Weiterleitung bei Verwendung von CMCD-Suchparametern nicht befolgt wurde (#2475).
  • RTSP-Erweiterung:
    • Unterstützung für RTP-Aggregationspaket für H265 gemäß RFC 7798#4.4.2 (#2413) hinzugefügt.
    • RtspClient wurde korrigiert, sodass die Standort-URI wie angegeben verwendet wird, wenn eine HTTP 302-Antwort verarbeitet wird (#2398).
    • Unterstützung für das Parsen von SessionDescriptions mit Zeilen, die nachgestellte Leerzeichen enthalten, wurde hinzugefügt (#2357).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Fehler behoben, bei dem DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange keine Auswirkungen auf Audiodecoder-Erweiterungen hatte (#2258).
  • Cast-Erweiterung:
    • Unterstützung für setVolume() und getVolume() hinzugefügt (#2279).
    • Verhindern, dass CastPlayer in STATE_BUFFERING wechselt, während die Zeitachse leer ist.
    • Unterstützung für getDeviceVolume(), setDeviceVolume(), getDeviceMuted() und setDeviceMuted() hinzugefügt (#2089).
  • Testdienstprogramme:
    • Fügen Sie advance(player).untilPositionAtLeast und untilMediaItemIndex zu TestPlayerRunHelper hinzu, um den Player bis zu einer bestimmten Position vorzuspulen. In den meisten Fällen sind diese Methoden zuverlässiger als die vorhandenen Methoden untilPosition und untilStartOfMediaItem.
    • Verschieben Sie FakeDownloader in das Modul test-utils-robolectric, um es in anderen Tests wiederzuverwenden.
    • 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 Codecnamen durch „media3“ ersetzt.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Der verworfene SegmentDownloader-Konstruktor SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) und die entsprechenden Konstruktoren in den zugehörigen Unterklassen DashDownloader, HlsDownloader und SsDownloader wurden entfernt.
    • Die veralteten Elemente Player.hasNext() und Player.hasNextWindow() wurden entfernt. Verwenden Sie stattdessen Player.hasNextMediaItem().
    • Verworfenes Player.next() entfernt. Verwenden Sie stattdessen Player.seekToNextMediaItem().
    • Verworfenes Player.seekToPreviousWindow() entfernt. Verwenden Sie stattdessen Player.seekToPreviousMediaItem().
    • Verworfenes Player.seekToNextWindow() entfernt. Verwenden Sie stattdessen Player.seekToNextMediaItem().
    • Veraltete BaseAudioProcessor im Modul exoplayer entfernt. Verwenden Sie BaseAudioProcessor im Modul common.
    • Entfernen Sie den verworfenen MediaCodecVideoRenderer-Konstruktor MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider).

Version 1.8.0-rc02

24. Juli 2025

Verwenden Sie die stabile Version 1.8.0.

Version 1.8.0-rc01

16. Juli 2025

Verwenden Sie die stabile Version 1.8.0.

Version 1.8.0-beta01

2. Juli 2025

Verwenden Sie die stabile Version 1.8.0.

Version 1.8.0-alpha01

19. Mai 2025

Verwenden Sie die stabile Version 1.8.0.

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, die eine Alpha-Version war und versehentlich als stabil gekennzeichnet wurde (siehe unten).

Version 1.7.0

16. Mai 2025

Diese Version hätte 1.7.0-alpha01 sein sollen, wurde aber versehentlich auf maven.google. com als 1.7.0 (d.h.stabil) gekennzeichnet. Bitte verwenden Sie sie nicht. Bleiben Sie bei 1.6.1 oder führen Sie ein Upgrade auf 1.7.1 durch (mit demselben Code wie 1.6.1).

Version 1.6.0

1.6.1

14. April 2025

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

  • Common Library:
    • Methode PlaybackParameters.withPitch(float) hinzugefügt, um eine PlaybackParameters mit einem neuen pitch-Wert einfach zu kopieren (#2257).
  • ExoPlayer:
    • Problem behoben, bei dem der Übergang zwischen Mediendateien aufgrund eines behebbaren Renderer-Fehlers während der Initialisierung der nächsten Mediendatei fehlschlägt (#2229).
    • Problem behoben, bei dem ProgressiveMediaPeriod eine IllegalStateException auslöst, da PreloadMediaSource versucht, die getBufferedDurationUs() aufzurufen, bevor sie vorbereitet ist (#2315).
    • Fehler beim Senden von CmcdData in Manifestanfragen für DASH, HLS und SmoothStreaming behoben (#2253).
    • Achten Sie darauf, dass AdPlaybackState.withAdDurationsUs(long[][]) nach dem Entfernen von Anzeigengruppen verwendet werden kann. Der Nutzer muss weiterhin ein Array mit Dauern für entfernte Anzeigengruppen übergeben, das leer oder null sein kann (#2267).
  • Extraktoren:
    • MP4: alternate_group aus der tkhd-Box parsen und als Mp4AlternateGroupData-Eintrag in der Format.metadata jedes Tracks verfügbar machen (#2242).
  • Audio:
    • Problem mit der Auslagerung behoben, bei dem die Position beim Abspielen einer Playlist mit kurzen Inhalten hängen bleiben konnte (#1920).
  • Sitzung:
    • Das Zeitlimit für die Aggregation von Plattform-MediaSession-Callbacks wurde von 500 auf 100 Millisekunden gesenkt. Außerdem wurde ein experimenteller Setter hinzugefügt, mit dem Apps diesen Wert konfigurieren können.
    • Problem behoben, bei dem Benachrichtigungen wieder angezeigt wurden, nachdem sie vom Nutzer geschlossen wurden (#2302).
    • Ein Fehler wurde behoben, bei dem die Sitzung eine Zeitachse mit einem einzelnen Element zurückgegeben hat, obwohl der verpackte Player tatsächlich leer war. Dies ist der Fall, wenn der umschlossene Player COMMAND_GET_TIMELINE nicht verfügbar hat, während COMMAND_GET_CURRENT_MEDIA_ITEM verfügbar ist und der umschlossene 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.
    • Fehler behoben, bei dem PlayerSurface nicht mit einem neuen Player neu zusammengesetzt werden kann.
  • HLS-Erweiterung:
    • Problem behoben, bei dem die Blockdauer in CmcdData für HLS-Medien nicht festgelegt wurde, was zu einem Assertionsfehler bei der Verarbeitung verschlüsselter Mediensegmente führte (#2312).
  • RTSP-Erweiterung:
    • Unterstützung für URI mit RTSPT-Schema hinzugefügt, um die RTSP-Sitzung für die Verwendung von TCP zu konfigurieren (#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 ist veröffentlicht. Version 1.6.0 enthält diese Commits.

  • Common Library:
    • Fügen Sie AudioManagerCompat und AudioFocusRequestCompat hinzu, um die entsprechenden Klassen in androidx.media zu ersetzen.
    • Kotlin von 1.9.20 auf 2.0.20 aktualisieren und das Compose Compiler Gradle-Plug-in verwenden. Upgrade der KotlinX Coroutines-Bibliothek von 1.8.1 auf 1.9.0.
    • Entfernen Sie die Methode Format.toBundle(boolean excludeMetadata) und verwenden Sie stattdessen Format.toBundle().
    • Fehler in SimpleBasePlayer behoben, bei dem das Festlegen eines neuen currentMediaItemIndex in State nach setPlaylist mit null MediaMetadata die Metadaten nicht neu auswertet (#1940).
    • Der Zugriff auf SimpleBasePlayer.State wurde von „protected“ in „public“ geändert, um die Verarbeitung von 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 Vorwärmen von „ExoPlayer“ für die Wiedergabe mit MediaCodecVideoRenderer hinzugefügt. Sie können DefaultRenderersFactory über experimentalSetEnableMediaCodecVideoRendererPrewarming konfigurieren, um eine sekundäre MediaCodecVideoRenderer für ExoPlayer bereitzustellen. Wenn diese Option aktiviert ist, verarbeitet ExoPlayer das Video aufeinanderfolgender Mediendateien während der Wiedergabe vor, um die Latenz beim Übergang zwischen Mediendateien zu reduzieren.
    • Reduzieren Sie die Standardwerte für bufferForPlaybackMs und bufferForPlaybackAfterRebufferMs in DefaultLoadControl auf 1.000 bzw. 2.000 ms.
    • DeviceInfo und die Gerätelautstärke werden asynchron initialisiert (wenn sie mit setDeviceVolumeControlEnabled aktiviert wurden). Diese Werte sind nicht sofort nach ExoPlayer.Builder.build() verfügbar. Player.Listener meldet Änderungen über onDeviceInfoChanged und onDeviceVolumeChanged.
    • Die ursprüngliche Audiositzungs-ID ist nach dem Erstellen des Players nicht mehr sofort verfügbar. Mit AnalyticsListener.onAudioSessionIdChanged können Sie sich bei Bedarf das erste Update anhören.
    • Berücksichtigen Sie bei der Auswahl eines Videotracks die Sprache. Wähle standardmäßig einen „Haupt“-Videotrack aus, der der Sprache des ausgewählten Audiotracks entspricht, falls verfügbar. Explizite Spracheinstellungen für Videos können mit TrackSelectionParameters.Builder.setPreferredVideoLanguage(s) angegeben werden.
    • Fügen Sie der Methode DefaultTrackSelector.selectVideoTrack() den Parameter selectedAudioLanguage hinzu.
    • Fügen Sie den Parameter retryCount zu MediaSourceEventListener.onLoadStarted und den entsprechenden MediaSourceEventListener.EventDispatcher-Methoden hinzu.
    • Fehler behoben, bei dem Playlistelemente oder Zeiträume in DASH-Streams mit mehreren Zeiträumen, deren Dauer nicht mit dem tatsächlichen Inhalt übereinstimmt, am Ende des Elements zu eingefrorenen Frames führen konnten (#1698).
    • Verschieben Sie BasePreloadManager.Listener auf eine oberste Ebene PreloadManagerListener.
    • RenderersFactory.createSecondaryRenderer kann implementiert werden, um sekundäre Renderer für das Vorwärmen bereitzustellen. Das Vorwärmen ermöglicht schnellere Übergänge zwischen Mediendateien während der Wiedergabe.
    • Senden von CmcdData für Manifestanfragen in den adaptiven Streamingformaten DASH, HLS und SmoothStreaming aktivieren (#1951).
    • MediaCodecInfo des Codecs angeben, der in MediaCodecRenderer.onReadyToInitializeCodec initialisiert wird (#1963).
    • Ändern Sie AdsMediaSource, damit die AdPlaybackStates durch Anhängen von Anzeigengruppen vergrößert werden kann. Ungültige Änderungen werden erkannt und lösen eine Ausnahme aus.
    • Ein Problem wurde behoben, durch das nach einer Mid-Roll-Anzeige beim Übergang zu Content-Medien möglicherweise zusätzliche Nur-Decodierungs-Frames in schneller Folge angezeigt wurden.
    • Lassen Sie DefaultRenderersFactory zwei MetadataRenderer-Instanzen hinzufügen, damit Anwendungen standardmäßig zwei verschiedene Metadatenschemas empfangen können.
    • Prüfen, ob das laufende Laden eines Blocks abgebrochen werden soll, wenn die Wiedergabe pausiert wird (#1785).
    • Option zu ClippingMediaSource hinzugefügt, um das Ausschneiden von Medien ohne Suchfunktion zu ermöglichen.
    • Fehler behoben, bei dem das Suchen mit Vorwärmen den Übergang zum folgenden Medienelement blockieren konnte.
    • Fehler behoben, bei dem ExoPlayer.isLoading() weiterhin true ist, obwohl es zu STATE_IDLE oder STATE_ENDED übergegangen ist (#2133).
    • lastRebufferRealtimeMs zu LoadControl.Parameter hinzugefügt (#2113).
  • Transformer:
    • Unterstützung für das Transmuxing in alternative abwärtskompatible Formate hinzugefügt.
    • Unterstützung für das Transcodieren und Transmuxen des Dolby Vision-Formats (Profil 8) hinzugefügt.
    • Aktualisieren Sie die Parameter von VideoFrameProcessor.registerInputStream und VideoFrameProcessor.Listener.onInputStreamRegistered, um Format zu verwenden.
    • Statische HDR-Metadaten generieren, wenn DefaultEncoderFactory verwendet wird.
    • Unterstützung für die Android-Plattformdiagnose mit MediaMetricsManager aktivieren. Transformer leitet Bearbeitungsereignisse und Leistungsdaten an die Plattform weiter, die Systemleistungs- und Debugging-Informationen auf dem Gerät bereitstellt. Diese Daten können auch von Google erhoben werden, wenn die Weitergabe von Nutzungs- und Diagnosedaten vom Nutzer des Geräts aktiviert wurde. Apps können die Bereitstellung von Plattformdiagnosedaten für Transformer mit Transformer.Builder.setUsePlatformDiagnostics(false) deaktivieren.
    • InAppMuxer in InAppMp4Muxer und InAppFragmentedMp4Muxer aufteilen. Mit InAppMp4Muxer wird eine nicht fragmentierte MP4-Datei erstellt, während mit InAppFragmentedMp4Muxer eine fragmentierte MP4-Datei erstellt wird.
    • Schnittstelle Muxer von media3-muxer nach media3-transformer verschieben.
    • Fügen Sie MediaProjectionAssetLoader hinzu, um Medien aus einem MediaProjection für die Bildschirmaufzeichnung bereitzustellen, und fügen Sie der Transformer-Demo-App Unterstützung für die Bildschirmaufzeichnung hinzu.
    • Fügen Sie #getInputFormat() zur Schnittstelle Codec hinzu.
    • Übertragen Sie die Verantwortung für die Freigabe von GlObjectsProvider nach Möglichkeit auf den Aufrufer in DefaultVideoFrameProcessor und DefaultVideoCompositor.
  • Extraktoren:
    • AVI: Die Verarbeitung von Dateien mit komprimiertem Audio mit konstanter Bitrate wurde korrigiert, bei denen im Stream-Header die Anzahl der Byte anstelle der Anzahl der Chunks gespeichert wird.
    • Die Verarbeitung von NAL-Einheiten mit Längen, die in 1 oder 2 Byte (statt 4) ausgedrückt werden, wurde korrigiert.
    • ArrayIndexOutOfBoundsException in MP4-Bearbeitungslisten wurde korrigiert, wenn die Bearbeitungsliste bei einem Nicht-Synchronisierungsframe ohne vorherigen Synchronisierungsframe 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 nicht mit IllegalStateException: Playback stuck buffering and not loading abgespielt werden (#2197).
  • Audio:
    • onAudioPositionAdvancing wird jetzt aufgerufen, wenn die Wiedergabe fortgesetzt wird (zuvor wurde es aufgerufen, wenn die Wiedergabe pausiert wurde).
    • Umgehen Sie SonicAudioProcessor nicht, wenn SpeedChangingAudioProcessor mit Standardparametern konfiguriert ist.
    • Unterlauf in Sonic#getOutputSize() behoben, der dazu führen konnte, dass DefaultAudioSink hängen blieb.
    • Korrigiere MediaCodecAudioRenderer.getDurationToProgressUs() und DecoderAudioRenderer.getDurationToProgressUs(), damit die angegebenen Dauern beim Suchen korrekt zurückgesetzt werden.
    • androidx.media3.common.audio.SonicAudioProcessor als endgültig festlegen.
    • Unterstützung für Float-PCM zu ChannelMappingAudioProcessor und TrimmingAudioProcessor hinzugefügt.
  • Video:
    • MediaCodecVideoRenderer.shouldUsePlaceholderSurface wurde in „protected“ geändert, damit Anwendungen die Verwendung von Platzhalteroberflächen überschreiben und blockieren können (#1905).
    • Experimentelles Parsen von ExoPlayer-AV1-Beispielabhängigkeiten hinzugefügt, um die Suche zu beschleunigen. Aktivieren Sie sie mit der neuen DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies API.
    • Experimentelle ExoPlayer API hinzugefügt, um verspätete MediaCodecVideoRenderer-Decoder-Eingabepuffer zu verwerfen, von denen keine Abhängigkeiten bestehen. Aktivieren Sie sie mit DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * Problem behoben, bei dem ein Player ohne Oberfläche sofort bereit war und die Decodierung ausstehender Frames sehr langsam war (#1973).
    • Xiaomi- und OPPO-Geräte vom Modus für getrennte Oberflächen ausschließen, um Bildschirmflackern zu vermeiden (#2059).
  • Text:
    • Unterstützung für VobSub-Untertitel hinzugefügt (#8260).
    • Es werden nicht mehr alle mit MediaItem.Builder.setSubtitleConfigurations konfigurierten Untertiteldateien vorab geladen. Stattdessen wird nur eine geladen, wenn sie über die Trackauswahl ausgewählt wird (#1721).
    • TTML: Unterstützung für das Verweisen auf tts:origin und tts:extent mit style hinzugefügt (#2953).
    • Beschränken Sie WebVTT- und SubRip-Zeitstempel auf genau drei Dezimalstellen. Zuvor wurden beliebig viele Dezimalstellen falsch geparst, aber es wurde immer davon ausgegangen, dass der Wert in Millisekunden angegeben ist, was zu falschen Zeitstempeln führte (#1997).
    • Es wurde ein Problem behoben, bei dem die Wiedergabe hängen blieb, wenn eine Playlist gekürzte Elemente mit CEA-608- oder CEA-708-Untertiteln enthielt.
    • IllegalStateException wurde korrigiert, wenn eine SSA-Datei einen Cue mit einer Dauer von null enthält (Start- und Endzeit gleich) (#2052).
    • Unterdrücken (und protokollieren) von Fehlern beim Parsen von Untertiteln, wenn Untertitel in denselben Container wie Audio und Video gemuxt werden (#2052).
    • Die Verarbeitung von Multibyte-UTF-8-Zeichen in WebVTT-Dateien mit CR-Zeilenenden wurde korrigiert (#2167).
  • DRM:
    • Fehler MediaCodec$CryptoException: Operation not supported in this configuration bei der Wiedergabe von ClearKey-Inhalten auf Geräten mit API < 27 behoben (#1732).
  • Auswirkung:
    • Die Funktionalität von OverlaySettings wurde in StaticOverlaySettings verschoben. OverlaySettings kann abgeleitet werden, um dynamische Overlay-Einstellungen zu ermöglichen.
  • Muxer:
    • MuxerException wurde aus der Schnittstelle Muxer verschoben, 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.
    • Fehler in FragmentedMp4Muxer behoben, der viele Fragmente erzeugt, wenn nur ein Audiotrack geschrieben wird.
  • Sitzung:
    • Der Status des Dienstes im Vordergrund wird für weitere 10 Minuten beibehalten, wenn die Wiedergabe pausiert, beendet oder abgebrochen wird. So können Nutzer die Wiedergabe innerhalb dieses Zeitlimits fortsetzen, ohne dass auf verschiedenen Geräten Einschränkungen für Dienste im Vordergrund gelten. Beachten Sie, dass der Aufruf von player.pause() nicht mehr verwendet werden kann, um den Dienst im Vordergrund vor stopSelf() zu beenden. Wenn Sie onTaskRemoved überschreiben, verwenden Sie stattdessen MediaSessionService.pauseAllPlayersAndStopSelf().
    • Die Benachrichtigung bleibt sichtbar, wenn die Wiedergabe in einen Fehler- oder Beendigungsstatus 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, sodass nur eine davon gemäß den verfügbaren Befehlen festgelegt wird und auch akzeptiert wird, wenn nur eine davon festgelegt ist.
    • Context als Parameter zu MediaButtonReceiver.shouldStartForegroundService hinzugefügt (#1887).
    • Fehler behoben, bei dem durch den Aufruf einer Player-Methode für eine MediaController, die mit einer Legacy-Sitzung verbunden ist, Änderungen aus einem ausstehenden Update verworfen wurden.
    • MediaSession.setSessionActivity(PendingIntent) akzeptiert jetzt Nullwerte (#2109).
    • Fehler behoben, bei dem eine veraltete Benachrichtigung sichtbar blieb, wenn die Playlist gelöscht wurde (#2211).
  • UI:
    • Fügen Sie dem Modul media3-ui-compose State Holder und Composables für PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState und PlaybackSpeedState hinzu.
  • Downloads:
    • Fehler in CacheWriter behoben, durch den Datenquellen geöffnet und Cachebereiche gesperrt bleiben, wenn die Datenquelle eine andere Exception als IOException ausgibt (#9760).
  • HLS-Erweiterung:
    • Fügen Sie eine erste Version von HlsInterstitialsAdsLoader hinzu. Der Anzeigen-Loader liest die HLS-Interstitials einer HLS-Medien-Playlist und ordnet sie dem AdPlaybackState zu, der an den 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 eine HlsInterstitialsAdsLoader auf bequeme und sichere Weise verwenden.
    • SUPPLEMENTAL-CODECS-Tag aus der HLS-Playlist parsen, um Dolby Vision-Formate zu erkennen (#1785).
    • Die Bedingung für das Suchen nach Synchronisierungspositionen in einem HLS-Stream wurde gelockert (#2209).
  • DASH-Erweiterung:
    • Unterstützung für das AC-4-Level-4-Format für DASH hinzugefügt (#1898).
    • Problem bei der Berechnung des Aktualisierungsintervalls für das Einfügen von Anzeigen in Livestreams mit mehreren Zeiträumen behoben (#1698).
    • Das Attribut scte214:supplementalCodecs aus dem DASH-Manifest parsen, um Dolby Vision-Formate zu erkennen (#1785).
    • Verbesserte Verarbeitung von Periodenübergängen in Livestreams, bei denen die Periode Medien-Samples enthält, die über die deklarierte Periodendauer hinausgehen (#1698).
    • Ein Problem wurde behoben, bei dem Adaptationssets, die mit adaptation-set-switching gekennzeichnet sind, aber unterschiedliche Sprachen oder Rollen-Flags haben, zusammengeführt werden (#2222).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Das MPEG-H-Decoder-Modul 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:
    • Die play-services-cast-framework-Abhängigkeit wurde auf 21.5.0 erhöht, um einen FLAG_MUTABLE-Absturz in Apps zu beheben, die auf API 34 oder höher auf Geräten mit installierten, aber deaktivierten Google Play-Diensten ausgerichtet sind (#2178).
  • Demo-App:
    • demo-compose wird um zusätzliche Tasten erweitert und die Integration von PlayerSurface wird durch Skalierung und Unterstützung für Rollläden verbessert.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Die veraltete Methode AudioMixer.create() wurde entfernt. Verwenden Sie stattdessen DefaultAudioMixer.Factory().create().
    • Entfernen Sie die folgenden verworfenen 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(), legen Sie den Videoeffekt in einem EditedMediaItem.Builder.setEffects() fest und übergeben Sie ihn stattdessen an Transformer.start().
      • setRemoveAudio(), verwenden Sie stattdessen EditedMediaItem.Builder.setRemoveAudio(), um die Audioinhalte aus dem EditedMediaItem zu entfernen, der an Transformer.start() übergeben wird.
      • setRemoveVideo(): Verwende stattdessen EditedMediaItem.Builder.setRemoveVideo(), um das Video aus dem EditedMediaItem zu entfernen, der an Transformer.start() übergeben wird.
      • setFlattenForSlowMotion(): Verwenden Sie stattdessen EditedMediaItem.Builder.setFlattenForSlowMotion(), um die an Transformer.start() übergebene EditedMediaItem zu vereinfachen.
      • setListener(), verwenden Sie stattdessen addListener(), removeListener() oder removeAllListeners().
    • Entfernen Sie die folgenden verworfenen 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), verwende stattdessen onError(Composition, ExportResult, ExportException).
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), verwende stattdessen onFallbackApplied(Composition, TransformationRequest, TransformationRequest).
    • Entfernen Sie die verworfene Klasse TransformationResult. Verwenden Sie stattdessen ExportResult.
    • Entfernen Sie die verworfene Klasse TransformationException. Verwenden Sie stattdessen ExportException.
    • Entfernen Sie das verworfene Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Verwenden Sie stattdessen Transformer.PROGRESS_STATE_NOT_STARTED.
    • Entfernen Sie das verworfene Transformer.setListener(). Verwenden Sie stattdessen Transformer.addListener(), Transformer.removeListener() oder Transformer.removeAllListeners().
    • Entfernen Sie das verworfene Transformer.startTransformation(). Verwenden Sie stattdessen Transformer.start(MediaItem, String).
    • Entfernen Sie das verworfene SingleFrameGlShaderProgram. Verwenden Sie stattdessen BaseGlShaderProgram.
    • Transformer.flattenForSlowMotion entfernen. Verwenden Sie stattdessen EditedMediaItem.flattenForSlowMotion.
    • ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent und ExoPlayer.DeviceComponent wurden entfernt.
    • androidx.media3.exoplayer.audio.SonicAudioProcessor wurde entfernt.
    • Die folgenden verworfenen DownloadHelper-Methoden wurden entfernt:
      • Konstruktor DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), verwenden Sie stattdessen DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList).
      • getRendererCapabilities(RenderersFactory): Eine entsprechende Funktionalität kann durch Erstellen eines DefaultRendererCapabilitiesList mit einem RenderersFactory und Aufrufen von DefaultRendererCapabilitiesList.getRendererCapabilities() erreicht werden.
      • Methode PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat) 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 ist veröffentlicht. Version 1.5.1 enthält diese Commits.

  • ExoPlayer:
    • Die Verwendung der asynchronen Entschlüsselung in MediaCodec wurde deaktiviert, um gemeldete Probleme mit Codec-Zeitüberschreitungen bei dieser Plattform-API zu vermeiden (#1641).
  • Extraktoren:
    • MP3: Die Wiedergabe wird nicht vorzeitig beendet, 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 Pixel-Seitenverhältnis, wenn diese bei der Verarbeitung von onOutputFormatChanged angegeben werden (#1371).
  • Text:
    • Fehler in ReplacingCuesResolver.discardCuesBeforeTimeUs behoben, bei dem der bei timeUs aktive Cue (vorher gestartet, aber noch nicht beendet) fälschlicherweise verworfen wurde (#1939).
  • Metadaten:
    • Disc-/Titelnummerierung und Genre aus Vorbis-Kommentaren in MediaMetadata extrahieren (#1958).

Version 1.5.0

27. November 2024

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

  • Common Library:
    • ForwardingSimpleBasePlayer hinzugefügt, mit dem die Weiterleitung an einen anderen Player mit kleinen Anpassungen möglich ist, wobei die vollständige Konsistenz und die Listener-Verarbeitung gewährleistet sind (#1183).
    • Ersetzen Sie SimpleBasePlayer.State.playlist durch die Methode getPlaylist().
    • Fügen Sie eine Überschreibung für SimpleBasePlayer.State.Builder.setPlaylist() hinzu, um direkt einen Timeline und die aktuellen Tracks und Metadata anzugeben, anstatt eine Playlist-Struktur zu erstellen.
    • Erhöhen Sie minSdk auf 21 (Android Lollipop). Dies entspricht allen anderen AndroidX-Bibliotheken.
    • Fügen Sie das Artefakt androidx.media3:media3-common-ktx hinzu, das Kotlin-spezifische Funktionen auf Basis der Common-Bibliothek bietet.
    • Fügen Sie der media3-common-ktx-Bibliothek die suspend-Erweiterungsfunktion Player.listen hinzu, um eine Koroutine zu starten, die auf Player.Events wartet.
    • Entfernen Sie @DoNotInline-Annotationen aus manuell ausgelagerten inneren Klassen, die dazu dienen, Fehler bei der Klassenprüfung zur Laufzeit zu vermeiden. In aktuellen Versionen von R8 werden solche Aufrufe jetzt automatisch ausgelagert, um Laufzeitfehler zu vermeiden. Eine manuelle Auslagerung ist also nicht mehr erforderlich. Alle Gradle-Nutzer der Bibliothek müssen bereits eine Version des Android-Gradle-Plug-ins verwenden, die eine Version von R8 verwendet, die dies tut, aufgrund von compileSdk = 35. Nutzer der Bibliothek mit Build-Systemen, die nicht auf Gradle basieren, müssen dafür sorgen, dass der R8-äquivalente Schritt zur Verkleinerung/Verschleierung einen ähnlichen automatischen Out-of-Lining-Prozess durchführt, um Fehler bei der Klassenüberprüfung zur Laufzeit zu vermeiden. Diese Änderung wurde bereits in anderen AndroidX-Bibliotheken vorgenommen.
  • ExoPlayer:
    • MediaCodecRenderer.onProcessedStreamChange() kann jetzt für jede Mediendatei 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 Aktionen ausführen können, wenn ein Fehler auftritt.
    • Fügen Sie BasePreloadManager.Listener hinzu, um Vorablade-Ereignisse an Apps weiterzugeben.
    • Änderung des SNTP-Client-Timeouts und Wiederholung alternativer Adressen bei Timeout zulassen (#1540).
    • Entfernen Sie MediaCodecAdapter.Configuration.flags, da das Feld immer null war.
    • Nutzer können den integrierten Lautsprecher für die Wiedergabe auf Wear OS API 35+ auswählen (sofern das Gerät dies unterstützt).
    • Verschieben Sie den blockierenden Aufruf von Context.getSystemService(Context.AUDIO_SERVICE), bis die Verarbeitung des Audiofokus aktiviert ist. Dadurch wird sichergestellt, dass der blockierende Aufruf nicht ausgeführt wird, wenn die Verarbeitung des Audiofokus nicht aktiviert ist (#1616).
    • Wiedergabe unabhängig von der zwischengespeicherten Dauer zulassen, wenn das Laden fehlschlägt (#1571).
    • Füge AnalyticsListener.onRendererReadyChanged() hinzu, um zu signalisieren, wann einzelne Renderer die Wiedergabe erlauben.
    • Es wurde ein Problem behoben, bei dem MediaCodec.CryptoException manchmal als „unerwarteter Laufzeitfehler“ gemeldet wurde, wenn MediaCodec im asynchronen Modus ausgeführt wurde (Standardverhalten bei API 31+).
    • Ü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 einen Wert übergeben, der eine bestimmte Dauer ab der Standardstartposition darstellt, für die die entsprechende Medienquelle mit diesem IntDef anstelle einer Position vorab geladen werden muss.
    • ForwardingRenderer-Implementierung hinzugefügt, die alle Methodenaufrufe an einen anderen Renderer weiterleitet (1703).
    • Vorabladen der Playlist für das nächste Element in der Playlist hinzufügen. Apps können das Vorabladen aktivieren, indem sie ExoPlayer.setPreloadConfiguration(PreloadConfiguration) entsprechend aufrufen. Standardmäßig ist das Vorabladen deaktiviert. Wenn die Funktion aktiviert ist, wird das Vorabladen durch DefaultLoadControl eingeschränkt, damit die Wiedergabe nicht beeinträchtigt wird. Das Vorabladen wird nur gestartet und fortgesetzt, wenn der Player nicht für die Wiedergabe lädt. Apps können dieses Verhalten ändern, indem sie LoadControl.shouldContinuePreloading() entsprechend implementieren (z. B. wenn diese Methode in DefaultLoadControl überschrieben wird). Die Standardimplementierung von LoadControl deaktiviert das Vorabladen, wenn eine App eine benutzerdefinierte Implementierung von LoadControl verwendet.
    • Methode MediaSourceEventListener.EventDispatcher.dispatchEvent() hinzugefügt, um das Aufrufen von Ereignissen von Unterklassen-Listenern zu ermöglichen (1736).
    • Fügen Sie DefaultPreloadManager.Builder hinzu, um die Instanzen DefaultPreloadManager und ExoPlayer mit einheitlichen, gemeinsam genutzten Konfigurationen zu erstellen.
    • Der Parameter Renderer[] wurde aus LoadControl.onTracksSelected() entfernt, da die DefaultLoadControl-Implementierung die Streamtypen aus ExoTrackSelection[] abrufen kann.
    • DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) wurde verworfen und die Methode wurde als „final“ markiert, um Überschreibungen zu verhindern. Stattdessen sollte die neue DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]) verwendet werden.
    • 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) Ereignisse für den Start, Fehler, Abbruch und Abschluss des Ladevorgangs gemeldet werden. Diese können als doppelte Ladeereignisse von AnalyticsListener angezeigt werden.
    • Verhindern, dass Untertitel- und Metadatenfehler die Wiedergabe vollständig stoppen. Stattdessen wird der problematische Track deaktiviert und die Wiedergabe der verbleibenden Tracks wird fortgesetzt (#1722).
      • Bei der neuen Untertitelverarbeitung (während der Extraktion) werden zugehörige Parsing-Fehler (z.B. ungültige Untertiteldaten) und Ladefehler (z.B. HTTP 404) über onLoadError-Callbacks ausgegeben.
      • Bei der alten Untertitelverarbeitung (während des Renderings) werden nur zugehörige Ladefehler über onLoadError-Callbacks ausgegeben, während Parsing-Fehler stillschweigend ignoriert werden (dies ist das bisherige Verhalten).
    • Fehler behoben, bei dem Playlistelemente oder Zeiträume in DASH-Streams mit mehreren Zeiträumen, deren Dauer nicht mit dem tatsächlichen Inhalt übereinstimmt, am Ende des Elements zu eingefrorenen Frames führen konnten (#1698).
    • SntpClient wurde ein Setter hinzugefügt, um die maximale verstrichene Zeit seit dem letzten Update festzulegen, nach der der Client neu initialisiert wird (#1794).
  • Transformer:
    • Füge SurfaceAssetLoader hinzu, um Videodaten über einen Surface in die Warteschlange für Transformer zu stellen.
    • ImageAssetLoader meldet nicht unterstützte Eingaben über AssetLoader.onError, anstatt eine IllegalStateException auszugeben.
    • Die Festlegung der Bilddauer mit MediaItem.Builder.setImageDurationMs für den Bildexport obligatorisch machen.
    • Unterstützung für den Export von Lücken in Sequenzen von Audio-EditedMediaItems hinzugefügt
  • Titelauswahl:
    • DefaultTrackSelector: Objektbasiertes Audio wird gegenüber kanalbasierter Audio bevorzugt, wenn andere Faktoren gleich sind.
  • Extraktoren:
    • Ermöglicht Mp4Extractor und FragmentedMp4Extractor, H264-Samples zu identifizieren, die von nachfolgenden Samples nicht als Referenz 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 abgeschnitten (statt ungültig) behandelt. Das bedeutet, dass die Wiedergabe von Dateien mit Nicht-MP3-Daten am Ende, die keine anderen Metadaten zur Angabe der Länge der MP3-Bytes enthalten, jetzt am Ende der MP3-Daten beendet wird, anstatt mit ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} fehlzuschlagen (#1563).
    • Fehlerbehebung bei der Verarbeitung von Preroll-Beispielen für Medienstartpositionen, die keine Keyframes sind, wenn Bearbeitungslisten in MP4-Dateien verarbeitet werden (#1659).
    • Verbesserte Berechnung der Framerate durch Verwendung der Mediendauer aus der mdhd-Box in Mp4Extractor und FragmentedMp4Extractor (#1531).
    • Falsche Skalierung von media_time in MP4-Bearbeitungslisten wurde korrigiert. 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 mit Bearbeitungsliste (#1797).
    • Fehler beim Parsen der Mediendauer im mdhd-Feld von MP4-Dateien behoben, um -1-Werte zu verarbeiten (#1819).
    • Unterstützung für die Identifizierung der h263-Box in MP4-Dateien für H.263-Videos hinzugefügt (#1821).
    • Unterstützung für das ISO-Basismediendateiformat AC-4 Level-4 hinzugefügt (#1265).
  • DataSource:
    • HttpEngineDataSource wurde aktualisiert, um die Verwendung ab Version S-Erweiterung 7 anstelle von API-Level 34 zu ermöglichen (#1262).
    • DataSourceContractTest: Bestätigen Sie, dass DataSource.getUri() den aufgelösten URI zurückgibt (wie dokumentiert). Wenn sich dieser vom angeforderten URI unterscheidet, können Tests dies mit der neuen Methode DataSourceContractTest.TestResource.Builder.setResolvedUri() angeben.
    • DataSourceContractTest: Bestätigen Sie, dass DataSource.getUri() und getResponseHeaders() nach einem fehlgeschlagenen Aufruf von open() (aufgrund einer nicht gefundenen Ressource) und vor einem nachfolgenden Aufruf von close() den Wert „open“ zurückgeben.
      • Durch das Ü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:
    • CTA-2075-Lautstärke-Metadaten werden automatisch im Codec konfiguriert, wenn sie in den Medien vorhanden sind.
    • Achte darauf, dass die Lautstärke beim Suchen gleichmäßig abnimmt.
    • Behebung von Knackgeräuschen, die beim Suchen auftreten können.
    • Fehler bei der Akkumulation von Kürzungen für den Algorithmus zur Zeitdehnung/Tonhöhenverschiebung von Sonic behoben.
    • Fehler in SpeedChangingAudioProcessor behoben, der dazu führte, dass Ausgabeframes verloren gingen.
  • Video:
    • MediaCodecVideoRenderer vermeidet das Decodieren von Samples, die weder gerendert noch von anderen Samples als Referenz verwendet werden.
    • Ab API 35 kann MediaCodecAdapter jetzt ein null Surface in configure empfangen und eine neue Methode detachOutputSurface aufrufen, um ein zuvor festgelegtes Surface zu entfernen, wenn der Codec dies unterstützt (MediaCodecInfo.detachedSurfaceSupported).
    • Verwenden Sie die von MediaCodecAdapter bereitgestellten Werte für das Pixel-Seitenverhältnis, wenn diese bei der Verarbeitung von onOutputFormatChanged angegeben werden (#1371).
    • 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).
    • Problemumgehung für Codecs hinzugefügt, die nach dem letzten Sample hängen bleiben, ohne ein Signal für das Ende des Streams zurückzugeben.
  • Text:
    • Benutzerdefiniertes VoiceSpan hinzugefügt und für WebVTT-Sprachspannen ausgefüllt (#1632).
    • Es wurde dafür gesorgt, 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).
    • Fehler behoben, bei dem die Wiedergabe bei DASH-Multi-Period-Streams hängen blieb, wenn CEA-608-Untertitel aktiviert waren (#1863).
  • Metadaten:
    • Weise den Typ C.TRACK_TYPE_METADATA Tracks zu, die icy- oder vnd.dvb.ait-Inhalte enthalten.
  • Bild:
    • Fügen Sie ExternallyLoadedImageDecoder hinzu, um die Einbindung in externe Bibliotheken zum Laden von Bildern wie Glide oder Coil zu vereinfachen.
  • DataSource:
    • FileDescriptorDataSource hinzugefügt, ein neues DataSource, das zum Lesen aus einem FileDescriptor verwendet werden kann (#3757).
  • Auswirkung:
    • DefaultVideoFrameProcessor-Problemumgehung für geringfügige SurfaceTexture-Skalierung hinzugefügt. SurfaceTexture kann eine kleine Skalierung enthalten, die einen 1-Texel-Rand um den Rand eines zugeschnittenen Puffers abschneidet. Dies wird jetzt so gehandhabt, dass die Ausgabe näher an der Erwartung liegt.
    • DefaultVideoFrameProcessor.queueInputBitmap() beschleunigen. Daher ist der Export von Bildern in Videos mit Transformer schneller.
  • IMA-Erweiterung:
    • Fehler behoben, bei dem das Löschen der Playlist zu einem ArrayIndexOutOfBoundsException in ImaServerSideAdInsertionMediaSource führen kann.
    • Fehler behoben, bei dem serverseitig eingefügte DAI-Streams ohne Preroll-Anzeige zu einem ArrayIndexOutOfBoundsException führen können, wenn die Wiedergabe über die letzte Midroll-Anzeige hinausgeht (#1741).
  • Sitzung:
    • Füge MediaButtonReceiver.shouldStartForegroundService(Intent) hinzu, damit Apps einen eingehenden Wiedergabebefehl zur Fortsetzung 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 abstürzt (#1528).
    • Ein Fehler wurde behoben, durch den benutzerdefinierte Befehle, die von einem MediaBrowser gesendet wurden, an die Variante MediaSessionCompat.Callback statt an die Variante MediaBrowserServiceCompat der Methode gesendet wurden, wenn eine Verbindung zu einem Legacy-Dienst bestand. Dadurch konnte der MediaBrowser nicht den tatsächlichen Rückgabewert empfangen, der vom Legacy-Dienst zurückgegeben wurde (#1474).
    • Behandlung von IllegalArgumentException, die von Geräten bestimmter Hersteller ausgelöst wird, wenn der Übertragungsempfänger für Intents von Medienschaltflächen festgelegt wird (#1730).
    • Befehlsschaltflächen für Mediendateien hinzufügen Dadurch wird die Media3 API für das hinzugefügt, was in der Legacy-Bibliothek als Custom browse actions mit MediaBrowserCompat bezeichnet wurde. Beachte, dass mit Media3 Befehlsschaltflächen für Medienelemente sowohl für MediaBrowser als auch für MediaController verfügbar sind. Weitere Informationen finden Sie unter Benutzerdefinierte Suchaktionen implementieren. * Fehler behoben, bei dem ein Media3-Controller manchmal nicht zulassen konnte, dass eine Sitzungs-App nach dem Anfordern von play() einen Dienst im Vordergrund startet.
    • CommandButton.Builder.setIconUri so einschränken, dass nur Inhalts-URIs akzeptiert werden.
    • Verbindungshinweise eines Media3-Browsers an den ursprünglichen MediaBrowserCompat übergeben, wenn eine Verbindung zu einem Legacy-MediaBrowserCompat hergestellt wird. Der Dienst kann die Verbindungshinweise, die als Root-Hinweise übergeben werden, mit dem ersten Aufruf von onGetRoot() empfangen.
    • Fehler behoben, bei dem ein MediaBrowser, der mit einem Legacy-Browserdienst verbunden war, keinen vom Dienst gesendeten Fehler erhielt, nachdem der Browser ein parentid abonniert hatte.
    • Verbesserung des Interoperabilitätsverhaltens, sodass ein Media3-Browser, der mit einem Legacy-MediaBrowserService verbunden ist, die untergeordneten Elemente eines parentId nicht zweimal anfordert, wenn er ein übergeordnetes Element abonniert.
  • UI:
    • Das gestreckte/zugeschnittene Video in der Problemumgehung PlayerView-in-Compose-AndroidView muss aufgrund von Problemen mit XML-basierten gemeinsamen Übergängen aktiviert werden. Apps, die PlayerView innerhalb von AndroidView verwenden, müssen PlayerView.setEnableComposeSurfaceSyncWorkaround aufrufen, um die Funktion zu aktivieren (#1237, #1594).
    • setFullscreenButtonState wurde zu PlayerView hinzugefügt, um bei Bedarf Aktualisierungen des Symbols für die Vollbildschaltfläche zu ermöglichen, d.h. Out-of-Band und nicht reaktiv auf eine Klickinteraktion (#1590, #184).
    • Es wurde ein Fehler behoben, bei dem die Option „Keine“ in der Textauswahl nicht funktionierte, wenn in der App Einstellungen für die Auswahl von Texttracks definiert waren.
  • DASH-Erweiterung:
    • Unterstützung für Perioden hinzugefügt, die in der Mitte eines Segments beginnen (#1440).
  • Smooth Streaming-Erweiterung:
    • Behebung eines Bad magic number for Bundle-Fehlers bei der Wiedergabe von SmoothStreaming-Streams mit Texttracks (#1779).
  • RTSP-Erweiterung:
    • Fehler beim Entfernen von Nutzerinformationen für URLs mit codierten @-Zeichen behoben (#1138).
    • Abstürze beim Parsen von RTP-Paketen mit Header-Erweiterungen wurden behoben (#1225).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Das IAMF-Decodermodul wurde hinzugefügt. Es unterstützt die Wiedergabe von MP4-Dateien mit IAMF-Tracks mithilfe der nativen libiamf-Bibliothek, um Audio zu synthetisieren.
      • Die Wiedergabe ist mit einem Stereolayout sowie 5.1 mit Spatial Audio und optionaler Erfassung von Kopfbewegungen möglich. Die binaurale Wiedergabe wird derzeit jedoch nicht unterstützt.
    • Unterstützung für 16‑KB-Seiten für Decoder-Erweiterungen unter Android 15 hinzugefügt (#1685).
  • Cast-Erweiterung:
    • Die Zeitachse wird nicht mehr bereinigt, nachdem die CastSession getrennt wurde. Dadurch kann die Sender-App die Wiedergabe nach einer Trennung lokal fortsetzen.
    • DeviceInfo von CastPlayer wird ausgefüllt, wenn ein Context angegeben ist. Dadurch kann der MediaSession mit einem RoutingSession verknüpft werden, was für die Einbindung des Ausgabewechslers (#1056) erforderlich ist.
  • Testdienstprogramme:
    • DataSourceContractTest enthält jetzt Tests zur Überprüfung von:
      • Der Eingabestream read position wurde aktualisiert.
      • Der Ausgabepuffer offset wird korrekt angewendet.
  • Demo-App
    • Speicherlecks in der Demo-App für Kurzvideos behoben (#1839).
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Entfernen Sie die veralteten Player.hasPrevious, Player.hasPreviousWindow(). Verwenden Sie stattdessen Player.hasPreviousMediaItem().
    • Entfernen Sie die veraltete Methode Player.previous(). Verwenden Sie stattdessen Player.seekToPreviousMediaItem().
    • Die veraltete Methode DrmSessionEventListener.onDrmSessionAcquired wurde entfernt.
    • Nicht mehr unterstützte DefaultEncoderFactory-Konstruktoren wurden entfernt. 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 ist veröffentlicht. Version 1.4.1 enthält diese Commits.

  • ExoPlayer:
    • Preload-Callbacks in PreloadMediaSource asynchron verarbeiten (#1568).
    • Wiedergabe unabhängig von der zwischengespeicherten Dauer zulassen, wenn das Laden fehlschlägt (#1571).
  • Extraktoren:
    • MP3: Der Fehler Searched too many bytes wurde behoben, indem nachfolgende Nicht-MP3-Daten basierend auf dem Längenfeld in einem Info-Frame korrekt ignoriert werden (#1480).
  • Text:
    • TTML: Die Verarbeitung von prozentualen tts:fontSize-Werten wurde korrigiert, damit sie korrekt von übergeordneten Knoten mit prozentualen tts:fontSize-Werten übernommen werden.
    • Fehler IndexOutOfBoundsException in LegacySubtitleUtil behoben, der durch die fehlerhafte Verarbeitung des Falls verursacht wurde, dass die angeforderte Ausgabe-Startzeit größer oder gleich der letzten Ereigniszeit in der Subtitle ist (#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, die L1-Widevine-Inhalte wiedergeben, wurde behoben. Dieser Fehler wird durch eine unvollständige Implementierung der Framework-Methode MediaDrm.requiresSecureDecoder verursacht (#1603).
  • Auswirkung:
    • Fügen Sie GlObjectsProvider eine release()-Methode hinzu.
  • Sitzung:
    • Doppeltippen auf KEYCODE_HEADSETHOOK wird in die Aktion „Zum nächsten Element springen“ umgewandelt, wie dokumentiert (#1493).
    • KEYCODE_HEADSETHOOK wird in MediaButtonReceiver als „play“-Befehl behandelt, wenn entschieden wird, ob er ignoriert werden soll, um einen ForegroundServiceDidNotStartInTimeException zu vermeiden (#1581).
  • RTSP-Erweiterung:
    • Ungültige Medienbeschreibungen beim SDP-Parsing überspringen (#1087).

Version 1.4.0

25. Juli 2024

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

  • Common Library:
    • Leite 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.
    • Kompilierungsabhängigkeit von der erweiterten Java 8-Entzuckerung 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 von der Anwendung bereitgestellte benutzerdefinierte Informationen zu Format-Instanzen zu speichern.
  • ExoPlayer:
    • Fügen Sie BasePreloadManager hinzu, um das Vorabladen für mehrere Quellen basierend auf den durch ihre rankingData definierten Prioritäten zu koordinieren. Anpassungen sind durch Erweitern dieser Klasse möglich. Füge DefaultPreloadManager hinzu, das PreloadMediaSource verwendet, um Medienbeispiele der Quellen im Arbeitsspeicher vorab zu laden, und eine Ganzzahl rankingData verwendet, die den Index eines Elements auf der Benutzeroberfläche angibt.
    • PlayerId wurde den meisten Methoden von LoadControl hinzugefügt, damit LoadControl-Implementierungen mehrere Spieler unterstützen können.
    • Entfernen Sie Buffer.isDecodeOnly() und C.BUFFER_FLAG_DECODE_ONLY. Dieses Flag muss nicht festgelegt werden, da Renderer und Decoder anhand des Zeitstempels entscheiden, ob Puffer übersprungen werden sollen. Benutzerdefinierte Renderer-Implementierungen sollten prüfen, ob die Pufferzeit mindestens BaseRenderer.getLastResetPositionUs() beträgt, um zu entscheiden, ob ein Sample angezeigt werden soll. Benutzerdefinierte SimpleDecoder-Implementierungen können bei Bedarf isAtLeastOutputStartTimeUs() prüfen oder andere Puffer mit DecoderOutputBuffer.shouldBeSkipped markieren, um sie zu überspringen.
    • Lassen Sie zu, dass von TargetPreloadStatusControl.getTargetPreloadStatus(T) ein Nullwert zurückgegeben wird, um anzugeben, dass ein MediaSource mit der angegebenen rankingData nicht vorab geladen werden soll.
    • Fügen Sie remove(MediaSource) zu BasePreloadManager hinzu.
    • Fügen Sie reset() zu BasePreloadManager hinzu, um alle Quellen im Haltezustand freizugeben, während die PreloadManager-Instanz beibehalten wird.
    • 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 beim Aktualisieren 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 DefaultPreloadManager- und die benutzerdefinierten PreloadMediaSource.PreloadControl-Implementierungen die nächste Quelle vorab laden oder andere Aktionen ausführen.
    • Fehler behoben, bei dem das Überspringen von Stille am Ende von Elementen eine Wiedergabeausnahme auslösen konnte.
    • Fügen Sie clear zu PreloadMediaSource hinzu, um den Vorabladezeitraum zu verwerfen.
    • Neuer Fehlercode PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED hinzugefügt, der verwendet wird, wenn Codec-Ressourcen für Aufgaben mit höherer Priorität zurückgefordert werden.
    • AdsMediaSource kann Pre-Roll-Anzeigen laden, bevor die Vorbereitung der ersten Content-Medien abgeschlossen ist (#1358).
    • Ein Fehler wurde behoben, durch den die Wiedergabe auf STATE_ENDED verschoben wurde, 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 die CPU-Aktivierungszyklen anzupassen und die Aktivierung zu verzögern, bis die Renderer fortfahren können. Sie können dies beim Einrichten Ihrer ExoPlayer-Instanz mit experimentalSetDynamicSchedulingEnabled() aktivieren.
    • Fügen Sie Renderer.getDurationToProgressUs() hinzu. Ein Renderer kann diese Methode implementieren, um ExoPlayer die Dauer zurückzugeben, die die Wiedergabe voranschreiten muss, damit der Renderer Fortschritte macht. 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 Eingabe- und Ausgabepuffer für MediaCodecRenderer verfügbar sind. MediaCodecRenderer signalisiert ExoPlayer, wenn diese Callbacks empfangen werden. Wenn ExoPlayer mit experimentalSetDynamicSchedulingEnabled() festgelegt ist, plant ExoPlayer die Arbeitsschleife, 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üge ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() hinzu, um die maximale Position zu konfigurieren, für die seekToPrevious() zum vorherigen Element springt (#1425).
    • Behebung einiger Inkonsistenzen beim Audiofokus, z.B. dass der vollständige oder vorübergehende Verlust des Fokus nicht gemeldet wird, während der Player pausiert ist (#1436).
    • Behebung potenzieller IndexOutOfBoundsException, die durch Extraktoren verursacht werden, die nach dem ersten Vorbereitungsschritt zusätzliche Tracks melden (#1476).
    • Effects in ExoPlayer.setVideoEffect() erhält die Zeitstempel ohne den Renderer-Offset (#1098).
    • Potenzielle IllegalArgumentException beim Umgang mit Spielerfehlern behoben, die beim Vorauslesen in ein anderes Playlist-Element 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 Trim-Optimierung wurden gelockert.
    • Unterstützung für den Wechsel zwischen SDR- und HDR-Eingabemedien in einer Sequenz hinzugefügt.
    • Unterstützung für Audioeffekte auf Kompositionsebene hinzugefügt.
    • Unterstützung für die Transcodierung 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 ausgibt.
    • Problemumgehung für einen Decoderfehler, bei dem die Anzahl der Audiokanäle bei der Verarbeitung von PCM-Eingaben auf Stereo beschränkt war.
    • Ignorieren Sie bei der Auswahl von Tracks in ExoPlayerAssetLoader die Einschränkungen für die Anzahl der Audiokanäle, da diese nur für die Wiedergabe gelten.
    • Ersetzen Sie die Schnittstelle androidx.media3.transformer.Muxer durch androidx.media3.muxer.Muxer und entfernen Sie androidx.media3.transformer.Muxer.
    • Fehler beim Laden von HEIC-Bildern aus Inhalts-URI-Schemas behoben. (#1373).
    • Passen Sie 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 Codecdetails verwenden, verwenden Sie stattdessen DefaultDecoderFactory.listener. Im Falle einer Codec-Ausnahme sind die Codec-Details in ExportException.codecInfo verfügbar.
  • Extraktoren:
    • MPEG-TS: Die Änderung wird rückgängig gemacht, damit der letzte Frame gerendert wird. Dazu wird die letzte Zugriffseinheit eines Streams an die Beispielwarteschlange übergeben (#7909). Es wurden Korrekturen vorgenommen, um die Probleme zu beheben, die nur bei I-Frame-HLS-Streams(#1150) und H.262-HLS-Streams (#1126) aufgetreten sind.
    • MP3: Die Datengröße aus einem Info-Frame wird der Größe vorgezogen, die vom zugrunde liegenden Stream gemeldet wird (z.B. Dateigröße oder HTTP-Content-Length-Header). Dadurch werden nicht abspielbare Trailerdaten (z.B. Albumcover) aus den Berechnungen für die Suche mit konstanter Bitrate ausgeschlossen, was die Suche genauer macht (#1376).
    • MP3: Verwende die Frame-Anzahl und andere Daten in einem Info-Frame (falls vorhanden), um eine durchschnittliche Bitrate für die Suche nach konstanter Bitrate zu berechnen, anstatt von der 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:
    • Die Codierungsattribute für DTS:X Profile 2 für die Passthrough-Wiedergabe wurden korrigiert (#1299).
    • Setzen Sie für die ausgelagerte Wiedergabe das Tracking-Feld für den Abschluss des Streams in DefaultAudioSink zurück, bevor Sie AudioTrack.stop() aufrufen, damit AudioTrack.StreamEventCallback#onPresentationEnded korrekt erkennt, wann alle ausstehenden Daten wiedergegeben wurden.
    • Fehler in SilenceSkippingAudioProcessor behoben, bei dem Übergänge zwischen verschiedenen Audioformaten (z. B. Stereo zu Mono) dazu führen können, dass der Prozessor eine Ausnahme auslöst (#1352).
    • Implementiere MediaCodecAudioRenderer.getDurationToProgressUs(), damit ExoPlayer die Hauptarbeitsschleife dynamisch so plant, dass der MediaCodecAudioRenderer Fortschritte machen kann.
  • Video:
    • Problem behoben, bei dem Listener.onRenderedFirstFrame() zu früh ankommt, wenn die Oberfläche während der Wiedergabe gewechselt wird.
    • Die Decoder-Fallback-Logik für Dolby Vision wurde korrigiert, sodass bei Bedarf ein kompatibler AV1-Decoder verwendet wird (#1389).
    • Codec-Ausnahme behoben, die durch das Aktivieren eines Video-Renderers während der Wiedergabe verursacht werden kann.
  • Text:
    • Problem behoben, bei dem Untertitel, die vor einer Suchposition beginnen, übersprungen werden. Dieses Problem wurde erst in Media3 1.4.0-alpha01 eingeführt.
    • Das Standardverhalten beim Parsen von Untertiteln wurde geändert, sodass es während der Extraktion statt während des Renderings erfolgt. Den Unterschied zwischen Extraktion und Rendering finden Sie im Architekturdiagramm von ExoPlayer.
      • Diese Änderung kann überschrieben werden, indem sowohl MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) als auch TextRenderer.experimentalSetLegacyDecodingEnabled(true) aufgerufen werden. Informationen zum Einbinden dieser Komponenten in eine ExoPlayer-Instanz finden Sie in der Dokumentation zur Anpassung. Diese Methoden (und die gesamte Unterstützung für die Dekodierung von alten Untertiteln) werden in einer zukünftigen Version entfernt.
      • Apps mit benutzerdefinierten SubtitleDecoder-Implementierungen müssen aktualisiert werden, um stattdessen SubtitleParser (und SubtitleParser.Factory anstelle von SubtitleDecoderFactory) zu implementieren.
    • PGS: Die Lauflängendecodierung wurde korrigiert, sodass 0 als Farbindex und nicht als literaler Farbwert aufgelöst wird (#1367).
    • CEA-708: Ignoriere den Wert rowLock. In der Spezifikation CEA-708-E S-2023 wird angegeben, dass sowohl rowLock als auch columnLock als „true“ angenommen werden sollten, unabhängig von den im Stream vorhandenen Werten. Die Unterstützung für columnLock ist nicht implementiert, daher wird effektiv davon ausgegangen, dass der Wert immer „false“ ist.
      • Dies war ursprünglich in den Versionshinweisen für 1.3.0-alpha01 enthalten, die Änderung wurde jedoch vor dem Release von 1.3.0-rc01 versehentlich rückgängig gemacht. Dieses Problem wurde behoben und die Änderung ist wieder vorhanden.
    • CEA-708: Vermeidung doppelter Zeilenumbrüche, die durch die naive Verarbeitung des Befehls „set pen location“ durch ExoPlayer hinzugefügt werden (#1315).
    • Behebung eines IllegalArgumentException-Fehlers von LegacySubtitleUtil, wenn ein WebVTT-Untertitel-Sample keine Cues enthält, z.B. als Teil eines DASH-Streams (#1516).
  • Metadaten:
    • Zuordnung von MP4- zu ID3-Sortier-Tags 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).
    • Fehler beim Lesen der numerischen MP4-Tags (/iTunes) gnre (Genre) und tmpo (Tempo) behoben, wenn der Wert länger als ein Byte ist.
    • ID3-TCON-Frame an MediaMetadata.genre weitergeben (#1305).
  • Bild:
    • Unterstützung für nicht quadratische DASH-Thumbnail-Raster hinzugefügt (#1300).
    • Unterstützung für AVIF für API 34 und höher hinzugefügt
    • null als Parameter für ExoPlayer.setImageOutput() zulassen, um einen zuvor festgelegten ImageOutput zu löschen.
  • DataSource:
    • Implementieren Sie die Unterstützung für android.resource://package/id-Rohressourcen-URIs, wobei sich package vom Paket der aktuellen Anwendung unterscheidet. Diese Methode war bisher nicht dokumentiert, ist aber 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.
    • ByteArrayDataSource kann jetzt während open() einen URI in ein Byte-Array auflösen, anstatt bei der Erstellung hartcodiert zu sein (#1405).
  • DRM:
    • Einstellung eines LoadErrorHandlingPolicy für DefaultDrmSessionManagerProvider zulassen (#1271).
  • Auswirkung:
    • Unterstützung mehrerer Geschwindigkeitsänderungen innerhalb desselben EditedMediaItem oder Composition in SpeedChangeEffect.
    • 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 der Debug-SurfaceView von Transformer verbessert wird.
    • Die Overlay-Matrix-Implementierung wurde aktualisiert, um sie mit der Dokumentation in Einklang zu bringen. Dazu wurden die in setOverlayFrameAnchor() angewendeten x- und y-Werte umgekehrt. Wenn Sie OverlaySettings.Builder.setOverlayFrameAnchor() verwenden, kehren Sie die x- und y-Werte um, indem Sie sie mit -1 multiplizieren.
    • Fehler behoben, bei dem TimestampWrapper bei Verwendung mit ExoPlayer#setVideoEffects abstürzt (#821).
    • Der Standard-SDR-Farbraum wird von linearen Farben in elektrisches BT 709-SDR-Video geändert. Außerdem sollte eine dritte Option zum Beibehalten des ursprünglichen Farbraums angeboten werden.
    • Unbestimmte Z-Reihenfolge von EditedMediaItemSequences kann definiert werden (#1055).
    • Behalte einen einheitlichen Luminanzbereich für verschiedene HDR-Inhalte bei (verwendet den HLG-Bereich).
    • Unterstützung für Ultra HDR-Overlays (Bitmap) für HDR-Inhalte hinzugefügt.
    • Zulassen, dass SeparableConvolution-Effekte vor API 26 verwendet werden.
    • Entferne nicht verwendete 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 Apps zum Abspielen von DAI-Anzeigenstreams erforderlich ist, wird auf „Stabil“ gesetzt.
    • Fügen Sie replaceAdTagParameters(Map <String, String>) zu ImaServerSideAdInsertionMediaSource.AdLoader hinzu, damit Anzeigen-Tag-Parameter zur Laufzeit ersetzt werden können.
    • Fehler behoben, bei dem VideoAdPlayer.VideoAdPlayerCallback.onError() nicht aufgerufen wurde, wenn während der Anzeigenwiedergabe ein Player-Fehler auftrat (#1334).
    • IMA SDK-Version auf 3.33.0 aktualisiert, um einen NullPointerException bei Verwendung von data://-Anzeigen-Tag-URIs zu beheben (#700).
  • Sitzung:
    • Ändern Sie den Standardwert von CommandButton.enabled in true und sorgen Sie dafür, dass der Wert für Controller „false“ bleiben kann, auch wenn der zugehörige Befehl verfügbar ist.
    • Fügen Sie Symbolkonstanten für CommandButton hinzu, die anstelle von benutzerdefinierten Symbolressourcen verwendet werden sollen.
    • MediaSessionService.isPlaybackOngoing() wurde hinzugefügt, damit Apps abfragen können, ob der Dienst in onTaskRemoved() beendet werden muss (#1219).
    • Füge MediaSessionService.pauseAllPlayersAndStopSelf() hinzu, um die Wiedergabe aller Sitzungen bequem zu pausieren, und rufe stopSelf() auf, um den Lebenszyklus von MediaSessionService zu beenden.
    • Überschreibe 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 Suchleiste in der Medienbenachrichtigung für Livestreams wird ausgeblendet, indem die Dauer nicht in den Sitzungsmetadaten der Plattform festgelegt wird (#1256).
    • Richten Sie die Konvertierung von MediaMetadata in MediaDescriptionCompat so aus, dass bei der Auswahl von Metadatenattributen dieselbe bevorzugte Reihenfolge und Logik wie in media1 verwendet wird.
    • MediaSession.sendError() hinzugefügt, mit dem nicht schwerwiegende Fehler an den Media3-Controller gesendet werden können. Wenn der Notification Controller verwendet wird (siehe MediaSession.getMediaNotificationControllerInfo()), wird der benutzerdefinierte Fehler verwendet, um den PlaybackState der Plattform-Sitzung mit den angegebenen Fehlerinformationen in einen Fehlerstatus zu aktualisieren (#543).
    • Füge MediaSession.Callback.onPlayerInteractionFinished() hinzu, um Sitzungen zu informieren, wenn eine Reihe von Spielerinteraktionen von einem bestimmten Controller abgeschlossen wurde.
    • 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 bereitzustellen, falls möglich.
    • Veröffentlichen Sie den Code für die Media3-Controller-Test-App, mit der Interaktionen mit Apps getestet werden können, die eine Mediensitzung veröffentlichen.
    • An MediaSession[Builder].setSessionExtras() von media3 übergebene Extras werden an PlaybackStateCompat.getExtras() eines media1-Controllers weitergegeben.
    • Schwerwiegende und nicht schwerwiegende Fehler der Plattform-Session zuordnen und umgekehrt. Ein PlaybackException wird einem schwerwiegenden Fehlerstatus des PlaybackStateCompat zugeordnet. Ein SessionError, der mit MediaSession.sendError(ControllerInfo, SessionError) an den Media Notification Controller gesendet wird, wird einem nicht schwerwiegenden Fehler in PlaybackStateCompat zugeordnet. Das bedeutet, dass der Fehlercode und die Fehlermeldung festgelegt werden, der Status der Plattform-Session jedoch nicht STATE_ERROR ist.
    • Ermöglicht, dass die Sitzungsaktivität pro Controller festgelegt wird, um die globale Sitzungsaktivität zu überschreiben. Die Sitzungsaktivität kann für einen Controller zum Zeitpunkt der Verbindung definiert werden, indem ein ConnectionResult mit AcceptedResultBuilder.setSessionActivivty(PendingIntent) erstellt wird. Nach dem Herstellen der Verbindung kann die Sitzungsaktivität mit MediaSession.setSessionActivity(ControllerInfo, PendingIntent) aktualisiert werden.
    • Verbesserte Fehlerreplikation von Aufrufen an MediaLibrarySession.Callback. Die Fehlerreplikation kann jetzt mit MediaLibrarySession.Builder.setLibraryErrorReplicationMode() konfiguriert werden, um den Fehlertyp auszuwählen oder die standardmäßig aktivierte Fehlerreplikation zu deaktivieren.
  • UI:
    • Unterstützung für die Bildanzeige in PlayerView hinzugefügt, wenn eine Verbindung zu einem ExoPlayer besteht (#1144).
    • Anpassung verschiedener Symbole in PlayerControlView über XML-Attribute hinzugefügt, um verschiedene Drawables pro PlayerView-Instanz anstelle von globalen Überschreibungen zu ermöglichen (#1200).
    • Problemumgehung für einen Plattformfehler, 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 unveröffentlichten Renderer-Instanzen preisgibt, da dies letztendlich zu einem Absturz der App mit IllegalStateException: Too many receivers, total of 1000, registered for pid führen kann (#1224).
  • Cronet-Erweiterung:
    • Korrigieren Sie 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:
    • Fehler behoben, bei dem ausstehende EMSG-Samples, die auf eine Diskontinuität warteten, in HlsSampleStreamWrapper mit einem falschen Offset delegiert wurden, was zu einem IndexOutOfBoundsException oder einem IllegalArgumentException führte (#1002).
    • Fehler behoben, bei dem nicht primäre Playlists für LL-HLS-Streams immer wieder neu geladen wurden (#1240).
    • Fehler behoben, bei dem die Aktivierung von CMCD für HLS mit Initialisierungssegmenten zu Source Error und IllegalArgumentException führte.
    • Fehler behoben, bei dem nicht primäre Wiedergabelisten während der Live-Wiedergabe nicht aktualisiert wurden (#1240).
    • Fehler behoben, bei dem die Aktivierung von CMCD für HLS-Livestreams ArrayIndexOutOfBoundsException verursacht (#1395).
  • DASH-Erweiterung:
    • Fehler behoben, bei dem die erneute Vorbereitung eines Livestreams mit mehreren Zeiträumen zu einem IndexOutOfBoundsException führen kann (#1329).
    • Unterstützung für dashif:Laurl-Lizenz-URLs hinzugefügt (#1345).
  • Cast-Erweiterung:
    • Fehler behoben, durch den der Albumtitel des MediaQueueItem in das Media3-Medienelement des Künstlers konvertiert wurde (#1255).
  • Testdienstprogramme:
    • Implementieren Sie onInit() und onRelease() in FakeRenderer.
    • Ändern Sie die TestPlayerRunHelper.runUntil()/playUntil()-Methoden so, dass sie bei nicht schwerwiegenden Fehlern (z.B. solchen, 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 Kurzvideos.
    • Wiederholungsmodus kann jetzt mit Intent-Argumenten über die Befehlszeile festgelegt werden (#1266).
    • Verwenden Sie HttpEngineDataSource als HttpDataSource, wenn dies vom Gerät unterstützt wird.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • CronetDataSourceFactory entfernen. 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 jeden XXXDataSource.Factory.
    • Entfernen Sie die OkHttpDataSource-Konstruktoren und OkHttpDataSourceFactory. Verwenden Sie stattdessen OkHttpDataSource.Factory.
    • PlayerMessage.setHandler(Handler) entfernen. 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.
    • DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS entfernen. Verwenden Sie stattdessen DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS.
    • MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean) entfernen. Verwenden Sie stattdessen MediaCodecInfo.canReuseCodec(Format, Format).
    • Entfernen Sie die Methoden DrmSessionManager.DUMMY und getDummyDrmSessionManager(). Verwenden Sie stattdessen DrmSessionManager.DRM_UNSUPPORTED.
    • Entfernen Sie AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). Verwenden Sie stattdessen die Überladungen, die ein DecoderReuseEvaluation-Objekt akzeptieren.
    • Entfernen Sie die IntDef-Konstante RendererSupport.FormatSupport und die Konstanten 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).
    • Schnittstelle Bundleable entfernen. 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 ist veröffentlicht. Version 1.3.1 enthält diese Commits.

  • Common Library:
    • Fügen Sie Format.labels hinzu, um lokalisierte oder andere alternative Labels zuzulassen.
  • ExoPlayer:
    • Problem behoben, bei dem PreloadMediaPeriod die Streams nicht beibehalten kann, wenn es noch einmal vorab geladen wird.
    • Wende bei der Neuauswahl des Tracks die richtige TrackSelectionResult auf den Wiedergabezeitraum an.
    • Frühzeitig aktivierte Renderer werden erst gestartet, nachdem der Wiedergabezeitraum beim Übergang zwischen Mediendateien vorgerückt ist (#1017).
    • Fehlender Rückgabetyp wurde zur ProGuard-Regel -keepclasseswithmembers für DefaultVideoFrameProcessor.Factory.Builder.build() hinzugefügt (#1187).
  • Transformer:
    • Problemumgehung für Ausnahme hinzugefügt, die ausgelöst wird, weil MediaMuxer vor API 30 keine negativen Präsentationszeitstempel unterstützt.
  • Titelauswahl:
    • DefaultTrackSelector: Bevorzugt Videotracks mit einer „angemessenen“ Framerate (>=10 fps) gegenüber solchen mit einer niedrigeren oder nicht festgelegten Framerate. Dadurch wird sichergestellt, dass der Player den „echten“ Videotrack in MP4s auswählt, die aus Fotos mit Bewegtbild 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: Format.averageBitrate wird aus Metadaten-Frames wie XING und VBRI ausgefüllt.
    • MPEG-TS: Eine Änderung wurde rückgängig gemacht, die darauf abzielte, dass der letzte Frame gerendert wird, indem die letzte Zugriffseinheit eines Streams an die Beispielwarteschlange übergeben wird (#7909). Dies liegt daran, dass die Änderung neue Probleme mit HLS-Streams nur mit I-Frames (#1150) und H.262-HLS-Streams (#1126) verursacht.
  • Audio:
    • Ermöglicht die Wiederherstellung des Renderers durch Deaktivieren der Entlastung, wenn die Initialisierung des Audiotracks im Entlastungsmodus fehlschlägt.
  • Video:
    • 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 H265-Streams mit 60 fps als nicht unterstützt markiert werden
    • 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).
    • Problem behoben, bei dem die Verarbeitung von HDR-Farbinformationen zu Fehlverhalten des Codecs führte und adaptive Formatwechsel für SDR-Videotracks verhinderte (#1158).
  • Text:
    • WebVTT: Verhindern, dass direkt aufeinanderfolgende Cues fälschlicherweise zusätzliche CuesWithTiming-Instanzen aus WebvttParser.parse erstellen (#1177).
  • DRM:
    • Problemumgehung für eine NoSuchMethodError, die vom MediaDrm-Framework anstelle von ResourceBusyException oder NotProvisionedException auf einigen Android 14-Geräten ausgelöst werden kann (#1145).
  • Auswirkung:
    • Das PQ-zu-SDR-Tone-Mapping wurde durch die Konvertierung von Farbräumen verbessert.
  • Sitzung:
    • Problem 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 einem nicht nullwertigen extras nicht zwischen Mediencontrollern und Sitzungen übertragen wird (#1176).
  • UI:
    • Fallback, um den Sprachnamen des Audiotracks einzuschließen, wenn Locale keinen Anzeigenamen identifizieren kann (#988).
  • DASH-Erweiterung:
    • Alle Label-Elemente aus dem Manifest in Format.labels einfügen (#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 wird 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 ist veröffentlicht. Version 1.3.0 enthält diese Commits.

  • Common Library:
    • Implementieren Sie Unterstützung für android.resource://package/[type/]name-Rohressourcen-URIs, wobei sich package vom Paket der aktuellen Anwendung unterscheidet. Dies wurde schon immer als funktionierend dokumentiert, aber erst jetzt korrekt implementiert.
    • Normalisieren Sie die MIME-Typen, die vom App-Code festgelegt oder aus Medien gelesen werden, sodass sie vollständig in Kleinbuchstaben geschrieben sind.
    • 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 aktuellen Versionen unserer AndroidX-Abhängigkeiten upgraden können.
    • Sowohl artworkUri als auch artworkData in MediaMetadata.Builder.populate(MediaMetadata) werden ausgefüllt, wenn mindestens einer der beiden Werte nicht null ist (#964).
  • ExoPlayer:
    • PreloadMediaSource und PreloadMediaPeriod wurden hinzugefügt, damit Apps eine Medienquelle mit Inhalten vor der Wiedergabe an einer bestimmten Startposition vorab laden können. PreloadMediaSource bereitet die Inhaltsmedienquelle für den Empfang des Timeline vor, bereitet den Zeitraum an der angegebenen Startposition vor und speichert ihn im Cache, wählt Tracks aus und lädt Mediendaten für den Zeitraum. Apps steuern den Vorabladefortschritt durch Implementieren von PreloadMediaSource.PreloadControl und Festlegen der vorab geladenen Quelle für die Wiedergabe im Player.
    • 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 Null-ImageDecoder.Factory.DEFAULT zur Verfügung.
    • Das Ereignis Player.Listener.onPositionDiscontinuity 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 dies mit MediaSource.Factory.experimentalParseSubtitlesDuringExtraction() aktivieren.
    • Unterstützung für adaptive Medienquellen mit PreloadMediaSource.
    • Implementieren Sie HttpEngineDataSource, eine HttpDataSource, mit der HttpEngine API.
    • Verhindern Sie die Erstellung von abgeleiteten Klassen von CompositeSequenceableLoader. Diese Komponente wurde zuvor erweiterbar gemacht, aber nie innerhalb der Bibliothek als Unterklasse definiert. Anpassungen können vorgenommen werden, indem eine Instanz mit dem Decorator-Muster umschlossen und ein benutzerdefiniertes CompositeSequenceableLoaderFactory implementiert wird.
    • Problem behoben, bei dem durch das Wiederholen derselben Zeit die Metadaten dieses Elements gelöscht wurden (#1007).
    • Die Methoden experimentalSetSubtitleParserFactory für BundledChunkExtractor.Factory und DefaultHlsExtractorFactory wurden in setSubtitleParserFactory umbenannt und die Übergabe von null ist nicht mehr zulässig. Verwenden Sie die neuen experimentalParseSubtitlesDuringExtraction(boolean)-Methoden, um das Parsing-Verhalten zu steuern.
    • Unterstützung für die Anpassung des während der Extraktion verwendeten SubtitleParser.Factory hinzugefügt. Dies kann mit MediaSource.Factory.setSubtitleParserFactory() erreicht werden.
    • Fügen Sie allen Format.id-Feldern, die aus MergingMediaSource generiert wurden, ein Quellpräfix hinzu. So lässt sich leichter feststellen, welche Quelle einen Format erzeugt 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 Abflachen von H.265/HEVC-SEF-Zeitlupenvideos hinzugefügt
    • Die Transmuxing-Geschwindigkeit wurde erhöht, insbesondere bei Bearbeitungen, bei denen Videos entfernt werden.
    • Fügen Sie eine API hinzu, um sicherzustellen, dass die Ausgabedatei mit einem Videoframe beginnt. Dadurch kann die Ausgabe von Trimmvorgängen besser mit Player-Implementierungen kompatibel sein, die den ersten Videoframe erst nach dem Präsentationszeitstempel anzeigen (#829).
    • Unterstützung für die Optimierung von MP4-Zuschneidevorgängen für einzelne Assets hinzugefügt.
    • Unterstützung hinzufügen, damit ein Videoframe den ersten Zeitstempel in der Ausgabedatei hat. Behebt das Problem, dass Ausgabedateien auf iOS-basierten Playern mit einem schwarzen Frame beginnen (#829).
  • Titelauswahl:
    • Fügen Sie DefaultTrackSelector.selectImageTrack hinzu, um die Auswahl des Bildtracks zu aktivieren.
    • Füge TrackSelectionParameters.isPrioritizeImageOverVideoEnabled hinzu, um festzulegen, ob ein Bildtrack ausgewählt werden soll, wenn sowohl ein Bild- als auch ein Videotrack verfügbar sind. Der Standardwert ist false. Das bedeutet, dass die Auswahl eines Videotracks priorisiert wird.
  • Extraktoren:
    • Zusätzliches AV1C-Parsing zum MP4-Extraktor 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. Das führt jedoch zu einer weniger detaillierten 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 Rollen-Flags zuordnen, damit Nutzer Audiotracks besser auswählen können (#973).
  • Audio:
    • Der Algorithmus zum Überspringen von Stille wurde durch eine sanfte Lautstärkerampe verbessert. Es wurden minimale Stille und natürlichere Stilledauern beibehalten (#7423).
    • Übersprungene Stille wird 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 eine benutzerdefinierte VideoFrameProcessor.Factory einfügen möchten, können eine CompositingVideoSinkProvider instanziieren, die die benutzerdefinierte VideoFrameProcessor.Factory verwendet, und den Video-Sink-Anbieter an MediaCodecVideoRenderer übergeben.
  • Text:
    • Die Serialisierung von Bitmap-Cues 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 Spezifikation CEA-708-E S-2023 wird angegeben, dass sowohl rowLock als auch columnLock als „true“ angenommen werden sollten, unabhängig von den im Stream vorhandenen Werten. Die Unterstützung für columnLock ist nicht implementiert, daher wird effektiv davon ausgegangen, dass der Wert immer „false“ ist.
  • Bild:
    • Unterstützung für DASH-Thumbnails hinzugefügt Rasterbilder werden zugeschnitten und einzelne Thumbnails werden ImageOutput kurz vor der Präsentationszeit zur Verfügung gestellt.
  • DRM:
    • Unverschlüsselte „Clear Lead“-Samples in DRM-Inhalten werden standardmäßig sofort wiedergegeben, auch wenn die Schlüssel für die später verschlüsselten Samples noch nicht bereit sind. Dies kann zu Unterbrechungen während der Wiedergabe führen, wenn die Schlüssel noch nicht bereit sind, wenn die Wiedergabeposition die verschlüsselten Samples erreicht. Zuvor wäre die Wiedergabe an dieser Stelle jedoch überhaupt nicht gestartet. Dieses Verhalten kann mit MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey oder DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys deaktiviert werden.
      • IMA-Erweiterung:
    • Ein Problem wurde behoben, durch das DASH- und HLS-Anzeigen ohne die entsprechende Dateiendung nicht wiedergegeben werden konnten.
  • Sitzung:
    • Doppelklickerkennung für TV-Apps deaktivieren (#962).
    • Problem behoben, bei dem MediaItem.RequestMetadata mit nur Nicht-Null-Extras nicht zwischen Mediencontrollern und Sitzungen übertragen wird.
    • 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 „Paketprivat“. Von außerhalb des HLS-Pakets sollte nicht direkt auf diesen Typ zugegriffen werden.
    • Suchvorgänge am Anfang eines Segments werden effizienter aufgelöst (#1031).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • MIDI-Decoder: SysEx-Ereignisnachrichten ignorieren (#710).
  • Testdienstprogramme:
    • Pausiere die Wiedergabe in TestPlayerRunHelper.playUntilPosition nicht. Der Test hält die Wiedergabe im Wiedergabestatus, setzt den Fortschritt jedoch aus, bis der Test Assertions und weitere Aktionen hinzufügen kann.
  • Demo-App:
    • Fügen Sie ein Demomodul für Kurzvideos hinzu, um die Verwendung von PreloadMediaSource mit dem Anwendungsfall für Kurzvideos 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, bei dem die manuelle Suche außerhalb des Bereichs LiveConfiguration.min/maxOffset den Offset immer wieder auf min/maxOffset zurücksetzte.
    • Problem behoben, bei dem die OPUS- und VORBIS-Kanallayouts für 3, 5, 6, 7 und 8 Kanäle falsch waren (#8396).
    • Es wurde ein Problem behoben, bei dem die Titelauswahl nach dem Zurückspulen auf null in einem Livestream fälschlicherweise dazu führte, dass der Stream an seiner Standardposition gestartet wurde (#9347).
    • Das Problem, dass neue Instanzen von CmcdData.Factory negative Werte für bufferedDurationUs von Chunk-Quellen erhielten, was zu einem IllegalArgumentException führte, wurde behoben (#888).
  • Transformer:
    • Problem umgehen, bei dem der Encoder während der Konfiguration einen Fehler ausgibt, weil eine hohe Betriebsrate festgelegt wurde.
  • Extraktoren:
    • Markiere sekundäre (nicht abspielbare) HEVC-Tracks in JPEG-Fotos mit Bewegtbild als ROLE_FLAG_ALTERNATE, um zu verhindern, dass sie aufgrund ihrer höheren Auflösung automatisch für die Wiedergabe ausgewählt werden.
    • Fehlerhafte Keyframe-Erkennung für TS-H264-Streams behoben (#864).
    • Die Schätzung der Dauer von TS-Streams, die länger als 47.721 Sekunden sind, wurde korrigiert (#855).
  • Audio:
    • Fehlerbehebung bei der Verarbeitung von EOS für SilenceSkippingAudioProcessor, wenn es mehrmals aufgerufen wird (#712).
  • Video:
    • 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:
    • Fehler behoben, bei dem MediaMetadata nur aus Vorbis-Kommentaren mit Großbuchstaben-Schlüsseln ausgefüllt wurde (#876).
    • OutOfMemoryError wird beim Parsen sehr großer ID3-Frames abgefangen, sodass die Wiedergabe ohne die Tag-Informationen fortgesetzt werden kann, anstatt dass sie vollständig fehlschlägt.
  • DRM:
    • Der Workaround für die fehlerhafte ClearKey-https://default.url-Lizenz-URL wurde auf API 33+ erweitert (zuvor galt der Workaround nur für API 33) (#837).
    • Fehler ERROR_DRM_SESSION_NOT_OPENED beim Wechsel von verschlüsselten zu unverschlüsselten Inhalten ohne mit dem Player verknüpfte Oberfläche behoben. Der Fehler wurde durch die falsche Verwendung eines sicheren Decoders zum Abspielen der unverschlüsselten Inhalte verursacht.
  • Sitzung:
    • Die benutzerdefinierten Schlüssel und Werte werden in MediaMetadataCompat bis MediaMetadata.extras und MediaMetadata.extras bis MediaMetadataCompat eingefügt (#756, #802).
    • Problem mit dem Broadcasting von 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).
    • IllegalStateException wurde behoben, wenn der Controller für Medienbenachrichtigungen die Verbindung noch nicht hergestellt hat, wenn die erste Benachrichtigungsaktualisierung angefordert wird (#917).
  • UI:
    • Problem 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).
    • Problem behoben, bei dem die Zahlen in der Vorspultaste des PlayerControlView falsch ausgerichtet waren (#547).
  • DASH-Erweiterung:
    • „f800“ wird im DASH-Manifest als Kanalanzahl von 5 für Dolby geparst (#688).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • MIDI: Problem behoben, bei dem beim Vorspulen die Ereignisse für Programmänderungen übersprungen wurden (#704).
    • Migration zu FFmpeg 6.0 und Aktualisierung des unterstützten NDK auf r26b (#707, #867).
  • Cast-Erweiterung:
    • Bereinigung der Erstellung eines Timeline, damit die App nicht abstürzt, wenn das Laden von Medien auf dem Übertragungsgerät fehlschlägt (#708).

Version 1.2.0

15. November 2023

  • Common Library:
    • Fügen Sie den Methoden in der Schnittstelle Log.Logger einen @Nullable Throwable-Parameter hinzu. Der Parameter message für diese Methoden enthält keine Informationen mehr über die Throwable, die an die Log.{d,i,w,e}()-Methoden übergeben werden. 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 Null-Werte zulassen, und Array-Elementtypen, die Null-Werte zulassen, nicht als Null-Werte zulassend erkannt wurden. Beispiele sind die Methodenparameter TrackSelectorResult und SimpleDecoder (#6792).
    • Ändere das Standardverhalten der Benutzeroberfläche und der Benachrichtigungen in Util.shouldShowPlayButton, um eine Wiedergabeschaltfläche anzuzeigen, wenn die Wiedergabe vorübergehend unterdrückt wird (z.B. aufgrund eines vorübergehenden Verlusts des Audiofokus). Das Legacy-Verhalten kann mit PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) oder MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) beibehalten werden (#11213).
    • Aktualisieren Sie androidx.annotation:annotation-experimental auf 1.3.1, um https://issuetracker.google.com/251172715 zu beheben.
    • Verschieben Sie ExoPlayer.setAudioAttributes in die Schnittstelle Player.
  • ExoPlayer:
    • Probleme beim Suchen in AC4-Streams behoben, die durch eine fehlerhafte Identifizierung von Nur-Decodierungs-Samples verursacht wurden (#11000).
    • Unterdrückung der Wiedergabe auf ungeeigneten Audioausgabegeräten (z.B. dem integrierten Lautsprecher auf Wear OS-Geräten) hinzugefügt, 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, obwohl 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 wird.
    • 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 zulassen, die von der Bibliothek über Player.replaceMediaItem(s) bereitgestellt werden (#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.
    • Erweitern Sie die Methode SequenceableLoader.continueLoading(long) in der Schnittstelle SequenceableLoader auf SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo enthält zusätzliche Parameter, darunter playbackSpeed und lastRebufferRealtimeMs, zusätzlich zum vorhandenen playbackPositionUs.
    • Erweitern Sie die Methode ChunkSource.getNextChunk(long, long, List, ChunkHolder) in der Schnittstelle ChunkSource auf ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Zusätzliche Felder zum CMCD-Logging (Common Media Client Data) hinzugefügt: Pufferüberlauf (bs), Frist (dl), Wiedergabegeschwindigkeit (pr) und Start (su) (#8699).
    • Luma- und Chroma-Bittiefe zu ColorInfo hinzugefügt (#491).
    • Dem CMCD-Logging (Common Media Client Data) wurden zusätzliche Felder hinzugefügt: „next object request“ (nor) und „next range request“ (nrr) (#8699).
    • Funktion zum Übertragen von CMCD-Daten (Common Media Client Data) mithilfe von Suchparametern hinzugefügt (#553).
    • Fehler bei ConcurrentModificationException in ExperimentalBandwidthMeter behoben (#612).
    • Fügen Sie den Parameter MediaPeriodId zu CompositeMediaSource.getMediaTimeForChildMediaTime hinzu.
    • Unterstützung von ClippingMediaSource (und anderen Quellen mit Zeitversatz für Zeitraum/Fenster) 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 Rotationsprobleme zu beheben.
    • Die Parameter frameRate und durationUs von SampleConsumer.queueInputBitmap wurden in TimestampIterator geändert.
  • Titelauswahl:
    • Füge DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness hinzu, um die nicht nahtlose Anpassung explizit zuzulassen oder zu verbieten. Die Standardeinstellung bleibt bei true.
  • Extraktoren:
    • MPEG-TS: Es wird dafür gesorgt, dass der letzte Frame gerendert wird, indem die letzte Zugriffseinheit eines Streams an die Beispielwarteschlange übergeben wird (#7909).
    • Tippfehler beim Bestimmen von rotationDegrees korrigiert. projectionPosePitch wurde in projectionPoseRoll geändert (#461).
    • Entfernen Sie die Annahme, dass Extractor-Instanzen direkt mit instanceof geprüft werden können. Wenn Sie zur Laufzeit Zugriff auf die Implementierungsdetails eines Extractor benötigen, müssen Sie zuerst Extractor.getUnderlyingInstance aufrufen.
    • Fügen Sie BmpExtractor hinzu.
    • Fügen Sie WebpExtractor hinzu.
    • Fügen Sie HeifExtractor hinzu.
    • Unterstützung für QuickTime Classic zu Mp4Extractor hinzugefügt.
  • 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 die Offload-Unterstützung abzurufen, die die Senke für das Format über DefaultAudioOffloadSupportProvider bieten kann. Es wird die neue AudioOffloadSupport zurückgegeben, die isFormatSupported, isGaplessSupported und isSpeedChangeSupported enthält.
    • Füge AudioSink.setOffloadMode() hinzu, um die Offload-Konfiguration für die Audiosenke zu konfigurieren. Der Standardwert ist AudioSink.OFFLOAD_MODE_DISABLED.
    • Die Auslagerung kann über setAudioOffloadPreference in TrackSelectionParameters aktiviert werden. Wenn die Einstellung „Aktivieren“ lautet, das Gerät die Auslagerung für das Format unterstützt und die Titelauswahl ein einzelner Audiotrack ist, wird die Audioauslagerung aktiviert.
    • Wenn audioOffloadModePreference auf AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED gesetzt ist, wählt der DefaultTrackSelector nur einen Audiotrack aus, und zwar nur dann, wenn das Format dieses Tracks im Offload unterstützt wird. Wenn kein Audiotrack im Offload unterstützt wird, wird kein Track ausgewählt.
    • Deaktivierung der Unterstützung für lückenlose Wiedergabe bei Offload vor API-Level 33 aufgrund eines Problems mit der Wiedergabeposition nach dem Titelwechsel.
    • Entfernen Sie den Parameter enableOffload aus der Methodensignatur DefaultRenderersFactory.buildAudioSink.
    • Methode „DefaultAudioSink.Builder.setOffloadMode“ entfernen.
    • Entfernen Sie den intdef-Wert DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Unterstützung für lückenlose Opus-Metadaten während der Offload-Wiedergabe hinzugefügt
    • Renderer-Wiederherstellung durch Deaktivieren der Auslagerung zulassen, wenn beim ersten Schreibvorgang ein Fehler aufgetreten 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.
    • Verschiebe die TrackSelectionParameters-Schnittstellen und ‑Definitionen für den Audio-Offload-Modus in eine innere AudioOffloadPreferences-Klasse.
    • Fügen Sie AnalyticsListener, AudioRendererEventListener und AudioSink.Listener die Callbacks onAudioTrackInitialized und onAudioTrackReleased hinzu.
    • Problem mit DTS Express-Audiopufferunterlauf behoben (#650).
    • Fehler behoben, bei dem die Funktionsprüfung für E-AC3-JOC eine IllegalArgumentException auslöst (#677).
  • Video:
    • MediaCodecVideoRenderer erlauben, eine benutzerdefinierte VideoFrameProcessor.Factory zu verwenden.
    • Fehler behoben, durch den der erste Frame nicht gerendert werden konnte, wenn der Audiostream mit negativen Zeitstempeln beginnt (#291).
  • Text:
    • ExoplayerCuesDecoder entfernen. Texttracks 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 „Nur-Decodierung“-Samples nicht mehr aufgerufen, da die Implementierung ohnehin null zurückgeben muss.
  • Auswirkung:
    • Fügen Sie VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) hinzu, um die Bitmap-Eingabe nach Zeitstempel in die Warteschlange zu stellen.
    • Ändern Sie VideoFrameProcessor.registerInputStream() in „nicht blockierend“. Apps müssen VideoFrameProcessor.Listener#onInputStreamRegistered() implementieren.
    • Die Parameter frameRate und durationUs von VideoFrameProcessor.queueInputBitmap wurden in TimestampIterator geändert.
  • IMA-Erweiterung:
    • Fehler behoben, bei dem ein DASH-Livestream mit mehreren Zeiträumen, der nicht das erste Element in einer Playlist ist, eine Ausnahme auslösen kann (#571).
    • Geben Sie den StreamManager frei, bevor Sie AdsLoader.destroy() aufrufen.
    • IMA SDK-Version auf 3.31.0 aktualisiert.
  • Sitzung:
    • Das Verhalten des Dienstes im Vordergrund für Benachrichtigungen wurde in DefaultMediaNotificationProvider auf FOREGROUND_SERVICE_IMMEDIATE festgelegt (#167).
    • Verwenden Sie nur android.media.session.MediaSession.setMediaButtonBroadcastReceiver() über API 31, um Probleme mit veralteten APIs auf Samsung-Geräten zu vermeiden (#167).
    • Verwenden Sie den Controller für Medienbenachrichtigungen als Proxy, um verfügbare Befehle und das benutzerdefinierte Layout festzulegen, die zum Ausfüllen der Benachrichtigung und der Plattformsitzung verwendet werden.
    • Konvertieren Sie Medientastenereignisse, die von MediaSessionService.onStartCommand() empfangen werden, innerhalb von Media3, anstatt sie an die Plattformsitzung und zurück an Media3 weiterzuleiten. Dadurch ist der Controller für Anrufe immer der Controller für Medienbenachrichtigungen und Apps können Anrufe, die über die Benachrichtigung eingehen, auf allen unterstützten API-Levels auf dieselbe Weise erkennen.
    • Fehler behoben, bei dem MediaController.getCurrentPosition() nicht weitergeht, wenn eine Verbindung zu einem alten MediaSessionCompat besteht.
    • Fügen Sie MediaLibrarySession.getSubscribedControllers(mediaId) hinzu, um die Nutzung zu vereinfachen.
    • Überschreiben Sie MediaLibrarySession.Callback.onSubscribe(), um die Verfügbarkeit der übergeordneten ID zu bestätigen, die der Controller abonniert. 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. Da Android Auto als Client-Controller aus der Framework-Sitzung liest, wird die Schaltfläche queue in der Benutzeroberfläche von Android Auto nicht angezeigt (#339).
    • Standardmäßig wird DataSourceBitmapLoader anstelle von SimpleBitmapLoader verwendet (#271, #327).
    • MediaSession.Callback.onMediaButtonEvent(Intent) hinzugefügt, damit Apps die Standardverarbeitung von Medientastenereignissen ü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 geöffnet wird, über das Nutzer eine geeignete Audioausgabe (z.B. Bluetooth-Kopfhörer) verbinden können. Die Wiedergabe wird automatisch fortgesetzt, wenn innerhalb eines konfigurierbaren Zeitlimits (standardmäßig 5 Minuten) ein geeignetes Gerät verbunden wird.
  • Downloads:
    • Deklarieren Sie den Typ des Dienstes im Vordergrund „Datensynchronisierung“ für DownloadService, um die Kompatibilität mit Android 14 zu gewährleisten. Wenn dieser Dienst verwendet wird, muss die App auch dataSync als foregroundServiceType im Manifest hinzufügen und die Berechtigung FOREGROUND_SERVICE_DATA_SYNC hinzufügen (#11239).
  • HLS-Erweiterung:
    • Die HLS-Live-Playlist wird mit einem Intervall aktualisiert, das anhand der letzten Lade-Startzeit und nicht anhand der letzten Lade-Abschlusszeit berechnet wird (#663).
  • DASH-Erweiterung:
    • Mehrere identische DASH-Kennungen in der Segmentvorlagen-URL zulassen.
    • Experimentelle Unterstützung für das Parsen von Untertiteln während der Extraktion hinzugefügt. Dieser bietet eine bessere Unterstützung für das Zusammenführen überlappender Untertitel, einschließlich der Behebung von Flackern beim Übergang zwischen Untertitelsegmenten. Sie können dies mit DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() aktivieren (#288).
  • RTSP-Erweiterung:
    • Race-Bedingung behoben, die beim Fallback auf TCP zu IndexOutOfBoundsException führen konnte, oder die Wiedergabe in einigen Situationen hängen blieb.
    • Der Status in der RTSP-Einrichtung wird geprüft, wenn der Ladestatus von RtspMediaPeriod zurückgegeben wird (#577).
    • Benutzerdefinierte RTSP-Anfragemethoden im öffentlichen Header der Optionsantwort ignorieren (#613).
    • Verwenden Sie den Zeitlimitwert für die RTSP-Einrichtungsantwort im Zeitintervall für das Senden von Keep-Alive-RTSP-Optionsanfragen (#662).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • Veröffentlichung des MIDI-Decodermoduls, das die Wiedergabe von Standard-MIDI-Dateien mithilfe der Jsyn-Bibliothek zur Audiosynthese unterstützt.
    • Füge DecoderOutputBuffer.shouldBeSkipped hinzu, um Ausgabepuffer, die nicht dargestellt werden müssen, direkt zu markieren. Diese Option wird gegenüber C.BUFFER_FLAG_DECODE_ONLY bevorzugt, das eingestellt wird.
    • Fügen Sie Decoder.setOutputStartTimeUs und SimpleDecoder.isAtLeastOutputStartTimeUs hinzu, damit Decoder reine Decodierungs-Samples vor dem Beginn verwerfen können. Diese sollte Buffer.isDecodeOnly vorgezogen werden, da diese Einstellung eingestellt wird.
    • Fehler beim Veröffentlichen des MIDI-Decoder-Artefakts im Maven-Repository behoben. Das Artefakt wird in media3-exoplayer-midi umbenannt (#734).
  • Leanback-Erweiterung:
    • Fehler behoben, bei dem das Deaktivieren einer Oberfläche im Leanback-Code zu einem ArithmeticException führen kann (#617).
  • Testdienstprogramme:
    • TestExoPlayerBuilder und FakeClock mit Espresso-UI-Tests und Compose-UI-Tests kompatibel machen. Dadurch wird ein Fehler behoben, bei dem die Wiedergabe während Espresso- oder Compose-Ansichtsinteraktionen nicht deterministisch voranschreitet.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Entfernen Sie TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) und TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Verwenden Sie stattdessen Composition.Builder.setHdrMode(int) und übergeben Sie Composition an Transformer.start(Composition, String).
    • Die verworfene Methode DownloadNotificationHelper.buildProgressNotification wurde entfernt. Verwenden Sie stattdessen eine nicht verworfene Methode, die einen notMetRequirements-Parameter 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

7. August 2023

Verwenden Sie die stabile Version 1.2.0.

Version 1.1.0

Version 1.1.1

16. August 2023

  • Common Library:
    • Versehentlich hinzugefügte multidex-Abhängigkeit aus allen Modulen entfernt (#499).
  • ExoPlayer:
    • Ein Problem in PlaybackStatsListener wurde behoben, bei dem nach dem Löschen der Playlist fälschlicherweise PlaybackStats erstellt wurden.
    • Zusätzliche Felder zum Logging von Common Media Client Data (CMCD) hinzugefügt: Streamingformat (sf), Streamtyp (st), Version (v), Top-Bitrate (tb), Objektdauer (d), gemessener Durchsatz (mtp) und Objekttyp (ot) (#8699).
  • Audio:
    • Ein Fehler wurde behoben, bei dem Player.getState() beim Abspielen sehr kurzer Dateien nie zu STATE_ENDED wechselte (#538).
  • Audio-Offload:
    • Stelle Ogg-ID-Header- und Kommentar-Header-Seiten dem Bitstream für die ausgelagerte Opus-Wiedergabe gemäß RFC 7845 voran.
  • Video:
    • H.265/HEVC: Fehler beim Parsen von SPS-Kurz- und Langzeit-Referenzbildinformationen behoben.
  • 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 Einzug und Tabulatorversatz berücksichtigt, wenn die Länge des Untertitels auf 32 Zeichen begrenzt wurde (was gemäß der Spezifikation technisch korrekt war) (#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 einen Getter für den Zugriff darauf bereit. Wenn sich das benutzerdefinierte Layout ändert, wird MediaController.Listener.onCustomLayoutChanged aufgerufen. Apps, die unterschiedliche benutzerdefinierte Layouts an verschiedene Media3-Controller senden möchten, können dies in MediaSession.Callback.onConnect mit einem AcceptedResultBuilder tun, damit das benutzerdefinierte Layout für den Controller verfügbar ist, wenn die Verbindung hergestellt ist.
    • Fälle behoben, in denen MediaLibraryServiceLegacyStub einen Fehler an eine Result gesendet hat, die dies nicht unterstützt hat, was zu einem UnsupportedOperationException geführt hat (#78).
    • Korrigieren Sie die Art und Weise, wie PlayerWrapper einen VolumeProviderCompat erstellt, indem Sie volumeControlType sowohl über Legacy-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) bestimmen (#554).

Version 1.1.0

5. Juli 2023

  • Common Library:
    • Grund für die Unterdrückung bei ungeeigneter Audioroute hinzugefügt und Wiedergabe, wenn bereit. Grund für zu lange Unterdrückung geändert. (#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
    • Fügen Sie dem Player überladene Methoden hinzu, 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 hinzufügen und vorhandenen Konstruktor einstellen.
    • Füge DeviceInfo.routingControllerId hinzu, um die Routing-Controller-ID für die Remote-Wiedergabe anzugeben.
    • Player.replaceMediaItem(s) wurde als Verknüpfung zum Hinzufügen und Entfernen von Elementen an derselben Position hinzugefügt (#8046).
  • ExoPlayer:
    • ExoPlayer darf die Methoden zur Lautstärkeregelung des Geräts nur steuern, wenn dies ausdrücklich aktiviert wurde. Mit ExoPlayer.Builder.setDeviceVolumeControlEnabled haben Sie Zugriff auf:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) und setDeviceVolume(int, int)
      • increaseDeviceVolume(int) und increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) und decreaseDeviceVolume(int, int)
    • FilteringMediaSource hinzufügen, um verfügbare Tracktypen aus einem MediaSource zu filtern.
    • Unterstützung für die Einbeziehung von Common Media Client Data (CMCD) in die ausgehenden Anfragen der adaptiven Streamingformate DASH, HLS und SmoothStreaming hinzugefügt. Die folgenden Felder wurden aufgenommen: br, bl, cid, rtp und sid (#8699). API-Struktur und API-Methoden:
      • 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 herauszufiltern, 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 und nicht als int zu speichern. Dadurch werden die Signaturen der öffentlichen Methoden SampleQueue.sourceId und SampleQueue.peekSourceId geändert.
    • Fügen Sie den LoadControl-Methoden shouldStartPlayback und onTracksSelected Parameter hinzu, mit denen diese Methoden mit der relevanten MediaPeriod verknüpft 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 Nebenläufigkeitsprobleme bei Livestreams mit mehreren Zeiträumen zu vermeiden.
    • Stellen Sie EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) und BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs) ein. Stattdessen kann die Variante der Methoden ohne mediaTimeOffsetUs aufgerufen werden. Beachten Sie, dass der Offset auch bei den verworfenen Varianten nicht mehr zu startTimeUs und endTimeUs der MediaLoadData-Objekte hinzugefügt wird, 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) beim Aufruf einer leeren Playlist wurde behoben.
  • Transformer:
    • Transformer.Builder.setMediaSourceFactory(MediaSource.Factory) entfernen. Verwenden Sie stattdessen ExoPlayerAssetLoader.Factory(MediaSource.Factory) und Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Transformer.startTransformation(MediaItem, ParcelFileDescriptor) entfernen.
    • Es wurde ein Fehler behoben, durch den die Transformation hängen bleiben konnte (was zu einer Zeitüberschreitung des Muxers führte), wenn das Ende des Videostreams signalisiert wurde, während ein Eingabeframe auf die Verarbeitung wartete.
    • Codecs über MediaCodecList statt über findDecoder/EncoderForFormat-Dienstprogramme abfragen, um die Unterstützung zu erweitern.
    • Entfernen Sie die B-Frame-Konfiguration in DefaultEncoderFactory, da sie auf einigen Geräten nicht funktioniert.
  • Trackauswahl:
    • Fügen Sie DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange hinzu, das standardmäßig deaktiviert ist. Wenn diese Option aktiviert ist, löst der DefaultTrackSelector eine neue Trackauswahl aus, wenn sich die Renderer-Funktionen geändert haben.
  • Extraktoren:
    • Ogg: Fehler beim Suchen in Dateien mit langer Dauer behoben (#391).
    • FMP4: Es wurde ein Problem behoben, bei dem TimestampAdjuster einen falschen Zeitstempel-Offset mit der Metadaten-Beispielzeit aus dem emsg-Atom initialisiert (#356).
  • Audio:
    • Fehler behoben, bei dem einige Wiedergaben fehlschlagen, wenn Tunneling aktiviert ist und AudioProcessors aktiv sind, z.B. für lückenloses Kürzen (#10847).
    • Opus-Frames in Ogg-Paketen bei direkter Wiedergabe (Offload) kapseln.
    • Aktuelle Position während des Ruhezustands mit Offload-Planung extrapolieren.
    • Füge Renderer.release() und AudioSink.release() hinzu, um die Ressourcen am Ende des Lebenszyklus des Players freizugeben.
    • Änderungen der Audiofunktionen in DefaultAudioSink überwachen. Fügen Sie im Konstruktor von DefaultAudioSink einen erforderlichen Parameter context hinzu, mit dem sich DefaultAudioSink als Listener für AudioCapabilitiesReceiver registriert und seine audioCapabilities-Property aktualisiert, wenn es über eine Änderung der Funktionen informiert wird.
    • Änderungen der Audiofunktionen werden über ein neues Ereignis onAudioCapabilitiesChanged in der Schnittstelle AudioSink.Listener und eine neue Schnittstelle RendererCapabilities.Listener weitergegeben, die onRendererCapabilitiesChanged-Ereignisse auslöst.
    • Fügen Sie ChannelMixingAudioProcessor hinzu, um die Skalierung/Mischung auf Audiokanäle anzuwenden.
    • Neuer int-Wert DISCARD_REASON_AUDIO_BYPASS_POSSIBLE wurde zu DecoderDiscardReasons hinzugefügt, um den Audiodecoder 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 hinzugefügt (#335).
  • Video:
    • MediaCodecVideoRenderer soll einen VideoSize mit einer Breite und Höhe von 0 melden, wenn der Renderer deaktiviert ist. Player.Listener.onVideoSizeChanged wird entsprechend aufgerufen, wenn sich Player.getVideoSize() ändert. Mit dieser Ä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 ist.
  • DRM:
    • Reduzieren Sie die Sichtbarkeit mehrerer interner Methoden in DefaultDrmSession, die nicht von außerhalb des DRM-Pakets aufgerufen werden sollen:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Eine neue Muxer-Bibliothek hinzufügen, mit der eine MP4-Containerdatei erstellt werden kann.
  • IMA-Erweiterung:
    • Aktivieren Sie DASH-Livestreams mit mehreren Zeiträumen für die dynamische Anzeigenbereitstellung. Beachte, dass die aktuelle Implementierung noch keine Suche in Livestreams unterstützt (#10912).
    • Es wurde ein Fehler behoben, bei dem eine neue Anzeigengruppe in Livestreams eingefügt wurde, weil die berechnete Inhaltsposition in aufeinanderfolgenden Zeitachsen leicht variierte.
  • Sitzung:
    • Fügen Sie die Hilfsmethode MediaSession.getControllerForCurrentRequest hinzu, um Informationen über den Controller abzurufen, der gerade eine Player-Methode aufruft.
    • androidx.media3.session.MediaButtonReceiver wurde hinzugefügt, damit Apps die Wiedergabe mit Ereignissen von Medientasten fortsetzen können, die z. B. 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).
    • In der kompakten Ansicht für Medienbenachrichtigungen werden unter Android 12 und niedriger standardmäßig die Befehlsschaltflächen „Zurück“ und „Weiter“ 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).
    • In der kompakten Ansicht für Medienbenachrichtigungen werden standardmäßig die Befehlsschaltflächen „Zurück“ und „Weiter“ für Android 12 und niedriger hinzugefügt (#410).
  • UI:
    • Füge die Util-Methoden shouldShowPlayButton und handlePlayPauseButtonAction hinzu, um benutzerdefinierte UI-Elemente mit einer Wiedergabe-/Pausetaste zu schreiben.
  • RTSP-Erweiterung:
    • Verwenden Sie für MPEG4-LATM den Standardwert für „profile-level-id“, wenn er in der SDP-Nachricht der Describe-Antwort fehlt (#302).
    • Verwendung des Basis-URI für die Auflösung relativer Pfade aus der RTSP-Sitzung, falls im DESCRIBE-Antwortheader vorhanden (#11160).
  • DASH-Erweiterung:
    • Entferne den Medienzeitversatz aus MediaLoadData.startTimeMs und MediaLoadData.endTimeMs für DASH-Streams mit mehreren Zeiträumen.
    • Fehler behoben, bei dem die erneute Vorbereitung einer Multi-Period-Live-DASH-Medienquelle eine IndexOutOfBoundsException erzeugte (#10838).
  • HLS-Erweiterung:
    • Fügen Sie HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) hinzu, um ein Zeitlimit für den Ladethread festzulegen, der auf die Initialisierung von TimestampAdjuster wartet. Wenn die Initialisierung nicht vor dem Zeitlimit abgeschlossen ist, wird ein PlaybackException ausgelöst, um ein endloses Stocken der Wiedergabe zu vermeiden. Das Zeitlimit ist standardmäßig auf null gesetzt (#323).
  • Testdienstprogramme:
    • Prüfen Sie, ob die Groß-/Kleinschreibung im URI-Schema in DataSourceContractTest ignoriert wird.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Entfernen Sie DefaultAudioSink-Konstruktoren und verwenden Sie stattdessen DefaultAudioSink.Builder.
    • Entfernen Sie HlsMasterPlaylist und verwenden Sie stattdessen HlsMultivariantPlaylist.
    • Player.stop(boolean) entfernen. Verwenden Sie stattdessen Player.stop() und Player.clearMediaItems() (wenn reset den Wert true hat).
    • Zwei verworfene SimpleCache-Konstruktoren wurden entfernt. Verwenden Sie stattdessen einen nicht verworfenen Konstruktor, der einen DatabaseProvider akzeptiert, um die Leistung zu verbessern.
    • Entfernen Sie den Konstruktor DefaultBandwidthMeter und verwenden Sie stattdessen DefaultBandwidthMeter.Builder.
    • Entfernen Sie DefaultDrmSessionManager-Konstruktoren und verwenden Sie stattdessen DefaultDrmSessionManager.Builder.
    • Zwei verworfene HttpDataSource.InvalidResponseCodeException-Konstruktoren wurden entfernt. Verwenden Sie einen nicht verworfenen Konstruktor, der zusätzliche Felder(cause, responseBody) akzeptiert, um das Fehler-Logging zu verbessern.
    • Entfernen Sie DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash und DownloadHelper.forSmoothStreaming und verwenden Sie stattdessen DownloadHelper.forMediaItem.
    • Entfernen Sie den verworfenen DownloadService-Konstruktor und verwenden Sie einen nicht verworfenen Konstruktor, der die Option zum Bereitstellen eines channelDescriptionResourceId-Parameters enthält.
    • Entfernen Sie die verworfenen 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 verworfenen WorkManagerScheduler-Konstruktor und verwenden Sie stattdessen einen nicht verworfenen Konstruktor, der die Option zum Bereitstellen eines Context-Parameters enthält.
    • Die verworfenen Methoden createVideoSampleFormat, createAudioSampleFormat, createContainerFormat und createSampleFormat, die zum Instanziieren der Klasse Format verwendet wurden, wurden entfernt. 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 die verworfene ExoPlayer.retry() und verwenden Sie stattdessen prepare().
    • Der verworfene DefaultTrackSelector-Konstruktor ohne Argumente wurde entfernt. Verwenden Sie stattdessen DefaultTrackSelector(Context).
    • Entfernen Sie den verworfenen Konstruktor OfflineLicenseHelper und verwenden Sie stattdessen OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Der verworfene DownloadManager-Konstruktor wurde entfernt. Verwenden Sie stattdessen den Konstruktor, der ein Executor akzeptiert.
    • Die verworfenen Cue-Konstruktoren wurden entfernt. Verwenden Sie stattdessen Cue.Builder.
    • Der verworfene Konstruktor OfflineLicenseHelper wurde entfernt. Verwenden Sie stattdessen OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Vier veraltete AnalyticsListener-Methoden wurden entfernt:
      • 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 verworfene 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 ist veröffentlicht. Version 1.0.2 enthält diese Commits.

Dieser Release entspricht dem ExoPlayer 2.18.7-Release.

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

  • Hauptbibliothek:
    • Fügen Sie Buffer.isLastSample() hinzu, um anzugeben, ob Buffer das Flag C.BUFFER_FLAG_LAST_SAMPLE enthält.
    • Problem behoben, bei dem der letzte Frame möglicherweise nicht gerendert wurde, wenn das letzte Sample mit Frames ohne Lesen des „End of Stream“-Samples aus der Warteschlange entfernt wurde. (#11079).
  • Extraktoren:
    • Das Parsen von H.265-SPS in MPEG-TS-Dateien wurde korrigiert, indem die Parsing-Logik wiederverwendet wurde, die bereits von RTSP- und MP4-Extraktoren verwendet wird (#303).
  • Text:
    • SSA: Unterstützung für UTF-16-Dateien hinzugefügt, wenn sie mit einer Bytereihenfolge-Marke beginnen (#319).
  • Sitzung:
    • Problem behoben, bei dem MediaController die verfügbaren Befehle nicht aktualisiert, wenn eine Verbindung zu einem Legacy-MediaSessionCompat besteht, das seine Aktionen aktualisiert.
    • Fehler behoben, der verhinderte, dass MediaLibraryService für einen Aufruf von der System-UI an Callback.onGetLibraryRoot mit params.isRecent == true auf API 30 null zurückgibt (#355).
    • Speicherleck von MediaSessionService oder MediaLibraryService behoben (#346).
    • Ein Fehler wurde behoben, bei dem eine kombinierte Aktualisierung von Timeline und Position in einem MediaSession dazu führen konnte, dass ein MediaController einen IllegalStateException auslöste.

Version 1.0.1

18. April 2021.

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

Diese Version entspricht dem ExoPlayer 2.18.6-Release.

  • Hauptbibliothek:
    • Überschreibung des Ziel-Livestreams beim Springen zur Standardposition zurücksetzen (#11051).
    • Es wurde ein Fehler behoben, bei dem leere Beispielstreams in den Medien dazu führen konnten, dass die Wiedergabe hängen blieb.
  • Sitzung:
    • Fehler behoben, bei dem mehrere identische Warteschlangenelemente, die von einer Legacy-MediaSessionCompat veröffentlicht wurden, zu einer Ausnahme in MediaController führten (#290).
    • Fehlende Weiterleitung von MediaSession.broadcastCustomCommand an die Legacy-MediaControllerCompat.Callback.onSessionEvent hinzugefügt (#293).
    • Fehler behoben, bei dem durch den Aufruf von MediaSession.setPlayer die verfügbaren Befehle nicht aktualisiert wurden.
    • Problem behoben, bei dem TrackSelectionOverride-Instanzen, die von einem MediaController gesendet wurden, ignoriert wurden, wenn sie auf eine Gruppe mit Format.metadata verwiesen (#296).
    • Problem behoben, bei dem Player.COMMAND_GET_CURRENT_MEDIA_ITEM verfügbar sein muss, um über die Legacy-MediaSessionCompat auf Metadaten zuzugreifen.
    • Problem behoben, bei dem MediaSession-Instanzen in einem Hintergrundthread bei Verwendung in MediaSessionService zu Abstürzen führten (#318).
    • Ein Problem wurde behoben, bei dem ein MediaButtonReceiver von der Bibliothek deklariert wurde, ohne dass dies von der App beabsichtigt war (#314).
  • DASH:
    • Verarbeitung leerer Segmentzeitachsen wurde korrigiert (#11014).
  • RTSP:
    • Wiederholung mit TCP, wenn die RTSP-Einrichtung mit UDP mit dem RTSP-Fehler 461 „UnsupportedTransport“ fehlschlägt (#11069).

Version 1.0.0

22. März 2023

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

Diese Version entspricht dem ExoPlayer 2.18.5-Release.

Seit Version 1.0.0-rc02 gibt es keine Änderungen.

Version 1.0.0-rc02

2. März 2023

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

Diese Version entspricht der ExoPlayer-Version 2.18.4.

  • Hauptbibliothek:
    • Fehlerbehebung bei der Erkennung des Netzwerktyps in API 33 (#10970).
    • Fehler NullPointerException beim Aufrufen von ExoPlayer.isTunnelingEnabled behoben (#10977).
  • Downloads:
    • Die maximale Differenz der Startzeit von zwei Segmenten, die zusammengeführt werden sollen, kann in SegmentDownloader und Unterklassen konfiguriert werden (#248).
  • Audio:
    • Fehlerhafte lückenlose MP3-Wiedergabe auf Samsung-Geräten behoben (#8594).
    • Fehler behoben, bei dem Wiedergabegeschwindigkeiten, die unmittelbar nach dem Deaktivieren von Audio festgelegt wurden, möglicherweise durch eine vorherige Geschwindigkeitsänderung überschrieben wurden (#10882).
  • Video:
    • Ordne das HEVC-HDR10-Format HEVCProfileMain10HDR10 statt HEVCProfileMain10 zu.
    • Problemumgehung für ein Geräteproblem bei 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 (#10898).
    • Leistungsprobleme bei der Frame-Freigabe bei der Wiedergabe von Medien mit einer Framerate, die weit über der Aktualisierungsrate des Displays liegt, wurden behoben.
  • Streamen:
    • Problem mit vorübergehendem STATE_IDLE beim Wechsel zwischen Mediendateien behoben (#245).
  • RTSP:
    • Die IllegalArgumentException, die beim Parsen von ungültigen RTSP-Describe-Antwortnachrichten ausgelöst wird, wird abgefangen (#10971).
  • Sitzung:
    • Es wurde ein Fehler behoben, durch den die Wiedergabe-/Pausetaste für Benachrichtigungen nicht mit dem Player-Status aktualisiert wurde (#192).
  • IMA-Erweiterung:
    • Es wurde ein Fehler behoben, der verhinderte, dass Streams mit dynamischer Anzeigenbereitstellung ohne Anzeigen gestartet wurden, weil 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 ist veröffentlicht. Version 1.0.0-rc01 enthält diese Commits.

Dieser Release entspricht dem ExoPlayer 2.18.3-Release.

  • Hauptbibliothek:
    • Die Decoder-Sortierlogik des Renderers wurde angepasst, um die Einstellungen von MediaCodecSelector zu berücksichtigen, 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üge ExoPlayer.Builder.setPlaybackLooper hinzu, um einen vorhandenen Wiedergabe-Thread für eine neue ExoPlayer-Instanz festzulegen.
    • Download-Manager-Hilfsprogramme können jetzt gelöscht werden (#10776).
    • Füge BasePlayer.seekTo einen Parameter hinzu, um auch den Befehl anzugeben, der für die Suche verwendet wird.
    • Verwendung des Designs beim Laden von Drawables in API 21+ (#220).
    • ConcatenatingMediaSource2 wurde hinzugefügt, um mehrere Mediendateien in einem einzigen Fenster zu kombinieren (#247).
  • Extraktoren:
    • Löse eine ParserException anstelle einer NullPointerException aus, wenn in der Beispiel-Tabelle (stbl) eine erforderliche Beispiel-Beschreibung (stsd) fehlt, wenn trak-Atome geparst werden.
    • Samples werden beim direkten Springen zu einem Synchronisierungsframe in fMP4 korrekt übersprungen (#10941).
  • Audio:
    • Verwende die Bitrate des komprimierten Audioformats, um die minimale Puffergröße für AudioTrack bei direkten Wiedergaben (Passthrough) zu berechnen.
  • Text:
    • Fehler behoben, bei dem TextRenderer einen ungültigen (negativen) Index an Subtitle.getEventTime übergibt, wenn eine Untertiteldatei keine Cues enthält.
    • SubRip: Unterstützung für UTF-16-Dateien hinzugefügt, wenn sie mit einer Byte-Reihenfolge-Markierung beginnen.
  • Metadaten:
    • Mehrere durch Null getrennte Werte aus ID3-Frames parsen, wie es ID3 v2.4 zulässt.
    • Fügen Sie MediaMetadata.mediaType hinzu, um den Typ des Inhalts oder des Ordners anzugeben, der durch die Metadaten beschrieben wird.
    • Fügen Sie MediaMetadata.isBrowsable als Ersatz für MediaMetadata.folderType hinzu. Der Ordnertyp wird in der nächsten Version eingestellt.
  • DASH:
    • Vollständiges Parsen für Bildanpassungssätze hinzugefügt, einschließlich Kachelanzahl (#3752).
  • UI:
    • Die verworfene PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) wurde korrigiert, damit Änderungen an der Sichtbarkeit an den registrierten Listener übergeben werden (#229).
    • Die Reihenfolge der Steuerelemente des Videoplayers in der Mitte in PlayerView wurde korrigiert, wenn ein Layout mit einer Leserichtung von rechts nach links (RTL) verwendet wird (#227).
  • Sitzung:
    • Füge die abstrakte Klasse SimpleBasePlayer hinzu, um die Schnittstelle Player für benutzerdefinierte Player zu implementieren.
    • Hilfsmethode zum Konvertieren des Plattform-Sitzungstokens in Media3 SessionToken hinzugefügt (#171).
    • Verwenden Sie onMediaMetadataChanged, um Aktualisierungen der Plattform-Mediensitzung auszulösen (#219).
    • Die Mediensitzung wurde als Argument von getMediaButtons() der DefaultMediaNotificationProvider hinzugefügt und es werden unveränderliche Listen verwendet, um die Übersichtlichkeit zu verbessern (#216).
    • onSetMediaItems-Callback-Listener hinzugefügt, um die Möglichkeit zu bieten, die MediaItem-Liste, den Startindex und die Position nach Sitzung zu ändern/festzulegen, bevor sie im Player festgelegt werden (#156).
    • Die Erkennung von Doppeltippen für Ereignisse von Nicht-Bluetooth-Medientasten wird vermieden (#233).
    • QueueTimeline wurde robuster gemacht, falls ein fragwürdiger Legacy-Sitzungsstatus vorliegt (#241).
  • Metadaten:
    • Mehrere durch Null getrennte Werte aus ID3-Frames parsen, wie es ID3 v2.4 zulässt.
    • Fügen Sie MediaMetadata.mediaType hinzu, um den Typ des Inhalts oder des Ordners anzugeben, der durch die Metadaten beschrieben wird.
    • Fügen Sie MediaMetadata.isBrowsable als Ersatz für MediaMetadata.folderType hinzu. Der Ordnertyp wird in der nächsten Version eingestellt.
  • Cast-Erweiterung:
    • Cast SDK-Version auf 21.2.0 aktualisiert.
  • IMA-Erweiterung:
    • Entferne den Player-Listener von ImaServerSideAdInsertionMediaSource im Anwendungsthread, um Threading-Probleme zu vermeiden.
    • Füge der ImaServerSideAdInsertionMediaSource.AdsLoader.Builder die Property focusSkipButtonWhenAvailable hinzu, um den Fokus auf den Überspringen-Button auf TV-Geräten zu legen, und setze sie standardmäßig auf „true“.
    • Fügen Sie der ImaServerSideAdInsertionMediaSource.AdsLoader die Methode focusSkipButton() hinzu, um den Fokus programmatisch auf die Schaltfläche zum Überspringen zu legen.
    • Die IMA SDK-Version wurde auf 3.29.0 aktualisiert.
  • Demo-App:
    • Berechtigung zum Senden von Benachrichtigungen für Downloadbenachrichtigungen zur Laufzeit anfordern (#10884).

Version 1.0.0-beta03

22. November 2022

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

Diese Version entspricht der ExoPlayer-Version 2.18.2.

  • Hauptbibliothek:
    • ExoPlayer.isTunnelingEnabled wurde hinzugefügt, um zu prüfen, ob Tunneling für die aktuell ausgewählten Tracks aktiviert ist (#2518).
    • WrappingMediaSource hinzugefügt, um das Wrapping eines einzelnen MediaSource zu vereinfachen (#7279).
    • Der Back-Buffer wird verworfen, bevor die Wiedergabe aufgrund von unzureichendem verfügbarem Speicherplatz hängen bleibt.
    • Schließen Sie den Tracing-Block „doSomeWork“, wenn die Auslagerung aktiviert ist.
    • Problem mit dem Sitzungstracking 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üge 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-Veröffentlichung zu einer IllegalStateException führen kann (#10758).
  • Build:
    • Mindestens compileSdkVersion erzwingen, um Kompilierungsfehler zu vermeiden (#10684).
    • Veröffentlichungsblock vermeiden, wenn er in einem anderen Gradle-Build enthalten ist.
  • Trackauswahl:
    • Andere Tracks gegenüber Dolby Vision bevorzugen, wenn das Display Dolby Vision nicht unterstützt. (#8944).
  • Downloads:
    • Potenzielle Endlosschleife in ProgressiveDownloader behoben, die durch gleichzeitiges Herunterladen und Abspielen mit derselben PriorityTaskManager verursacht wurde (#10570).
    • Downloadbenachrichtigung sofort anzeigen (#183).
    • Die Anzahl der parallelen Downloadentfernungen wurde auf 1 begrenzt, um die Erstellung übermäßiger Threads zu vermeiden (#10458).
  • Video:
    • Versuche es mit einem alternativen Decoder für Dolby Vision, wenn das Display es nicht unterstützt. (#9794).
  • Audio:
    • Verwende SingleThreadExecutor, um AudioTrack-Instanzen freizugeben, um OutOfMemory-Fehler zu vermeiden, wenn mehrere Player gleichzeitig freigegeben werden (#10057).
    • Fügt AudioOffloadListener.onExperimentalOffloadedPlayback für den AudioTrack-Offload-Status hinzu. (#134).
    • AudioTrackBufferSizeProvider als öffentliche Schnittstelle festlegen.
    • Fügen Sie 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 werden auf allen Android-Versionen den Kanalmasken 7.1 bzw. 7.1.4 zugeordnet (#10701).
  • Metadaten:
    • MetadataRenderer kann jetzt so konfiguriert werden, dass Metadaten gerendert werden, sobald sie verfügbar sind. Erstelle eine Instanz mit MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), um anzugeben, ob der Renderer Metadaten frühzeitig oder synchron mit der Wiedergabeposition ausgibt.
  • DRM:
    • Problem in der ClearKey-Implementierung von Android 13 umgehen, bei dem eine nicht leere, aber ungültige Lizenz-URL zurückgegeben wird.
    • Fehler setMediaDrmSession failed: session not opened beim Wechsel zwischen DRM-Schemas in einer Playlist (z.B. Widevine zu ClearKey) wurde behoben.
  • Text:
    • CEA-608: Befehle zum Wechseln des Dienstes in Feld 2 werden jetzt korrekt verarbeitet (#10666).
  • DASH:
    • EventStream.presentationTimeOffset aus Manifesten parsen (#10460).
  • UI:
    • Aktuelle Überschreibungen des Players verwenden, wie in TrackSelectionDialogBuilder voreingestellt (#10429).
  • Sitzung:
    • Befehle werden immer in der richtigen Reihenfolge ausgeführt, auch wenn einige eine asynchrone Auflösung erfordern (#85).
    • Fügen Sie DefaultMediaNotificationProvider.Builder hinzu, um DefaultMediaNotificationProvider-Instanzen zu erstellen. Der Builder kann die Benachrichtigungs-ID, die Benachrichtigungskanal-ID und den Benachrichtigungskanalnamen konfigurieren, die vom Anbieter verwendet werden. Fügen Sie außerdem die Methode DefaultMediaNotificationProvider.setSmallIcon(int) hinzu, um das kleine Symbol für Benachrichtigungen festzulegen. (#104).
    • Sicherstellen, dass vor MediaController.release() gesendete Befehle nicht verworfen werden (#99).
    • SimpleBitmapLoader kann Bitmaps aus file://-URIs laden (#108).
    • Behebung einer Assertion, die verhindert, dass MediaController in einem Zeitraum über eine Anzeige springt (#122).
    • Wenn die Wiedergabe endet, wird die MediaSessionService im Vordergrund beendet und eine Benachrichtigung zum Neustart der Wiedergabe des zuletzt wiedergegebenen Medienelements wird angezeigt (#112).
    • Starten Sie keinen Dienst im Vordergrund mit einem Pending Intent für die Pause (#167).
    • Manuelles Ausblenden des „Badges“, das mit der von DefaultNotificationProvider erstellten Benachrichtigung verknüpft ist, in API 26 und API 27 (das Badge wird in API 28+ automatisch ausgeblendet) (#131).
    • Fehler behoben, bei dem eine zweite Binder-Verbindung von einer Legacy-MediaSession zu einem Media3-MediaController IllegalStateExceptions verursacht (#49).
  • RTSP:
    • Hinzufügen der Verarbeitung fragmentierter H263-Pakete (#119).
    • Unterstützung für MP4A-LATM hinzugefügt (#162).
  • IMA:
    • Zeitlimit für das Laden von Anzeigeninformationen hinzugefügt, um Fälle zu verarbeiten, in denen das IMA SDK beim Laden einer Anzeige hängen bleibt (#10510).
    • Verhindern, dass Mid-Roll-Anzeigen übersprungen werden, wenn zum Ende des Inhalts gesprungen wird (#10685).
    • Die Fensterdauer für Livestreams mit serverseitig eingefügten Anzeigen, z. B. IMA DAI, wird korrekt berechnet (#10764).
  • FFmpeg-Erweiterung:
    • Neu erforderliche Flags zum Verknüpfen von FFmpeg-Bibliotheken mit NDK 23.1.7779620 und höher hinzugefügt (#9933).
  • AV1-Erweiterung:
    • CMake-Version aktualisiert, um Inkompatibilitäten mit den neuesten Android Studio-Releases zu vermeiden (#9933).
  • Cast-Erweiterung:
    • getDeviceInfo() implementieren, um CastPlayer identifizieren zu können, wenn die Wiedergabe mit einem MediaController gesteuert wird (#142).
  • Transformer:
    • Muxer-Watchdog-Timer hinzugefügt, um zu erkennen, wenn die Generierung eines Ausgabe-Samples zu langsam ist.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Transformer.Builder.setOutputMimeType(String) entfernen. 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 ist veröffentlicht. Version 1.0.0-beta02 enthält diese Commits.

Diese Version entspricht dem ExoPlayer 2.18.1-Release.

  • Hauptbibliothek:
    • Achten Sie darauf, dass das Ändern von ShuffleOrder mit ExoPlayer.setShuffleOrder zu einem Aufruf von Player.Listener#onTimelineChanged mit reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED führt (#9889).
    • Bei progressiven Medien werden nur ausgewählte Tracks in die gepufferte Position aufgenommen (#10361).
    • Benutzerdefinierten Logger für alle ExoPlayer-Logausgaben zulassen (#9752).
    • Die Implementierung von setDataSourceFactory in DefaultMediaSourceFactory wurde korrigiert, da sie in einigen Fällen nicht funktionierte (#116).
  • Extraktoren:
    • Das Parsen von H265-Kurzzeit-Referenzbildsätzen wurde korrigiert (#10316).
    • Das Parsen von Bitraten aus esds-Boxen wurde korrigiert (#10381).
  • DASH:
    • ClearKey-Lizenz-URL aus Manifesten parsen (#10246).
  • UI:
    • TalkBack muss die aktuell aktive Geschwindigkeitsoption im Menü „Wiedergabesteuerung“ ansagen (#10298).
  • RTSP:
    • Verarbeitung fragmentierter VP8-Pakete hinzugefügt (#110).
  • Leanback-Erweiterung:
    • Auf playWhenReady-Änderungen in LeanbackAdapter warten (10420).
  • Streamen:
    • Verwenden Sie die MediaItem, die als Window.mediaItem in CastTimeline an die Playlist-Methoden übergeben wurde (#25, #8212).
    • Unterstützung für Player.getMetadata() und Listener.onMediaMetadataChanged() mit CastPlayer (#25).

Version 1.0.0-beta01

16. Juni 2022

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

Dies entspricht dem ExoPlayer 2.18.0-Release.

  • Hauptbibliothek:
    • Unterstützung für die Android-Plattformdiagnose über MediaMetricsManager aktivieren. ExoPlayer leitet Wiedergabeereignisse und Leistungsdaten an die Plattform weiter, um Informationen zur Systemleistung und zum Debugging auf dem Gerät bereitzustellen. Diese Daten können auch von Google erhoben werden, wenn die Weitergabe von Nutzungs- und Diagnosedaten vom Nutzer des Geräts aktiviert wurde. Apps können mit ExoPlayer.Builder.setUsePlatformDiagnostics(false) festlegen, dass sie nicht zur Plattformdiagnose für ExoPlayer beitragen.
    • Fehler behoben, bei dem Tracks bei Verwendung von MergingMediaSource zu oft zurückgesetzt werden, z. B. beim Sideloading von Untertiteln und beim Ändern des ausgewählten Untertitels während der Wiedergabe (#10248).
    • Die Erkennung des 5G-NSA-Netzwerktyps in API 29 und 30 wird beendet. Bei diesen Wiedergaben wird von einem 4G-Netzwerk ausgegangen.
    • Übergabe 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üge MediaItem.RequestMetadata hinzu, um Metadaten darzustellen, die zum Abspielen von Medien erforderlich sind, wenn die genaue LocalConfiguration nicht bekannt ist. Entfernen Sie auch MediaMetadata.mediaUrl, da dies jetzt in RequestMetadata enthalten ist.
    • Fügen Sie Player.Command.COMMAND_SET_MEDIA_ITEM hinzu, damit Spieler ein einzelnes Element festlegen können.
  • Trackauswahl:
    • Klasse TrackSelectionOverrides in TrackSelectionParameters reduzieren und TrackSelectionOverride zu einer Klasse der obersten Ebene hochstufen.
    • TracksInfo in Tracks und TracksInfo.TrackGroupInfo in Tracks.Group umbenennen. Player.getCurrentTracksInfo und Player.Listener.onTracksInfoChanged wurden ebenfalls in Player.getCurrentTracks und Player.Listener.onTracksChanged umbenannt. Dazu gehört auch, dass der Methodenname Player.Listener.onTracksChanged nicht mehr verworfen wird, aber mit anderen Parametertypen.
    • Ändern Sie DefaultTrackSelector.buildUponParameters und DefaultTrackSelector.Parameters.buildUpon so, dass DefaultTrackSelector.Parameters.Builder anstelle des verworfenen DefaultTrackSelector.ParametersBuilder zurückgegeben wird.
    • Fügen Sie DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities hinzu, das standardmäßig aktiviert ist. Wenn diese Option aktiviert ist, bevorzugt der DefaultTrackSelector Audiotracks, deren Kanalanzahl die Ausgabefunktionen des Geräts nicht überschreitet. Auf Mobilgeräten bevorzugt das DefaultTrackSelector Stereo-/Monoformate gegenüber Mehrkanal-Audioformaten, 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 Audio-Spatialisierung unterstützen, der DefaultTrackSelector auf Änderungen der Spatializer-Eigenschaften überwacht und eine neue Trackauswahl ausgelöst. Geräte mit einem television-UI-Modus sind von diesen Einschränkungen ausgenommen. Das Format mit der höchsten Kanalanzahl 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:
    • Verwenden Sie den LG AC3-Audiodecoder, der einen nicht standardmäßigen MIME-Typ bewirbt.
    • Der Rückgabetyp von AudioAttributes.getAudioAttributesV21() wurde von android.media.AudioAttributes in eine neue AudioAttributesV21-Wrapper-Klasse geändert, um eine langsame ART-Überprüfung bei API < 21 zu verhindern.
    • Plattform (API 29+) abfragen oder die Anzahl der Audiocodierungskanäle für Audio-Passthrough annehmen, wenn die Anzahl der Audioformatkanäle nicht festgelegt ist, was bei der HLS-Vorbereitung ohne Chunks der Fall ist (10204).
    • Konfiguriere AudioTrack mit der Kanalmaske AudioFormat.CHANNEL_OUT_7POINT1POINT4, wenn der Decoder 12-Kanal-PCM-Audio ausgibt (#10322).
  • Digitale Rechteverwaltung
    • Die DRM-Sitzung wird jetzt immer korrekt aktualisiert, wenn unmittelbar nach einer Formatänderung gespult wird (10274).
  • Text:
    • Ändern Sie Player.getCurrentCues() so, dass CueGroup anstelle von List<Cue> zurückgegeben wird.
    • SSA: Unterstützung der Stileinstellung OutlineColour, wenn BorderStyle == 3 (d.h. OutlineColour legt den Hintergrund des Cues fest) (#8435).
    • CEA-708: Daten in mehrere Dienstblöcke parsen und Blöcke ignorieren, die nicht mit der aktuell ausgewählten Dienstnummer verknüpft sind.
    • RawCcExtractor wurde entfernt, da es nur zur Verarbeitung eines Google-internen Untertitelformats verwendet wurde.
  • Extraktoren:
    • Unterstützung für AVI hinzugefügt (#2092).
    • Matroska: DiscardPadding für Opus-Tracks parsen.
    • MP4: Bitraten aus esds-Boxen parsen.
    • Ogg: Doppelte Opus-ID und Kommentarheader zulassen (#10038).
  • UI:
    • Fehler bei der Übermittlung von Ereignissen an OnClickListeners, die auf PlayerView festgelegt sind, wenn useController=false (#9605). Außerdem wurde die Übermittlung von Ereignissen an OnLongClickListener für alle Ansichtskonfigurationen korrigiert.
    • Fehler behoben, bei dem eine Sequenz von Touch-Events, die die Grenzen von PlayerView vor ACTION_UP verlassen, fälschlicherweise als Klick behandelt wurde (#9861).
    • Problem mit der Bedienungshilfe PlayerView behoben, bei dem durch Tippen die Wiedergabe umgeschaltet wurde, anstatt die Steuerelemente auszublenden (#8627).
    • Schreiben Sie TrackSelectionView und TrackSelectionDialogBuilder so um, dass sie mit der Player-Schnittstelle statt mit 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 Trackauswahl von PlayerView angezeigt und ein geeigneter erzwungener Text-Track bleibt ausgewählt, wenn „Keine“ ausgewählt ist (#9432).
  • DASH:
    • Anzahl der Kanäle aus DTS-AudioChannelConfiguration-Elementen parsen. Dadurch wird die Audio-Passthrough-Funktion für DTS-Streams wieder aktiviert (#10159).
    • Die Übergabe von null an DashMediaSource.Factory.setCompositeSequenceableLoaderFactory wird nicht zugelassen. Instanzen von DefaultCompositeSequenceableLoaderFactory können bei Bedarf explizit übergeben werden.
  • HLS:
    • Fallback auf die Vorbereitung mit Chunks, wenn das Attribut CODECS der Playlist den Audio-Codec nicht enthält (#10065).
    • Die Übergabe von null an HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory und HlsMediaSource.Factory.setPlaylistTrackerFactory wird nicht zugelassen. Instanzen von DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory oder ein Verweis auf DefaultHlsPlaylistTracker.FACTORY können bei Bedarf explizit übergeben werden.
  • Smooth Streaming:
    • Die Übergabe von null an SsMediaSource.Factory.setCompositeSequenceableLoaderFactory wird nicht zugelassen. Instanzen von DefaultCompositeSequenceableLoaderFactory können bei Bedarf explizit übergeben werden.
  • RTSP:
    • RTP-Reader für H263 hinzugefügt (#63).
    • RTP-Reader für MPEG4 hinzugefügt (#35).
    • RTP-Reader für HEVC hinzugefügt (#36).
    • RTP-Reader für AMR hinzufügen. Derzeit werden nur einkanalige, nicht verschachtelte AMR-Streams unterstützt. Zusammengesetzte AMR-RTP-Nutzlast wird nicht unterstützt. (#46)
    • RTP-Reader für VP8 hinzugefügt (#47).
    • RTP-Reader für WAV hinzugefügt (#56).
    • RTSP-Header für die Standardautorisierung korrigieren. (#9544).
    • Die Prüfung obligatorischer SDP-Felder wurde eingestellt, da ExoPlayer sie nicht benötigt (#10049).
    • Auslösen einer geprüften Ausnahme beim Parsen des RTSP-Timings (#10165).
    • RTP-Reader für VP9 hinzugefügt (#47).
    • RTP-Reader für OPUS hinzugefügt (#53).
  • Datenquellen:
    • Benennen Sie DummyDataSource in PlaceholderDataSource um.
    • Problemumgehung für die OkHttp-Unterbrechungsbehandlung.
  • 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 Legacy-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-Aufrufe 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 Coverbildern hinzu.
    • Fügen Sie MediaSession.setCustomLayout() hinzu, um die Abwärtskompatibilität mit der Legacy-Sitzung zu gewährleisten.
    • Fügen Sie MediaSession.setSessionExtras() hinzu, um die Funktionsparität mit der Legacy-Sitzung zu gewährleisten.
    • Benennen Sie MediaSession.MediaSessionCallback in MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback in MediaLibrarySession.Callback und MediaSession.Builder.setSessionCallback in setCallback um.
    • NPE in MediaControllerImplLegacy behoben (#59).
    • Änderung der Positionsinformationen der Sitzung auf der Zeitachse(#51).
    • NPE in MediaControllerImplBase nach dem Freigeben des Controllers behoben (#74).
  • Anzeigenwiedergabe / IMA:
    • Die Abrufhäufigkeit für Anzeigen wurde von alle 100 ms auf alle 200 ms verringert, um den Empfehlungen des Media Rating Council (MRC) zu entsprechen.
  • FFmpeg-Erweiterung:
    • CMake-Version auf 3.21.0+ aktualisiert, um einen CMake-Fehler zu vermeiden, der dazu führt, dass die Gradle-Synchronisierung von Android Studio fehlschlägt (#9933).
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) entfernen. Verwenden Sie stattdessen Player.Listener.onTracksChanged(Tracks).
    • Entfernen Sie Player.getCurrentTrackGroups und Player.getCurrentTrackSelections. Verwenden Sie stattdessen Player.getCurrentTracks. Sie können auch weiterhin ExoPlayer.getCurrentTrackGroups und ExoPlayer.getCurrentTrackSelections verwenden, obwohl diese Methoden weiterhin verworfen werden.
    • 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).
    • Transformer.Builder.setContext entfernen. Der 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 ist veröffentlicht. Version 1.0.0-alpha03 enthält diese Commits.

Dies entspricht dem ExoPlayer 2.17.1-Release.

  • Audio:
    • Fehler bei der Überprüfung der Audiofunktionen für Dolby Atmos (E-AC3-JOC) in HLS behoben.
  • Extraktoren:
    • FMP4: Es wurde ein Problem behoben, bei dem emsg-Beispielmetadaten in der falschen Reihenfolge für Streams ausgegeben werden konnten, die sowohl v0- als auch v1-emsg-Atome enthalten (#9996).
  • Text:
    • Die Interaktion von SingleSampleMediaSource.Factory.setTrackId und MediaItem.SubtitleConfiguration.Builder.setId wurde korrigiert, um das Feld SubtitleConfiguration zu priorisieren und auf den Wert Factory zurückzugreifen, wenn es nicht festgelegt ist (#10016).
  • Anzeigenwiedergabe:
    • Behebung von Audiounterbrechungen zwischen Anzeigenzeiträumen in Live-HLS-SSAI-Streams.

Version 1.0.0-alpha02

2. März 2022

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

Dies entspricht dem ExoPlayer-Release 2.17.0.

  • Kernbibliothek:
    • 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 von ihnen erstellte MediaCodecRenderer-Instanzen übergeben können.
    • Die ICY-Headerfelder name und genre werden an MediaMetadata.station bzw. MediaMetadata.genre weitergegeben, damit sie die App über Player.Listener.onMediaMetadataChanged() erreichen (#9677).
    • Entfernen Sie Nullschlüssel aus DefaultHttpDataSource#getResponseHeaders.
    • Warten und wiederholen, wenn das Erstellen einer MediaCodec-Instanz fehlschlägt. 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 von MediaCodec abrufen können. (#9766).
    • Fehler bei der Maven-Abhängigkeitsauflösung behoben (#8353).
    • Deaktivieren der automatischen Geschwindigkeitsanpassung für Livestreams, die weder Funktionen mit niedriger Latenz noch eine Nutzereinstellung für die Geschwindigkeit haben (#9329).
    • Benennen Sie DecoderCounters#inputBufferCount in queuedInputBufferCount um.
    • SimpleExoPlayer.renderers als privat kennzeichnen. Auf Renderer kann über ExoPlayer.getRenderer zugegriffen werden.
    • Einige konstante AnalyticsListener.EventFlags-Werte wurden aktualisiert, um mit den Werten in Player.EventFlags übereinzustimmen.
    • AnalyticsCollector in eine Schnittstelle und eine Standardimplementierung aufteilen, damit es von R8 entfernt werden kann, wenn eine App es nicht benötigt.
  • Trackauswahl:
    • Unterstützung für bevorzugte Videorollen-Flags bei der Trackauswahl (#9402).
    • Die Logik für die Auswahl von Videotracks wurde aktualisiert, sodass bevorzugte MIME-Typen und Rollen-Flags berücksichtigt werden, wenn mehrere Videotracks für die Anpassung ausgewählt werden (#9519).
    • Die Logik für die Auswahl von Video- und Audiotracks wurde aktualisiert, sodass für adaptive Auswahlen nur Formate mit demselben Decoder- und Hardwaresupport ausgewählt werden (#9565).
    • Die Logik für die Auswahl von Videotracks wurde aktualisiert, sodass effizientere Codecs bevorzugt werden, wenn mehrere Codecs von primären, hardwarebeschleunigten Decodern unterstützt werden (#4835).
    • Bevorzugen Sie Einstellungen für Audioinhalte (z. B. den Standard-Audiotrack oder einen Track, der der Systemsprache entspricht) gegenüber technischen Einschränkungen bei der Trackauswahl (z. B. bevorzugter MIME-Typ oder maximale Kanalanzahl).
    • Problem bei der Trackauswahl behoben, bei dem das Überschreiben einer Trackgruppe andere Trackgruppen desselben Typs nicht deaktiviert hat (#9675).
    • Problem bei der Trackauswahl behoben, bei dem eine Mischung aus nicht leeren und leeren Tracküberschreibungen nicht korrekt angewendet wurde (#9649).
    • Doppelte TrackGroups in einem TrackGroupArray verbieten. TrackGroups können immer durch Festlegen einer id im TrackGroup-Konstruktor unterscheidbar gemacht werden. Dadurch wird ein Absturz behoben, der auftrat, wenn die Wiedergabe fortgesetzt wurde, nachdem die App mit einer aktiven Track-Überschreibung in den Hintergrund verschoben wurde (#9718).
    • Die Logik in AdaptiveTrackSelection wurde geändert, um eine Qualitätssteigerung bei ausreichender Netzwerkbandbreite zu ermöglichen, auch wenn die Wiedergabe sehr nahe 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.
    • Ändern Sie AudioCapabilities-APIs so, dass explizit AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES anstelle von null übergeben werden muss.
    • Anpassung der Berechnung der AudioTrack-Puffergröße durch Einfügen eines AudioTrackBufferSizeProvider in DefaultAudioSink zulassen. (#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).
    • Fehlerhaftes 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:
    • Feld MediaItem.SubtitleConfiguration.id hinzugefügt, das an das Feld Format.id des Untertiteltracks weitergegeben wird, der aus der Konfiguration erstellt wurde (#9673).
    • Grundlegende Unterstützung für WebVTT-Untertitel in Matroska-Containern hinzugefügt (#9886).
    • Verhindern, dass Cea708Decoder mehr als die deklarierte Größe eines Dienstblocks liest.
  • DRM:
    • Entfernen Sie playbackLooper aus DrmSessionManager.(pre)acquireSession. Wenn ein DrmSessionManager von einer App in einem benutzerdefinierten MediaSource verwendet wird, muss stattdessen der playbackLooper an DrmSessionManager.setPlayer übergeben werden.
  • Anzeigenwiedergabe / IMA:
    • Unterstützung für die dynamische Anzeigenbereitstellung (DAI) von IMA hinzugefügt (#8213).
    • AdPlaybackState wurde eine Methode hinzugefügt, mit der eine Anzeigengruppe zurückgesetzt werden kann, damit sie noch einmal abgespielt werden kann (#9615).
    • Erzwingen der Wiedergabegeschwindigkeit von 1,0 während der Anzeigenwiedergabe (#9018).
    • Ein Problem wurde behoben, bei dem eine Anzeigengruppe, die nicht geladen werden konnte, zu einem sofortigen Zurücksetzen der Wiedergabe führte (#9929).
  • UI:
    • Die Farbe der Zahlen in den Schaltflächen zum Zurück- und Vorspulen in StyledPlayerView wurde bei Verwendung bestimmter Designs korrigiert (#9765).
    • Strings für die Wiedergabegeschwindigkeit werden korrekt übersetzt (#9811).
  • DASH:
    • Geparste wichtige und zusätzliche Properties wurden zu Representation hinzugefügt (#9579).
    • Unterstützung der Track-Rolle forced-subtitle (#9727).
    • Die Trackrolle main wird nicht mehr als C.SELECTION_FLAG_DEFAULT interpretiert.
    • Die Logik für den URL-Ausschluss von Basis-URLs für Manifeste, die den DVB-Namespace nicht deklarieren, wurde korrigiert (#9856).
    • Unterstützung relativer MPD.Location-URLs (#9939).
  • HLS:
    • Format.label für reine Audio-HLS-Streams korrekt füllen (#9608).
    • Verwenden Sie standardmäßig die Vorbereitung ohne Chunks, um die Startzeit zu verbessern. Wenn Ihre Wiedergabeversionen gemuxte Untertiteltracks enthalten, die nicht in der Masterplaylist deklariert sind, sollten Sie sie der Masterplaylist hinzufügen, damit sie für die Wiedergabe verfügbar sind. Alternativ können Sie die Vorbereitung ohne Chunks mit HlsMediaSource.Factory.setAllowChunklessPreparation(false) deaktivieren.
    • Unterstützung für die Suche nach genauen Keyframes in HLS (#2882).
  • RTSP:
    • Stellen Sie eine Client-API bereit, um die für jede Serververbindung verwendete SocketFactory zu überschreiben (#9606).
    • Die Authentifizierungsmethode DIGEST wird gegenüber BASIC bevorzugt, wenn beide vorhanden sind (#9800).
    • Behandlung, wenn das RTSP-Track-Timing nicht verfügbar ist (#9775).
    • Ungültige RTP-Info-Headerwerte ignorieren (#9619).
  • Transformer:
    • Die erforderliche Mindest-API-Version wurde 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.
    • Ermöglicht die Registrierung mehrerer Listener.
    • Es wurde ein Problem behoben, bei dem der Transformer hängen blieb, wenn die Codecausgabe teilweise gelesen wurde.
    • Potenzielle NPE in Transformer.getProgress behoben, wenn beim Freigeben des Muxers ein Fehler auftritt.
    • Fügen Sie eine Demo-App zum Anwenden von Transformationen hinzu.
  • MediaSession-Erweiterung:
    • Standardmäßig wird die Playlist jetzt beim Beenden von MediaSessionConnector gelöscht. Apps, die die Playlist beibehalten möchten, können setClearMediaItemsOnStop(false) für den Connector aufrufen.
  • Cast-Erweiterung:
    • Fehler behoben, der verhinderte, dass CastPlayer onIsPlayingChanged korrekt aufruft (#9792).
    • Unterstützung für Audio-Metadaten einschließlich Artwork mit DefaultMediaItemConverter (#9663).
  • FFmpeg-Erweiterung:
    • build_ffmpeg.sh von den Binärdienstprogrammen von LLVM anstelle von GNU abhängig machen (#9933).
  • Kompatibilität mit Android 12:
    • Aktualisiere die Cast-Erweiterung, damit sie von com.google.android.gms:play-services-cast-framework:20.1.0 abhängt. Frühere Versionen von play-services-cast-framework sind nicht mit Apps kompatibel, die auf Android 12 ausgerichtet sind, und stürzen beim Erstellen von PendingIntents mit einem IllegalArgumentException ab (#9528).
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Player.EventListener entfernen. Verwenden Sie stattdessen Player.Listener.
    • Entfernen Sie MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory und MediaSourceFactory#setDrmUserAgent. Verwenden Sie stattdessen MediaSourceFactory#setDrmSessionManagerProvider.
    • MediaSourceFactory#setStreamKeys entfernen. Verwenden Sie stattdessen MediaItem.Builder#setStreamKeys.
    • MediaSourceFactory#createMediaSource(Uri) entfernen. Verwenden Sie stattdessen MediaSourceFactory#createMediaSource(MediaItem).
    • Entfernen Sie setTag aus DashMediaSource, HlsMediaSource und SsMediaSource. Verwenden Sie stattdessen MediaItem.Builder#setTag.
    • DashMediaSource#setLivePresentationDelayMs(long, boolean) entfernen. Verwenden Sie MediaItem.Builder#setLiveConfiguration und MediaItem.LiveConfiguration.Builder#setTargetOffsetMs, um das Manifest zu überschreiben, oder DashMediaSource#setFallbackTargetLiveOffsetMs, um einen Fallback-Wert anzugeben.
    • (Simple)ExoPlayer.setThrowsWhenUsingWrongThread entfernen. Die Thread-Erzwingung kann nicht mehr deaktiviert werden.
    • Entfernen Sie ActionFile und ActionFileUpgradeUtil. Verwenden Sie ExoPlayer 2.16.1 oder eine frühere Version, um mit ActionFileUpgradeUtil alte Aktionsdateien in DefaultDownloadIndex zusammenzuführen.
    • ProgressiveMediaSource#setExtractorsFactory entfernen. Verwenden Sie stattdessen den Konstruktor ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • Entfernen Sie 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 Konstruktor DefaultRenderersFactory(Context), DefaultRenderersFactory#setExtensionRendererMode und DefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Entfernen Sie alle öffentlichen CronetDataSource-Konstruktoren. Verwenden Sie stattdessen CronetDataSource.Factory.
  • Ändern Sie die folgenden IntDefs nur in @Target(TYPE_USE). Dies kann die Kompilierung von Verwendungen in Kotlin beeinträchtigen. Das Problem lässt sich beheben, indem die Annotation verschoben wird, um den Typ (Int) zu annotieren.
    • @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 ist veröffentlicht. Version 1.0.0-alpha01 enthält diese Commits.

Neue Funktionen

Media3 ist die neue Heimat für Medienunterstützungsbibliotheken, einschließlich ExoPlayer. Die erste Alphaversion enthält frühe, funktionale Implementierungen von Bibliotheken für die Implementierung von Medienanwendungsfällen, darunter:

  • ExoPlayer, ein Mediaplayer auf Anwendungsebene für Android, der sich leicht anpassen und erweitern lässt.
  • Mediensitzungsfunktionen zum Anzeigen und Steuern von Wiedergaben. 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 zur Verwendung mit ExoPlayer zusammenfassen, z. B. das Einfügen von Anzeigen über das IMA SDK.

Weitere Informationen findest du 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 zu pflegen und zu veröffentlichen, damit Entwickler Zeit haben, ihre Apps zu Media3 zu migrieren. 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 wird eine direkte Integration zwischen Playern und Mediensitzungen ermöglicht, ohne dass eine Adapter-/Connector-Klasse verwendet werden muss.