Media3

Supportbibliotheken für Medienanwendungsfälle.
Letzte Aktualisierung Stabile Release Releasekandidat Beta-Release Alpha-Release
11. November 2026 1.11.1 - 1.12.0-beta01 -

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-beta01

11. November 2026

Version 1.12.0-beta01 enthält die folgenden Commits.

  • Gemeinsame Bibliothek:
    • Reduzieren Sie C.DEFAULT_BUFFER_SEGMENT_SIZE von 65536 auf 65520, damit jede Pufferzuweisung (einschließlich des byte[]-Objekt-Headers) in ganze Betriebssystemseiten im großen Objektbereich von ART passt. Dadurch wird die Speichernutzung des Beispielpuffers auf Geräten mit 4-KiB-Seiten um etwa 6 % und auf Geräten mit 16-KiB-Seiten um etwa 20 % reduziert.
    • Ersetzen Sie androidx.media3.common.util.NullableType durch JSpecify org.jspecify.annotations.Nullable.
    • androidx.media3.common.util.UnknownNull wurde zugunsten von JSpecify-Annotationen für Nullsicherheit entfernt. Kotlin-Unterklassen von RunnableFutureTask mit einem Ergebnistyp, der Null zulässt (z. B. Void?), müssen ein Typargument angeben, das Null zulässt (z. B. RunnableFutureTask<Void?, Exception>).
    • Fügen Sie AdViewProvider.getAdVideoView() hinzu, um den Videocontainer View bereitzustellen, dessen Größe während der Anzeigenwiedergabe angepasst werden kann.
    • Der RFC 6381-Codec-String mlpa wird in MimeTypes.getMediaMimeType zu MimeTypes.AUDIO_TRUEHD zugeordnet, wodurch fehlende gemuxte Dolby TrueHD-Audiotracks während der HLS-Chunkless-Vorbereitung behoben werden (#3485).
    • AdPlaybackState.withAdDurationsUs wurde korrigiert, um das übergebene Array zu kopieren, und AdPlaybackState.fromAdPlaybackState, um alle Arrayfelder der Anzeigengruppen zu kopieren, sodass eine Instanz nicht mehr über beibehaltene oder freigegebene Arrays geändert werden kann.
    • Fehler IllegalStateException („Player is accessed on the wrong thread.“) behoben, wenn Player.listen oder Player.listenTo von einem anderen Thread als dem Anwendungsthread des Players abgebrochen wird (z. B. beim Abbau des Compose-UI-Tests) (#3005).
  • ExoPlayer:
    • Es wurde ein Problem behoben, bei dem ein Renderer, der frühzeitig für einen bevorstehenden Medienzeitraum aktiviert wurde, mit dem Rendern beginnen konnte, bevor die Wiedergabe zu diesem Zeitraum wechselte.
    • Kotlin-Unterklassen von CompositeMediaSource, die nullable untergeordnete Quell-IDs (z. B. Void?) verwenden, müssen ein nullable Typargument angeben (z. B. CompositeMediaSource<Void?>).
    • Prüfen Sie in AdsMediaSource, ob AdPlaybackState.removedAdGroupCount bei AdPlaybackState Aktualisierungen nicht abnimmt.
    • Es wurde ein Problem behoben, bei dem beim Übergang zwischen Medienzeiträumen, die unterschiedliche Renderer verwenden, der eingehende Renderer vorzeitig aktiviert werden konnte, bevor der ausgehende Renderer das Rendering abgeschlossen hatte (z. B. durch Auslösen von IllegalStateException („Mehrere Renderer-Medienuhren aktiviert“)), wenn Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION aktiviert ist.
    • Es wurde ein Problem behoben, bei dem der Übergang zu einer Anzeige mit einer benutzerdefinierten Wiedergabegeschwindigkeit die Weiterleitung aller Renderer zum Anzeigenzeitraum verzögern konnte, wenn Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION aktiviert war.
    • Probleme mit dem Vorwärmen von Renderern bei Übergängen zwischen Medienzeiträumen und der erneuten Auswahl von Tracks wurden behoben.
    • MediaPeriod.supportsStreamPrerollFlags() (Standardwert false) hinzufügen, damit benutzerdefinierte MediaPeriod-Implementierungen die Berichterstellung für anfängliche Unterbrechungen mit SampleStream.getFlags() aktivieren können. Wenn dies nicht unterstützt wird und Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION aktiviert ist, wird auf MediaPeriod.readDiscontinuity() zurückgegriffen.
    • Es wurde ein Problem behoben, bei dem das Überspringen einer Anzeige, gefolgt von einer anderen Anzeige in derselben Anzeigengruppe, mit DISCONTINUITY_REASON_AUTO_TRANSITION anstelle von DISCONTINUITY_REASON_SKIP gemeldet wurde oder gar nicht gemeldet wurde, wenn AdsMediaSource die verzögerte Vorbereitung der Contentquelle verwendet.
  • Transformer:
    • CodecDB (androidx.media3.transformer.codecdb) wurde hinzugefügt. Diese Funktion empfiehlt Video-Encoder-Konfigurationen (Codec, Encoder-Einstellungen und Bitrate) für das aktuelle Gerät anhand von gemessenen Encoder-Qualitätsdaten.
  • Extraktoren:
    • ADTS: Es wurde ein Problem behoben, bei dem AdtsExtractor das Audioformat von einem falschen Synchronisierungswort in der Nutzlast eines unvollständigen ersten Frames ableitete. Dies konnte dazu führen, dass die Wiedergabe von AAC-Livestreams, die in der Mitte des Frames gestartet wurden, fehlschlug oder ins Stocken geriet (#3464).
    • Fehler ArrayIndexOutOfBoundsException in FragmentedMp4Extractor behoben, wenn ein Fragment eine trun-Box ohne Samples enthält (#3471).
    • ADTS: FLAG_DISABLE_ID3_METADATA zu AdtsExtractor hinzugefügt, um zu verhindern, dass ID3-Daten im Stream als application/id3-Track ausgegeben werden.
    • MP4: Behebung eines Problems bei der lückenlosen Wiedergabe von AAC-Tracks, deren Muxer (z. B. FFmpeg) den letzten stts-Eintrag kürzt, um das Encoder-Padding auszuschließen. Dadurch wurde das Padding aus der elst-Bearbeitungsliste als 0 abgeleitet und das Ende des letzten Frames wurde abgespielt (#3489).
    • Behebung von Problemen mit großen Vorabzuweisungen für den Peek-Zwischenspeicher und OutOfMemoryError beim Sniffing beschädigter oder Nicht-Mediendateien, die mit ID3 beginnen (#3502).
  • Prüfer:
    • Ein Problem wurde behoben, bei dem durch das Abbrechen des von MetadataRetriever.retrieveDurationUs() zurückgegebenen Future verhindert wurde, dass close() die zugrunde liegende MediaSource freigibt (#3468).
    • Korrigieren Sie MediaExtractorCompat, um MediaFormat.KEY_FRAME_RATE als Ganzzahl zurückzugeben, die der Plattform MediaExtractor entspricht.
  • Audio:
    • Es wurde ein Problem behoben, bei dem gepufferte übersprungene Stille in AudioSink.getCurrentPositionUs(boolean) enthalten war und mit AudioSink.Listener.onSilenceSkipped() gemeldet wurde, bevor die Wiedergabe den übersprungenen Bereich erreichte (#3472).
    • Lege die Codec-Herkunft mit AudioTrack.Builder.setCodecProvenance auf API 37+ fest, wenn du räumliches Mehrkanal-PCM-Audio abspielst, das aus einem komprimierten Format decodiert wurde.
    • Es wurde ein Problem behoben, bei dem die Initialisierungswiederholungen von AudioTrack übersprungen wurden, wenn 1 Sekunde Audio mindestens so groß wie die anfängliche Puffergröße war. Dadurch schlug die DTS-HD-Weiterleitung auf Geräten mit begrenztem Audiospeicher fehl (#3487).
  • Video:
    • Fallback auf einen H.265/HEVC-Decoder für abwärtskompatible Dolby Vision Profile 7-Streams zulassen und kein Fallback mehr auf einen AV1-Decoder für Profile 10-Streams, deren Basisebene den vollen Bereich mit nicht spezifizierten Übertragungseigenschaften signalisiert (#3486).
    • Die Decoderauswahl in MediaCodecUtil wurde korrigiert, um zu vermeiden, dass primäre Decoder ausgewählt werden, die das Profil des Formats nicht funktional unterstützen (z. B. ein Dolby Vision-Decoder für ein anderes Profil), wenn kein Decoder das Format vollständig unterstützt (#3486).
  • Text:
    • Reduziere die Speichernutzung in DvbParser, indem du Untertitelbereiche direkt in Bitmaps in der Größe des Bereichs renderst, anstatt eine Vollbild-Bitmap beizubehalten.
  • Auswirkung:
    • Behebung eines NullPointerException in DefaultVideoFrameProcessor beim Leeren (z. B. beim Suchen oder Scrubben in CompositionPlayer) (#3470).
    • Es wurde ein Problem behoben, bei dem DefaultGlObjectsProvider.release einen GlException auslöste, wenn der Anbieter nach einem Release wiederverwendet wurde (#2016).
  • Muxer:
    • Der Track Format wird validiert, wenn er zu Mp4Muxer oder FragmentedMp4Muxer hinzugefügt wird, anstatt später beim Schreiben von Beispielen oder Schließen des Muxers einen Fehler zu verursachen.
    • Wiederholte Aufrufe von Muxer.close() in allen Muxer-Implementierungen der Bibliothek werden zu einem No-Op gemacht und der Muxer wird als geschlossen behandelt, auch wenn close() einen Fehler auslöst. Wenn nach close() eine andere Methode aufgerufen wird, wird jetzt ein IllegalStateException ausgelöst.
  • IMA-Erweiterung:
    • Unterstützung der ResizablePlayer-Schnittstelle des IMA SDK, damit interaktive Anzeigen die Größe und Position der Videoplayer-Ansicht im Anzeigencontainer ändern können, und Hinzufügen von ImaAdsLoader.requestAds(DataSpec, Object, AdViewProvider) (ImaAdsLoader.requestAds(DataSpec, Object, ViewGroup) wird eingestellt).
  • Sitzung:
    • APIs für Einstellungen für Medientasten stabilisieren.
    • Die Speichernutzung wird reduziert, da komprimierte Coverdaten nicht mehr in CacheBitmapLoader gespeichert werden.
    • Vermeiden Sie redundante MediaSession.setQueue(null)-Aufrufe bei Zeitachsenaktualisierungen, wenn die Sitzungswarteschlange der Plattform bereits null ist (z. B. wenn Player.COMMAND_GET_TIMELINE nicht verfügbar ist).
    • Ein Problem wurde behoben, bei dem MediaSessionService einer Dienstimplementierung nicht die Möglichkeit gab, sich ordnungsgemäß wiederherzustellen, da nicht versucht wurde, eine neue Sitzung zu erstellen (#3490).
    • Player.TIMELINE_CHANGE_REASON_SOURCE_UPDATE anstelle von Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED melden, wenn ein Legacy-MediaSessionCompat-Metadatenupdate die Metadaten oder die Dauer des aktiven Warteschlangenelements ändert, ohne die Warteschlange zu ändern.
    • Fehlende Cover für ältere Sitzungen, die neben einer gültigen METADATA_KEY_ALBUM_ART eine null METADATA_KEY_DISPLAY_ICON (oder Cover-URI) festlegen, werden korrigiert: Null-Cover-Werte werden jetzt beim Konvertieren älterer Metadaten übersprungen.
  • UI:
    • Füge einen subtitles-Slot für ein Composable zu ContentFrame und Player hinzu, mit Standardunterstützung in media3-ui-compose-material3 für das Rendern von Bitmap- und horizontalen Textuntertiteln.
    • SubtitleView.setTextDirectionHeuristic wurde hinzugefügt, um die Anpassung der Heuristik für die Textrichtung zu ermöglichen, die für den bidirektionalen Zeilenumbruch von Untertiteln verwendet wird (#3454).
    • Alle Steuerelement-Slots in Player in media3-ui-compose-material3, einschließlich benutzerdefinierter Slots, werden animiert und der Parameter visible wird aus PlayerDefaults.TopControls, CenterControls und BottomControls entfernt. Dies ist eine funktionsgefährdende Änderung an einer instabilen API.
    • Unterstützung für AdViewProvider.getAdVideoView() in PlayerView durch Wrapping von exo_content_frame in exo_content_frame_container.
    • Die Speichernutzung in SubtitleView wurde reduziert, indem im Cache gespeicherte Untertitel-Bitmaps und Textlayouts freigegeben werden, wenn Cues gelöscht werden. Außerdem wurde ein Problem behoben, bei dem veralteter Untertiteltext sichtbar bleiben konnte, wenn ein Cue nicht breit genug war, um ihn darzustellen.
  • HLS-Erweiterung:
    • Es wurden Probleme behoben, bei denen beim Neuladen eines fehlgeschlagenen oder abgebrochenen HLS-Medienblocks teilweise gepufferte Samples beibehalten werden konnten, ohne sie zu verwerfen oder zu verbinden, oder die Ladeposition auf eine veraltete Suchposition zurückgesetzt wurde (#3362).
    • Fehler IllegalStateException wurde behoben, der beim Springen zum Anfang eines gepufferten Segments nach einem adaptiven Trackwechsel auftrat.
    • Behebung mehrerer Wiedergabeprobleme beim Wechseln von Pfaden mit HLS Content Steering (#3465).
  • DASH-Erweiterung:
    • Duplizierte oder unleserliche CEA-608-Untertitel wurden korrigiert, wenn ein Stream mehrere eingebettete Untertiteltracks hat (#887).
  • Cast-Erweiterung:
    • Ein Problem wurde behoben, bei dem RemoteCastPlayer-Ladeanfragen von Android TV-Empfängern verworfen wurden (#3462).
    • Aktualisieren Sie die Abhängigkeit com.google.android.gms:play-services-cast-framework auf 23.0.0.
    • CastParams.Builder.setSystemOutputSwitcherEnabled(boolean) wurde hinzugefügt, um zu konfigurieren, ob Cast-Geräte in der Ausgabeauswahl des Systems angezeigt werden, ohne dass MediaTransferReceiver in AndroidManifest.xml deklariert werden muss. Außerdem wurde die Ausgabeauswahl des Systems standardmäßig für Apps aktiviert, die auf API 37 oder höher ausgerichtet sind und auf Geräten mit API 37 oder höher ausgeführt werden.
    • Unterstützung vordefinierter Cast-MediaMetadata-Felder in DefaultMediaItemConverter durch Zuordnung von Feldern ohne dediziertes MediaItem.mediaMetadata-Attribut zu und von MediaItem.mediaMetadata.extras und Beibehaltung benutzerdefinierter Extras in MediaInfo.customData.
    • In DefaultMediaItemConverter werden keine Ausnahmen mehr ausgelöst, wenn ein Wiedergabe-URI fehlt oder die Konvertierung fehlschlägt. Die Medien-ID und die Metadaten in der CastPlayer-Zeitachse für Cast-Warteschlangenelemente ohne Wiedergabe-URI bleiben erhalten.
    • Füge SessionAvailabilityListener.onCastSessionAvailable(boolean) hinzu, um anzugeben, ob eine verfügbare Übertragungssitzung mit Intent to Join gestartet wurde, und behalte den Status der Remote-Wiedergabe bei, anstatt ihn mit dem Status des lokalen Players zu überschreiben, wenn du einer Übertragungssitzung mit Intent to Join in CastPlayer beitrittst.
    • MediaInfo und Zeitachsendauern aus MediaMetadata.durationMs für Nicht-Live-Elemente in DefaultMediaItemConverter und RemoteCastPlayer füllen und vom Empfänger aufgelöste Dauern und Livestream-Status über Warteschlangensuchen hinweg beibehalten.
  • Demo-App:
    • In der Demo-App für die Sitzung das Neuanordnen von Playlistelementen durch Ziehen zulassen.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • androidx.media3.transformer.TextureAssetLoader entfernen. Verwenden Sie stattdessen androidx.media3.transformer.RawAssetLoader.
    • Entfernen Sie öffentliche DefaultDecoderFactory-Konstruktoren. Verwenden Sie stattdessen DefaultDecoderFactory.Builder.
    • DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_BLACKLIST_MS entfernen. Verwenden Sie stattdessen DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_EXCLUSION_MS.
    • Entfernen Sie DefaultVideoFrameProcessor.Factory.Builder.setRequireRegisteringAllInputFrames(boolean). Verwenden Sie stattdessen VideoFrameProcessor.INPUT_TYPE_SURFACE_AUTOMATIC_FRAME_REGISTRATION.
    • Entfernen Sie EditedMediaItemSequence.Builder.experimentalSetForceAudioTrack(boolean) und EditedMediaItemSequence.Builder.experimentalSetForceVideoTrack(boolean). Verwenden Sie stattdessen EditedMediaItemSequence.Builder(Set).
    • EditedMediaItemSequence.forceAudioTrack entfernen. Verwenden Sie stattdessen trackTypes.contains(C.TRACK_TYPE_AUDIO).
    • EditedMediaItemSequence.forceVideoTrack entfernen. Verwenden Sie stattdessen trackTypes.contains(C.TRACK_TYPE_VIDEO).
    • Entfernen Sie ExportResult.durationMs und ExportResult.Builder.setDurationMs. Verwenden Sie stattdessen ExportResult.approximateDurationMs und ExportResult.Builder.setApproximateDurationMs.
    • SilenceSkippingAudioProcessor.DEFAULT_PADDING_SILENCE_US entfernen. Gib das Verhalten bei Stille stattdessen mit silenceRetentionRatio an.
    • Timeline.getPeriodPosition(Window, Period, int, long, long) entfernen. Verwenden Sie stattdessen Timeline.getPeriodPositionUs(Window, Period, int, long, long).

Version 1.12.0-alpha02

26. Oktober 2026

Version 1.12.0-alpha02 enthält die folgenden Commits.

  • Auswirkungen auf die Google Play-Dienste:
    • Einführung eines neuen media3-effect-play-services-Moduls mit Google Play-Dienste-Medieneffekten, einschließlich EnhancementSessionDecorator für die Videooptimierung und StudioSoundAudioProcessor für die Trennung von Audioquellen.

Version 1.12.0-alpha01

21. Oktober 2026

Version 1.12.0-alpha01 enthält die folgenden Commits.

  • Gemeinsame Bibliothek:
    • 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 Chunk 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 den AdPlaybackState für jeden Zeitraum aufteilen und versetzen.
    • Race-Bedingung in PreCacheHelper behoben, bei der das Abbrechen einer laufenden Vorbereitungsanfrage trotzdem Downloads im Hintergrund starten konnte.
    • Beschränken 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ätzlichem Zwischenspeichern 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 Wiedergabekopfs AudioTrack fälschlicherweise als Ganzzahlüberlauf behandelt werden konnte, was dazu führte, dass die Wiedergabe während der Zwischenspeicherung ins Stocken geriet (#3407).
    • Experimentelle DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean) entfernen.
    • Vermeidung unnötiger erneuter Aktivierungen des Renderers und von Fehlern bei der Rückkehr von Interstitials oder Anzeigen zu Inhalten, die am Ende abgeschnitten sind (#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 zu einem nicht vorbereiteten Medienzeitraum überging, wenn Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION aktiviert war.
    • Ein Problem wurde behoben, bei dem Videoframes während der dynamischen Planung unerwartet übersprungen oder verworfen werden konnten, wenn Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS aktiviert ist.
    • Ein ArrayIndexOutOfBoundsException in Analytics-Listenern wurde behoben, der auftrat, wenn die Wiedergabe während einer Anzeige in einem Livestream gestoppt 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 einem Suchvorgang (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 Ladevorgang 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.
    • Beheben Sie Frame-Drops in Kompositionen mit mehreren Sequenzen, die durch Zeitstempelquantisierung oder Rundungsabweichungen verursacht werden, indem Sie bei der Frame-Aggregation den Frame mit dem nächstgelegenen Zeitstempel auswählen. Dies ist nur ab API 29 möglich, da pro Videosequenz ein zusätzlicher Frame im Flug gehalten werden muss.
  • Transformer:
    • Unterstützung für die Konfiguration der Framerate der Videoframe-Aggregation mit Composition.Builder.setVideoFrameAggregationParameters für Exportworkflows.
    • Beheben Sie Frame-Drops in Kompositionen mit mehreren Sequenzen, die durch Zeitstempelquantisierung oder Rundungsabweichungen verursacht werden, indem Sie bei der Frame-Aggregation den Frame mit dem nächstgelegenen Zeitstempel auswählen. 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.
  • Trackauswahl:
    • Ein Problem wurde 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 war (#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 von GOP-internen Beispielabhängigkeiten 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öhenkoordinaten zum Ausfüllen von Mp4LocationData behoben.
    • 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 eine negative 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: Parsen von mebx-Box-Tracks mit zeitgesteuerten Metadaten in Mp4Extractor und FragmentedMp4Extractor. Tracks mit einem it35-Schlüssel werden als MimeTypes.APPLICATION_ITUT_T35 verfügbar gemacht (wodurch die HAGC-Wiedergabe ermöglicht 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 Decodierungsfehlern 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-Box-Tracks mit zeitgesteuerten Metadaten in MediaExtractorCompat als MimeTypes.APPLICATION_MEBX.
  • Inspector-Frame:
    • Behebung des Problems, dass Wide-Gamut-BT.2020-Farben im SDR-Basisbild abgeschnitten werden, wenn Ultra-HDR-Frames mit FrameExtractor extrahiert 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).
    • Behebung potenzieller Wiedergabeprobleme nach Titelübergängen mit komprimiertem Offload.
    • Problem auf Amazon Fire TV-Sticks umgehen, bei dem AC-3-Audio während Periodenübergängen 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-Dateien (#2576).
    • Es wurde ein Problem behoben, bei dem die Aktualisierungen der Verzögerung und des Padding für die lückenlose Wiedergabe bei dynamischem Offload während der Titelübergänge auf den eingehenden Titel und nicht auf den wiedergegebenen Titel angewendet wurden.
    • Kürzen des Encoder-End-Paddings bei einzelnen Streams und dem letzten Stream in einer Playlist zusätzlich zu 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 eigenständiger SubRip-Untertitel 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 tfdt-Box (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 geschrieben wurde, bevor andere Beispiele geschrieben wurden.
    • 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üge 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 SecurityException-Absturzes beim Erstellen oder Freigeben eines MediaSession auf Geräten, die strenge PendingIntent-Limits erzwingen.
    • Es wurde ein Problem 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 eine pausierte alte MediaSessionCompat-Version einen nicht unterstützten onPrepareFrom*-Callback anstelle von onPlayFrom* oder onPlay() ohne erneute Initialisierung der angeforderten Mediendatei auslösen konnte.
    • Fehlerbehebung für NullPointerException in der Legacy-Version von MediaBrowser beim Empfang einer benutzerdefinierten Befehlsantwort (#3432).
    • Absturz von IllegalArgumentException 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 einer Legacy-MediaSessionCompat erfolgen, werden zusammengefasst (z. B. wird durch den gemeinsamen Aufruf von setMediaItem, prepare und play jetzt ein einzelner onPlayFrom*-Callback gesendet).
  • UI:
    • Die Positionierung von Satzzeichen in RTL-Untertiteln und die Beibehaltung des Span-Bereichs wurden korrigiert, 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ügen Sie dem media3-ui-compose-Modul die Klasse CuesState und das Composable 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 in PresentationState hinzugefügt und damit das Rendering des bereitgestellten optionalen artwork-Composable in ContentFrame und Player zeitlich gesteuert. Fügen Sie das Composable Artwork hinzu, das als Standardwert für den Slot artwork 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.
    • Füge die Klasse PlaybackState hinzu, um die Beobachtung des benutzerdefinierten Wiedergabestatus zu ermöglichen, und führe BufferingIndicator als schaltflächenunabhängige Komponente ein.
    • 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 nicht mehr den Player oder die Sichtbarkeit der Steuerelemente 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-Benutzeroberfläche in ProgressSlider, ProgressStateWithTickCount und ProgressStateWithTickInterval hinzugefügt, indem isLive und liveOffsetMs verfügbar gemacht wurden. 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 Eingabeende behandeln konnte, anstatt einen 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).
    • Behebung von NullPointerException beim Parsen von MPEG-TS-EXT-X-MAP-Initialisierungssegmenten, die PES-Medien-Samples enthalten (#3456).
    • Regression behoben, bei der Format.id und Format.metadata für exponierte HLS-Tracks null waren (#3402).
    • Anzeigen mit Asset-Listen werden auf X-PLAYOUT-LIMIT gekürzt und Anzeigen, die vollständig außerhalb des Limits liegen, werden übersprungen. Der Offset für die Fortsetzung des Inhalts wird standardmäßig auf 0 gesetzt, 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 Offset für die Fortsetzung 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 Bereitstellen 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.
    • Ein Problem wurde behoben, bei dem schnelles Scrubbing fälschlicherweise den Fallback-Mechanismus des TCP-Protokolls auslösen konnte.
    • Ein Absturz von IllegalStateException wurde 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.
    • Ein Problem wurde behoben, bei dem das Zurückspulen während eines bereits ausstehenden Suchvorgangs zu Audioausfällen und zum Einfrieren der Videowiedergabe führen konnte.
    • Es wurde ein Problem 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 Verwerfen von Padding ignoriert wurde, wenn Pre-Skip und das Verwerfen von Padding 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).
    • Behebung von ArrayIndexOutOfBoundsException in RemoteCastPlayer, 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änger-Warteschlange 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. bei 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, um die Auswahl von Untertiteln und Audiotracks während des Streamings 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 die Gradle-minSdk auf 24.

Version 1.11.0

1.11.1

10. September 2026

  • ExoPlayer:
    • Verschieben Sie 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.
    • Es wurde ein Problem behoben, bei dem die Wiedergabe ins Stocken geriet, wenn ein nicht übergehender sekundärer Renderer vorab geladen wurde.
    • 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.
    • ArrayIndexOutOfBoundsException wurde korrigiert, wenn eine Aktualisierung der Live-Zeitachse die Standardposition über eine serverseitig eingefügte Anzeige hinaus verschiebt, die gerade wiedergegeben 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: Es wurde ein Problem 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 gemäß der Definition von Android als vorzeichenlos behandelt werden (#3271).
    • Es wurde ein Problem beim Offloading behoben, bei dem die Wiedergabe während der Pre-Roll-Anzeigen oder bei lückenlosen Übergängen 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 der Wiedergabe 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, das Laden 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 einem 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 des Zurücksetzens berücksichtigt.
    • Fügen Sie SampleStream getFlags() und FLAG_STRICT_DURATION hinzu, damit Streams Flags melden können, und aktualisieren Sie die Renderer, um diese Flags dynamisch zu prüfen.
    • Wenn die Streamformate keinen gültigen Wert liefern, wird auf die Schätzung der Framerate in MediaCodecVideoRenderer und auf 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 Puffers zurückgreifen, wenn der verfügbare Heap-Speicher knapp ist.
    • Die Verarbeitung von Standbildern wurde angeglichen, wenn MediaItem.imageDurationUs nicht festgelegt ist: JPEG- und HEIC-Standbilder werden jetzt mit einer sehr kurzen Standarddauer „abgespielt“ (wie zuvor PNG- und andere Bilder).
    • 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 Parität zur alten Methode zu erreichen.
    • Fügen Sie in DefaultBandwidthMeter Unterstützung für einen benutzerdefinierten 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 ExoPlayer wird dynamisch und nicht in einem statischen Intervall ausgeführt.
    • Ein unnötiger Reset wurde entfernt, der auftreten konnte, wenn Tracks mit Pre-Roll-Samples zur aktiven Wiedergabe hinzugefügt wurden.
    • 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 zuvor vor dem Empfang von Eingabepuffern geleert wurde.
    • Experimentelles ExoPlayer.Builder.enablePerStreamMediaProgression() hinzufügen, 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 wird.
  • Trackauswahl:
    • BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR verfügbar machen und AdaptiveTrackSelection.Factory.setTrackFormatComparator hinzufügen, um die Sortierung nach benutzerdefinierten Formaten 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 aufeinanderfolgende 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, um das Verwerfen von angehängten Bildern und Coverdesign-Metadaten während des Container-Parsings zu ermöglichen und so den Laufzeitspeicherverbrauch 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 (Nero- und 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. Dazu müssen Sie FLAG_READ_MFRA_FOR_SEEK_MAP für FragmentedMp4Extractor angeben. Dies wird jetzt standardmäßig in DefaultExtractorsFactory (#3088) durchgeführt.
    • av1C-Daten mit nicht unterstützter Version werden ignoriert.
    • 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 Out-of-Bounds-Lesevorgänge beim Parsen leerer ilst-Metadaten-Tag-Elemente verhindern (#3191).
    • MPEG-TS: Bei Streams, bei denen das letzte PES-Paket eine bekannte Länge hat, wird der letzte Frame gerendert (#3206).
    • MP3: Die Bitrate für Dateien mit Xing- und VBRI-Header wird jetzt korrekt gemeldet.
    • 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 wurden angepasst, 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, sodass DefaultAudioSink diese explizite Maske verwenden kann, 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 verbessert, 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, bei dem 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 die zeitbasierte Audioverarbeitung zu ermöglichen (#418).
    • Unterstützung für 32-Bit- und 64-Bit-PCM-Gleitkommazahlen 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, kann aber über MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold() angepasst werden.
    • Fehler in VideoFrameReleaseHelper behoben, bei dem Änderungen an 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. durch Verknüpfen eines Metadaten-Tracks mit dem Video-Track, den er beschreibt.
    • Fügen Sie OggMuxer hinzu, um das Multiplexen von OPUS- oder VORBIS-Mediastreams 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 Pause Ads 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 Hintergrund-Thread-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 der Zeitachse außerhalb der Grenzen (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 erkannte.
    • Problem mit der doppelten Herunterskalierung von Grafiken in MediaSession behoben, wenn die Bildgröße nahe am Plattformlimit liegt. Dadurch wird die Unschärfe in Benachrichtigungen behoben (#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 während Statusaktualisierungen.
    • Absturz durch Abfangen von ForegroundServiceStartNotAllowedException in MediaSessionService.stopSelfSafely() behoben (#3310).
    • Unerwarteter onMediaItemTransition()-Callback für MediaController beim Suchen 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 dem Modul media3-ui-compose die Klasse CurrentMediaItemState und die entsprechende rememberCurrentMediaItemState-Komposition hinzu. Dieser State Holder wird in demo-compose verwendet, um verschiedene Metadaten zum aktuell wiedergegebenen MediaItem anzuzeigen.
    • Fügen Sie dem Modul media3-ui-compose die Klasse PlaylistState und die entsprechende rememberPlaylistState-Komposition hinzu. Dieser State Holder wird in demo-compose verwendet, um verschiedene Metadateninformationen zum MediaItems anzuzeigen, das im Player festgelegt ist.
    • API für schnellen Vorlauf/Zeitlupe zu PlaybackSpeedState hinzufügen. 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 der aktuellen Mediendatei an.
    • Fügen Sie dem Modul media3-ui-compose die Klasse ErrorState und die entsprechende rememberErrorState-Komposition hinzu. Füge das ErrorText-Composable zu media3-ui-compose-material3 hinzu und mache es zu einem Standard-Overlay auf der Player.
    • PlayerDefaults-Objekt mit Composables für TopControls, CenterControls, BottomControls und ErrorOverlay veröffentlichen.
    • Fügen Sie FocusRequester zum Composable Player 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-Ereignissen 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 auflösen, wenn sie zum Herunterladen abgerufen werden (#3258).
  • Ktor-Erweiterung:
    • Ein neues media3-datasource-ktor-Erweiterungsmodul wurde hinzugefügt, das einen KtorDataSource bereitstellt, der vom Ktor-HTTP-Stack unterstützt wird.
    • Fehler KtorDataSource behoben, bei dem der gesamte HTTP-Antworttext beim Öffnen einer Verbindung in den Arbeitsspeicher geladen wurde (#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 werden, auch wenn die Playlist nicht mehr primär oder aktiv ist (#3254).
    • Die Berechnung des Offsets für die Fortsetzung des Inhalts beim Auflösen von Interstitial-Asset-Listen wurde korrigiert (#3322).
    • Problem mit unerwarteter 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 Fehler bei der UDP-Portbindung 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-Ausgabe-Switchers 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 Titelauswahl dauerhaft im Titelmaskierungsstatus hängen bleiben konnte, was dazu führte, dass nachfolgende Titelaktualisierungen 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 MediaItems überträgt, die beim Ändern des aktiven Players nicht abspielbar sind (#3199).
    • Fehler behoben, bei dem nicht konfigurierte Livestreams (liveConfiguration == UNSET) als STREAM_TYPE_BUFFERED in die Warteschlange gestellt wurden (#3318).
  • Testdienstprogramme:
    • 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.
    • Verschärfen Sie die Assertions in DataSourceContractTest für die von DataSource.open() zurückgegebenen Längen. 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.
  • Erstellen
    • Die README.md-Anleitung für die lokale Abhängigkeit von Media3 wurde aktualisiert, um Gradle Composite Builds (includeBuild) zu verwenden. Das core_settings.gradle-Script 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:
    • Fehlerbehebung bei der Verarbeitung von onAudioSessionIdChanged in SimpleBasePlayer und ForwardingSimpleBasePlayer.
  • 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 ignorieren, 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 wurden, wenn dem Player mehrere Audiorenderer hinzugefügt wurden.
  • Video:
    • Anpassung der Logik für die Wiederverwendung von Codecs bei Änderungen der Framerate in APIs unter 30, 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. Dadurch wurde verhindert, dass Videos aufgrund eines Framework-Problems vor API 31 fehlerhaft wiedergegeben wurden.
  • 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, bei dem COMMAND_SEEK_TO_MEDIA_ITEM in einer MediaController nicht verfügbar ist, wenn eine Verbindung zu einer reinen Plattformsitzung hergestellt wird, die das Springen zu anderen Elementen, aber keine Änderungen an der Playlist unterstützt.
    • Es wurde ein Problem 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 früher nicht mit Controller.isTrusted() gekennzeichnet wurde, wenn eine Verbindung über Plattform-Controller hergestellt wurde.
  • HLS-Erweiterung:
    • Es wurde ein Fehler behoben, durch den während des Stream-Fallbacks ein ArrayIndexOutOfBoundsException ausgelöst wurde, wenn die Trackauswahl eine Teilmenge der verfügbaren Tracks war (#3161).
    • Ein Problem wurde 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ügen Sie AdsMediaSource Clipping-Funktionen hinzu.
    • Unterstützung für dynamische Planung in MediaCodecVideoRenderer hinzugefügt, um die Planung und die CPU-Aktivierungszyklen besser auf die Verarbeitung von Videoframes abzustimmen. Sie können dies mit experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() in DefaultRenderersFactory aktivieren.
    • Ermöglicht das Festlegen eines benutzerdefinierten DataSource.Factory in DefaultPreloadManager.Builder.
    • Zulassen, dass ExoPlayer ohne Robolectric simuliert wird, 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 nach 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, durch das 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 hinzufügen.
  • 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.
    • Es wurde ein Problem behoben, bei dem eingebettete Metadatentracks unabhängig davon ausgewählt wurden, ob der entsprechende primäre Track ausgewählt war (#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-Decodererweiterung) oder über den Android Spatializer.
    • Die Unterstützung für AC4Profile22 und andere Legacy-Profile wird bei der Bewertung der AC-4-Decoder-Unterstützung in Automotive-Szenarien korrekt entfernt (#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 den Media-Codec-Decodern abzugleichen, unterstützt durch neue Felder und Logik in AudioCapabilities und AudioCapabilitiesReceiver.
    • Fehler behoben, bei dem die Wiedergabe hängen blieb, wenn eine Playlist mit lückenlosem Audio im komprimierten Offload-Modus abgespielt wurde.
  • Text:
    • VobSub: Die SPU-Steuerbefehle START und STOP werden verwendet, 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 Metadatentracks abzudecken, die von HLS-Varianten und ‑Wiedergaben veröffentlicht werden (#3043).
  • Auswirkung:
    • LottieOverlay wurde in ein neues :media3-effect-lottie-Modul verschoben (und von androidx.media3.effect.LottieOverlay in androidx.media3.effect.lottie.LottieOverlay umbenannt).
  • 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 LOADED-Ereignis angegebenen MIME-Typ übereinstimmte. Mit der Korrektur wird der MIME-Typ der Anzeige jetzt anhand der von IMA bereitgestellten Anzeigenmedieninformationen zugeordnet.
    • setEnableCustomTabs wurde zu ImaAdsLoader und ImaServerSideAdInsertionMediaSource hinzugefügt, 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. Sie 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 Alpha-Testgruppe beitreten möchten, wenden Sie sich an Ihren Kontopartner.
  • Sitzung:
    • Es wurde ein Fehler behoben, durch den große Arrays in MediaMetadata.artworkData die App zum Absturz bringen konnten.
    • 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.
    • Veraltete Intent-Instanzen erkennen, 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 von Mediendateien nicht an Controller gemeldet wurde, wenn die Wiedergabe von einem bestimmten Mediendateiindex zu einem anderen mit derselben Mediendatei aus dem Grund „AUTO“ und „SEEK“ (#2997) wechselte.
    • 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).
    • Problem mit der Skalierung des Cover-Symbols für Benachrichtigungen unter Android Q behoben (#3084).
  • UI:
    • Fügen Sie PlaybackSpeedControl Composable zu media3-ui-compose hinzu, um die Wiedergabegeschwindigkeit anzuzeigen und zu ändern.
    • Fügen Sie PlaybackSpeedToggleButton-Composable zu media3-ui-compose-material3 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ßen Offscreen-Zwischenspeicher beim Animieren von PlayerControlView vermeiden.
    • Fügen Sie Player Composable zu media3-ui-compose-material3 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 für 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 Abgleichern für reguläre Ausdrücke (#3008).
    • ID3-Metadatentrack (EMSG) in Audiowiedergaben 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 korrekt 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, bei dem 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.

  • Gemeinsame Bibliothek:
    • Unterstützung von Datums-/Uhrzeit-Strings mit nur Stunden im Zeitzonen-Offset (#2929).
  • ExoPlayer:
    • Lassen Sie zu, dass die dynamische Planung das doSomeWork-Intervall erst nach dem Start der Audiowiedergabe verlangsamt, 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 Sie dieses Problem beheben, wird die CPU-Inaktivitätszeit hoffentlich verlängert und Strom gespart.
    • Es wurde ein 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 Legacy-Profile wird bei der Bewertung der AC-4-Decoder-Unterstützung in Automotive-Szenarien korrekt entfernt (#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 anhand 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 eines MediaController, der mit einer Plattformsitzung verbunden war, zum Absturz der App führte, wenn das Beenden während der Anzeigenwiedergabe erfolgte (#2948).
    • Zusätzliche Prüfungen für extras-Bundle-Instanzen in verschiedenen Klassen hinzufügen, 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 Autor, Verfasser und Komponist nicht als Fallback verwendet wurden, wenn von den Legacy-Typen 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 jetzt 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

  • Gemeinsame Bibliothek:
    • 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 Delegatplayer die Referenzgleichheit zum Vergleichen von Listener-Instanzen verwendet (#2675).
    • Fügen Sie 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 wurde behoben, der durch einen Ganzzahlüberlauf verursacht wurde, wenn die gemeldete gepufferte Position unplausibel viel größer als die gemeldete Dauer war (#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ügen Sie 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 angegebene Dauer hinaus, ohne das Ende des Elements zu erreichen.
      • Nach 10 Minuten mit einem Grund für die Wiedergabeunterdrückung beim Versuch, die Wiedergabe zu starten.
    • Die Wakelock-Verarbeitung wird standardmäßig aktiviert, 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 über TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData) DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) oder DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs) 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 die Standardwerte von DefaultLoadControl angepasst, damit sie mit einer Vielzahl von lokalen 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 Medien oder Medienquellen im Batch hinzuzufügen und anschließend automatisch invalidate() aufzurufen.
      • Fügen Sie removeMediaItems((List<MediaItem>) und removeMediaSources(List<MediaSource>) hinzu, um die Mediendateien oder Medienquellen im Batch zu entfernen. Achten Sie darauf, dass der Preload-Manager nach dem Entfernen nicht mit dem Vorabladen beginnt oder fortfährt.
      • Lassen Sie zu, dass DefaultPreloadManager.setCurrentPlayingIndex(int) sich automatisch selbst 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 Gruppe von Bildern im Scrubbing-Modus zu überspringen.
    • Füge DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) hinzu, damit Apps einen Wert für die Zielpuffer-Byte 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 SkipInfo zum AdPlaybackState.AdGroup 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 anhängen, wenn die Anzeigenwiedergabe nach einer Suchanpassung 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.
    • Fehler IllegalStateException 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.
    • Ein Fehler wurde behoben, bei dem das Springen zu anderen Mediendateien im Scrubbing-Modus zu IllegalStateException führen konnte.
    • Potenzielle NullPointerException in DefaultPlaybackSessionManager wurden 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 im Playlist- oder Wiederholungsmodus beim Vor- oder Zurückspulen 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 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 hinzufügen.
  • Transformer:
    • InAppMp4Muxer als Standard-Muxer verwenden.
    • Fügen Sie EditedMediaItem.Builder#setSpeed() hinzu und verwerfen Sie Effects#createExperimentalSpeedChangingEffects().
    • Ersetzen Sie forceAudioTrack und forceVideoTrack durch trackTypes in EditedMediaItemSequence.
  • Trackauswahl:
    • 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 bestehenden Suchlimit für ein Synchronisierungsbyte zu entsprechen (#2713).
    • MP3: FLAG_ENABLE_INDEX_SEEKING wurde geändert, um Suchinformationen bevorzugt aus Metadaten-Headern (wie Xing und VBRI) abzurufen, 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 der Standard war und VBR explizite Header erfordert. Dies verbessert die sofortige Suchbarkeit für Dateien ohne Metadaten, geht jedoch auf Kosten der potenziellen Genauigkeit für VBR-Dateien ohne Header. 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 Abrufen 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. Diese AutoCloseable-Klasse bietet eine Möglichkeit, Frames mit Unterstützung für HDR-Videos, Videoeffekte und benutzerdefinierte Decoderauswahl zu extrahieren. 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 Medien-Samples aus einer Mediendatei extrahiert werden können. Die vorhandene androidx.media3.exoplayer.MediaExtractorCompat wird jetzt zugunsten dieser neuen Klasse eingestellt.
  • Audio:
    • AudioProcessor-Instanzen über das Springen 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.
    • Nutze die Profil- und Level-Funktionen des AC-4-Decoders bei der Bewertung der Unterstützung von Track-Formaten (#2580).
    • Potenzielle 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 Scrubbing 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 jedoch leicht behoben werden kann, 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:
    • Entfernung benutzerdefinierter ProGuard-Regeln, 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. Dazu 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 benutzerdefinierten IMA DAI-UI-Optionen 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.
    • Es wurde ein 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“.
    • Der MediaButtonReceiver.onForegroundServiceStartNotAllowedException wurde ein Context-Parameter hinzugefügt (#2625).
    • Lies die Lautstärkeregelungs-ID von der Plattform PlaybackInfo, anstatt sie über Binder abzurufen. So wird sichergestellt, dass der Wiedergabetyp und die ID für die Lautstärkeregelung atomar gelesen werden und übereinstimmen.
    • 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, auch wenn 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 wird behoben, indem „KEYCODE_HEADSETHOOK“ wie KEYCODE_MEDIA_PLAY_PAUSE behandelt wird (#2816).
    • Es wurde ein Fehler behoben, bei dem die Oberflächengröße nicht zwischen der Sitzung und dem Controller kommuniziert wurde, was dazu führte, dass in der Demositzung keine Videoeffekte 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 Plattform-Mediensitzungen korrekt dargestellt, z. B. für die System-UI oder Android Auto.
    • Es wurde ein Problem behoben, bei dem dieselbe Bitmap mehrmals komprimiert wurde, wenn eine MediaController mit einer Plattform-Mediensitzung verbunden wurde.
  • UI:
    • Fügen Sie dem media3-ui-compose-Modul 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-Komponierbare Funktion hinzu. Dieser State Holder wird in demo-compose verwendet, um den Fortschritt als horizontale schreibgeschützte Fortschrittsanzeige darzustellen.
    • Fügen Sie media3-ui-compose das ContentFrame-Composable hinzu, das die PlayerSurface-Verwaltung mit der Größenänderung des Seitenverhältnisses und dem Abdecken mit einem Shutter kombiniert.
    • Problemumgehung für einen bekannten Plattformfehler in API 34, 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).
    • Erstellen Sie ein neues media3-ui-compose-material3-Modul und fügen Sie ihm Composables mit Material3-Design hinzu (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton).
    • Fügen Sie TimeText-Komposition zu media3-ui-compose-material3 hinzu, um den Spielerfortschritt 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 das Medienrouting in der PlayerView hinzugefügt.
    • Verwenden Sie BidiFormatter, um Satzzeichen in RTL-Textuntertiteln korrekt anzuzeigen (#11214).
  • HLS-Erweiterung:
    • HLS-Interstitial-Skip-Attribute 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 gelöscht 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.
    • HlsInterstitialsAdsLoader.Listener.onAdStarted wurde hinzugefügt, 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 beim Abspielen 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 bereitgestellt wird, wenn sie veröffentlicht wird und wenn die Mediendatei vom Nutzer aktualisiert 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 beheben (#2613).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • AV1-Erweiterung: Der AV1-Software-Decoder 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 dafür gesorgt, 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 Sie das alte CastPlayer-Verhalten beibehalten möchten, bei dem nur die Cast-Wiedergabe unterstützt wird, können Sie RemoteCastPlayer verwenden. Die bereits 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 zusammensetzbaren 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:
    • Fügen Sie die maximale Zeitdifferenz für den automatischen Übergang von FakeClock hinzu. 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 die 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.

  • Gemeinsame Bibliothek:
    • 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 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 werden konnten.
    • Achte darauf, dass der letzte Frame korrekt gerendert wird, wenn das MediaCodec-Flag DECODE_ONLY verwendet wird. Dieses Flag ist im Scrubbing-Modus standardmäßig aktiviert.
    • 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 standardmäßig MediaCodec.BUFFER_FLAG_DECODE_ONLY verwenden.
    • 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 lautlosem Audio füllen möchten, müssen Sie jetzt experimentalSetForceAudioTrack(true) in EditedMediaItemSequence.Builder explizit festlegen. Wenn sich die Lücke in der Mitte der Sequenz befindet, ist dieses Flag nicht erforderlich.
    • 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ürzungsvorgangs und dem Startpunkt des Kürzungsvorgangs zu ignorieren.
    • Aktualisieren Sie die Composition Demo-App, um Kotlin und Jetpack Compose zu verwenden, und fügen Sie ein benutzerdefiniertes 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 Springen 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).
    • WavExtractor wird aktualisiert, 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 drehen als auch spiegeln, wird verarbeitet. Dadurch werden gespiegelte Videos, die mit der Frontkamera des iPhone aufgenommen wurden, richtig herum angezeigt, aber fälschlicherweise auf der Y-Achse gespiegelt (#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().
    • Konstantes Power-Upmixing/Downmixing in DefaultAudioMixer zulassen.
    • ChannelMappingAudioProcessor, TrimmingAudioProcessor und ToFloatPcmAudioProcessor öffentlich machen (#2339).
    • Verwenden Sie AudioTrack#getUnderrunCount() in AudioTrackPositionTracker, um Unterläufe in DefaultAudioSink zu erkennen, anstatt eine 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 aus der Pause für die ersten 10 Sekunden unterbrochen wurde, 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.
    • Behebung des Problems, dass auf einigen Geräten nach dem Fallback auf Stereo-Audio nicht wieder zu Mehrkanal-Audio gewechselt wurde (#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. * Verbesserte 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 ins Stocken geriet, 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).
    • Es wurde ein Problem behoben, bei dem die Wiedergabe hängen blieb, wenn von einem Stream mit einem Untertitelfehler zu einem Livestream mit einem leeren Untertiteltrack 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 in MatroskaExtractor nur CodecId = S_TEXT/ASS unterstützt, was die „erweiterte“ (v4+) Variante von SubStation Alpha-Untertiteln darstellen soll. Die Parsing-Logik von ExoPlayer ist jedoch für beide Varianten gleich (#2384).
    • Unterstützung für das Attribut layer in SubStation Alpha (SSA)-Untertiteldateien 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:
    • Begrenzen Sie 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.
    • Richte die maximale Bitmap-Ausgabegröße, die in CompositionPlayer verwendet wird, an der Größe aus, die bereits in Transformer verwendet wird. Das bedeutet, dass CompositionPlayer im Gegensatz zu ExoPlayer die Displaygröße beim Decodieren von Bitmaps 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, das standardmäßig auf „false“ gesetzt ist.
  • IMA-Erweiterung:
    • Ein Fehler wurde behoben, durch den ein Ladefehler in einer Anzeige versehentlich eine andere Anzeigengruppe ungültig machen konnte.
    • 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.
    • Die Prüfung auf verfügbare Befehle beim Senden benutzerdefinierter Befehle an ein Legacy-MediaBrowserServiceCompat wurde 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 Players fälschlicherweise als persistente benutzerdefinierte Ausnahme behandelt wurde. Dadurch wird verhindert, dass die Anwendung wiederhergestellt wird.
    • 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 hinterlassen 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, einen IllegalStateException verursachte (#2265).
    • Es wird nicht automatisch eine Benachrichtigung angezeigt, wenn ein Player mit Mediendateien 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 eines MediaBrowser, der mit einem Legacy-MediaBrowserServiceCompat verbunden war, zu einem NullPointerException führte.
    • Ein Fehler wurde 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 am Player außerhalb des Beobachtungszeitraums werden jetzt erfasst (#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, wenn der Nutzer beginnt, die Scrubbing-Leiste zu ziehen. Bei jeder Bewegung wird ein player.seekTo-Aufruf ausgegeben. Der Scrubbing-Modus wird beendet, wenn der Nutzer den Bildschirm nicht mehr berührt. Diese Integration kann entweder mit time_bar_scrubbing_enabled = true in XML oder mit der Methode setTimeBarScrubbingEnabled(boolean) in 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. Dabei müssen die zeitbasierten Start- und Endpositionen der Medien angegeben werden, 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 Inhalt entsprechend 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 Preload-Hinweisen 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).
    • Das Parsen von Playlists wurde korrigiert, 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 der Anpassungssatz für die Trickwiedergabe mit dem Hauptanpassungssatz zusammengeführt wurde, um eine ungültige TrackGroup zu bilden (#2148).
    • Fehler behoben, bei dem das Verkürzen der Dauer eines DASH-Zeitraums eine Ausnahme auslösen kann, wenn bereits Samples über die neue Dauer hinaus 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.
    • Der verworfene MediaCodecVideoRenderer-Konstruktor MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider) wurde entfernt.

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, die 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.

  • Gemeinsame Bibliothek:
    • Methode PlaybackParameters.withPitch(float) hinzugefügt, um ein 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 von 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 MediaSession-Callbacks der Plattform 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ückgab, obwohl der umschlossene Player tatsächlich leer war. Dies ist aufgetreten, 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.

  • Gemeinsame Bibliothek:
    • 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 ExoPlayer eine sekundäre MediaCodecVideoRenderer 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 benachrichtigt über Ä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 Playlist-Elemente 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 PreloadManagerListener der obersten Ebene.
    • 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).
    • Geben Sie MediaCodecInfo des Codecs an, 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, bei dem nach einer Mid-Roll-Anzeige beim Übergang zu Content-Medien zusätzliche Nur-Decodierungs-Frames in schneller Folge angezeigt werden konnten.
    • Lassen Sie DefaultRenderersFactory zwei MetadataRenderer-Instanzen hinzufügen, damit Anwendungen standardmäßig zwei verschiedene Metadatenschemas empfangen können.
    • Es wird neu bewertet, ob das laufende Laden eines Blocks abgebrochen werden soll, wenn die Wiedergabe pausiert wird (#1785).
    • Option zu ClippingMediaSource hinzugefügt, um das Ausschneiden in nicht suchbaren Medien 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 hinzufügen.
    • 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.
    • Generieren Sie statische HDR-Metadaten, wenn Sie DefaultEncoderFactory verwenden.
    • Unterstützung für die Android-Plattformdiagnose mit MediaMetricsManager aktivieren. Transformer leitet Bearbeitungsereignisse und Leistungsdaten an die Plattform weiter, um Systemleistungs- und Debugging-Informationen 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 die Bereitstellung von Daten für die Plattformdiagnose 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, das Medien aus einem MediaProjection für die Bildschirmaufzeichnung bereitstellt, und fügen Sie der Transformer-Demo-App Unterstützung für die Bildschirmaufzeichnung hinzu.
    • Fügen Sie #getInputFormat() 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 ist.
    • Die Verarbeitung von NAL-Einheiten mit Längen, die in 1 oder 2 Byte (statt 4) ausgedrückt werden, wurde korrigiert.
    • Fehler ArrayIndexOutOfBoundsException in MP4-Bearbeitungslisten behoben, wenn die Bearbeitungsliste bei einem nicht synchronisierten Frame ohne vorherigen synchronisierten Frame beginnt (#2062).
    • Problem behoben, bei dem TS-Streams auf einigen Geräten hängen bleiben konnten (#2069).
    • FLAC: Unterstützung für 32-Bit-FLAC-Dateien hinzugefügt. Bisher konnten diese nicht mit IllegalStateException: Playback stuck buffering and not loading wiedergegeben 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 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 ausstehende Frames sehr langsam decodiert wurden (#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, sondern nur noch eine, 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 haben wir eine beliebige Anzahl von Dezimalstellen fälschlicherweise geparst, aber immer angenommen, dass der Wert in Millisekunden angegeben ist, was zu falschen Zeitstempeln geführt hat (#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.
    • Fehler IllegalStateException behoben, 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 Muxer-Schnittstelle 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.
    • Ein Fehler in FragmentedMp4Muxer wurde 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 Vordergrunddienste drohen. Beachten Sie, dass der Dienst im Vordergrund nicht mehr nur durch Aufrufen von player.pause() vor stopSelf() beendet werden kann. Wenn Sie onTaskRemoved überschreiben, verwenden Sie stattdessen MediaSessionService.pauseAllPlayersAndStopSelf().
    • Die Benachrichtigung bleibt sichtbar, wenn die Wiedergabe in einen Fehler- oder Beendigungszustand 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, der dazu führt, dass Datenquellen geöffnet bleiben und Cachebereiche gesperrt werden, 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 einen 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 Adaptionssets, die mit adaptation-set-switching, aber unterschiedlichen Sprachen oder Rollen-Flags gekennzeichnet sind, zusammengeführt werden (#2222).
  • Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
    • Das MPEG-H-Decodermodul wurde hinzugefügt, das den integrierten MPEG-H-Decoder zum Decodieren von MPEG-H-Audio verwendet (#1826).
  • MIDI-Erweiterung:
    • Benutzerdefinierte AudioSink- und AudioRendererEventListener-Instanzen in MidiRenderer einbinden.
  • Cast-Erweiterung:
    • Die Abhängigkeit play-services-cast-framework 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:
    • Entfernen Sie die eingestellte Methode AudioMixer.create(). Verwenden Sie stattdessen DefaultAudioMixer.Factory().create().
    • Entfernen Sie die folgenden verworfenen Transformer.Builder-Methoden:
      • Verwenden Sie stattdessen setTransformationRequest(), setAudioMimeType(), setVideoMimeType() und setHdrMode().
      • setAudioProcessors(): Legen Sie den Audioprozessor in einem EditedMediaItem.Builder.setEffects() fest und übergeben Sie ihn stattdessen an Transformer.start().
      • Legen Sie stattdessen den Videoeffekt in einem EditedMediaItem.Builder.setEffects() mit setVideoEffects() fest und übergeben Sie ihn an Transformer.start().
      • setRemoveAudio(), verwenden Sie stattdessen EditedMediaItem.Builder.setRemoveAudio(), um die Audioinhalte aus dem an Transformer.start() übergebenen EditedMediaItem zu entfernen.
      • setRemoveVideo(), verwende stattdessen EditedMediaItem.Builder.setRemoveVideo(), um das Video aus dem EditedMediaItem zu entfernen, das an Transformer.start() übergeben wurde.
      • 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 die verworfene Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Verwenden Sie stattdessen Transformer.PROGRESS_STATE_NOT_STARTED.
    • Entfernen Sie die verworfene Transformer.setListener(). Verwenden Sie stattdessen Transformer.addListener(), Transformer.removeListener() oder Transformer.removeAllListeners().
    • Entfernen Sie die verworfene Transformer.startTransformation(). Verwenden Sie stattdessen Transformer.start(MediaItem, String).
    • Entfernen Sie die 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 bereitgestellten Pixel-Seitenverhältniswerten, 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:
    • Extrahiert die Disc-/Titelnummerierung und das Genre aus Vorbis-Kommentaren in MediaMetadata (#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.

  • Gemeinsame Bibliothek:
    • ForwardingSimpleBasePlayer hinzugefügt, um die Weiterleitung an einen anderen Player mit kleinen Anpassungen zu ermöglichen und gleichzeitig für vollständige Konsistenz und Listener-Verarbeitung zu sorgen (#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 bietet, die auf der Common-Bibliothek basieren.
    • Fügen Sie die aussetzende Erweiterungsfunktion Player.listen hinzu, um eine Koroutine zu starten, die auf Player.Events in der media3-common-ktx-Bibliothek wartet.
    • Entfernen Sie @DoNotInline-Annotationen aus manuell ausgelagerten inneren Klassen, die dazu dienen, Fehler bei der Laufzeitklassenprüfung 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 dies 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 vorab geladen werden muss, anstatt einer Position.
    • 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 Option aktiviert ist, wird das Vorabladen auf den Start beschränkt und nur fortgesetzt, wenn der Player nicht für die Wiedergabe lädt, um die Wiedergabe nicht zu beeinträchtigen.DefaultLoadControl 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 freigegebenen Konfigurationen zu erstellen.
    • Entferne den Parameter Renderer[] aus LoadControl.onTracksSelected(), da die Implementierung von DefaultLoadControl 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 das neue DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]) verwendet werden.
    • MediaSourceEventListener-Ereignisse aus sekundären Quellen in MergingMediaSource melden. Dies führt dazu, dass für per Sideloading geladene Untertitel (die mit MediaItem.LocalConfiguration.subtitleConfigurations hinzugefügt wurden) Ereignisse für das Starten, Fehler, Abbrechen und Abschließen 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 Playlist-Elemente 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 der letzten Aktualisierung festzulegen, nach der der Client neu initialisiert wird (#1794).
  • Transformer:
    • Füge SurfaceAssetLoader hinzu, das das Einreihen von Videodaten in die Warteschlange für Transformer über ein Surface unterstützt.
    • 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
  • Trackauswahl:
    • 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 als 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).
    • Nicht sequenzielle Frames bei der endIndices-Berechnung für MP4 mit Bearbeitungsliste verarbeiten (#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: Prüfen, ob 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:
    • Automatische Konfiguration von CTA-2075-Lautstärkemetadaten im Codec, falls in den Medien vorhanden.
    • 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 Aufrufe einer neuen Methode detachOutputSurface, 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 hinzufügen und für WebVTT-Sprachspannen ausfüllen (#1632).
    • 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) werden angezeigt (#1763).
    • Unterstützung von CEA-608-Untertiteln in Dolby Vision-Inhalten (#1820).
    • Behebung eines Problems, 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 Buffers abschneidet. Dies wird jetzt so gehandhabt, dass die Ausgabe näher am Erwarteten 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 konnte.
    • 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 beendet (#1528).
    • Es wurde ein Fehler 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ückgesendet 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).
    • Fügen Sie Befehlsschaltflächen für Mediendateien hinzu. 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 älteren 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 Fehler vom Dienst erhielt, nachdem der Browser einen 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:
    • Der Workaround für gestreckte/zugeschnittene Videos in PlayerView-in-Compose-AndroidView muss aufgrund von Problemen mit XML-basierten gemeinsamen Übergängen aktiviert werden. Apps, die PlayerView in AndroidView verwenden, müssen PlayerView.setEnableComposeSurfaceSyncWorkaround aufrufen, um die Funktion zu aktivieren (#1237, #1594).
    • setFullscreenButtonState wurde zu PlayerView hinzugefügt, um Aktualisierungen des Symbols der Vollbildschaltfläche bei Bedarf 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 funktioniert, wenn es von der App definierte Einstellungen für die Auswahl von Texttracks gibt.
  • DASH-Erweiterung:
    • Unterstützung für Zeiträume 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 Stereo-Layout 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 der Ausgabewechsel-Funktion erforderlich ist (#1056).
  • Testdienstprogramme:
    • DataSourceContractTest enthält jetzt Tests zur Überprüfung von:
      • 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 eingestellte Methode Player.previous(). Verwenden Sie stattdessen Player.seekToPreviousMediaItem().
    • Entfernen Sie die eingestellte Methode DrmSessionEventListener.onDrmSessionAcquired.
    • 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 Startzeit der Ausgabe 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.

  • Gemeinsame Bibliothek:
    • 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 Entzuckerung von Java 8 entfernt (#1312).
    • Achten Sie darauf, dass die an MediaItem.Builder.setImageDurationMs() übergebene Dauer für ein Nicht-Bild-MediaItem 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, um mit PreloadMediaSource Medienbeispiele der Quellen im Arbeitsspeicher vorab zu laden. Verwende eine Ganzzahl rankingData, die den Index eines Elements auf der Benutzeroberfläche angibt.
    • Füge PlayerId zu den meisten Methoden von LoadControl hinzu, 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 dem 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 (Puffer-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 Contentmedien 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 Fortschritte machen 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 fortfahren kann. Wenn ExoPlayer mit experimentalSetDynamicSchedulingEnabled() festgelegt ist, ruft ExoPlayer diese Methode auf, wenn die Zeit für die Planung der Arbeitsaufgabe berechnet wird.
    • Fügen Sie MediaCodecAdapter#OnBufferAvailableListener hinzu, um zu benachrichtigen, wenn Eingabe- und Ausgabepuffer für die Verwendung durch 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.
    • ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() wurde hinzugefügt, um die maximale Position zu konfigurieren, für die seekToPrevious() zum vorherigen Element springt (#1425).
    • Einige Inkonsistenzen beim Audiofokus wurden behoben, z.B. dass der vollständige oder vorübergehende Verlust des Fokus nicht gemeldet wurde, während der Player pausiert war (#1436).
    • Behebung potenzieller IndexOutOfBoundsException, die dadurch verursacht werden, dass Extraktoren 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.
    • Prüfungen der H.264-Stufe für die Trim-Optimierung lockern.
    • 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.
    • Es wurde ein Decoder-Fehler behoben, 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.
    • Problem beim Laden von HEIC-Bildern aus Inhalts-URI-Schemas behoben. (#1373).
    • Passe die Dauer des Audiotracks in AudioGraphInput an, um die AV-Synchronisierung zu verbessern.
    • Entfernen Sie das Feld ExportResult.processedInputs. Wenn Sie dieses Feld für 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 vorwärtsgerollt, um sicherzustellen, dass 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) von Berechnungen für die Suche mit konstanter Bitrate ausgeschlossen, was die Suche genauer macht (#1376).
    • MP3: Die Frame-Anzahl und andere Daten in einem Info-Frame (falls vorhanden) werden verwendet, um eine durchschnittliche Bitrate für die Suche nach konstanter Bitrate zu berechnen, anstatt die Bitrate des Frames nach dem Info-Frame zu extrapolieren, die künstlich klein sein kann, z.B. ein 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 eintrifft, wenn die Oberfläche während der Wiedergabe gewechselt wird.
    • Die Fallback-Logik des Decoders 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 durch Aufrufen von beiden, MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) und TextRenderer.experimentalSetLegacyDecodingEnabled(true), überschrieben 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 Decodierung 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 zu 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: Es werden keine doppelten Zeilenumbrüche mehr hinzugefügt, die durch die naive Verarbeitung des Befehls „set pen location“ durch ExoPlayer verursacht wurden (#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. Zuvor wurden die MP4-Tags „Albumsortierung“ (soal), „Künstlersortierung“ (soar) und „Albumkünstlersortierung“ (soaa) fälschlicherweise den ID3-Tags TSO2, TSOA und TSOP zugeordnet (#1302).
    • Das Lesen der numerischen MP4-Tags (/iTunes) gnre (Genre) und tmpo (Tempo) wurde korrigiert, 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 ungleich null annotiert.
    • ByteArrayDataSource kann einen URI während open() in ein Byte-Array auflösen, anstatt bei der Erstellung hartcodiert zu werden (#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 Debug SurfaceView von Transformer verbessert wird.
    • Die Implementierung der Overlay-Matrix 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.
    • Es ist jetzt möglich, eine unbestimmte Z-Reihenfolge von EditedMediaItemSequences zu definieren (#1055).
    • Beibehaltung eines einheitlichen Luminanzbereichs für verschiedene HDR-Inhalte (verwendet den HLG-Bereich).
    • Unterstützung für Ultra-HDR-Overlays (Bitmap) auf HDR-Inhalten hinzugefügt.
    • Zulassen, dass SeparableConvolution-Effekte vor API 26 verwendet werden.
    • Entfernen Sie 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 auch dann „false“ bleiben kann, wenn der zugehörige Befehl verfügbar ist.
    • Symbolkonstanten für CommandButton hinzufügen, 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 aus, um bei der Auswahl von Metadatenattributen dieselbe bevorzugte Reihenfolge und Logik wie in media1 zu verwenden.
    • 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-Session 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üge SessionError hinzu und verwende es in SessionResult und LibraryResult anstelle des Fehlercodes, um weitere Informationen zum Fehler und zur Behebung des Fehlers bereitzustellen, falls möglich.
    • Veröffentliche den Code für die Media3-Controller-Test-App, mit der Interaktionen mit Apps getestet werden können, die eine Mediensitzung veröffentlichen.
    • 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 Fehlerreplikation zu deaktivieren, die standardmäßig aktiviert ist.
  • 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 unterschiedliche 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:
    • Es wurde dafür gesorgt, dass DownloadHelper keine unveröffentlichten Renderer-Instanzen preisgibt, was 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 das 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 Playlists während der Livewiedergabe nicht aktualisiert wurden (#1240).
    • Fehler behoben, bei dem das Aktivieren von CMCD für HLS-Livestreams zu ArrayIndexOutOfBoundsException führt (#1395).
  • DASH-Erweiterung:
    • Fehler behoben, bei dem die erneute Vorbereitung eines Livestreams mit mehreren Perioden einen IndexOutOfBoundsException auslösen 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.
    • Die TestPlayerRunHelper.runUntil()/playUntil()-Methoden wurden so geändert, 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.
    • Ermöglicht das Festlegen des Wiederholungsmodus mit Intent-Argumenten über die Befehlszeile (#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.
    • Entferne 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-Anmerkung 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).
    • Entfernen Sie die Schnittstelle Bundleable. 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.

  • Gemeinsame Bibliothek:
    • 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 die richtige entsprechende TrackSelectionResult auf den Wiedergabezeitraum bei der Neuauswahl des Tracks an.
    • Frühzeitig aktivierte Renderer werden erst gestartet, nachdem der Wiedergabezeitraum beim Übergang zwischen Mediendateien vorgerückt ist (#1017).
    • Fehlender Rückgabetyp 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.
  • Trackauswahl:
    • 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 Blöcken 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). Das liegt daran, dass die Änderung neue Probleme mit I-Frame-only-HLS-Streams (#1150) und H.262-HLS-Streams (#1126) verursacht.
  • Audio:
    • Renderer-Wiederherstellung durch Deaktivieren der Entlastung zulassen, wenn die Initialisierung des Audiotracks im Entlastungsmodus fehlschlägt.
  • Video:
    • Workaround 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 Tone Mapping von PQ zu SDR 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).
    • Problem behoben, bei dem MediaMetadata mit nur einem extras-Wert, der nicht null ist, nicht zwischen Mediencontrollern und Sitzungen übertragen wird (#1176).
  • UI:
    • Fallback-Modus, um den Sprachnamen des Audiotracks einzubeziehen, 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 ist standardmäßig als lokale Abhängigkeit deaktiviert, da ein zusätzliches Maven-Repository konfiguriert werden muss. Nutzer, die dieses Modul aus einer lokalen Abhängigkeit benötigen, können es wieder aktivieren.

Version 1.3.0

6. März 2024

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

  • Gemeinsame Bibliothek:
    • Implementieren Sie die Unterstützung für android.resource://package/[type/]name-Rohressourcen-URIs, wobei sich package vom Paket der aktuellen Anwendung unterscheidet. Diese Funktion wurde schon immer als funktionierend dokumentiert, aber erst jetzt korrekt implementiert.
    • MIME-Typen, die vom App-Code festgelegt oder aus Medien gelesen werden, werden normalisiert, 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 adaptiver Medienquellen mit PreloadMediaSource.
    • Implementiere HttpEngineDataSource, ein HttpDataSource, mit der HttpEngine API.
    • Verhindern Sie die Erstellung von Unterklassen von CompositeSequenceableLoader. Diese Komponente wurde zuvor erweiterbar gemacht, aber innerhalb der Bibliothek nie 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 experimentalSetSubtitleParserFactory-Methoden für BundledChunkExtractor.Factory und DefaultHlsExtractorFactory wurden in setSubtitleParserFactory umbenannt und die Übergabe von null wurde deaktiviert. 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 eine 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-Suchparametern 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, damit 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 seinem 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).
  • Trackauswahl:
    • Füge DefaultTrackSelector.selectImageTrack hinzu, um die Auswahl von Bildtracks zu aktivieren.
    • Fügen Sie TrackSelectionParameters.isPrioritizeImageOverVideoEnabled hinzu, um festzulegen, ob ein Bildtrack ausgewählt werden soll, wenn sowohl ein Bildtrack 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 sie 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. Die minimale Stille und die natürlichere Dauer der Stille wurden 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 Anbieter der Videosenke 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 ihrer Präsentationszeit zur Verfügung gestellt.
  • DRM:
    • Unverschlüsselte „Clear Lead“-Samples in DRM-Inhalten werden standardmäßig sofort abgespielt, 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 „package-private“. Dieser Typ sollte nicht direkt von außerhalb des HLS-Pakets abhängig sein.
    • Das Springen zum Anfang eines Segments wurde effizienter gestaltet (#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 in einem 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:
    • Problem behoben, bei dem durch manuelles Suchen außerhalb des Bereichs LiveConfiguration.min/maxOffset der Offset immer wieder auf min/maxOffset zurückgesetzt wurde.
    • Problem behoben, bei dem die OPUS- und VORBIS-Kanallayouts für 3, 5, 6, 7 und 8 Kanäle falsch waren (#8396).
    • 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).
    • Es wurde ein Problem behoben, bei dem neue Instanzen von CmcdData.Factory negative Werte für bufferedDurationUs von Chunk-Quellen erhielten, was zu einem IllegalArgumentException führte (#888).
  • Transformer:
    • Problem umgehen, bei dem der Encoder während der Konfiguration aufgrund einer hohen Betriebsrate einen Fehler ausgibt.
  • 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).
    • Fehler bei der Schätzung der Dauer von TS-Streams, die länger als 47.721 Sekunden sind, wurde behoben (#855).
  • Audio:
    • Behebung 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 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 die Wiedergabe vollständig fehlschlägt.
  • DRM:
    • Erweiterung des Workarounds für die fehlerhafte ClearKey-Lizenz-URL https://default.url auf API 33+ (zuvor galt der Workaround nur für API 33) (#837).
    • ERROR_DRM_SESSION_NOT_OPENED wurde behoben, wenn von verschlüsselten zu unverschlüsselten Inhalten gewechselt wurde, ohne dass eine Oberfläche mit dem Player verbunden war. Der Fehler ist auf die falsche Verwendung eines sicheren Decoders zur Wiedergabe der unverschlüsselten Inhalte zurückzuführen.
  • Sitzung:
    • Die benutzerdefinierten Schlüssel und Werte werden in MediaMetadataCompat bis MediaMetadata.extras und MediaMetadata.extras bis MediaMetadataCompat eingefügt (#756, #802).
    • Fehler beim Übertragen 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 Schaltfläche zum Vorspulen 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 Program Change-Ereignisse ü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

  • Gemeinsame Bibliothek:
    • Fügen Sie den Methoden in der Schnittstelle Log.Logger einen Parameter @Nullable Throwable 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 Nullwerte zulassen, und Array-Elementtypen, die Nullwerte zulassen, nicht als solche 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 alte 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, die von der Bibliothek über Player.replaceMediaItem(s) bereitgestellt werden, zulassen (#33, #9978).
    • Benennen Sie MimeTypes.TEXT_EXOPLAYER_CUES in MimeTypes.APPLICATION_MEDIA3_CUES um.
    • Fügen Sie PngExtractor hinzu, um eine ganze PNG-Datei als ein Beispiel in TrackOutput zu senden und zu lesen.
    • 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).
    • Dem CMCD-Logging (Common Media Client Data) wurden zusätzliche Felder hinzugefügt: Pufferunterlauf (bs), Frist (dl), Wiedergabegeschwindigkeit (pr) und Start (su) (#8699).
    • Luma- und Chroma-Bittiefe zu ColorInfo hinzugefügt (#491).
    • Zusätzliche Felder zum CMCD-Logging (Common Media Client Data) hinzugefügt: nächste Objektanfrage (nor) und nächste Bereichsanfrage (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.
  • Trackauswahl:
    • 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 korrigieren. projectionPosePitch wurde in projectionPoseRoll geändert (#461).
    • Die Annahme, dass Extractor-Instanzen direkt mit instanceof geprüft werden können, wurde entfernt. Wenn Sie zur Laufzeit Zugriff auf die Implementierungsdetails eines Extractor-Objekts 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 ein DefaultAudioOffloadSupportProvider bieten kann. Es wird der neue AudioOffloadSupport zurückgegeben, der isFormatSupported, isGaplessSupported und isSpeedChangeSupported enthält.
    • Füge AudioSink.setOffloadMode() hinzu, um die Offload-Konfiguration auf der 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 auch nur dann, wenn das Format dieses Tracks beim Offloading 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 Planung der Auslagerung für die Wiedergabe von ausgelagerten Audioinhalten aktivieren.
    • Löschen Sie ExoPlayer.experimentalSetOffloadSchedulingEnabled und AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • onExperimentalSleepingForOffloadChanged wurde in onSleepingForOffloadChanged und onExperimentalOffloadedPlayback in onOffloadedPlayback umbenannt.
    • Verschiebe die mit dem Audio-Offload-Modus zusammenhängenden TrackSelectionParameters-Schnittstellen und ‑Definitionen 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. Text-Tracks mit sampleMimeType = application/x-media3-cues werden jetzt direkt von TextRenderer verarbeitet, ohne dass eine SubtitleDecoder-Instanz erforderlich ist.
  • Metadaten:
    • MetadataDecoder.decode wird nicht mehr für „Nur-Decodierung“-Samples 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() so, dass es nicht blockierend ist. 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).
    • Gib den StreamManager frei, bevor du AdsLoader.destroy() aufrufst.
    • Die IMA SDK-Version wurde 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() ab 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, mit dem die Benachrichtigung und die Plattformsitzung ausgefüllt 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 Anruf-Controller 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 weiterging, wenn eine Verbindung zu einem alten MediaSessionCompat bestand.
    • 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) hinzufügen, damit Apps die Standardbehandlung von Medien-Button-Ereignissen überschreiben können.
  • UI:
    • Füge eine Player.Listener-Implementierung für Wear OS-Geräte hinzu, die die Wiedergabeunterdrückung aufgrund von Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT verarbeitet, indem ein Systemdialogfeld gestartet wird, über das ein Nutzer eine geeignete Audioausgabe (z.B. Bluetooth-Kopfhörer) verbinden kann. 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 in einem Intervall aktualisiert, das anhand der letzten Ladebeginnzeit und nicht anhand der letzten Ladeabschlusszeit 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() (#288) aktivieren.
  • RTSP-Erweiterung:
    • Race-Bedingung behoben, die beim Fallback auf TCP zu IndexOutOfBoundsException führen konnte, oder die Wiedergabe in einigen Situationen hängen blieb.
    • Prüfung des Status in der RTSP-Einrichtung, 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 Methode wird gegenüber C.BUFFER_FLAG_DECODE_ONLY bevorzugt, die eingestellt wird.
    • Füge Decoder.setOutputStartTimeUs und SimpleDecoder.isAtLeastOutputStartTimeUs hinzu, damit Decoder reine Decodierungs-Samples vor dem Beginn verwerfen können. Diese Option sollte gegenüber bevorzugt werden, da Buffer.isDecodeOnly 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 einer 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

  • Gemeinsame Bibliothek:
    • 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.
    • Dem Logging von Common Media Client Data (CMCD) wurden zusätzliche Felder hinzugefügt: Streamingformat (sf), Streamtyp (st), Version (v), höchste Bitrate (tb), Objektdauer (d), gemessener Durchsatz (mtp) und Objekttyp (ot) (#8699).
  • Audio:
    • Fehler behoben, bei dem Player.getState() beim Abspielen sehr kurzer Dateien nie zu STATE_ENDED wechselte (#538).
  • Audio-Offload:
    • Ogg-ID-Header- und Kommentar-Header-Seiten werden dem Bitstream für die ausgelagerte Opus-Wiedergabe gemäß RFC 7845 vorangestellt.
  • Video:
    • H.265/HEVC: Fehler beim Parsen von SPS-Informationen zu kurz- und langfristigen Referenzbildern 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 Cue-Länge auf 32 Zeichen begrenzt wurde (was laut 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, um sicherzustellen, dass das benutzerdefinierte Layout für den Controller verfügbar ist, wenn die Verbindung hergestellt ist.
    • Fälle behoben, in denen MediaLibraryServiceLegacyStub einen Fehler an einen Result gesendet hat, der dies nicht unterstützt hat, was zu einem UnsupportedOperationException geführt hat (#78).
    • Korrigieren Sie die Art und Weise, wie PlayerWrapper eine 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

  • Gemeinsame Bibliothek:
    • Grund für die Unterdrückung bei ungeeigneter Audioroute hinzufügen und wiedergeben, wenn bereit. Grund für zu lange Unterdrückung ändern. (#15).
    • Fügen Sie dem Player Befehle hinzu:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Fügen Sie „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 hinzugefügt, mit dem verfügbare Tracktypen aus einem MediaSource gefiltert werden können.
    • Unterstützung für die Einbeziehung von Common Media Client Data (CMCD) in die ausgehenden Anfragen der adaptiven Streamingformate DASH, HLS und SmoothStreaming hinzugefügt. Die folgenden Felder wurden aufgenommen: br, bl, cid, rtp und sid (#8699). API-Struktur und API-Methoden:
      • Das CMCD-Logging ist standardmäßig deaktiviert. Verwenden Sie MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory), um es zu aktivieren.
      • Alle Schlüssel sind standardmäßig aktiviert. Überschreiben Sie CmcdConfiguration.RequestConfig.isKeyAllowed(String key), um 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 dem 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, wird durch DefaultTrackSelector eine neue Trackauswahl ausgelöst, 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-Abtastzeit 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 den erforderlichen Parameter context hinzu, mit dem sich DefaultAudioSink als Listener für AudioCapabilitiesReceiver registriert und die Property audioCapabilities aktualisiert, wenn eine Änderung der Funktionen gemeldet 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 Skalierung/Mischung auf Audiokanäle anzuwenden.
    • Füge den neuen int-Wert DISCARD_REASON_AUDIO_BYPASS_POSSIBLE zu DecoderDiscardReasons hinzu, um den Audio-Decoder zu verwerfen, wenn der Bypass-Modus nach einer Änderung der Audiofunktionen möglich ist.
    • Unterstützung für die direkte Wiedergabe von DTS Express und DTS:X hinzugefügt (#335).
  • Video:
    • MediaCodecVideoRenderer meldet ein VideoSize mit einer Breite und Höhe von 0, 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 kein Video 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, durch den in Livestreams eine neue Werbeunterbrechung eingefügt wurde, weil die berechnete Inhaltsposition in aufeinanderfolgenden Zeitachsen leicht variierte.
  • Sitzung:
    • Fügen Sie die Hilfsmethode MediaSession.getControllerForCurrentRequest hinzu, um Informationen zum Controller abzurufen, der gerade eine Player-Methode aufruft.
    • androidx.media3.session.MediaButtonReceiver wurde hinzugefügt, damit Apps die Fortsetzung der Wiedergabe mit Ereignissen von Medientasten implementieren können, die beispielsweise von einem Bluetooth-Headset gesendet werden (#167).
    • Fügen Sie MediaSession.Callback.onAddMediaItems eine Standardimplementierung hinzu, damit angeforderte MediaItems an Player übergeben werden können, wenn sie LocalConfiguration haben (z.B. URI) (#282).
    • In der kompakten Ansicht der Medienbenachrichtigung werden standardmäßig die Befehlsschaltflächen „Zurückspulen“ und „Vorspulen“ für Android 12 und niedriger 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 der Medienbenachrichtigung werden standardmäßig die Befehlsschaltflächen „Zurückspulen“ und „Vorspulen“ 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 der Basis-URI für die Auflösung relativer Pfade aus der RTSP-Sitzung, wenn im DESCRIBE-Antwortheader vorhanden (#11160).
  • DASH-Erweiterung:
    • Entferne den Medienzeitversatz aus MediaLoadData.startTimeMs und MediaLoadData.endTimeMs für DASH-Streams mit mehreren Zeiträumen.
    • Ein Fehler wurde behoben, bei dem die erneute Vorbereitung einer Live-DASH-Medienquelle mit mehreren Zeiträumen zu einem IndexOutOfBoundsException führte (#10838).
  • HLS-Erweiterung:
    • Fügen Sie HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) hinzu, um ein Zeitlimit für den Ladethread festzulegen, damit auf die Initialisierung von TimestampAdjuster gewartet wird. Wenn die Initialisierung nicht vor dem Zeitlimit abgeschlossen wird, 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 das URI-Schema in DataSourceContractTest Groß- und Kleinschreibung berücksichtigt.
  • 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 verwendet, 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.
    • Die verworfenen Methoden copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate und copyWithVideoSize wurden entfernt. Verwenden Sie stattdessen Format.buildUpon() und Setter-Methoden.
    • Entfernen Sie das 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 OfflineLicenseHelper-Konstruktor 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.
    • Entfernen Sie den verworfenen OfflineLicenseHelper-Konstruktor und verwenden Sie stattdessen OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Vier verworfene 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.

Diese Version entspricht der ExoPlayer-Version 2.18.7.

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

  • Core-Bibliothek:
    • Fügen Sie Buffer.isLastSample() hinzu, um anzugeben, ob Buffer das Flag C.BUFFER_FLAG_LAST_SAMPLE enthält.
    • Problem behoben, bei dem der letzte Frame möglicherweise nicht gerendert wurde, wenn das letzte Sample mit Frames aus der Warteschlange entfernt wurde, ohne das Sample „Ende des Streams“ zu lesen. (#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 einer Legacy-MediaSessionCompat besteht, die ihre Aktionen aktualisiert.
    • Fehler behoben, der verhinderte, dass MediaLibraryService bei einem 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.

  • Core-Bibliothek:
    • Überschreibung des Ziel-Livestreams beim Springen zur Standardposition zurücksetzen (#11051).
    • Es wurde ein Fehler behoben, durch den 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 alte 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 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 dem ExoPlayer 2.18.4-Release.

  • Core-Bibliothek:
    • Fehlerbehebung bei der Erkennung des Netzwerktyps in API 33 (#10970).
    • NullPointerException wurde beim Aufrufen von ExoPlayer.isTunnelingEnabled korrigiert (#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.
    • Workaround 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 wurden behoben, die bei der Wiedergabe von Medien mit einer Framerate auftraten, die weit über der Aktualisierungsrate des Displays lag.
  • Streamen:
    • Problem mit vorübergehendem STATE_IDLE beim Wechsel zwischen Mediendateien behoben (#245).
  • RTSP:
    • Die beim Parsen von ungültigen RTSP-Beschreibungsantwortnachrichten ausgelöste IllegalArgumentException 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 DAI-Streams 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.

  • Core-Bibliothek:
    • Die Logik für die Decoderreihenfolge des Renderers wird angepasst, um die Einstellungen von MediaCodecSelector beizubehalten, 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.
    • Löschen von Download-Manager-Hilfsprogrammen zulassen (#10776).
    • Fügen Sie BasePlayer.seekTo einen Parameter hinzu, um auch den Befehl anzugeben, der für die Suche verwendet wird.
    • Design beim Laden von Drawables auf API 21 und höher verwenden (#220).
    • ConcatenatingMediaSource2 wurde hinzugefügt, um mehrere Mediendateien in einem einzigen Fenster zu kombinieren (#247).
  • Extraktoren:
    • Löst eine ParserException anstelle einer NullPointerException aus, wenn beim Parsen von trak-Atomen eine erforderliche Beispielbeschreibung (stsd) in der Beispieltabelle (stbl) fehlt.
    • Samples werden beim direkten Springen zu einem Synchronisierungsframe in fMP4 korrekt übersprungen (#10941).
  • Audio:
    • Verwende die Bitrate des komprimierten Audioformats, um die Mindestpuffergröß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:
    • Das 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 Schreibrichtung von rechts nach links (RTL) verwendet wird (#227).
  • Sitzung:
    • Füge die abstrakte Klasse SimpleBasePlayer hinzu, um die Implementierung der Schnittstelle Player für benutzerdefinierte Player zu erleichtern.
    • 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 zur Klarstellung verwendet (#216).
    • onSetMediaItems-Callback-Listener hinzugefügt, um die MediaItem-Liste, den Startindex und die Position nach Sitzung zu ändern/festzulegen, bevor sie auf dem 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:
    • Die Cast SDK-Version wurde 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 das Attribut focusSkipButtonWhenAvailable hinzu, um den Fokus auf den Button „Überspringen“ auf TV-Geräten zu legen, und setze es standardmäßig auf „true“.
    • Füge der ImaServerSideAdInsertionMediaSource.AdsLoader die Methode focusSkipButton() hinzu, um programmatisch den Fokus auf die Schaltfläche zum Überspringen zu legen.
    • IMA SDK-Version 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.

  • Core-Bibliothek:
    • 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 Arbeitsspeicher hängen bleibt.
    • Schließen Sie den Tracing-Block „doSomeWork“, wenn die Auslagerung aktiviert ist.
    • Problem mit dem Sitzungstracking bei schnellem Suchen 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 einem IllegalStateException führen kann (#10758).
  • Build:
    • Mindestversion von compileSdkVersion erzwingen, um Kompilierungsfehler zu vermeiden (#10684).
    • Vermeiden Sie die Veröffentlichung des Blocks, wenn er in einem anderen Gradle-Build enthalten ist.
  • Trackauswahl:
    • Andere Tracks als Dolby Vision bevorzugen, wenn das Display Dolby Vision nicht unterstützt. (#8944).
  • Downloads:
    • Eine potenzielle Endlosschleife in ProgressiveDownloader, die durch gleichzeitiges Herunterladen und Wiedergeben mit derselben PriorityTaskManager verursacht wurde, wurde behoben (#10570).
    • Downloadbenachrichtigung wird sofort angezeigt (#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 Dolby Vision nicht unterstützt. (#9794).
  • Audio:
    • Verwende SingleThreadExecutor, um AudioTrack-Instanzen freizugeben und OutOfMemory-Fehler zu vermeiden, wenn mehrere Player gleichzeitig freigegeben werden (#10057).
    • Fügt AudioOffloadListener.onExperimentalOffloadedPlayback für den AudioTrack-Offload-Status hinzu. (#134).
    • Machen Sie AudioTrackBufferSizeProvider zu einer öffentlichen Schnittstelle.
    • 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 Player-Position ausgibt.
  • DRM:
    • Problemumgehung für einen Fehler in der ClearKey-Implementierung von Android 13, 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 der zuletzt wiedergegebenen Mediendatei wird angezeigt (#112).
    • Starten Sie keinen Dienst im Vordergrund mit einem ausstehenden Intent zum Pausieren (#167).
    • Manuelles Ausblenden des „Badge“, das mit der von DefaultNotificationProvider erstellten Benachrichtigung verknüpft ist, in API 26 und API 27 (das Badge wird in API 28 und höher 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:
    • Implementiere getDeviceInfo(), 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.

  • Core-Bibliothek:
    • 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).
    • Benutzerdefinierter 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:
    • Parsing von H265-Kurzzeit-Referenzbildsätzen korrigiert (#10316).
    • Fehler beim Parsen von Bitraten aus esds-Boxen behoben (#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 an die Playlist-Methoden als Window.mediaItem in CastTimeline übergeben wurde (#25, #8212).
    • Unterstützung von Player.getMetadata() und Listener.onMediaMetadataChanged() mit CastPlayer (#25).

Version 1.0.0-beta01

16. Juni 2022

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

Dies entspricht dem ExoPlayer-Release 2.18.0.

  • Core-Bibliothek:
    • Unterstützung für die Android-Plattformdiagnose über MediaMetricsManager aktivieren. ExoPlayer leitet Wiedergabeereignisse und Leistungsdaten an die Plattform weiter, die dann 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 mit ExoPlayer.Builder.setUsePlatformDiagnostics(false) die Weitergabe von Daten an die Plattformdiagnose für ExoPlayer deaktivieren.
    • 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 auf API 29 und 30 wird beendet. Bei diesen Wiedergaben wird von einem 4G-Netzwerk ausgegangen.
    • Die Ü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:
    • Reduzieren Sie die Klasse TrackSelectionOverrides auf TrackSelectionParameters und stufen Sie TrackSelectionOverride zu einer Klasse der obersten Ebene hoch.
    • Benennen Sie TracksInfo in Tracks und TracksInfo.TrackGroupInfo in Tracks.Group um. 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 DefaultTrackSelector Stereo-/Mono-Formate 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 Audioräumlichkeit 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 und 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:
    • DummySurface in PlaceholderSurface umbenennen.
    • 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.
    • Die Plattform (API 29+) wird abgefragt oder die Anzahl der Audiocodierungskanäle für Audio-Passthrough wird angenommen, wenn die Anzahl der Audioformate nicht festgelegt ist. Dies ist bei der HLS-Vorbereitung ohne Chunks der Fall (10204).
    • Konfiguriere AudioTrack mit der Kanalmaske AudioFormat.CHANNEL_OUT_7POINT1POINT4, wenn der Decoder 12-Kanal-PCM-Audio ausgibt (#10322).
  • DRM
    • Die DRM-Sitzung wird jetzt immer korrekt aktualisiert, wenn unmittelbar nach einer Formatänderung gesucht 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 Bereitstellung 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:
    • DummyDataSource in PlaceholderDataSource umbenennen.
    • 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 alten Media Session herstellt.
    • Entfernen Sie MediaController.setMediaUri und MediaSession.Callback.onSetMediaUri. Dieselbe Funktionalität kann mit MediaController.setMediaItem und MediaSession.Callback.onAddMediaItems erreicht werden.
    • Leite alte MediaController-Anrufe zur Medienwiedergabe an MediaSession.Callback.onAddMediaItems statt an onSetMediaUri weiter.
    • Fügen Sie MediaNotification.Provider und DefaultMediaNotificationProvider hinzu, um die Benachrichtigung anzupassen.
    • Fügen Sie BitmapLoader und SimpleBitmapLoader hinzu, um Bilder von Kunstwerken herunterzuladen.
    • 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).
    • Aktualisierung der Positionsinformationen der Sitzung in der Zeitachse (#51).
    • NPE in MediaControllerImplBase nach Freigabe 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 stattdessen 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 beim Prüfen 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.

  • Core-Bibliothek:
    • 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).
    • DecoderCounters#inputBufferCount in queuedInputBufferCount umbenennen.
    • 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).
    • Bevorzuge Einstellungen für Audioinhalte (z. B. den Standard-Audiotrack oder einen Track, der der Sprache des Systems 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 unterscheidbar gemacht werden, indem im TrackGroup-Konstruktor eine id festgelegt wird. 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 ist (#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) im IMA SDK 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 Vor- und Zurückspul-Buttons von StyledPlayerView wurde bei bestimmten Designs korrigiert (#9765).
    • Strings für die Wiedergabegeschwindigkeit werden korrekt übersetzt (#9811).
  • DASH:
    • Geparste erforderliche 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, oder die Vorbereitung ohne Chunks mit HlsMediaSource.Factory.setAllowChunklessPreparation(false) deaktivieren.
    • Unterstützung der Keyframe-genauen Suche in HLS (#2882).
  • RTSP:
    • Es wurde eine Client-API bereitgestellt, um die für eine 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 werden ignoriert (#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 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) auf dem 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 denen von GNU abhängig machen (#9933).
  • Kompatibilität mit Android 12:
    • Aktualisieren Sie 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 Legacy-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 verpacken, 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.