Media3

Bibliotheken für Medienanwendungsfälle unterstützen
Letzte Aktualisierung Stabile Version Release-Kandidat Beta-Ausgabe Alphaversion
20. Dezember 2024 1.5.1 - - 1.6.0-alpha01

Abhängigkeiten deklarieren

Wenn du eine Abhängigkeit von Media3 hinzufügen möchtest, musst du deinem Projekt das Google Maven-Repository hinzufügen. Weitere Informationen finden Sie im Maven-Repository von Google.

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

Groovy

dependencies {
    def media3_version = "1.4.1"

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

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

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

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

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

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

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

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

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

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

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

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

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

Kotlin

dependencies {
    val media3_version = "1.4.1"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Feedback

Ihr Feedback hilft uns, Jetpack zu verbessern. Im Media3-Issue-Tracker finden Sie Antworten auf Fragen, Informationen zu bekannten Problemen und Funktionsanfragen sowie die Möglichkeit, neue Probleme zu melden.

Version 1.6.0

Version 1.6.0-alpha01

20. Dezember 2024

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

  • Gemeinsame Bibliothek:
    • Entfernen Sie die Methode Format.toBundle(boolean excludeMetadata) und verwenden Sie stattdessen Format.toBundle().
    • Fügen Sie AudioManagerCompat und AudioFocusRequestCompat hinzu, um die entsprechenden Klassen in androidx.media zu ersetzen.
  • ExoPlayer:
    • Achte bei der Auswahl eines Videotracks auf die Sprache. Wähle standardmäßig einen „Haupt“-Videotrack aus, der der Sprache des ausgewählten Audiotracks entspricht, sofern verfügbar. Mit TrackSelectionParameters.Builder.setPreferredVideoLanguage(s) können Sie explizite Einstellungen für die Videosprache festlegen.
    • 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 den tatsächlichen Inhalten übereinstimmt, am Ende des Elements zu Frame-Einfrieren führen können (#1698).
    • Reduzieren Sie die Standardwerte für bufferForPlaybackMs und bufferForPlaybackAfterRebufferMs in DefaultLoadControl auf 1.000 bzw. 2.000 ms.
    • Fügen Sie MediaExtractorCompat hinzu, eine neue Klasse mit Funktionen, die denen der Plattform MediaExtractor entsprechen.
    • Verschieben Sie BasePreloadManager.Listener auf eine oberste Ebene. PreloadManagerListener
    • RenderersFactory.createSecondaryRenderer kann implementiert werden, um sekundäre Renderer für das Vorwärmen bereitzustellen. Durch die Vorwärmung können Medienelemente während der Wiedergabe schneller gewechselt werden.
    • Aktiviere das Senden von CmcdData für Manifestanfragen in den adaptiven Streamingformaten DASH, HLS und SmoothStreaming (#1951).
    • Geben Sie den MediaCodecInfo des Codecs an, der in MediaCodecRenderer.onReadyToInitializeCodec initialisiert werden soll (#1963).
    • Ändern Sie AdsMediaSource, damit die AdPlaybackStates durch Anhängen von Anzeigengruppen wachsen kann. Ungültige Änderungen werden erkannt und eine Ausnahme wird ausgelöst.
  • Transformator:
    • Aktualisieren Sie die Parameter VideoFrameProcessor.registerInputStream und VideoFrameProcessor.Listener.onInputStreamRegistered, um Format zu verwenden.
    • Unterstützung für das Transmuxing in alternative abwärtskompatible Formate hinzufügen
    • Generiere bei Verwendung von DefaultEncoderFactory statische HDR-Metadaten.
  • Extraktoren:
    • AVI: Fehler bei der Verarbeitung von Dateien mit komprimiertem Audio mit konstanter Bitrate behoben, bei denen im Stream-Header die Anzahl der Byte anstelle der Anzahl der Chunks gespeichert wird.
  • Audio:
    • onAudioPositionAdvancing wird jetzt aufgerufen, wenn die Wiedergabe fortgesetzt wird. Bisher wurde es aufgerufen, wenn die Wiedergabe pausiert wurde.
  • Video:
    • Korrigiere MediaCodecVideoRenderer so, dass der Renderer ohne Surface nur dann Frames überspringt, die zu früh sind, wenn VideoFrameReleaseControl.getFrameReleaseAction nicht FRAME_RELEASE_TRY_AGAIN_LATER ist.
  • Text:
    • Es werden nicht mehr alle mit MediaItem.Builder.setSubtitleConfigurations konfigurierten Untertiteldateien geladen, sondern nur eine, wenn sie über die Spurauswahl ausgewählt wird (#1721).
  • Wirkung:
    • Die Funktionen von OverlaySettings wurden in StaticOverlaySettings verschoben. OverlaySettings kann untergeordnet werden, um dynamische Overlay-Einstellungen zuzulassen.
  • Muxer:
    • MuxerException wurde aus der Muxer-Benutzeroberfläche entfernt, um einen sehr langen voll qualifizierten Namen zu vermeiden.
  • Sitzung:
    • Fügen Sie „Context“ als Parameter zu „MediaButtonReceiver.shouldStartForegroundService“ hinzu (#1887).
  • UI:
    • Fügen Sie dem media3-ui-compose-Modul PlayerSurface Composable hinzu.
    • Fügen Sie dem media3-ui-compose-Modul die Klassen PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState und ShuffleButtonState sowie die entsprechenden rememberPlayPauseButtonState-, rememberNextButtonState-, rememberPreviousButtonState-, rememberRepeatButtonState- und rememberShuffleButtonState-Kompositionen hinzu.
  • HLS-Erweiterung:
    • Fügen Sie eine erste Version von HlsInterstitialsAdsLoader hinzu. Der Anzeigen-Lademechanismus liest die HLS-Interstitials einer HLS-Media-Playlist und ordnet sie der AdPlaybackState zu, die an die AdsMediaSource übergeben wird. Diese erste Version unterstützt nur HLS-VOD-Streams mit X-ASSET-URI-Attributen.
    • Fügen Sie HlsInterstitialsAdsLoader.AdsMediaSourceFactory hinzu. Apps können damit AdsMediaSource-Instanzen erstellen, die auf einfache und sichere Weise einen HlsInterstitialsAdsLoader verwenden.
  • DASH-Erweiterung:
    • Unterstützung für das AC-4-Level-4-Format für DASH hinzugefügt (#1898).
  • Decodererweiterungen (FFmpeg, VP9, AV1 usw.):
    • Füge das MPEG-H-Dekodierungsmodul hinzu, das das native MPEG-H-Dekodierungsmodul zum Dekodieren von MPEG-H-Audio verwendet (#1826).
  • Demo-App:
    • Fügen Sie demo-compose mithilfe von PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState und ShuffleButtonState zusammensetzbare UI-Elemente vom Typ MinimalControls (PlayPauseButton, NextButton, PreviousButton) und ExtraControls (RepeatButton, ShuffleButton) hinzu.
  • Entfernen Sie veraltete Symbole:
    • Die eingestellte Methode AudioMixer.create() entfernen Verwenden Sie stattdessen DefaultAudioMixer.Factory().create().
    • Entfernen Sie die folgenden veralteten Transformer.Builder-Methoden:
      • setTransformationRequest(), verwende stattdessen setAudioMimeType(), setVideoMimeType() und setHdrMode().
      • setAudioProcessors(), legen Sie den Audioprozessor in einem EditedMediaItem.Builder.setEffects() fest und übergeben Sie ihn stattdessen an Transformer.start().
      • setVideoEffects(), Videoeffekt in einem EditedMediaItem.Builder.setEffects() festlegen und an Transformer.start() übergeben.
      • setRemoveAudio(), verwenden Sie stattdessen EditedMediaItem.Builder.setRemoveAudio(), um den Ton aus der EditedMediaItem zu entfernen, die an Transformer.start() übergeben wird.
      • setRemoveVideo(), verwende stattdessen EditedMediaItem.Builder.setRemoveVideo(), um das Video aus der EditedMediaItem zu entfernen, die an Transformer.start() übergeben wird.
      • setFlattenForSlowMotion(), verwenden Sie stattdessen EditedMediaItem.Builder.setFlattenForSlowMotion(), um den an Transformer.start() übergebenen EditedMediaItem zu flach zu bilden.
      • setListener(), verwende stattdessen addListener(), removeListener() oder removeAllListeners().
    • Entfernen Sie die folgenden veralteten Transformer.Listener-Methoden:
      • onTransformationCompleted(MediaItem); verwenden Sie stattdessen onCompleted(Composition, ExportResult).
      • onTransformationCompleted(MediaItem, TransformationResult). Verwenden Sie stattdessen onCompleted(Composition, ExportResult).
      • onTransformationError(MediaItem, Exception); verwenden Sie stattdessen onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationException); verwenden Sie stattdessen onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationResult, TransformationException); verwenden Sie stattdessen onError(Composition, ExportResult, ExportException).
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest); verwenden Sie stattdessen onFallbackApplied(Composition, TransformationRequest, TransformationRequest).
    • Entfernen Sie die eingestellte Klasse TransformationResult. Verwenden Sie stattdessen ExportResult.
    • Entfernen Sie die eingestellte Klasse TransformationException. Verwenden Sie stattdessen ExportException.
    • Entfernen Sie die eingestellte Transformer.PROGRESS_STATE_NO_TRANSFORMATION. Verwenden Sie stattdessen Transformer.PROGRESS_STATE_NOT_STARTED.
    • Entfernen Sie die eingestellte Transformer.setListener(). Verwenden Sie stattdessen Transformer.addListener(), Transformer.removeListener() oder Transformer.removeAllListeners().
    • Entfernen Sie die eingestellte Transformer.startTransformation(). Verwenden Sie stattdessen Transformer.start(MediaItem, String).
    • Entfernen Sie die eingestellte SingleFrameGlShaderProgram. Verwenden Sie stattdessen BaseGlShaderProgram.
    • Entfernen Sie Transformer.flattenForSlowMotion. Verwenden Sie stattdessen EditedMediaItem.flattenForSlowMotion.

Version 1.5

Version 1.5.1

19. Dezember 2024

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

  • ExoPlayer:
    • Die asynchrone Entschlüsselung in MediaCodec wurde deaktiviert, um gemeldete Probleme mit Zeitüberschreitungen bei Codecs mit dieser Plattform-API zu vermeiden (#1641).
  • Extraktoren:
    • MP3: Die Wiedergabe wird nicht vorzeitig beendet, wenn der Inhaltsverzeichnis eines VBRI-Frames nicht alle MP3-Daten in einer Datei abdeckt (#1904).
  • Video:
    • Rollback bei der Verwendung der von MediaCodecAdapter bereitgestellten Pixelseitenverhältniswerte, die bei der Verarbeitung von onOutputFormatChanged angegeben wurden (#1371).
  • Text:
    • Fehlerkorrektur in ReplacingCuesResolver.discardCuesBeforeTimeUs: Der Cue, der bei timeUs aktiv war (vorher gestartet, aber noch nicht beendet), wurde fälschlicherweise verworfen (#1939).
  • Metadaten:
    • Extrahiere die Disc-/Tracknummer und das Genre aus Vorbis-Kommentaren in MediaMetadata (#1958).

Version 1.5.0

27. November 2024

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

  • Gemeinsame Bibliothek:
    • Füge ForwardingSimpleBasePlayer hinzu, mit dem du mit kleinen Anpassungen zu einem anderen Player weiterleiten kannst und gleichzeitig für vollständige Konsistenz und korrekte Verarbeitung von Listenern sorgst (#1183).
    • Ersetzen Sie SimpleBasePlayer.State.playlist durch die Methode getPlaylist().
    • Füge eine Überschreibung für SimpleBasePlayer.State.Builder.setPlaylist() hinzu, um einen Timeline und aktuelle Tracks und Metadata direkt anzugeben, anstatt eine Playlist-Struktur zu erstellen.
    • Erhöhen Sie minSdk auf 21 (Android Lollipop). Dies entspricht allen anderen AndroidX-Bibliotheken.
    • androidx.media3:media3-common-ktx-Artefakt hinzufügen, das Kotlin-spezifische Funktionen auf der Common Library bietet
    • Fügen Sie die Player.listen-Sperrungserweiterungsfunktion hinzu, um eine Coroutine zu starten, die Player.Events in der media3-common-ktx-Bibliothek überwacht.
    • Entfernen Sie @DoNotInline-Anmerkungen aus manuell nicht ausgerichteten inneren Klassen, um Fehler bei der Laufzeitüberprüfung von Klassen zu vermeiden. In den neuesten Versionen von R8 werden solche Aufrufe jetzt automatisch außerhalb der Aufrufabfolge ausgeführt, um Laufzeitfehler zu vermeiden. Eine manuelle Aufrufabfolge 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 anderen Build-Systemen als Gradle müssen dafür sorgen, dass ihr R8-entsprechender Schritt zum Schrumpfen/Unkenntlichmachen einen ähnlichen automatischen Prozess zum Entfernen von Inline-Code durchführt, um Fehler bei der Laufzeitüberprüfung von Klassen zu vermeiden. Diese Änderung wurde bereits in anderen AndroidX-Bibliotheken vorgenommen.
  • ExoPlayer:
    • MediaCodecRenderer.onProcessedStreamChange() kann jetzt für jedes Medienelement aufgerufen werden. Bisher wurde sie nicht für den ersten Aufruf aufgerufen. Verwenden Sie MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart(), um diese Funktion zu aktivieren.
    • Fügen Sie PreloadMediaSource.PreloadControl.onPreloadError hinzu, damit PreloadMediaSource.PreloadControl-Implementierungen bei einem Fehler Maßnahmen ergreifen können.
    • Fügen Sie BasePreloadManager.Listener hinzu, um Preloading-Ereignisse an Apps weiterzuleiten.
    • Es ist jetzt möglich, die SNTP-Client-Zeitüberschreitung zu ändern und bei einer Zeitüberschreitung noch einmal mit alternativen Adressen zu versuchen (#1540).
    • Entfernen Sie MediaCodecAdapter.Configuration.flags, da das Feld immer null war.
    • Der Nutzer kann den integrierten Lautsprecher für die Wiedergabe unter Wear OS API 35 und höher auswählen (wenn das Gerät dies unterstützt).
    • Verschieben Sie den Blockierungsaufruf an Context.getSystemService(Context.AUDIO_SERVICE), bis die Audiofokusverwaltung aktiviert ist. So wird verhindert, dass der Anruf blockiert wird, wenn die Audiofokus-Verarbeitung nicht aktiviert ist (#1616).
    • Wiedergabe unabhängig von der zwischengespeicherten Dauer zulassen, wenn das Laden fehlschlägt (#1571).
    • Füge AnalyticsListener.onRendererReadyChanged() hinzu, um anzuzeigen, dass die Wiedergabe bei einzelnen Renderern möglich ist.
    • Fehlerbehebung: MediaCodec.CryptoException wird manchmal als „unerwarteter Laufzeitfehler“ gemeldet, wenn MediaCodec im asynchronen Modus ausgeführt wird (Standardverhalten bei API 31 und höher).
    • Übergeben Sie bufferedDurationUs anstelle von bufferedPositionUs mit PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Außerdem wird DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS in DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS geändert. Apps müssen dann anstelle einer Position einen Wert für eine bestimmte Dauer ab der Standardstartposition übergeben, für die die entsprechende Medienquelle mit dieser IntDef vorab geladen werden muss.
    • Fügen Sie eine ForwardingRenderer-Implementierung hinzu, die alle Methodenaufrufe an einen anderen Renderer weiterleitet (1703).
    • Füge das Playlist-Preload für das nächste Element in der Playlist hinzu. Apps können das Vorabladen aktivieren, indem sie ExoPlayer.setPreloadConfiguration(PreloadConfiguration) entsprechend aufrufen. Das Vorabladen ist standardmäßig deaktiviert. Wenn die Funktion aktiviert ist, wird das Vorladen so eingeschränkt, dass es nur gestartet und fortgesetzt wird, wenn der Player nicht für die Wiedergabe geladen wird.DefaultLoadControl Apps können dieses Verhalten ändern, indem sie LoadControl.shouldContinuePreloading() entsprechend implementieren (z. B. durch Überschreiben dieser Methode in DefaultLoadControl). Bei der Standardimplementierung von LoadControl wird das Vorladen deaktiviert, wenn eine App eine benutzerdefinierte Implementierung von LoadControl verwendet.
    • Methode MediaSourceEventListener.EventDispatcher.dispatchEvent() hinzufügen, um das Aufrufen von Ereignissen von Unterklassen-Listenern zu ermöglichen (1736).
    • Fügen Sie DefaultPreloadManager.Builder hinzu, mit dem die DefaultPreloadManager- und ExoPlayer-Instanzen mit konsistent freigegebenen Konfigurationen erstellt werden.
    • Entferne den Parameter Renderer[] aus LoadControl.onTracksSelected(), da die DefaultLoadControl-Implementierung die Streamtypen aus ExoTrackSelection[] abrufen kann.
    • DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) wurde eingestellt und die Methode als endgültig markiert, um Überschreibungen zu verhindern. Stattdessen sollte die neue DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]) verwendet werden.
    • MediaSourceEventListener-Ereignisse aus sekundären Quellen in MergingMediaSource melden Dies führt dazu, dass für nebengeladene Untertitel (mit MediaItem.LocalConfiguration.subtitleConfigurations hinzugefügt) Ereignisse zum Starten, Fehler, Abbrechen und Abschließen des Ladens gemeldet werden. Diese können als doppelte Ladeereignisse erscheinen, die von AnalyticsListener gesendet werden.
    • Verhindern, dass Untertitel- und Metadatenfehler die Wiedergabe vollständig stoppen. Stattdessen wird der problematische Titel deaktiviert und die Wiedergabe der verbleibenden Titel fortgesetzt (#1722).
      • Bei der neuen Untertitelverwaltung (während der Extraktion) werden zugehörige Parse- (z.B. ungültige Untertiteldaten) und Ladefehler (z.B. HTTP 404) über onLoadError-Callbacks ausgegeben.
      • Bei der bisherigen Untertitelverarbeitung (während des Renderings) werden nur zugehörige Ladefehler über onLoadError-Callbacks ausgegeben, während Parsefehler 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 den tatsächlichen Inhalten übereinstimmt, am Ende des Elements zu Frame-Einfrieren führen können (#1698).
    • Fügen Sie SntpClient einen Setter hinzu, um die maximale verstrichene Zeit seit der letzten Aktualisierung festzulegen, nach der der Client neu initialisiert wird (#1794).
  • Transformator:
    • Füge SurfaceAssetLoader hinzu, mit dem Videodaten über einen Surface in der Warteschlange für Transformer angeordnet werden können.
    • ImageAssetLoader meldet nicht unterstützte Eingaben über AssetLoader.onError, anstatt eine IllegalStateException zu werfen.
    • Die Bilddauer muss beim Bildexport mit MediaItem.Builder.setImageDurationMs festgelegt werden.
    • Exportunterstützung für Lücken in Sequenzen von EditedMediaItems hinzufügen
  • Titelauswahl:
    • DefaultTrackSelector: Bei ansonsten gleichen Faktoren sollte objektbasiertes Audio gegenüber kanalbasiertem Audio bevorzugt werden.
  • Extraktoren:
    • Mit Mp4Extractor und FragmentedMp4Extractor können H264-Samples identifiziert werden, die von nachfolgenden Samples nicht als Referenz verwendet werden.
    • Option zum Aktivieren der indexbasierten Suche in AmrExtractor hinzufügen
    • MP3-Dateien mit mehr als 128 KB zwischen gültigen Frames werden als abgeschnitten (nicht 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-Byte enthalten, jetzt am Ende der MP3-Daten beendet wird, anstatt mit ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} fehlzuschlagen (#1563).
    • Die Verarbeitung von Pre-Roll-Samples für Medienstartpositionen, die keine keyframes sind, wurde bei der Verarbeitung von Bearbeitungslisten in MP4-Dateien korrigiert (#1659).
    • Die Berechnung der Framerate wurde verbessert, indem die Mediendauer aus dem Feld mdhd in Mp4Extractor und FragmentedMp4Extractor verwendet wird (#1531).
    • Falsche Skalierung von media_time in MP4-Bearbeitungslisten korrigiert. Während segment_duration bereits korrekt anhand der Filmzeitleiste skaliert wurde, wird media_time jetzt gemäß dem MP4-Formatstandard (#1792) anhand der Zeitleiste des Tracks skaliert.
    • Bei der Berechnung von endIndices für MP4-Dateien mit einer Bearbeitungsliste werden jetzt nicht in der richtigen Reihenfolge angeordnete Frames berücksichtigt (#1797).
    • Korrektur des Media-Dauer-Parsings im Feld mdhd von MP4-Dateien, um -1-Werte zu verarbeiten (#1819).
    • Unterstützung für die Identifizierung des 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, sodass die Verwendung ab Version S-Erweiterung 7 statt ab API-Level 34 möglich ist (#1262).
    • DataSourceContractTest: Prüfen, ob DataSource.getUri() den aufgelösten URI zurückgibt (wie dokumentiert). Wenn sich diese von der angeforderten URI unterscheidet, kann dies in Tests mit der neuen Methode DataSourceContractTest.TestResource.Builder.setResolvedUri() angegeben werden.
    • DataSourceContractTest: Prüfen, ob DataSource.getUri() und getResponseHeaders() den Wert „offen“ zurückgeben, nachdem ein Aufruf von open() fehlgeschlagen ist (aufgrund einer nicht gefundenen Ressource) und vor einem nachfolgenden Aufruf von close().
      • Wenn Sie DataSourceContractTest.getNotFoundResources() überschreiben, können Testunterklassen mehrere „nicht gefunden“-Ressourcen und auch alle erwarteten Überschriften bereitstellen. So lässt sich zwischen HTTP 404 (mit Headern) und „Server nicht gefunden“ (ohne Header) unterscheiden.
  • Audio:
    • Konfiguriert automatisch CTA-2075-Lautstärkemetadaten für den Codec, sofern sie in den Medien vorhanden sind.
    • Die Lautstärke sollte beim Vor- und Zurückspringen stufenlos leiser werden.
    • Pop-Geräusche, die beim Suchen auftreten können, wurden behoben.
    • Behebung von Fehlern beim Kürzen von Audioinhalten beim Algorithmus für Zeitdehnung/Tonhöhenänderung von Sonic.
    • Fehler in SpeedChangingAudioProcessor behoben, der zu fehlenden Ausgabeframes führte
  • Video:
    • MediaCodecVideoRenderer verhindert die Dekodierung von Samples, die weder gerendert noch von anderen Samples als Referenz verwendet werden.
    • Bei API 35 und höher kann MediaCodecAdapter jetzt eine null Surface in configure empfangen und eine neue Methode detachOutputSurface aufrufen, um eine zuvor festgelegte Surface zu entfernen, wenn der Codec dies unterstützt (MediaCodecInfo.detachedSurfaceSupported).
    • Verwende die von MediaCodecAdapter bereitgestellten Pixel-Seitenverhältniswerte, sofern vorhanden, bei der Verarbeitung von onOutputFormatChanged (#1371).
    • Behelfslösung für ein Geräteproblem auf dem Galaxy Tab S7 FE hinzugefügt, durch das sichere H264-Streams mit 60 fps als nicht unterstützt gekennzeichnet werden (#1619).
    • Problemumgehung für Codecs hinzugefügt, die nach dem letzten Sample hängen bleiben, ohne ein Signal zum Ende des Streams zurückzugeben.
  • Text:
    • Füge eine benutzerdefinierte VoiceSpan hinzu und fülle sie für WebVTT-Sprachspanne aus (#1632).
    • WebVTT-Untertitel in HLS mit sehr großen Zeitstempeln, die bei der Darstellung als Mikrosekunden und Multiplikation mit der 90,000-MPEG-Zeitbasis einen 64-Bit-long überschreiten, werden angezeigt (#1763).
    • Unterstützung von CEA-608-Untertiteln in Dolby Vision-Inhalten (#1820)
    • Behebung eines Fehlers, bei dem die Wiedergabe bei DASH-Streams mit mehreren Zeiträumen hängen blieb, wenn CEA-608-Untertitel aktiviert waren (#1863).
  • Metadaten:
    • Weise den Tracks mit icy- oder vnd.dvb.ait-Inhalten den Typ C.TRACK_TYPE_METADATA zu.
  • Bild:
    • Fügen Sie ExternallyLoadedImageDecoder hinzu, um die Integration in externe Bibliotheken zum Laden von Bildern wie Glide oder Coil zu vereinfachen.
  • DataSource:
    • Fügen Sie FileDescriptorDataSource hinzu, eine neue DataSource, die zum Lesen aus einer FileDescriptor verwendet werden kann (#3757).
  • Wirkung:
    • Problemumgehung für geringfügige SurfaceTexture-Skalierung hinzufügen.DefaultVideoFrameProcessor SurfaceTexture kann eine kleine Skalierung enthalten, die einen 1-Texel-Rand um den Rand eines zugeschnittenen Buffers abschneidet. Dies wird jetzt so verarbeitet, dass die Ausgabe näher am erwarteten Ergebnis liegt.
    • DefaultVideoFrameProcessor.queueInputBitmap() beschleunigen Dadurch ist der Export von Bildern in Videos mit Transformer schneller.
  • IMA-Erweiterung:
    • Fehler behoben, durch den das Löschen der Playlist zu einer ArrayIndexOutOfBoundsException in ImaServerSideAdInsertionMediaSource führen konnte
    • Fehler behoben, bei dem serverseitig eingefügte DAI-Streams ohne Preroll zu einer ArrayIndexOutOfBoundsException führen können, wenn die Wiedergabe über die letzte Mid-Roll hinausgeht (#1741).
  • Sitzung:
    • Füge MediaButtonReceiver.shouldStartForegroundService(Intent) hinzu, damit Apps einen Wiedergabebefehl zur Wiederaufnahme 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 einer ForegroundServiceDidNotStartInTimeException zum Absturz bringt (#1528).
    • Behebung eines Fehlers, durch den benutzerdefinierte Befehle, die von einem MediaBrowser gesendet wurden, bei einer Verbindung mit einem älteren Dienst an die MediaSessionCompat.Callback-Variante der Methode statt an die MediaBrowserServiceCompat-Variante gesendet wurden. Dadurch konnte MediaBrowser den tatsächlichen Rückgabewert nicht erhalten, der vom alten Dienst zurückgesendet wurde (#1474).
    • Bei der Einrichtung des Broadcastempfängers für Intents von Medienschaltflächen wird von Geräten bestimmter Hersteller IllegalArgumentException geworfen (#1730).
    • Befehlsschaltflächen für Medienelemente hinzufügen Dadurch wird die Media3 API für das, was früher Custom browse actions war, in die alte Bibliothek mit MediaBrowserCompat eingefügt. Beachten Sie, 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 von AAOS.
    • Fehler behoben, durch den ein Media3-Controller manchmal nicht zuließ, dass eine Sitzungs-App einen Dienst im Vordergrund startet, nachdem play() angefordert wurde.
    • Beschränken Sie CommandButton.Builder.setIconUri darauf, nur Inhalts-URIs zu akzeptieren.
    • Übergeben Sie Verbindungshinweise eines Media3-Browsers an die ursprüngliche MediaBrowserCompat, wenn Sie eine Verbindung zu einer älteren MediaBrowserCompat herstellen. Der Dienst kann die Verbindungshinweise, die als Stammhinweise übergeben werden, beim ersten Aufruf von onGetRoot() erhalten.
    • Fehler behoben, bei dem eine MediaBrowser, die mit einem alten Browserdienst verbunden ist, keinen vom Dienst gesendeten Fehler empfing, nachdem der Browser eine parentid abonniert hatte.
    • Verbesserung des Interoperabilitätsverhaltens, damit ein Media3-Browser, der mit einer älteren MediaBrowserService verbunden ist, die untergeordneten Elemente einer parentId nicht zweimal anfordert, wenn er ein übergeordnetes Element abonniert.
  • UI:
    • Die Funktion zum Strecken/Zuschneiden von Videos in der PlayerView-in-Compose-AndroidView-Umgehung ist jetzt optional, da es Probleme mit XML-basierten gemeinsamen Übergängen gibt. Apps, die PlayerView in AndroidView verwenden, müssen PlayerView.setEnableComposeSurfaceSyncWorkaround aufrufen, um die Funktion zu aktivieren (#1237, #1594).
    • Füge setFullscreenButtonState zu PlayerView hinzu, um das Symbol der Vollbildschaltfläche auf Anfrage zu aktualisieren, also nicht reaktiv auf eine Klickinteraktion (#1590, #184).
    • Es wurde ein Fehler behoben, durch den die Option „Kein“ in der Textauswahl nicht funktionierte, wenn es appdefinierte Einstellungen für die Auswahl von Untertiteln 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 beim Abspielen von SmoothStreaming-Streams mit Untertiteln (#1779)
  • RTSP-Erweiterung:
    • Behebung eines Problems beim Entfernen von Nutzerinformationen für URLs, die codierte @-Zeichen enthalten (#1138).
    • Behebung von Abstürzen beim Parsen von RTP-Paketen mit Headererweiterungen (#1225).
  • Decodererweiterungen (z. B. FFmpeg, VP9, AV1):
    • Füge das IAMF-Dekodierungsmodul hinzu, das die Wiedergabe von MP4-Dateien mit IAMF-Tracks unterstützt. Dabei wird die native libiamf-Bibliothek verwendet, um Audio zu synthetisieren.
      • Die Wiedergabe ist mit einem Stereolayout sowie 5.1 mit Spatialisierung und optionaler Kopferfassung aktiviert. Die binaurale Wiedergabe wird derzeit nicht unterstützt.
    • Unterstützung für 16-KB-Seiten für Decodererweiterungen 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.
    • Fülle das DeviceInfo von CastPlayer aus, wenn ein Context angegeben ist. So kann die MediaSession mit einer RoutingSession verknüpft werden, was für die Einbindung des Ausgabeschalters erforderlich ist (#1056).
  • Test-Dienstprogramme:
    • DataSourceContractTest enthält jetzt Tests für Folgendes:
      • Der Eingabestream read position wird aktualisiert.
      • Der Ausgabepuffer offset wird richtig angewendet.
  • Demo-App
    • Speicherlecks in der Demo-App für Kurzvideos beheben (#1839)
  • Entfernen Sie veraltete Symbole:
    • Eingestellte Player.hasPrevious, Player.hasPreviousWindow() entfernt. Verwenden Sie stattdessen Player.hasPreviousMediaItem().
    • Entfernen Sie die eingestellte Methode Player.previous(). Verwenden Sie stattdessen Player.seekToPreviousMediaItem().
    • Die eingestellte Methode DrmSessionEventListener.onDrmSessionAcquired entfernen
    • Entfernen Sie die eingestellten DefaultEncoderFactory-Konstruktoren. Verwenden Sie stattdessen DefaultEncoderFactory.Builder.

Version 1.5.0-rc02

19. November 2024

Verwenden Sie die stabile Version 1.5.0.

Version 1.5.0-rc01

13. November 2024

Verwenden Sie die stabile Version 1.5.0.

Version 1.5.0-beta01

30. Oktober 2024

Verwenden Sie die stabile Version 1.5.0.

Version 1.5.0-alpha01

10. September 2024

Verwenden Sie die stabile Version 1.5.0.

Version 1.4.0

Version 1.4.1

27. August 2024

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

  • ExoPlayer:
    • Asynchrone Verarbeitung von PreloadMediaSource-Vorab-Callbacks (#1568)
    • Wiedergabe unabhängig von der Zwischenspeicherdauer zulassen, wenn das Laden fehlschlägt (#1571).
  • Extraktoren:
    • MP3: Der Searched too many bytes-Fehler wurde behoben, indem nachstehende nicht MP3-Daten basierend auf dem Längenfeld in einem Info-Frame korrekt ignoriert wurden (#1480).
  • Text:
    • TTML: Die Verarbeitung von Prozentwerten für tts:fontSize wurde korrigiert, damit sie korrekt von übergeordneten Knoten mit Prozentwerten für tts:fontSize übernommen werden.
    • Fehlerbehebung bei IndexOutOfBoundsException in LegacySubtitleUtil, da der Fall, dass die angeforderte Ausgabestartzeit größer oder gleich der Endzeit des Ereignisses in der Subtitle ist, nicht richtig behandelt wurde (#1516).
  • Digitale Rechteverwaltung:
    • Korrektur des Fehlers android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE auf Geräten mit API 31 und höher, auf denen L1 Widevine-Inhalte wiedergegeben werden. Dieser Fehler wird durch eine unvollständige Implementierung der Framework-Methode MediaDrm.requiresSecureDecoder verursacht (#1603).
  • Wirkung:
    • Fügen Sie GlObjectsProvider eine release()-Methode hinzu.
  • Sitzung:
    • Ein Doppeltippen auf KEYCODE_HEADSETHOOK in eine Aktion zum „Nächste Titelschleife abspielen“ umwandeln, wie dokumentiert (#1493).
    • Bei der Entscheidung, ob KEYCODE_HEADSETHOOK in MediaButtonReceiver ignoriert werden soll, um eine ForegroundServiceDidNotStartInTimeException zu vermeiden, wird KEYCODE_HEADSETHOOK als „Wiedergabe“-Befehl behandelt (#1581).
  • RTSP-Erweiterung:
    • Ungültige Media Descriptions beim SDP-Parsen überspringen (#1087).

Version 1.4.0

25. Juli 2024

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

  • Gemeinsame Bibliothek:
    • Vorgebliche No-Op-Suchanrufe an die geschützten Methoden BasePlayer.seekTo() und SimpleBasePlayer.handleSeek() weiterleiten, anstatt sie zu ignorieren. Wenn du diese Methoden in einem benutzerdefinierten Player implementierst, musst du diese zusätzlichen Aufrufe möglicherweise mit mediaItemIndex == C.INDEX_UNSET verarbeiten.
    • Kompilierungsabhängigkeit von der erweiterten Java 8-Entschwefelung entfernt (#1312).
    • Die an MediaItem.Builder.setImageDurationMs() übergebene Dauer wird für ein MediaItem, das kein Bild ist, ignoriert (wie dokumentiert).
    • Fügen Sie Format.customData hinzu, um von der App bereitgestellte benutzerdefinierte Informationen zu Format-Instanzen zu speichern.
  • ExoPlayer:
    • Fügen Sie BasePreloadManager hinzu, das das Vorladen für mehrere Quellen basierend auf den Prioritäten koordiniert, die durch ihre rankingData definiert sind. Sie können diese Klasse erweitern, um sie anzupassen. Füge DefaultPreloadManager hinzu, bei dem PreloadMediaSource verwendet wird, um Mediensamples der Quellen in den Arbeitsspeicher zu laden, und eine Ganzzahl rankingData, die den Index eines Elements auf der Benutzeroberfläche angibt.
    • Füge den meisten Methoden von LoadControl die Option PlayerId hinzu, damit LoadControl-Implementierungen mehrere Spieler unterstützen können.
    • Entfernen Sie Buffer.isDecodeOnly() und C.BUFFER_FLAG_DECODE_ONLY. Es ist nicht erforderlich, dieses Flag festzulegen, da Renderer und Dekodierer Buffers basierend auf dem Zeitstempel überspringen. Bei benutzerdefinierten Renderer-Implementierungen sollte geprüft werden, ob die Pufferzeit mindestens BaseRenderer.getLastResetPositionUs() beträgt, um zu entscheiden, ob ein Sample angezeigt werden soll. Bei benutzerdefinierten SimpleDecoder-Implementierungen kann bei Bedarf isAtLeastOutputStartTimeUs() geprüft oder andere Puffer mit DecoderOutputBuffer.shouldBeSkipped markiert werden, um sie zu überspringen.
    • Erlauben Sie, dass von TargetPreloadStatusControl.getTargetPreloadStatus(T) ein Nullwert zurückgegeben wird, um anzugeben, dass ein MediaSource nicht mit dem angegebenen rankingData vorab geladen werden soll.
    • Fügen Sie remove(MediaSource) zu BasePreloadManager hinzu.
    • Fügen Sie reset() zu BasePreloadManager hinzu, um alle Quellen mit Zurückhaltung freizugeben und die Instanz des Preload-Managers beizubehalten.
    • Fügen Sie ExoPlayer.setPriority() (und Builder.setPriority()) hinzu, um den Prioritätswert zu definieren, der in PriorityTaskManager und für die Wichtigkeit von MediaCodec ab API 35 verwendet wird.
    • Problem beim Aktualisieren der letzten Zeit für die erneute Pufferung behoben, was zu einem falschen bs-Schlüssel (Puffermangel) in CMCD führte (#1124).
    • Füge PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) hinzu, um anzugeben, dass die Quelle vollständig geladen wurde. So können die DefaultPreloadManager- und die benutzerdefinierte PreloadMediaSource.PreloadControl-Implementierung die nächste Quelle vorab laden oder andere Aktionen ausführen.
    • Es wurde ein Fehler behoben, durch den das Überspringen von Stille am Ende von Elementen eine Wiedergabeausnahme auslösen konnte.
    • Fügen Sie clear zu PreloadMediaSource hinzu, um den Zeitraum für das Vorabladen zu verwerfen.
    • 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 darf Pre-Roll-Anzeigen laden, bevor die anfängliche Medienvorbereitung für den Inhalt abgeschlossen ist (#1358).
    • Fehler behoben, durch den die Wiedergabe bei der erneuten Vorbereitung eines DASH-Livestreams mit mehreren Zeiträumen auf STATE_ENDED umgestellt wurde, nachdem der ursprüngliche Zeitraum bereits aus dem Manifest entfernt wurde.
    • Benennen Sie onTimelineRefreshed() in onSourcePrepared() und onPrepared() in onTracksSelected() in PreloadMediaSource.PreloadControl um. Benennen Sie auch die IntDefs in DefaultPreloadManager.Stage entsprechend um.
    • Es wurde experimentelle Unterstützung für die dynamische Planung hinzugefügt, um die Arbeit besser an die CPU-Aktivierungszyklen anzupassen und das Aufwachen so zu verzögern, dass Renderer fortfahren können. Du kannst diese Funktion bei der Einrichtung deiner ExoPlayer-Instanz mit experimentalSetDynamicSchedulingEnabled() aktivieren.
    • Fügen Sie Renderer.getDurationToProgressUs() hinzu. Ein Renderer kann diese Methode implementieren, um an ExoPlayer die Dauer zurückzugeben, um die die Wiedergabe vorrücken muss, damit der Renderer fortfahren kann. Wenn ExoPlayer mit experimentalSetDynamicSchedulingEnabled() festgelegt ist, ruft ExoPlayer diese Methode auf, um die Zeit für die Planung der Arbeitsaufgabe zu berechnen.
    • Fügen Sie MediaCodecAdapter#OnBufferAvailableListener hinzu, um benachrichtigt zu werden, wenn Eingabe- und Ausgabe-Buffer für MediaCodecRenderer verfügbar sind. MediaCodecRenderer signalisiert ExoPlayer, wenn diese Callbacks empfangen werden. Wenn ExoPlayer mit experimentalSetDynamicSchedulingEnabled() festgelegt ist, plant ExoPlayer seinen Arbeits-Loop, da die Renderer Fortschritte machen können.
    • Verwenden Sie für LoadControl-Methoden eine Datenklasse anstelle einzelner Parameter.
    • Fügen Sie ExoPlayer.isReleased() hinzu, um zu prüfen, ob Exoplayer.release() aufgerufen wurde.
    • Fügen Sie ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() hinzu, um die maximale Position zu konfigurieren, bis zu der 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 eines potenziellen IndexOutOfBoundsException, der durch Extractors verursacht wurde, die nach dem ersten Vorbereitungsschritt zusätzliche Titel melden (#1476).
    • Effects in ExoPlayer.setVideoEffect() erhält die Zeitstempel ohne Renderer-Offset (#1098).
    • Potenzieller IllegalArgumentException beim Umgang mit einem Playerfehler beim Vorlesen eines anderen Playlist-Elements behoben (#1483).
  • Transformator:
    • Füge audioConversionProcess und videoConversionProcess zu ExportResult hinzu, um anzugeben, wie der jeweilige Titel in der Ausgabedatei erstellt wurde.
    • Die Überprüfungen auf H.264-Ebene für die Trimm-Optimierung wurden gelockert.
    • Unterstützung für den Wechsel zwischen SDR- und HDR-Eingabemedien in einer Sequenz hinzugefügt.
    • Unterstützung für Audioeffekte auf Kompositionsebene hinzugefügt.
    • Unterstützung für die Transcodierung von Ultra-HDR-Bildern in HDR-Videos hinzugefügt
    • Das Problem, dass die DefaultAudioMixer nach dem Zurücksetzen und Wiederverwenden nicht die richtige Anzahl von Byte ausgibt, wurde behoben.
    • Behebung eines Decoderfehlers, bei dem die Anzahl der Audiokanäle bei der Verarbeitung von PCM-Eingängen auf „Stereo“ begrenzt wurde.
    • Ignoriere bei der Auswahl von Tracks in ExoPlayerAssetLoader die Einschränkungen bei der Anzahl der Audiokanäle, da sie nur für die Wiedergabe gelten.
    • Ersetzen Sie die androidx.media3.transformer.Muxer-Benutzeroberfläche durch androidx.media3.muxer.Muxer und entfernen Sie androidx.media3.transformer.Muxer.
    • Behebung von Problemen beim Laden von HEIC-Bildern über Content-URI-Schemas (#1373).
    • Passen Sie die Dauer des Audiotracks unter AudioGraphInput an, um die Synchronisierung von Audio und Video zu verbessern.
    • Entfernen Sie das Feld ExportResult.processedInputs. Wenn du dieses Feld für Codec-Details verwendest, verwende stattdessen DefaultDecoderFactory.listener. Bei einer Codec-Ausnahme findest du die Codec-Details in der ExportException.codecInfo.
  • Extraktoren:
    • MPEG-TS: Die Änderung wird vorwärts ausgeführt, damit der letzte Frame gerendert wird. Dazu wird die letzte Zugriffseinheit eines Streams an die Sample-Warteschlange übergeben (#7909). Es wurden Fehlerkorrekturen für Probleme in HLS-Streams mit nur I-Frames(#1150) und H.262-HLS-Streams (#1126) implementiert.
    • MP3: Die Datengröße aus einem Info-Frame hat Vorrang vor der vom zugrunde liegenden Stream gemeldeten Größe (z.B. Dateigröße oder HTTP-Content-Length-Header). So lassen sich nicht abspielbare Trailerdaten (z.B. Albumcover) aus Berechnungen für die Suche nach konstanter Bitrate ausschließen, wodurch die Suche genauer wird (#1376).
    • MP3: Verwende die Frame-Anzahl und andere Daten in einem Info-Frame (falls vorhanden), um eine durchschnittliche Bitrate für die Suche nach einer konstanten Bitrate zu berechnen, anstatt von der Bitrate des Frames nach dem Info-Frame zu extrapolieren, die möglicherweise künstlich niedrig ist, z.B. PCUT-Frame (#1376).
    • Fehler bei der Extraktion von PCM-Audioformaten in AVI-Containern behoben.
  • Audio:
    • Korrektur der DTS:X-Profil 2-Codierungsattribute für die Passthrough-Wiedergabe (#1299)
    • Bei der ausgelagerten Wiedergabe musst du das Tracking-Feld für den Streamabschluss in DefaultAudioSink zurücksetzen, bevor du AudioTrack.stop() aufrufst, damit AudioTrack.StreamEventCallback#onPresentationEnded richtig erkennt, wann alle ausstehenden Daten wiedergegeben wurden.
    • Fehler in SilenceSkippingAudioProcessor behoben, bei dem Übergänge zwischen verschiedenen Audioformaten (z. B. von Stereo zu Mono) dazu führen können, dass der Prozessor eine Ausnahme auslöst (#1352).
    • Implementiere MediaCodecAudioRenderer.getDurationToProgressUs() so, dass ExoPlayer seinen Haupt-Arbeits-Loop dynamisch so plant, dass der MediaCodecAudioRenderer Fortschritte erzielen kann.
  • Video:
    • Das Problem wurde behoben, dass Listener.onRenderedFirstFrame() zu früh angezeigt wurde, wenn während der Wiedergabe die Oberfläche gewechselt wurde.
    • Die Fallback-Logik für den Decoder für Dolby Vision wurde korrigiert, damit bei Bedarf ein kompatibler AV1-Decoder verwendet wird (#1389).
    • Behebung eines Codec-Ausnahmefehlers, der durch die Aktivierung eines Video-Renderers während der Wiedergabe auftreten kann
  • Text:
    • Es wurde ein Problem behoben, durch das Untertitel, die vor einer Suchposition beginnen, übersprungen wurden. Dieses Problem wurde erst in Media3 1.4.0-alpha01 eingeführt.
    • Ändere das Standardverhalten beim Untertitel-Parsing so, dass es während der Extraktion statt während des Renderings erfolgt. Den Unterschied zwischen Extraktion und Rendering findest du im Architekturdiagramm von ExoPlayer.
      • Diese Änderung kann überschrieben werden, indem sowohl MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) als auch TextRenderer.experimentalSetLegacyDecodingEnabled(true) aufgerufen werden. In der Anleitung zur Anpassung erfahren Sie, wie Sie diese Komponenten in eine ExoPlayer-Instanz einbinden. Diese Methoden und die gesamte Unterstützung für die alte Untertiteldecodierung werden in einer zukünftigen Version entfernt.
      • Apps mit benutzerdefinierten SubtitleDecoder-Implementierungen müssen aktualisiert werden, um stattdessen SubtitleParser (und SubtitleParser.Factory anstelle von SubtitleDecoderFactory) zu implementieren.
    • PGS: Korrektur der Laufzeitdekodierung, damit 0 als Farbindex und nicht als Literalfarbwert aufgelöst wird (#1367).
    • CEA-708: rowLock-Wert ignorieren. Gemäß der CEA-708-E S-2023-Spezifikation sollten rowLock und columnLock unabhängig von den im Stream vorhandenen Werten als wahr angenommen werden. Da die Unterstützung von columnLock nicht implementiert ist, wird davon ausgegangen, dass dieser Wert immer falsch ist.
      • Diese Änderung war ursprünglich in den Versionshinweisen für 1.3.0-alpha01 enthalten, wurde aber vor der Veröffentlichung von 1.3.0-rc01 versehentlich rückgängig gemacht. Das Problem wurde behoben und die Änderung ist wieder sichtbar.
    • CEA-708: Vermeiden von doppelten Zeilenumbrüchen, die durch die naive Verarbeitung des Befehls „set pen location“ (Stiftposition festlegen) von ExoPlayer hinzugefügt werden (#1315).
    • Korrigiere eine IllegalArgumentException von LegacySubtitleUtil, wenn ein WebVTT-Untertitelbeispiel keine Cues enthält, z.B. als Teil eines DASH-Streams (#1516).
  • Metadaten:
    • Fehler bei der Zuordnung von MP4-Sortiertags zu ID3-Tags behoben. Bisher wurden die MP4-Tags „Albumsortierung“ (soal), „Künstlersortierung“ (soar) und „Albumkünstlersortierung“ (soaa) fälschlicherweise den ID3-Tags TSO2, TSOA und TSOP zugeordnet (#1302).
    • Behebung eines Problems beim Lesen von MP4- (/iTunes-)Zahlen-Tags gnre (Genre) und tmpo (Tempo), wenn der Wert mehr als ein Byte lang ist.
    • ID3-TCON-Frame an MediaMetadata.genre weitergeben (#1305)
  • Bild:
    • Unterstützung für nicht quadratische DASH-Miniaturansichten-Raster hinzugefügt (#1300).
    • Unterstützung für AVIF für API 34 und höher
    • null als Parameter für ExoPlayer.setImageOutput() zulassen, um eine zuvor festgelegte ImageOutput zu löschen
  • DataSource:
    • Implementieren Sie die Unterstützung für android.resource://package/id-URIs für Rohressourcen, wobei package sich vom Paket der aktuellen Anwendung unterscheidet. Bisher war dies nicht dokumentiert, aber es ist eine effizientere Methode, auf Ressourcen in einem anderen Paket zuzugreifen, als nach Namen zu suchen.
    • Prüfen Sie in den DataSpec-Konstruktoren unbedingt, ob url nicht null ist. Dieser Parameter wurde bereits als „nicht null“ gekennzeichnet.
    • ByteArrayDataSource darf einen URI während open() in ein Byte-Array auflösen, anstatt ihn bei der Erstellung hartcodiert zu haben (#1405).
  • Digitale Rechteverwaltung:
    • Es ist jetzt möglich, eine LoadErrorHandlingPolicy auf DefaultDrmSessionManagerProvider festzulegen (#1271).
  • Wirkung:
    • Mehrere Geschwindigkeitsänderungen innerhalb desselben EditedMediaItem oder Composition in SpeedChangeEffect werden unterstützt.
    • Unterstützung für HLG- und PQ-Ausgabe von Ultra-HDR-Bitmap-Eingabe
    • Unterstützung für EGL_GL_COLORSPACE_BT2020_HLG_EXT hinzugefügt, wodurch die HLG-Surface-Ausgabe in ExoPlayer.setVideoEffect und der Debug-SurfaceView von Transformer verbessert wird.
    • Aktualisieren Sie die Overlay-Matriximplementierung, damit sie der Dokumentation entspricht. Kehren Sie dazu die X- und Y-Werte in setOverlayFrameAnchor() um. 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ürzte (#821).
    • Ändern Sie den Standard-SDR-Farbarbeitsraum von linearen Farben zu elektrischen BT 709-SDR-Videos. Bieten Sie auch eine dritte Option an, um den ursprünglichen Farbraum beizubehalten.
    • Es ist jetzt möglich, eine unbestimmte Z-Reihenfolge für EditedMediaItemSequences zu definieren (#1055).
    • Für verschiedene HDR-Inhalte einen einheitlichen Leuchtdichtebereich beibehalten (HLG-Bereich wird verwendet).
    • Unterstützung für Ultra-HDR- (Bitmap-)Overlays auf HDR-Inhalten hinzufügen
    • SeparableConvolution-Effekte vor API 26 zulassen
    • Entferne nicht verwendete OverlaySettings.useHdr, da der dynamische Bereich von Overlay und Frame übereinstimmen muss.
    • HDR-Unterstützung für TextOverlay hinzufügen Die Leuchtkraft des Text-Overlays kann mit OverlaySettings.Builder.setHdrLuminanceMultiplier() angepasst werden.
  • IMA-Erweiterung:
    • Die API, die für Apps zum Abspielen von DAI-Anzeigenstreams erforderlich ist, wird als stabil eingestuft.
    • Fügen Sie replaceAdTagParameters(Map <String, String>) zu ImaServerSideAdInsertionMediaSource.AdLoader hinzu, damit Anzeigen-Tag-Parameter während der Laufzeit ersetzt werden können.
    • Fehler behoben, durch den VideoAdPlayer.VideoAdPlayerCallback.onError() nicht aufgerufen wurde, wenn während der Anzeigenwiedergabe ein Playerfehler auftrat (#1334).
    • Die IMA SDK-Version wurde auf 3.33.0 erhöht, um einen NullPointerException bei der Verwendung von data://-Anzeigen-Tag-URIs zu beheben (#700).
  • Sitzung:
    • Ändern Sie den Standardwert von CommandButton.enabled in true und achten Sie darauf, dass der Wert für Controller auch dann auf „False“ bleiben kann, wenn der zugehörige Befehl verfügbar ist.
    • Fügen Sie Symbolkonstanten für CommandButton hinzu, die anstelle benutzerdefinierter Symbolressourcen verwendet werden sollen.
    • Fügen Sie MediaSessionService.isPlaybackOngoing() hinzu, damit Apps abfragen können, ob der Dienst in onTaskRemoved() beendet werden muss (#1219).
    • Füge MediaSessionService.pauseAllPlayersAndStopSelf() hinzu, mit dem sich die Wiedergabe aller Sitzungen bequem pausieren lässt, und rufe stopSelf() auf, um den Lebenszyklus der MediaSessionService zu beenden.
    • Überschreiben Sie MediaSessionService.onTaskRemoved(Intent), um eine sichere Standardimplementierung bereitzustellen, bei der der Dienst im Vordergrund ausgeführt wird, wenn die Wiedergabe aktiv ist, oder der Dienst andernfalls angehalten wird.
    • Die Sprungleiste in der Medienbenachrichtigung für Livestreams wird ausgeblendet, wenn die Dauer nicht in den Metadaten der Plattformsitzung festgelegt wird (#1256).
    • Gleichen Sie die Umwandlung von MediaMetadata mit MediaDescriptionCompat an, damit bei der Auswahl von Metadateneigenschaften dieselbe bevorzugte Reihenfolge und Logik wie in media1 verwendet wird.
    • MediaSession.sendError() hinzufügen, mit dem nicht schwerwiegende Fehler an den Media3-Controller gesendet werden können Wenn du den Benachrichtigungscontroller verwendest (siehe MediaSession.getMediaNotificationControllerInfo()), wird der benutzerdefinierte Fehler verwendet, um den PlaybackState der Plattformsitzung in einen Fehlerstatus mit den angegebenen Fehlerinformationen zu aktualisieren (#543).
    • Fügen Sie MediaSession.Callback.onPlayerInteractionFinished() hinzu, um Sitzungen darüber zu informieren, wenn eine Reihe von Spielerinteraktionen von einem bestimmten Controller abgeschlossen wurde.
    • Fügen Sie SessionError hinzu und verwenden Sie es anstelle des Fehlercodes in SessionResult und LibraryResult, um weitere Informationen zum Fehler und zur Behebung des Fehlers anzugeben, sofern 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.
    • Übertragen Sie die an MediaSession[Builder].setSessionExtras() von media3 übergebenen Extras an PlaybackStateCompat.getExtras() eines media1-Controllers.
    • Ordnen Sie schwerwiegende und nicht schwerwiegende Fehler der Plattformsitzung zu und von ihr zu. Eine PlaybackException ist einem schwerwiegenden Fehlerstatus der PlaybackStateCompat zugeordnet. Ein SessionError, das mit MediaSession.sendError(ControllerInfo, SessionError) an den Media-Benachrichtigungscontroller gesendet wird, wird in PlaybackStateCompat einem nicht schwerwiegenden Fehler zugeordnet. Das bedeutet, dass der Fehlercode und die Fehlermeldung festgelegt sind, der Status der Plattformsitzung jedoch von STATE_ERROR abweicht.
    • Die Sitzungsaktivität kann pro Controller festgelegt werden, um die globale Sitzungsaktivität zu überschreiben. Die Sitzungsaktivität kann für einen Controller bei der Verbindungsherstellung definiert werden, indem ein ConnectionResult mit AcceptedResultBuilder.setSessionActivivty(PendingIntent) erstellt wird. Nach der Verbindung kann die Sitzungsaktivität mit MediaSession.setSessionActivity(ControllerInfo, PendingIntent) aktualisiert werden.
    • Fehlerreplikation von Aufrufen an MediaLibrarySession.Callback wurde verbessert. Die Fehlerreplikation kann jetzt mit MediaLibrarySession.Builder.setLibraryErrorReplicationMode() konfiguriert werden, um den Fehlertyp auszuwählen oder die standardmäßig aktivierte Fehlerreplikation zu deaktivieren.
  • UI:
    • Unterstützung für die Bildanzeige auf PlayerView hinzufügen, wenn eine Verbindung zu einem ExoPlayer besteht (#1144).
    • Verschiedene Symbole in PlayerControlView können über XML-Attribute angepasst werden, um unterschiedliche drawables pro PlayerView-Instanz zuzulassen, anstatt globale Überschreibungen (#1200).
    • Behebung eines Plattformfehlers, der zu einem gedehnten/zugeschnittenen Video führte, wenn SurfaceView in einem Compose AndroidView in API 34 verwendet wurde (#1237).
  • Downloads:
    • Achten Sie darauf, dass DownloadHelper keine noch nicht veröffentlichten Renderer-Instanzen preisgibt, da dies zu einem Absturz der App mit IllegalStateException: Too many receivers, total of 1000, registered for pid führen kann (#1224).
  • Cronet-Erweiterung:
    • Fehler bei SocketTimeoutException in CronetDataSource beheben In einigen Versionen von Cronet ist die vom Rückruf bereitgestellte Anfrage nicht immer gleich. Dies führt dazu, dass der Rückruf nicht abgeschlossen wird und die Anfrage abläuft (https://issuetracker.google.com/328442628).
  • HLS-Erweiterung:
    • Fehler behoben, bei dem ausstehende EMSG-Samples, die auf eine Unterbrechung warten, in HlsSampleStreamWrapper mit einem falschen Offset delegiert wurden, was zu einer IndexOutOfBoundsException oder IllegalArgumentException führte (#1002).
    • Behebung eines Fehlers, durch den nicht primäre Playlists bei LL-HLS-Streams immer wieder neu geladen wurden (#1240).
    • Fehler behoben, durch den die Aktivierung von CMCD für HLS mit Initialisierungssegmenten zu Source Error und IllegalArgumentException führte.
    • Fehler behoben, durch den nicht primäre Wiedergabeplaylists während der Livestreamwiedergabe nicht aktualisiert wurden (#1240).
    • Fehler behoben, durch den beim Aktivieren von CMCD für HLS-Livestreams ArrayIndexOutOfBoundsException ausgegeben wurde (#1395).
  • DASH-Erweiterung:
    • Es wurde ein Fehler behoben, durch den beim erneuten Vorbereiten eines Livestreams mit mehreren Zeiträumen eine IndexOutOfBoundsException ausgegeben werden konnte (#1329).
    • Unterstützung für dashif:Laurl-Lizenz-URLs hinzugefügt (#1345).
  • Cast-Erweiterung:
    • Fehler behoben, durch den der Albumtitel der MediaQueueItem in den Künstler im Media3-Medienelement umgewandelt wurde (#1255).
  • Test-Dienstprogramme:
    • Implementieren Sie onInit() und onRelease() in FakeRenderer.
    • Ändern Sie TestPlayerRunHelper.runUntil()/playUntil()-Methoden so, dass sie bei nicht schwerwiegenden Fehlern fehlschlagen (z.B. bei Fehlern, die an AnalyticsListener.onVideoCodecError() gemeldet werden). 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 Kurzformulare.
    • Es ist jetzt möglich, den Wiederholungsmodus mit Intent-Argumenten über die Befehlszeile festzulegen (#1266).
    • Verwenden Sie HttpEngineDataSource als HttpDataSource, sofern vom Gerät unterstützt.
  • Entfernen Sie veraltete Symbole:
    • Entfernen Sie CronetDataSourceFactory. Verwenden Sie stattdessen CronetDataSource.Factory.
    • Entfernen Sie einige DataSpec-Konstruktoren. Verwenden Sie stattdessen DataSpec.Builder.
    • Entfernen Sie die setContentTypePredicate(Predicate)-Methode aus DefaultHttpDataSource, OkHttpDataSource und CronetDataSource. Verwenden Sie stattdessen die entsprechende Methode für jede XXXDataSource.Factory.
    • Entfernen Sie die Konstruktoren OkHttpDataSource und OkHttpDataSourceFactory. Verwenden Sie stattdessen OkHttpDataSource.Factory.
    • Entfernen Sie PlayerMessage.setHandler(Handler). Verwenden Sie stattdessen setLooper(Looper).
    • Entfernen Sie das Feld Timeline.Window.isLive. Verwenden Sie stattdessen die Methode isLive().
    • Entfernen Sie DefaultHttpDataSource-Konstruktoren. Verwenden Sie stattdessen DefaultHttpDataSource.Factory.
    • Entfernen Sie DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Verwenden Sie stattdessen DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS.
    • Entfernen Sie MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Verwenden Sie stattdessen MediaCodecInfo.canReuseCodec(Format, Format).
    • Entfernen Sie die Methode DrmSessionManager.DUMMY und getDummyDrmSessionManager(). Verwenden Sie stattdessen DrmSessionManager.DRM_UNSUPPORTED.
    • Entfernen Sie AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format) und VideoRendererEventListener.onVideoInputFormatChanged(Format). Verwenden Sie stattdessen die Überladungen, die ein DecoderReuseEvaluation annehmen.
    • Entfernen Sie RendererSupport.FormatSupport IntDef 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 Bundleable-Benutzeroberfläche. Dazu gehören auch alle konstanten Bundleable.Creator<Foo> CREATOR-Felder. Stattdessen sollten sie die Methoden Bundle toBundle() und static Foo fromBundle(Bundle) für jeden Typ verwenden.

Version 1.4.0-rc01

10. Juli 2024

Verwenden Sie die stabile Version 1.4.0.

Version 1.4.0-beta01

26. Juni 2024

Verwenden Sie die stabile Version 1.4.0.

Version 1.4.0-alpha02

7. Juni 2024

Verwenden Sie die stabile Version 1.4.0.

Version 1.4.0-alpha01

17. April 2024

Verwenden Sie die stabile Version 1.4.0.

Version 1.3.0

Version 1.3.1

11. April 2024

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

  • Gemeinsame Bibliothek:
    • Fügen Sie Format.labels hinzu, um lokalisierte oder andere alternative Labels zuzulassen.
  • ExoPlayer:
    • Das Problem, dass PreloadMediaPeriod die Streams nicht beibehalten konnte, wenn sie noch einmal vorab geladen wurde, wurde behoben.
    • Wende die richtige entsprechende TrackSelectionResult auf den Wiedergabezeitraum bei der Trackwiederauswahl an.
    • Renderer, die vorzeitig aktiviert werden, sollten beim Wechseln zwischen Medienelementen erst gestartet werden, nachdem die Wiedergabezeit fortgeschritten ist (#1017).
    • Proguard--keepclasseswithmembers-Regel für DefaultVideoFrameProcessor.Factory.Builder.build() einen fehlenden Rückgabetyp hinzufügen (#1187).
  • Transformator:
    • Problemumgehung für eine Ausnahme hinzugefügt, die auftritt, weil MediaMuxer vor API 30 keine negativen Zeitstempel für die Präsentation unterstützte.
  • Titelauswahl:
    • DefaultTrackSelector: Videotracks mit einer angemessenen Framerate (≥ 10 fps) sollten bevorzugt verwendet werden. So wird sichergestellt, dass der Player den „echten“ Videotrack in MP4-Dateien aus Fotos mit Bewegung auswählt, die zwei HEVC-Tracks enthalten können, von denen einer eine höhere Auflösung, aber eine sehr geringe Anzahl von Frames hat (#1051).
  • Extraktoren:
    • Behebung eines Problems, bei dem das Padding beim Lesen von Elementen 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 rückgängig gemacht, mit der sichergestellt werden sollte, dass der letzte Frame gerendert wird, indem die letzte Zugriffseinheit eines Streams an die Sample-Warteschlange übergeben wird (#7909). Das liegt daran, dass die Änderung neue Probleme mit HLS-Streams mit nur I-Frames (#1150) und H.262-HLS-Streams (#1126) verursacht.
  • Audio:
    • Ermöglicht die Wiederherstellung des Renderers, indem das Offload deaktiviert wird, wenn der Audiotrack im Offload-Modus nicht initialisiert werden kann.
  • Video:
    • Problemumgehung für ein Geräteproblem auf dem Galaxy Tab S7 FE, Chromecast mit Google TV und Lenovo M10 FHD Plus hinzugefügt, bei dem H265-Streams mit 60 fps als nicht unterstützt gekennzeichnet wurden
    • Es wurde eine Problemumgehung hinzugefügt, die 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).
    • Behebung eines Problems, bei dem die Verarbeitung von HDR-Farbinformationen zu Fehlverhalten des Codecs führt und die adaptive Formatumstellung für SDR-Videotracks verhindert (#1158).
  • Text:
    • WebVTT: Verhindern, dass durch direkt aufeinanderfolgende Cues CuesWithTiming-Instanzen aus WebvttParser.parse erstellt werden (#1177).
  • Digitale Rechteverwaltung:
    • Umgehung einer NoSuchMethodError, die auf einigen Android 14-Geräten vom MediaDrm-Framework anstelle von ResourceBusyException oder NotProvisionedException geworfen werden kann (#1145).
  • Wirkung:
    • Verbesserte Tonmapping-Funktion von PQ nach SDR durch Konvertierung von Farbräumen.
  • Sitzung:
    • Das Problem wurde behoben, dass die aktuelle Position zurückspringt, wenn der Controller das aktuelle Element ersetzt (#951).
    • Behebung eines Problems, bei dem MediaMetadata mit nur nicht nullwertigem extras nicht zwischen Mediencontrollern und Sitzungen übertragen wird (#1176).
  • UI:
    • Wenn Locale keinen Anzeigenamen ermitteln kann, wird der Name der Sprache des Audiotracks verwendet (#988).
  • DASH-Erweiterung:
    • Fülle alle Label-Elemente aus dem Manifest in Format.labels ein (#1054).
  • RTSP-Erweiterung:
    • Leere Werte für Sitzungsinformationen (i-Tags) beim SDP-Parsen überspringen (#1087).
  • Decodererweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • Deaktivieren Sie die MIDI-Erweiterung standardmäßig als lokale Abhängigkeit, da dafür ein zusätzliches Maven-Repository konfiguriert werden muss. Nutzer, die dieses Modul aufgrund einer lokalen Abhängigkeit benötigen, können es wieder aktivieren.

Version 1.3.0

6. März 2024

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

  • Gemeinsame Bibliothek:
    • Implementiere die Unterstützung für android.resource://package/[type/]name-URIs für Rohressourcen, bei denen sich package vom Paket der aktuellen Anwendung unterscheidet. Diese Funktion sollte zwar immer funktionieren, wurde aber bisher nicht richtig implementiert.
    • MIME-Typen, die durch App-Code festgelegt oder aus Medien gelesen werden, werden normalisiert und in Kleinbuchstaben geschrieben.
    • Definieren Sie Anzeigen in AdPlaybackState mit einem vollständigen MediaItem anstelle eines einzelnen Uri.
    • Erhöhen Sie minSdk auf 19 (Android KitKat). Dies ist mit allen anderen AndroidX-Bibliotheken abgestimmt und erforderlich, damit wir auf die neuesten Versionen unserer AndroidX-Abhängigkeiten umstellen können.
    • Geben Sie sowohl artworkUri als auch artworkData in MediaMetadata.Builder.populate(MediaMetadata) ein, wenn mindestens einer von ihnen nicht null ist (#964).
  • ExoPlayer:
    • Fügen Sie PreloadMediaSource und PreloadMediaPeriod hinzu, damit Apps eine Inhaltsmedienquelle vor der Wiedergabe an einer bestimmten Startposition vorab laden können. PreloadMediaSource bereitet die Inhaltsmedienquelle für den Empfang der Timeline vor, bereitet den Zeitraum an der angegebenen Startposition vor und speichert ihn im Cache, wählt Titel aus und lädt Mediendaten für den Zeitraum. Apps steuern den Fortschritt des Vorabladens, indem sie PreloadMediaSource.PreloadControl implementieren und die vorab geladene Quelle für die Wiedergabe auf den Player festlegen.
    • Fügen Sie ExoPlayer.setImageOutput hinzu, damit Apps ImageRenderer.ImageOutput festlegen können.
    • DefaultRenderersFactory stellt dem Player jetzt standardmäßig ein ImageRenderer mit nullwertigen ImageOutput und ImageDecoder.Factory.DEFAULT zur Verfügung.
    • Das Ereignis Player.Listener.onPositionDiscontinuity wird gesendet, wenn Stille übersprungen wird (#765).
    • Experimentelle Unterstützung für das Parsen von Untertiteln während der Extraktion hinzufügen. Sie können dies mit MediaSource.Factory.experimentalParseSubtitlesDuringExtraction() aktivieren.
    • Unterstütze adaptive Medienquellen mit PreloadMediaSource.
    • Implementiere HttpEngineDataSource, eine HttpDataSource, mit der HttpEngine API.
    • Unterklassifizierung von CompositeSequenceableLoader verhindern Diese Komponente wurde bereits erweiterbar gemacht, aber nie in der Bibliothek untergeordnet. Anpassungen können vorgenommen werden, indem eine Instanz mit dem Dekorator-Muster umhüllt und eine benutzerdefinierte CompositeSequenceableLoaderFactory implementiert wird.
    • Problem behoben, bei dem durch das Wiederholen derselben Uhrzeit die Metadaten dieses Elements gelöscht wurden (#1007).
    • Benennen Sie experimentalSetSubtitleParserFactory-Methoden auf BundledChunkExtractor.Factory und DefaultHlsExtractorFactory in setSubtitleParserFactory um und lassen Sie keine Übergabe von null zu. Mit den neuen experimentalParseSubtitlesDuringExtraction(boolean)-Methoden können Sie das Parsen steuern.
    • Unterstützung für die Anpassung des SubtitleParser.Factory während der Extraktion hinzugefügt. Das ist mit MediaSource.Factory.setSubtitleParserFactory() möglich.
    • 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 (#883) generiert hat.
    • Der Regex, der für die Validierung von benutzerdefinierten Schlüsselnamen für Common Media Client Data (CMCD) verwendet wird, wurde korrigiert. Er prüft jetzt nur noch auf Bindestrich (#1028).
    • CMCD-Abfrageparameter nicht mehr doppelt codieren (#1075).
  • Transformator:
    • Unterstützung für das Glätten von H.265/HEVC SEF-Zeitlupenvideos hinzugefügt.
    • Die Transmuxing-Geschwindigkeit wurde erhöht, insbesondere bei der Bearbeitungsoption „Video entfernen“.
    • Fügen Sie die API hinzu, damit die Ausgabedatei mit einem Videoframe beginnt. Dadurch kann die Ausgabe von Trimmvorgängen mit Playerimplementierungen kompatibler sein, bei denen der erste Videoframe erst nach dem Präsentationszeitstempel angezeigt wird (#829).
    • Unterstützung für die Optimierung von MP4-Zuschnittsvorgängen für einzelne Assets hinzugefügt
    • Unterstützung hinzugefügt, damit ein Videoframe den ersten Zeitstempel in der Ausgabedatei hat Behebung eines Problems, bei dem Ausgabedateien auf iOS-basierten Playern mit einem schwarzen Frame beginnen (#829).
  • Titelauswahl:
    • Fügen Sie DefaultTrackSelector.selectImageTrack hinzu, um die Auswahl von Bildtracks zu aktivieren.
    • Füge TrackSelectionParameters.isPrioritizeImageOverVideoEnabled hinzu, um festzulegen, ob ein Bildtrack ausgewählt werden soll, wenn sowohl ein Bild- als auch ein Videotrack verfügbar sind. Der Standardwert ist false. Das bedeutet, dass die Auswahl eines Videotracks priorisiert wird.
  • Extraktoren:
    • Dem MP4-Extractor wurde eine zusätzliche AV1C-Analyse hinzugefügt, um die Werte ColorInfo.colorSpace, ColorInfo.colorTransfer und ColorInfo.colorRange abzurufen (#692).
    • MP3: Verwende die Suche mit konstanter Bitrate (CBR) für Dateien mit einem Info-Header (das CBR-Äquivalent des Xing-Headers). Bisher haben wir die Sprungtabelle aus der Info-Header verwendet. Dies führt jedoch zu weniger präzisen Suchvorgängen 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-Beschreibungen extrahieren und ihnen Rollenflaggen zuordnen, damit Nutzer fundiertere Entscheidungen bei der Auswahl von Audiotracks treffen können (#973).
  • Audio:
    • Der Algorithmus zum Überspringen von Stille wurde verbessert. Die Lautstärke wird jetzt stufenlos erhöht. Die minimale Stille wurde beibehalten und die Dauer der Stille ist natürlicher (#7423).
    • Die übersprungene Stille wird jetzt genauer erfasst (#1035).
  • Video:
    • Ändern Sie den Konstruktor von MediaCodecVideoRenderer, der ein VideoFrameProcessor.Factory-Argument annimmt, und ersetzen Sie ihn durch einen Konstruktor, der ein VideoSinkProvider-Argument annimmt. Apps, die eine benutzerdefinierte VideoFrameProcessor.Factory einschleusen möchten, können eine CompositingVideoSinkProvider instanziieren, die die benutzerdefinierte VideoFrameProcessor.Factory verwendet, und den Video-Sink-Anbieter an MediaCodecVideoRenderer übergeben.
  • Text:
    • Die Serialisierung von Bitmap-Cues wurde korrigiert, um den Tried to marshall a Parcel that contained Binder objects-Fehler bei Verwendung von DefaultExtractorsFactory.setTextTrackTranscodingEnabled zu beheben (#836).
    • CEA-708: rowLock-Wert ignorieren. Gemäß der CEA-708-E S-2023-Spezifikation sollten rowLock und columnLock unabhängig von den im Stream vorhandenen Werten als wahr angenommen werden. Da die Unterstützung von columnLock nicht implementiert ist, wird davon ausgegangen, dass dieser Wert immer falsch ist.
  • Bild:
    • Unterstützung für DASH-Thumbnails hinzufügen Rasterbilder werden zugeschnitten und es werden individuelle Thumbnails bereitgestellt, die ImageOutput ungefähr zur Präsentationszeit angezeigt werden.
  • Digitale Rechteverwaltung:
  • IMA-Erweiterung:
    • Problem behoben, durch das DASH- und HLS-Anzeigen ohne die richtige Dateiendung nicht wiedergegeben werden konnten
  • Sitzung:
    • Deaktivierung der Doppelklickerkennung für TV-Apps (#962)
    • Problem behoben, durch das MediaItem.RequestMetadata mit nur nicht nullwertigen Extras nicht zwischen Mediencontrollern und Sitzungen übertragen wurde.
    • Fügen Sie MediaLibrarySession.Builder einen Konstruktor hinzu, der nur Context statt MediaLibraryService akzeptiert.
  • HLS-Erweiterung:
    • Reduzieren Sie HlsMediaPeriod auf paketinterne Sichtbarkeit. Dieser Typ sollte nicht direkt von außerhalb des HLS-Pakets abhängig sein.
    • Resolve sucht jetzt effizienter den Anfang eines Segments (#1031).
  • Decodererweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • MIDI-Decoder: SysEx-Ereignisnachrichten ignorieren (#710).
  • Test-Dienstprogramme:
    • Pausiere die Wiedergabe nicht auf TestPlayerRunHelper.playUntilPosition. Die Wiedergabe bleibt im Wiedergabestatus, der Fortschritt wird jedoch angehalten, bis dem Test Behauptungen und weitere Aktionen hinzugefügt werden können.
  • Demo-App:
    • Fügen Sie ein Demomodul für Kurzformate hinzu, um die Verwendung von PreloadMediaSource mit dem Anwendungsfall für Kurzformate 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:
    • Behebung eines Problems, bei dem der Offset bei manuellen Suchanfragen außerhalb des Bereichs LiveConfiguration.min/maxOffset immer wieder auf min/maxOffset zurückgesetzt wurde.
    • Behebung des Problems, dass die OPUS- und VORBIS-Kanallayouts für die Kanäle 3, 5, 6, 7 und 8 falsch waren (#8396).
    • Behoben wurde ein Problem, durch das der Stream nach dem Springen zu Beginn eines Livestreams fälschlicherweise an seiner Standardposition gestartet wurde (#9347).
    • Behebung des Problems, bei dem neue Instanzen von CmcdData.Factory negative Werte für bufferedDurationUs von Chunk-Quellen erhielten, was zu einer IllegalArgumentException führte (#888).
  • Transformator:
    • Problembehebung, bei dem der Encoder bei der Konfiguration aufgrund einer hohen Betriebsrate eine Fehlermeldung ausgegeben hat
  • Extraktoren:
    • Markieren Sie sekundäre (nicht abspielbare) HEVC-Tracks in JPEG-Motion-Fotos als ROLE_FLAG_ALTERNATE, damit sie aufgrund ihrer höheren Auflösung nicht automatisch für die Wiedergabe ausgewählt werden.
    • Fehler bei der Keyframe-Erkennung für TS-H264-Streams behoben (#864).
    • Dauerschätzung für TS-Streams korrigiert, die länger als 47.721 Sekunden sind (#855).
  • Audio:
    • Fehler bei der Verarbeitung von EOS für SilenceSkippingAudioProcessor behoben, wenn die Funktion mehrmals aufgerufen wird (#712).
  • Video:
    • Behelfslösung für ein Geräteproblem auf dem Galaxy Tab S7 FE, Chromecast mit Google TV und Lenovo M10 FHD Plus hinzugefügt, durch das AVC-Streams mit 60 fps als nicht unterstützt gekennzeichnet 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 erfasst. Das bedeutet, dass die Wiedergabe ohne die Tag-Informationen fortgesetzt werden kann, anstatt dass die Wiedergabe vollständig fehlschlägt.
  • Digitale Rechteverwaltung:
    • Die Umgehung für eine falsche ClearKey-https://default.url-Lizenz-URL wurde auf API 33 und höher ausgeweitet (früher nur auf API 33) (#837).
    • Behebung eines Problems mit ERROR_DRM_SESSION_NOT_OPENED beim Wechsel von verschlüsselten zu unverschlüsselten Inhalten, wenn dem Player keine Oberfläche zugeordnet ist. Der Fehler ist auf die falsche Verwendung eines sicheren Decoders zum Abspielen der unverschlüsselten Inhalte zurückzuführen.
  • Sitzung:
    • Fügen Sie die benutzerdefinierten Schlüssel und Werte unter MediaMetadataCompat bis MediaMetadata.extras und MediaMetadata.extras bis MediaMetadataCompat ein (#756, #802).
    • Problem mit der Übertragung von notifyChildrenChanged für ältere Controller behoben (#644).
    • Ein Fehler wurde behoben, durch den auf einigen Geräten ein Absturz verursacht wurde, wenn für einen deaktivierten setWhen-Timer der Benachrichtigung eine negative Zeit festgelegt wurde (#903).
    • Fehler IllegalStateException behoben, wenn der Media-Benachrichtigungscontroller die Verbindung nicht hergestellt hat, als das erste Benachrichtigungsupdate angefordert wurde (#917).
  • UI:
    • Problem behoben, durch das die Schaltflächen „Vor“ und „Zurück“ nicht sichtbar waren, wenn sie in einem BottomSheetDialogFragment mit Material Design verwendet wurden (#511).
    • Das Problem, dass die Zahlen auf der Schaltfläche „Vorspulen“ der PlayerControlView nicht richtig ausgerichtet waren, wurde behoben (#547).
  • DASH-Erweiterung:
    • „f800“ im DASH-Manifest als Kanalanzahl „5“ für Dolby parsen (#688).
  • Decodererweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • MIDI: Problem behoben, bei dem beim Vorspulen die Programmänderungsereignisse übersprungen wurden (#704).
    • Migrieren Sie zu FFmpeg 6.0 und aktualisieren Sie das unterstützte NDK auf r26b (#707, #867).
  • Cast-Erweiterung:
    • Die Erstellung einer Timeline wird bereinigt, damit die App nicht abstürzt, wenn das Laden von Medien auf dem Streaminggerät fehlschlägt (#708).

Version 1.2.0

15. November 2023

  • Gemeinsame Bibliothek:
    • Fügen Sie den Methoden in der Log.Logger-Schnittstelle einen @Nullable Throwable-Parameter hinzu. Der Parameter message für diese Methoden enthält keine Informationen mehr zum Throwable, der an die Log.{d,i,w,e}()-Methoden übergeben wird. Daher müssen diese Informationen bei Bedarf manuell an die Implementierungen angehängt werden (z. B. mit Logger.appendThrowableString(String, Throwable)).
    • Behebung eines Kotlin-Kompatibilitätsproblems, bei dem nullable Parameter von generischen Typen und nullable Typen von Arrayelementen nicht als nullable erkannt wurden. Beispiele hierfür sind die Methodenparameter TrackSelectorResult und SimpleDecoder (#6792).
    • Sie können die Standard-UI und das Standardverhalten von Benachrichtigungen in Util.shouldShowPlayButton so ändern, dass eine Wiedergabeschaltfläche angezeigt wird, wenn die Wiedergabe vorübergehend unterdrückt wird (z.B. aufgrund eines vorübergehenden Verlusts des Audiofokus). Das bisherige Verhalten kann beibehalten werden, indem PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) oder MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) verwendet wird (#11213).
    • Führe ein Upgrade von androidx.annotation:annotation-experimental auf 1.3.1 durch, um das Problem zu beheben: https://issuetracker.google.com/251172715.
    • Verschieben Sie ExoPlayer.setAudioAttributes auf die Player-Benutzeroberfläche.
  • ExoPlayer:
    • Probleme beim Suchen in AC4-Streams behoben, die durch die falsche Identifizierung von nur zum Decodieren bestimmten Samples verursacht wurden (#11000).
    • Die Wiedergabe kann auf ungeeigneten Audioausgabegeräten (z.B. dem integrierten Lautsprecher auf Wear OS-Geräten) unterdrückt werden, wenn diese Funktion über ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput aktiviert ist. Der Grund für die Unterdrückung der Wiedergabe wird zu Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT aktualisiert, wenn die Wiedergabe versucht wird, wenn 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, sobald eine geeignete Ausgabe verbunden ist.
    • Fügen Sie MediaSource.canUpdateMediaItem und MediaSource.updateMediaItem hinzu, um MediaItem-Aktualisierungen nach der Erstellung über Player.replaceMediaItem(s) zu akzeptieren.
    • Erlaube MediaItem-Aktualisierungen für alle MediaSource-Klassen, die von der Bibliothek über Player.replaceMediaItem(s) bereitgestellt werden (#33, #9978).
    • Benennen Sie MimeTypes.TEXT_EXOPLAYER_CUES in MimeTypes.APPLICATION_MEDIA3_CUES um.
    • Fügen Sie PngExtractor hinzu, das eine ganze PNG-Datei als Sample in TrackOutput sendet und liest.
    • Erhöhen Sie die SequenceableLoader.continueLoading(long)-Methode in der SequenceableLoader-Schnittstelle auf SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo enthält zusätzliche Parameter, darunter playbackSpeed und lastRebufferRealtimeMs, zusätzlich zum vorhandenen playbackPositionUs.
    • Optimieren Sie die ChunkSource.getNextChunk(long, long, List, ChunkHolder)-Methode in der ChunkSource-Schnittstelle auf ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Den CMCD-Protokollen (Common Media Client Data) wurden zusätzliche Felder hinzugefügt: Puffermangel (bs), Frist (dl), Wiedergaberate (pr) und Start (su) (#8699).
    • Fügen Sie ColorInfo (#491) die Bittiefe für Luminanz und Chroma hinzu.
    • Dem CMCD-Logging (Common Media Client Data) wurden zusätzliche Felder hinzugefügt: „next object request“ (nor) und „next range request“ (nrr) (#8699).
    • Es wurde eine Funktion hinzugefügt, mit der CMCD-Daten (Common Media Client Data) mithilfe von Abfrageparametern übertragen werden können (#553).
    • Fehler bei ConcurrentModificationException in ExperimentalBandwidthMeter beheben (#612).
    • Fügen Sie CompositeMediaSource.getMediaTimeForChildMediaTime den Parameter MediaPeriodId hinzu.
    • Unterstützung von ClippingMediaSource (und anderen Quellen mit Zeitabweichungen für Zeiträume/Fenster) in ConcatenatingMediaSource2 (#11226)
    • Ändern Sie BaseRenderer.onStreamChanged() so, dass auch ein MediaPeriodId-Argument empfangen wird.
  • Transformator:
    • EXIF-Drehdaten für Bildeingaben analysieren
    • Entfernen Sie den Anmerkungstyp TransformationRequest.HdrMode und die zugehörigen Konstanten. Verwenden Sie stattdessen Composition.HdrMode und die zugehörigen Konstanten.
    • Vereinfachen Sie die OverlaySettings, um Probleme mit der Drehung zu beheben.
    • Die frameRate- und durationUs-Parameter von SampleConsumer.queueInputBitmap wurden in TimestampIterator geändert.
  • Titelauswahl:
    • Fügen Sie DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness hinzu, um die nicht nahtlose Anpassung explizit zuzulassen oder zu deaktivieren. Das Standardverhalten von true bleibt unverändert.
  • Extraktoren:
    • MPEG-TS: Der letzte Frame wird gerendert, indem die letzte Zugriffseinheit eines Streams an die Beispielwarteschlange übergeben wird (#7909).
    • Tippfehler bei der Bestimmung von rotationDegrees korrigiert. projectionPosePitch in projectionPoseRoll geändert (#461)
    • Entfernen Sie die Annahme, dass Extractor-Instanzen direkt mit instanceof geprüft werden können. Wenn Sie Laufzeitzugriff auf die Implementierungsdetails eines Extractor benötigen, müssen Sie zuerst Extractor.getUnderlyingInstance aufrufen.
    • Fügen Sie BmpExtractor hinzu.
    • Fügen Sie WebpExtractor hinzu.
    • Fügen Sie HeifExtractor hinzu.
    • Mp4Extractor unterstützt jetzt QuickTime Classic.
  • Audio:
    • Unterstützung für 24/32-Bit-Big-Endian-PCM in MP4 und Matroska hinzufügen und PCM-Codierung für lpcm in MP4 parsen
    • Unterstützung für das Extrahieren von Vorbis-Audio in MP4 hinzugefügt.
    • Fügen Sie AudioSink.getFormatOffloadSupport(Format) hinzu, mit dem die Unterstützung für die Auslagerung abgerufen wird, die der Abfluss für das Format über eine DefaultAudioOffloadSupportProvider bereitstellen kann. Es gibt die neue AudioOffloadSupport zurück, die isFormatSupported, isGaplessSupported und isSpeedChangeSupported enthält.
    • Fügen Sie AudioSink.setOffloadMode() hinzu, über das die Offload-Konfiguration am Audio-Sink konfiguriert wird. Der Standardwert ist AudioSink.OFFLOAD_MODE_DISABLED.
    • Das Auslagern kann über setAudioOffloadPreference in TrackSelectionParameters aktiviert werden. Wenn die Einstellung aktiviert ist, das Gerät das Auslagern für das Format unterstützt und die Titelauswahl ein einzelner Audiotrack ist, wird das Audio-Auslagern aktiviert.
    • Wenn audioOffloadModePreference auf AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED gesetzt ist, wird mit DefaultTrackSelector nur dann ein Audiotrack ausgewählt, wenn das Format dieses Tracks beim Offload unterstützt wird. Wenn beim Offload kein Audiotrack unterstützt wird, wird kein Track ausgewählt.
    • Die Unterstützung für unterbrechungsfreies Streaming beim Offload wird bei Geräten mit einer älteren API als API-Level 33 aufgrund eines Problems mit der Wiedergabeposition nach dem Titelübergang deaktiviert.
    • Entfernen Sie den Parameter enableOffload aus der Methodensignatur von DefaultRenderersFactory.buildAudioSink.
    • Entfernen Sie die Methode DefaultAudioSink.Builder.setOffloadMode.
    • Entfernen Sie den intdef-Wert DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Unterstützung für Opus-Metadaten ohne Unterbrechungen bei der Offload-Wiedergabe hinzugefügt.
    • Ermöglicht die Wiederherstellung des Renderers, indem das Offload deaktiviert wird, wenn der erste Schreibvorgang fehlgeschlagen ist (#627).
    • Die Auslagerungsplanung standardmäßig für die ausgelagerte Wiedergabe von Audioinhalten aktivieren
    • Löschen Sie ExoPlayer.experimentalSetOffloadSchedulingEnabled und AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • onExperimentalSleepingForOffloadChanged wurde in onSleepingForOffloadChanged und onExperimentalOffloadedPlayback in onOffloadedPlayback umbenannt.
    • Verschieben Sie die TrackSelectionParameters-Schnittstellen und ‑Definitionen, die sich auf den Audio-Offload-Modus beziehen, in eine innere AudioOffloadPreferences-Klasse.
    • Fügen Sie onAudioTrackInitialized- und onAudioTrackReleased-Callbacks zu AnalyticsListener, AudioRendererEventListener und AudioSink.Listener hinzu.
    • Problem mit Unterlauf des DTS Express-Audiopuffers behoben (#650).
    • Fehler behoben, bei dem die Funktionsprüfung für E-AC3-JOC eine IllegalArgumentException zurückgab (#677).
  • Video:
    • MediaCodecVideoRenderer darf eine benutzerdefinierte VideoFrameProcessor.Factory verwenden.
    • Fehler behoben, durch den der erste Frame nicht gerendert werden konnte, wenn der Audiostream mit negativen Zeitstempeln beginnt (#291).
  • Text:
    • Entfernen Sie ExoplayerCuesDecoder. Textspuren 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-Dekodierungs-Samples“ aufgerufen, da die Implementierung ohnehin null zurückgeben muss.
  • Wirkung:
    • VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) Bitmap-Eingabe nach Zeitstempel in die Warteschlange stellen.
    • Ändern Sie VideoFrameProcessor.registerInputStream() in „Nicht blockierend“. Apps müssen VideoFrameProcessor.Listener#onInputStreamRegistered() implementieren.
    • Die frameRate- und durationUs-Parameter von VideoFrameProcessor.queueInputBitmap wurden in TimestampIterator geändert.
  • IMA-Erweiterung:
    • Es wurde ein Fehler behoben, durch den bei einem DASH-Livestream mit mehreren Zeiträumen, der nicht der erste Artikel in einer Playlist ist, eine Ausnahme ausgelöst werden kann (#571).
    • StreamManager vor dem Aufrufen von AdsLoader.destroy() freigeben
    • Die IMA SDK-Version wurde auf 3.31.0 erhöht.
  • Sitzung:
    • Legen Sie das Verhalten des Benachrichtigungsdienstes im Vordergrund in DefaultMediaNotificationProvider auf FOREGROUND_SERVICE_IMMEDIATE fest (#167).
    • Verwenden Sie nur android.media.session.MediaSession.setMediaButtonBroadcastReceiver() API 31 oder höher, um Probleme mit veralteten APIs auf Samsung-Geräten zu vermeiden (#167).
    • Verwende den Media Notification Controller als Proxy, um verfügbare Befehle und das benutzerdefinierte Layout festzulegen, das für die Benachrichtigung und die Plattformsitzung verwendet wird.
    • Konvertiere Medienschalter-Ereignisse, die von MediaSessionService.onStartCommand() in Media3 empfangen werden, anstatt sie an die Plattformsitzung und zurück an Media3 weiterzuleiten. Der Controller des Anrufers ist immer der Controller der Medienbenachrichtigung. Apps können Anrufe, die von der Benachrichtigung stammen, auf allen unterstützten API-Ebenen auf dieselbe Weise erkennen.
    • Fehler behoben, durch den MediaController.getCurrentPosition() nicht fortschreitet, wenn eine Verbindung zu einer älteren MediaSessionCompat besteht.
    • Fügen Sie MediaLibrarySession.getSubscribedControllers(mediaId) hinzu.
    • Überschreiben Sie MediaLibrarySession.Callback.onSubscribe(), um die Verfügbarkeit der übergeordneten ID zu bestätigen, für die der Controller abonniert ist. Ist der Vorgang erfolgreich, wird das Abo akzeptiert und notifyChildrenChanged() wird sofort aufgerufen, um den Browser zu informieren (#561).
    • Fügen Sie ein Sitzungsdemo-Modul für Automotive OS hinzu und aktivieren Sie die Sitzungsdemo für Android Auto.
    • Legen Sie die Warteschlange der Framework-Sitzung nicht fest, wenn COMMAND_GET_TIMELINE für den Medienbenachrichtigungscontroller nicht verfügbar ist. Wenn Android Auto als Clientcontroller die 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).
    • Fügen Sie MediaSession.Callback.onMediaButtonEvent(Intent) hinzu, damit Apps die Standard-Ereignisbehandlung der Medienschaltfläche überschreiben können.
  • UI:
    • Fügen Sie eine Player.Listener-Implementierung für Wear OS-Geräte hinzu, die die Unterdrückung der Wiedergabe aufgrund von Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT verarbeitet, indem ein Systemdialogfeld geöffnet wird, über das Nutzer einen geeigneten Audioausgang (z.B. Bluetooth-Kopfhörer) verbinden können. Die Wiedergabe wird automatisch fortgesetzt, wenn innerhalb eines konfigurierbaren Zeitlimits (Standard: 5 Minuten) ein geeignetes Gerät verbunden ist.
  • Downloads:
    • Deklarieren Sie den Typ „Datensynchronisierung“ für Dienste im Vordergrund für DownloadService, um die Kompatibilität mit Android 14 zu gewährleisten. Wenn dieser Dienst verwendet wird, muss die App dataSync als foregroundServiceType in das Manifest einfügen und die Berechtigung FOREGROUND_SERVICE_DATA_SYNC hinzufügen (#11239).
  • HLS-Erweiterung:
    • Die HLS-Liveplaylist wird mit einem Intervall aktualisiert, das nicht vom Zeitpunkt des letzten Ladevorgangs, sondern vom Zeitpunkt des letzten Ladevorgangs berechnet wird (#663).
  • DASH-Erweiterung:
    • Mehrere DASH-IDs in der URL der Segmentvorlage zulassen
    • Experimentelle Unterstützung für das Parsen von Untertiteln während der Extraktion hinzufügen. Dadurch werden überlappende Untertitel besser unterstützt und es wird verhindert, dass beim Wechsel zwischen Untertitelsegmenten ein Flimmern auftritt. Sie können diese Funktion mit DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() aktivieren (#288).
  • RTSP-Erweiterung:
    • Behebung einer Race-Bedingung, die beim Rückfall auf TCP zu IndexOutOfBoundsException oder in einigen Fällen zu einer hängenden Wiedergabe führen konnte
    • Status in der RTSP-Einrichtung prüfen, wenn der Ladestatus von RtspMediaPeriod zurückgegeben wird (#577).
    • Benutzerdefinierte Rtsp-Anfragemethoden im öffentlichen Options-Antwortheader ignorieren (#613).
    • Verwende den Zeitlimitwert für die RTSP-Einrichtungsantwort im Zeitintervall für das Senden von Keep-Alive-RTSP-Optionsanfragen (#662).
  • Decodererweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
    • MIDI-Decodiermodul freigeben, das die Wiedergabe von Standard-MIDI-Dateien mit der Jsyn-Bibliothek zur Audiosynthese unterstützt
    • Fügen Sie DecoderOutputBuffer.shouldBeSkipped hinzu, um Ausgabe-Buffer direkt zu kennzeichnen, die nicht angezeigt werden müssen. Dies ist vorzuziehen gegenüber C.BUFFER_FLAG_DECODE_ONLY, das eingestellt wird.
    • Füge Decoder.setOutputStartTimeUs und SimpleDecoder.isAtLeastOutputStartTimeUs hinzu, damit Decoder nur zum Decodieren bestimmte Samples vor dem Startzeitpunkt löschen können. Dieser Wert sollte Buffer.isDecodeOnly vorgezogen werden, der eingestellt wird.
    • Fehler beim Veröffentlichen des MIDI-Decoder-Artefakts im Maven-Repository behoben Das Artefakt wurde in media3-exoplayer-midi umbenannt (#734).
  • Leanback-Erweiterung:
    • Fehler behoben, durch den das Deaktivieren einer Oberfläche zu einem ArithmeticException im Leanback-Code führen kann (#617).
  • Test-Dienstprogramme:
    • Machen Sie TestExoPlayerBuilder und FakeClock mit Espresso-UI-Tests und Compose-UI-Tests kompatibel. Dadurch wird ein Fehler behoben, durch den die Wiedergabe bei Interaktionen mit der Espresso- oder Compose-Ansicht nicht deterministisch fortgesetzt wurde.
  • Entfernen Sie veraltete 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).
    • Entfernen Sie die verworfene DownloadNotificationHelper.buildProgressNotification-Methode und verwenden Sie stattdessen eine nicht verworfene Methode, die einen notMetRequirements-Parameter annimmt.

Version 1.2.0-rc01

1. November 2023

Verwenden Sie die stabile Version 1.2.0.

Version 1.2.0-beta01

19. Oktober 2023

Verwenden Sie die stabile Version 1.2.0.

Version 1.2.0-alpha02

29. September 2023

Verwenden Sie die stabile Version 1.2.0.

Version 1.2.0-alpha01

17. August 2023

Verwenden Sie die stabile Version 1.2.0.

Version 1.1.0

Version 1.1.1

16. August 2023

  • Gemeinsame Bibliothek:
    • Die versehentlich hinzugefügte multidex-Abhängigkeit aus allen Modulen entfernen (#499).
  • ExoPlayer:
    • Problem in PlaybackStatsListener behoben, bei dem nach dem Löschen der Playlist PlaybackStats erstellt wurden
    • Füge der CMCD-Protokollierung (Common Media Client Data) zusätzliche Felder hinzu: Streamingformat (sf), Streamtyp (st), Version (v), höchste Bitrate (tb), Objektdauer (d), gemessener Durchsatz (mtp) und Objekttyp (ot) (#8699).
  • Audio:
    • Es wurde ein Fehler behoben, durch den Player.getState() beim Abspielen sehr kurzer Dateien nie zu STATE_ENDED wechselte (#538).
  • Audio-Offload:
    • Füge dem Bitstream für die ausgelagerte Opus-Wiedergabe gemäß RFC 7845 Ogg-ID-Header- und Kommentar-Header-Seiten vor.
  • Video:
    • H.265/HEVC: Fehler beim Parsen von SPS-Informationen zu Kurz- und Langzeit-Referenzbildern behoben
  • Text:
    • CEA-608: Die Logik für die Kürzung von Cues wurde geändert, sodass nur sichtbarer Text berücksichtigt wird. Bisher wurden Einzüge und Tabulatorabstand berücksichtigt, wenn die Cue-Länge auf 32 Zeichen begrenzt wurde. Dies war technisch gemäß der Spezifikation korrekt (#11019).
  • IMA-Erweiterung:
    • Die IMA SDK-Version wurde auf 3.30.3 erhöht.
  • Sitzung:
    • Fügen Sie dem Status des Controllers ein benutzerdefiniertes Layout hinzu und stellen Sie einen Getter bereit, um darauf zuzugreifen. Wenn sich das benutzerdefinierte Layout ändert, wird MediaController.Listener.onCustomLayoutChanged aufgerufen. Apps, die verschiedene benutzerdefinierte Layouts an verschiedene Media3-Controller senden möchten, können dies in MediaSession.Callback.onConnect mithilfe eines AcceptedResultBuilder tun, um sicherzustellen, dass das benutzerdefinierte Layout für den Controller verfügbar ist, wenn die Verbindung hergestellt ist.
    • Behebung von Fällen, in denen MediaLibraryServiceLegacyStub einen Fehler an eine Result gesendet hat, die dies nicht unterstützt, was zu einer UnsupportedOperationException geführt hat (#78).
    • Die Erstellung von VolumeProviderCompat durch PlayerWrapper wurde korrigiert. volumeControlType wird jetzt sowohl über alte Befehle (COMMAND_ADJUST_DEVICE_VOLUME und COMMAND_SET_DEVICE_VOLUME) als auch über neue Befehle (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS und COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) festgelegt (#554).

Version 1.1.0

5. Juli 2023

  • Gemeinsame Bibliothek:
    • Grund für die Unterdrückung von unangemessenen Audiorouten hinzufügen und „Bei Verfügbarkeit wiedergeben“ ändern Grund für die Unterdrückung zu lange. (#15).
    • Befehle zum Player hinzufügen:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Füge dem Player überladene Methoden hinzu, mit denen Nutzer Flags für die Lautstärke angeben können:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Fügen Sie Builder für DeviceInfo hinzu und stufen Sie den vorhandenen Konstruktor als veraltet ein.
    • Füge DeviceInfo.routingControllerId hinzu, um die ID des Routing-Controllers für die Remote-Wiedergabe anzugeben.
    • Player.replaceMediaItem(s) kann als Tastenkürzel zum Hinzufügen und Entfernen von Elementen an derselben Position verwendet werden (#8046).
  • ExoPlayer:
    • Erlaube ExoPlayer die Steuerung der Gerätelautstärkemethoden nur, wenn sie ausdrücklich aktiviert wurde. Mit ExoPlayer.Builder.setDeviceVolumeControlEnabled hast du Zugriff auf Folgendes:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) und setDeviceVolume(int, int)
      • increaseDeviceVolume(int) und increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) und decreaseDeviceVolume(int, int)
    • Fügen Sie FilteringMediaSource hinzu, mit dem sich verfügbare Titeltypen aus einer MediaSource herausfiltern lassen.
    • Unterstützung für das Einfügen von Common Media Client Data (CMCD) in ausgehende Anfragen der adaptiven Streamingformate DASH, HLS und SmoothStreaming hinzufügen Die folgenden Felder wurden übernommen: br, bl, cid, rtp und sid (#8699). API-Struktur und API-Methoden:
      • Das CMCD-Logging ist standardmäßig deaktiviert. Mit MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) kannst du es aktivieren.
      • Alle Schlüssel sind standardmäßig aktiviert. Überschreiben Sie CmcdConfiguration.RequestConfig.isKeyAllowed(String key), um die protokollierten Schlüssel herauszufiltern.
      • Überschreiben Sie CmcdConfiguration.RequestConfig.getCustomData(), um das benutzerdefinierte Schlüsselprotokoll 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, damit sourceId als long und nicht als int gespeichert wird. Dadurch ändern sich die Signaturen der öffentlichen Methoden SampleQueue.sourceId und SampleQueue.peekSourceId.
    • Fügen Sie den LoadControl-Methoden shouldStartPlayback und onTracksSelected Parameter hinzu, mit denen diese Methoden mit dem entsprechenden 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 Probleme mit der Parallelität bei Livestreams mit mehreren Zeiträumen zu vermeiden.
    • EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) und BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs) werden eingestellt. Stattdessen kann die Variante der Methoden ohne mediaTimeOffsetUs aufgerufen werden. Hinweis: Auch bei den veralteten Varianten wird der Offset nicht mehr zu startTimeUs und endTimeUs der MediaLoadData-Objekte hinzugefügt, die vom Dispatcher gesendet werden.
    • Benennen Sie ExoTrackSelection.blacklist in excludeTrack und isBlacklisted in isTrackExcluded um.
    • Korrektur des inkonsistenten Verhaltens zwischen ExoPlayer.setMediaItem(s) und addMediaItem(s) beim Aufrufen einer leeren Playlist.
  • Transformator:
    • Entfernen Sie Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Verwenden Sie stattdessen ExoPlayerAssetLoader.Factory(MediaSource.Factory) und Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Entfernen Sie Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Es wurde ein Fehler behoben, durch den die Transformation hängen bleiben konnte (was zu einem Zeitüberschreitungsfehler des Muxers führte), wenn das Ende des Videostreams signalisiert wurde, während ein Eingabeframe noch verarbeitet wurde.
    • Führe Codec-Abfragen über MediaCodecList aus, anstatt findDecoder/EncoderForFormat-Dienstprogramme zu verwenden, um die Unterstützung zu erweitern.
    • Entferne die B-Frame-Konfiguration in DefaultEncoderFactory, da sie auf einigen Geräten nicht funktioniert.
  • Titelauswahl:
    • Fügen Sie DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange hinzu, das standardmäßig deaktiviert ist. Wenn diese Option aktiviert ist, wird durch das DefaultTrackSelector eine neue Titelauswahl ausgelöst, wenn sich die Renderer-Funktionen geändert haben.
  • Extraktoren:
    • Ogg: Fehler beim Suchen in Dateien mit langer Dauer behoben (#391).
    • FMP4: Problem behoben, bei dem TimestampAdjuster einen falschen Zeitstempel-Offset mit der Metadaten-Beispielzeit aus dem emsg-Atom initialisiert (#356).
  • Audio:
    • Fehler behoben, bei dem einige Wiedergaben fehlgeschlagen sind, wenn das Tunneling aktiviert ist und AudioProcessors aktiv sind, z.B. für das lückenfreies Zuschneiden (#10847).
    • Opus-Frames in Ogg-Paketen bei der direkten Wiedergabe (Offload) kapseln
    • Extrapolieren der aktuellen Position während des Ruhemodus mit Auslagerungsplanung
    • Fügen Sie Renderer.release() und AudioSink.release() hinzu, um die Ressourcen am Ende des Lebenszyklus des Spielers freizugeben.
    • Änderungen an den Audiofunktionen in DefaultAudioSink Fügen Sie im Konstruktor von DefaultAudioSink einen erforderlichen Parameter context hinzu, mit dem sich DefaultAudioSink als Listener für AudioCapabilitiesReceiver registriert und seine audioCapabilities-Property aktualisiert, wenn eine Änderung der Funktionen erkannt wird.
    • Änderungen an den Audiofunktionen über ein neues Ereignis onAudioCapabilitiesChanged in der Benutzeroberfläche AudioSink.Listener und eine neue Benutzeroberfläche RendererCapabilities.Listener weitergeben, die onRendererCapabilitiesChanged-Ereignisse auslöst
    • Füge ChannelMixingAudioProcessor hinzu, um Audiokanäle zu skalieren oder zu mischen.
    • Füge DecoderDiscardReasons den neuen Ganzzahlwert DISCARD_REASON_AUDIO_BYPASS_POSSIBLE hinzu, um den Audiodecoder zu verwerfen, wenn nach einer Änderung der Audiofunktionen der Bypass-Modus möglich ist.
    • Unterstützung für die direkte Wiedergabe von DTS Express und DTS:X hinzugefügt (#335).
  • Video:
    • Wenn der Renderer deaktiviert ist, soll MediaCodecVideoRenderer einen VideoSize mit einer Breite und Höhe von 0 melden. Player.Listener.onVideoSizeChanged wird entsprechend aufgerufen, wenn sich Player.getVideoSize() ändert. Durch diese Änderung hat die Videogröße von ExoPlayer mit MediaCodecVideoRenderer eine Breite und Höhe von 0, wenn Player.getCurrentTracks kein Video unterstützt oder die Größe des unterstützten Videotracks noch nicht festgelegt wurde.
  • Digitale Rechteverwaltung:
    • Reduzieren Sie die Sichtbarkeit mehrerer rein 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:
    • Füge eine neue Mixer-Bibliothek hinzu, mit der eine MP4-Containerdatei erstellt werden kann.
  • IMA-Erweiterung:
    • Mehrere Zeiträume für DASH-Livestreams für die dynamische Anzeigenbereitstellung aktivieren Die aktuelle Implementierung unterstützt noch nicht das Suchen in Livestreams (#10912).
    • Ein Fehler wurde behoben, bei dem in Livestreams eine neue Anzeigengruppe eingefügt wurde, weil die berechnete Inhaltsposition in aufeinanderfolgenden Zeitachsen leicht variiert.
  • Sitzung:
    • Fügen Sie die Hilfsmethode MediaSession.getControllerForCurrentRequest hinzu, um Informationen zum Controller zu erhalten, der derzeit eine Player-Methode aufruft.
    • Fügen Sie androidx.media3.session.MediaButtonReceiver hinzu, damit Apps die Wiedergabe mit Medientastenereignissen fortsetzen können, die beispielsweise von einem Bluetooth-Headset gesendet werden (#167).
    • Fügen Sie MediaSession.Callback.onAddMediaItems eine Standardimplementierung hinzu, damit angeforderte MediaItems an Player übergeben werden können, wenn sie LocalConfiguration (z.B. URI) haben (#282).
    • Füge in der kompakten Ansicht von Medienbenachrichtigungen für Android 12 und niedriger standardmäßig die Befehlsschaltflächen „Zuvor“ und „Nächster Titel“ hinzu (#410).
    • Fügen Sie MediaSession.Callback.onAddMediaItems eine Standardimplementierung hinzu, damit angeforderte MediaItems an Player übergeben werden können, wenn sie LocalConfiguration (z.B. URI) haben (#282).
    • Füge in der kompakten Ansicht von Medienbenachrichtigungen für Android 12 und niedriger standardmäßig die Befehlsschaltflächen „Zuvor“ und „Nächster Titel“ hinzu (#410).
  • UI:
    • Fügen Sie die Util-Methoden shouldShowPlayButton und handlePlayPauseButtonAction hinzu, um benutzerdefinierte UI-Elemente mit einer Wiedergabe-/Pause-Schaltfläche zu erstellen.
  • RTSP-Erweiterung:
    • Verwende für MPEG4-LATM den Standardwert für „profile-level-id“, falls dieser in der SDP-Nachricht „Describe Response“ (#302) nicht vorhanden ist.
    • Verwende den Basis-URI für die Auflösung des relativen Pfads aus der RTSP-Sitzung, sofern er im DESCRIBE-Antwortheader vorhanden ist (#11160).
  • DASH-Erweiterung:
    • Entferne den Zeitversatz der Medien von MediaLoadData.startTimeMs und MediaLoadData.endTimeMs für DASH-Streams mit mehreren Zeiträumen.
    • Ein Fehler wurde behoben, bei dem beim erneuten Vorbereiten einer mehrperiodigen Live-Dash-Medienquelle eine IndexOutOfBoundsException ausgegeben wurde (#10838).
  • HLS-Erweiterung:
    • Fügen Sie HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) hinzu, um ein Zeitlimit für den Ladethread festzulegen, der auf die Initialisierung von TimestampAdjuster wartet. Wenn die Initialisierung nicht vor Ablauf des Zeitlimits abgeschlossen ist, wird PlaybackException geworfen, um ein endloses Stottern der Wiedergabe zu vermeiden. Das Zeitlimit ist standardmäßig auf null gesetzt (#323).
  • Test-Dienstprogramme:
    • Prüfen Sie in DataSourceContractTest, ob das URI-Schema nicht zwischen Groß- und Kleinschreibung unterscheidet.
  • Entfernen Sie nicht mehr unterstützte Symbole:
    • Entfernen Sie die DefaultAudioSink-Konstruktoren und verwenden Sie stattdessen DefaultAudioSink.Builder.
    • Entfernen Sie HlsMasterPlaylist und verwenden Sie stattdessen HlsMultivariantPlaylist.
    • Entfernen Sie Player.stop(boolean). Verwenden Sie stattdessen Player.stop() und Player.clearMediaItems() (wenn reset = true).
    • Entfernen Sie zwei verworfene SimpleCache-Konstruktoren und verwenden Sie stattdessen einen nicht verworfenen Konstruktor, der ein DatabaseProvider annimmt, um die Leistung zu verbessern.
    • Entfernen Sie den Konstruktor DefaultBandwidthMeter und verwenden Sie stattdessen DefaultBandwidthMeter.Builder.
    • Entfernen Sie die DefaultDrmSessionManager-Konstruktoren und verwenden Sie stattdessen DefaultDrmSessionManager.Builder.
    • Entfernen Sie zwei veraltete HttpDataSource.InvalidResponseCodeException-Konstruktoren und verwenden Sie einen nicht veralteten Konstruktor, der zusätzliche Felder(cause, responseBody) akzeptiert, um die Fehlerprotokollierung zu verbessern.
    • Entfernen Sie DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash und DownloadHelper.forSmoothStreaming und verwenden Sie stattdessen DownloadHelper.forMediaItem.
    • Entfernen Sie den veralteten DownloadService-Konstruktor und verwenden Sie einen nicht veralteten Konstruktor, der die Option zum Angeben eines channelDescriptionResourceId-Parameters enthält.
    • Entfernen Sie veraltete 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 kotlin.text-Paket, java.nio.charset.StandardCharsets oder com.google.common.base.Charsets.
    • Entfernen Sie den eingestellten WorkManagerScheduler-Konstruktor und verwenden Sie stattdessen einen nicht eingestellten Konstruktor, der die Option zum Angeben eines Context-Parameters enthält.
    • Entfernen Sie die verworfenen Methoden createVideoSampleFormat, createAudioSampleFormat, createContainerFormat und createSampleFormat, mit denen die Format-Klasse instanziiert wurde. Verwenden Sie stattdessen Format.Builder, um Instanzen von Format zu erstellen.
    • Entfernen Sie die veralteten Methoden copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate und copyWithVideoSize und verwenden Sie stattdessen Format.buildUpon()- und setter-Methoden.
    • Entfernen Sie die verworfene ExoPlayer.retry() und verwenden Sie stattdessen prepare().
    • Der verworfene Konstruktor DefaultTrackSelector ohne Argumente wurde entfernt. Verwenden Sie stattdessen DefaultTrackSelector(Context).
    • Entfernen Sie den veralteten Konstruktor OfflineLicenseHelper und verwenden Sie stattdessen OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Entfernen Sie den veralteten DownloadManager-Konstruktor und verwenden Sie stattdessen den Konstruktor, der ein Executor annimmt.
    • Entfernen Sie die veralteten Cue-Konstruktoren und verwenden Sie stattdessen Cue.Builder.
    • Entfernen Sie den veralteten Konstruktor OfflineLicenseHelper und verwenden Sie stattdessen OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Vier nicht mehr unterstützte 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 veralteten 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 die verworfene Zeichenfolge DefaultLoadControl.Builder.createDefaultLoadControl() und verwenden Sie stattdessen build().
    • Entfernen Sie das verworfene MediaItem.PlaybackProperties und verwenden Sie stattdessen MediaItem.LocalConfiguration. Das nicht mehr unterstützte Feld MediaItem.playbackProperties hat jetzt den Typ MediaItem.LocalConfiguration.

Version 1.1.0-rc01

21. Juni 2023

Verwenden Sie die stabile Version 1.1.0.

Version 1.1.0-beta01

7. Juni 2023

Verwenden Sie die stabile Version 1.1.0.

Version 1.1.0-alpha01

10. Mai 2023

Verwenden Sie die stabile Version 1.1.0.

Version 1.0.0

Version 1.0.2

18. Mai 2023

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

Dieser Release entspricht der ExoPlayer-Version 2.18.7.

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

  • Kernbibliothek:
    • Fügen Sie Buffer.isLastSample() hinzu, um anzugeben, ob Buffer das Flag C.BUFFER_FLAG_LAST_SAMPLE enthält.
    • Behebung eines Problems, bei dem der letzte Frame möglicherweise nicht gerendert wird, wenn das letzte Sample mit Frames aus der Warteschlange entfernt wird, ohne das Sample „Ende des Streams“ zu lesen. (#11079).
  • Extraktoren:
    • Das Parsen von H.265-SPS in MPEG-TS-Dateien wurde korrigiert, indem die bereits von RTSP- und MP4-Extractorn verwendete Parselogik wiederverwendet wurde (#303).
  • Text:
    • SSA: Unterstützung für UTF-16-Dateien hinzugefügt, wenn sie mit einer Bytereihenfolge-Marke beginnen (#319).
  • Sitzung:
    • Problem behoben, durch das MediaController seine verfügbaren Befehle nicht aktualisiert, wenn eine Verbindung zu einer älteren MediaSessionCompat besteht, die ihre Aktionen aktualisiert.
    • Fehler behoben, durch den die MediaLibraryService bei einem Aufruf von der System-UI an die Callback.onGetLibraryRoot mit params.isRecent == true unter API 30 den Wert „null“ zurückgab (#355).
    • Speicherleck bei MediaSessionService oder MediaLibraryService behoben (#346)
    • Ein Fehler wurde behoben, durch den eine kombinierte Timeline- und Positionsaktualisierung in einer MediaSession dazu führen konnte, dass eine MediaController eine IllegalStateException auslöste.

Version 1.0.1

18. April 2023

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

Dieser Release entspricht der ExoPlayer-Version 2.18.6.

  • Kernbibliothek:
    • Überschreibung des Ziel-Livestreams zurücksetzen, wenn zur Standardposition gesprungen wird (#11051).
    • Fehler behoben, durch den leere Sample-Streams in den Medien die Wiedergabe blockieren konnten
  • Sitzung:
    • Fehler behoben, bei dem mehrere identische Warteschlangenelemente, die von einer älteren MediaSessionCompat veröffentlicht wurden, zu einer Ausnahme in MediaController führten (#290).
    • Fehlende Weiterleitung von MediaSession.broadcastCustomCommand an die alte MediaControllerCompat.Callback.onSessionEvent hinzufügen (#293).
    • Fehler behoben, durch den die verfügbaren Befehle nicht aktualisiert wurden, wenn MediaSession.setPlayer aufgerufen wurde.
    • Behebung eines Problems, bei dem TrackSelectionOverride-Instanzen, die von einer MediaController gesendet werden, ignoriert werden, wenn sie auf eine Gruppe mit Format.metadata verweisen (#296).
    • Problem behoben, bei dem Player.COMMAND_GET_CURRENT_MEDIA_ITEM verfügbar sein muss, um über den alten MediaSessionCompat auf Metadaten zuzugreifen.
    • Problem behoben, bei dem MediaSession-Instanzen in einem Hintergrund-Thread zu Abstürzen führen, wenn sie in MediaSessionService verwendet werden (#318).
    • Problem behoben, bei dem ein Empfänger für Medienschaltflächen von der Bibliothek deklariert wurde, ohne dass dies von der App beabsichtigt war (#314).
  • DASH:
    • Fehler bei der Verarbeitung leerer Zeitachsen für Segmente behoben (#11014).
  • RTSP:
    • Wiederholen Sie den Vorgang mit TCP, wenn die RTSP-Einrichtung mit UDP fehlschlägt und der RTSP-Fehler 461 UnsupportedTransport (#11069) auftritt.

Version 1.0.0

22. März 2023

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

Dieser Release entspricht der ExoPlayer-Version 2.18.5.

Es gibt keine Änderungen seit 1.0.0-rc02.

Version 1.0.0-rc02

2. März 2023

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

Dieser Release entspricht der ExoPlayer-Version 2.18.4.

  • Kernbibliothek:
    • Fehlerbehebung bei der Netzwerktyperkennung in API 33 (#10970).
    • Fehler bei NullPointerException beim Anrufen von ExoPlayer.isTunnelingEnabled behoben (#10977)
  • Downloads:
    • Die maximale Differenz zwischen den Startzeiten zweier Segmente, die zusammengeführt werden sollen, kann in SegmentDownloader und Unterklassen konfiguriert werden (#248).
  • Audio:
    • Fehler bei der fehlerfreien MP3-Wiedergabe auf Samsung-Geräten behoben (#8594).
    • Fehler behoben, durch den die Wiedergabegeschwindigkeit, die direkt nach dem Deaktivieren von Audio festgelegt wurde, von einer vorherigen Geschwindigkeitsänderung überschrieben werden konnte (#10882).
  • Video:
    • Weise das HEVC HDR10-Format HEVCProfileMain10HDR10 anstelle von HEVCProfileMain10 zu.
    • Behelfslösung für ein Geräteproblem auf Chromecast mit Google TV und Lenovo M10 FHD Plus hinzugefügt, durch das AVC-Streams mit 60 fps als nicht unterstützt gekennzeichnet werden (#10898).
    • Behebung von Leistungsproblemen beim Freigeben von Frames beim Abspielen von Medien mit einer Framerate, die weit über der Bildschirmaktualisierungsrate liegt.
  • Streamen:
    • Behebung des vorübergehenden STATE_IDLE beim Wechseln zwischen Medienelementen (#245)
  • RTSP:
    • IllegalArgumentException beim Parsen ungültiger RTSP-Antworten abfangen und beschreiben (#10971)
  • Sitzung:
    • Es wurde ein Fehler behoben, durch den die Wiedergabe-/Pause-Schaltfläche in der Benachrichtigung nicht mit dem Playerstatus aktualisiert wurde (#192).
  • IMA-Erweiterung:
    • Ein Fehler wurde behoben, durch den DAI-Streams ohne Anzeigen nicht gestartet werden konnten, 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 wird veröffentlicht. Version 1.0.0-rc01 enthält diese Commits.

Dieser Release entspricht der ExoPlayer-Version 2.18.3.

  • Kernbibliothek:
    • Optimiere die Logik für die Dekoderreihenfolge des Renderers, damit die Einstellungen von MediaCodecSelector eingehalten werden, auch wenn ein Dekoder meldet, dass er die Medien möglicherweise nicht leistungsfähig wiedergeben kann. Bei der Standardauswahl wird beispielsweise 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.
    • Es ist jetzt möglich, Downloadmanager-Hilfsprogramme zu löschen (#10776).
    • Fügen Sie BasePlayer.seekTo einen Parameter hinzu, um auch den Befehl anzugeben, der für die Suche verwendet wird.
    • Verwenden Sie das Design beim Laden von drawables bei API 21 und höher (#220).
    • ConcatenatingMediaSource2 hinzugefügt, mit dem mehrere Medienelemente in einem einzigen Fenster kombiniert werden können (#247).
  • Extraktoren:
    • Gib ParserException anstelle von NullPointerException aus, wenn in der Beispieltabelle (stbl) beim Parsen von trak-Atomen eine erforderliche Beispielbeschreibung (stsd) fehlt.
    • Samples werden jetzt richtig übersprungen, wenn in fMP4 direkt zu einem Synchronframe gesprungen wird (#10941).
  • Audio:
    • Verwende die Bitrate des komprimierten Audioformats, um die minimale Puffergröße für AudioTrack bei der direkten Wiedergabe (Passthrough) zu berechnen.
  • Text:
    • Korrigieren, dass TextRenderer einen ungültigen (negativen) Index an Subtitle.getEventTime weitergibt, wenn eine Untertiteldatei keine Cues enthält
    • SubRip: Unterstützung für UTF-16-Dateien hinzugefügt, wenn sie mit einem Byte-Reihenfolge-Zeichen beginnen.
  • Metadaten:
    • Mehrere durch Nullen getrennte Werte aus ID3-Frames parsen, wie von ID3 v2.4 zulässig
    • Fügen Sie MediaMetadata.mediaType hinzu, um den Inhaltstyp oder den Ordnertyp anzugeben, der in den 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 hinzufügen, einschließlich der Kachelnanzahl (#3752).
  • UI:
    • Beheben Sie das in PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) veraltete Problem, damit Änderungen an der Sichtbarkeit an den registrierten Listener übergeben werden (#229).
    • Die Anordnung der Playersteuerung in der Mitte von PlayerView wurde bei einem Layout mit Leserichtung von rechts nach links korrigiert (#227).
  • Sitzung:
    • Füge eine abstrakte SimpleBasePlayer hinzu, um die Player-Benutzeroberfläche für benutzerdefinierte Player zu implementieren.
    • Hilfsmethode zum Konvertieren des Plattformsitzungstokens in Media3 hinzufügen SessionToken (#171).
    • Mit onMediaMetadataChanged können Updates der Plattformmediensitzung ausgelöst werden (#219).
    • Fügen Sie die Mediensitzung als Argument von getMediaButtons() der DefaultMediaNotificationProvider hinzu und verwenden Sie zur besseren Verständlichkeit unveränderliche Listen (#216).
    • Füge einen onSetMediaItems-Callback-Listener hinzu, um die MediaItem-Liste, den Startindex und die Position nach Sitzung zu ändern/festzulegen, bevor sie auf den Player angewendet werden (#156).
    • Doppeltippen nicht für Ereignisse von Medientasten außerhalb von Bluetooth erkennen lassen (#233)
    • QueueTimeline ist jetzt robuster bei einem fragwürdigen alten Sitzungsstatus (#241).
  • Metadaten:
    • Mehrere durch Nullen getrennte Werte aus ID3-Frames parsen, wie von ID3 v2.4 zulässig
    • Fügen Sie MediaMetadata.mediaType hinzu, um den Inhaltstyp oder den Ordnertyp anzugeben, der in den Metadaten beschrieben wird.
    • Fügen Sie MediaMetadata.isBrowsable als Ersatz für MediaMetadata.folderType hinzu. Der Ordnertyp wird in der nächsten Version eingestellt.
  • Cast-Erweiterung:
    • Cast SDK-Version auf 21.2.0 angehoben.
  • IMA-Erweiterung:
    • Entfernen Sie den Player-Listener der ImaServerSideAdInsertionMediaSource im Anwendungs-Thread, um Probleme mit Threads zu vermeiden.
    • Füge ImaServerSideAdInsertionMediaSource.AdsLoader.Builder das Attribut focusSkipButtonWhenAvailable hinzu, um das Fokussieren der Schaltfläche „Überspringen“ auf Fernsehern anzufordern, und setze es standardmäßig auf „wahr“.
    • Füge der ImaServerSideAdInsertionMediaSource.AdsLoader die Methode focusSkipButton() hinzu, um den Fokus programmatisch auf die Schaltfläche „Überspringen“ zu setzen.
    • Die IMA SDK-Version wurde auf 3.29.0 erhöht.
  • Demo-App:
    • Benachrichtigungsberechtigung für Downloadbenachrichtigungen zur Laufzeit anfordern (#10884).

Version 1.0.0-beta03

22. November 2022

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

Dieser Release entspricht der ExoPlayer-Version 2.18.2.

  • Kernbibliothek:
    • Füge ExoPlayer.isTunnelingEnabled hinzu, um zu prüfen, ob das Tunneling für die aktuell ausgewählten Tracks aktiviert ist (#2518).
    • Fügen Sie WrappingMediaSource hinzu, um das Umbrechen einer einzelnen MediaSource zu vereinfachen (#7279).
    • Der Back-Buffer wird verworfen, bevor die Wiedergabe aufgrund von zu wenig verfügbarem Arbeitsspeicher hängt.
    • Schließen Sie den Tracing-Block „doSomeWork“, wenn die Auslagerung aktiviert ist.
    • Problem beim Sitzungs-Tracking bei schnellen Suchanfragen in PlaybackStatsListener behoben (#180).
    • Fehlender onMediaItemTransition-Callback wird gesendet, wenn seekToNext oder seekToPrevious in einer Playlist mit nur einem Element aufgerufen wird (#10667).
    • Fügen Sie Player.getSurfaceSize hinzu, um die Größe der Oberfläche zurückzugeben, auf der das Video gerendert wird.
    • Fehler behoben, durch den das Entfernen von Zuhörern während der Player-Veröffentlichung zu einer IllegalStateException führen konnte (#10758).
  • Build:
    • Es wird ein Mindestwert für compileSdkVersion erzwungen, um Kompilierungsfehler zu vermeiden (#10684).
    • Blockieren Sie die Veröffentlichung, wenn die Datei in einem anderen Gradle-Build enthalten ist.
  • Titelauswahl:
    • Wähle andere Tracks anstelle von Dolby Vision aus, wenn das Display diese Technologie nicht unterstützt. (#8944).
  • Downloads:
    • Behebung eines potenziellen Endlosschleifenfehlers in ProgressiveDownloader, der durch gleichzeitigen Download und Wiedergabe mit demselben PriorityTaskManager verursacht wurde (#10570).
    • Die Downloadbenachrichtigung wird sofort angezeigt (#183).
    • Parallele Downloadentfernungen auf 1 beschränken, um eine übermäßige Threaderstellung zu vermeiden (#10458).
  • Video:
    • Wenn das Display Dolby Vision nicht unterstützt, versuchen Sie es mit einem alternativen Decoder. (#9794).
  • Audio:
    • Verwende SingleThreadExecutor, um AudioTrack-Instanzen freizugeben, um OutOfMemory-Fehler zu vermeiden, wenn mehrere Spieler gleichzeitig freigegeben werden (#10057).
    • Fügen Sie AudioOffloadListener.onExperimentalOffloadedPlayback für den Offload-Status von AudioTracks 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 wird in allen Android-Versionen den Kanalmasken 7.1 und 7.1.4 zugeordnet (#10701).
  • Metadaten:
    • MetadataRenderer kann jetzt so konfiguriert werden, dass Metadaten sobald sie verfügbar sind gerendert werden. Erstelle eine Instanz mit MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean), um anzugeben, ob der Renderer Metadaten frühzeitig oder synchron mit der Position des Players ausgibt.
  • Digitale Rechteverwaltung:
    • Umgehen eines Fehlers in der ClearKey-Implementierung von Android 13, bei dem eine nicht leere, aber ungültige Lizenz-URL zurückgegeben wird.
    • Der Fehler setMediaDrmSession failed: session not opened beim Wechseln zwischen DRM-Schemas in einer Playlist (z.B. von Widevine zu ClearKey) wurde behoben.
  • Text:
    • CEA-608: Befehle zum Dienstwechsel in Feld 2 müssen richtig verarbeitet werden (#10666).
  • DASH:
    • EventStream.presentationTimeOffset aus Manifesten parsen (#10460)
  • UI:
    • Aktuelle Overrides des Players als Voreinstellung in TrackSelectionDialogBuilder verwenden (#10429)
  • Sitzung:
    • Befehle müssen immer in der richtigen Reihenfolge ausgeführt werden, auch wenn für einige eine asynchrone Auflösung erforderlich ist (#85).
    • Fügen Sie DefaultMediaNotificationProvider.Builder hinzu, um DefaultMediaNotificationProvider-Instanzen zu erstellen. Der Builder kann die Benachrichtigungs-ID, die Benachrichtigungskanal-ID und den Namen des Benachrichtigungskanals 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).
    • Befehle, die vor MediaController.release() gesendet wurden, dürfen nicht verworfen werden (#99).
    • SimpleBitmapLoader kann Bitmaps aus file://-URIs laden (#108).
    • Behebung einer Behauptung, die verhindert, dass MediaController in einem bestimmten Zeitraum über eine Anzeige springt (#122).
    • Wenn die Wiedergabe endet, wird die MediaSessionService im Vordergrund beendet und eine Benachrichtigung wird angezeigt, um die Wiedergabe des zuletzt abgespielten Medienelements neu zu starten (#112).
    • Starten Sie keinen Dienst im Vordergrund mit einer ausstehenden Intent-Anfrage zum Pausieren (#167).
    • Das mit der von DefaultNotificationProvider erstellten Benachrichtigung verknüpfte Symbol kann in API 26 und API 27 manuell ausgeblendet werden. In API 28 und höher wird es automatisch ausgeblendet. #131
    • Fehler behoben, bei dem eine zweite Binder-Verbindung von einer älteren MediaSession zu einer Media3-MediaController zu IllegalStateExceptions führte (#49).
  • RTSP:
    • H263-Fragmentierungspakete werden jetzt verarbeitet (#119).
    • Unterstützung für MP4A-LATM hinzugefügt (#162)
  • IMA:
    • Es wurde eine Zeitüberschreitung für das Laden von Anzeigeninformationen hinzugefügt, um Fälle zu behandeln, in denen das IMA SDK beim Laden einer Anzeige hängen bleibt (#10510).
    • Mid-Roll-Anzeigen können nicht mehr übersprungen werden, wenn zum Ende des Inhalts gesprungen wird (#10685).
    • Korrekte Berechnung der Fensterdauer für Livestreams mit serverseitig eingefügten Anzeigen, z. B. IMA DAI (#10764).
  • FFmpeg-Erweiterung:
    • Es wurden neue Flags hinzugefügt, um FFmpeg-Bibliotheken mit NDK 23.1.7779620 und höher zu verknüpfen (#9933).
  • AV1-Erweiterung:
    • Die CMake-Version wurde aktualisiert, um Inkompatibilitäten mit den neuesten Android Studio-Releases zu vermeiden (#9933).
  • Cast-Erweiterung:
    • Implementiere getDeviceInfo(), um CastPlayer bei der Wiedergabesteuerung mit einer MediaController identifizieren zu können (#142).
  • Transformator:
    • Es wurde ein Watchdog-Timer für den Muxer hinzugefügt, um zu erkennen, wenn die Generierung eines Ausgabe-Samples zu langsam ist.
  • Entfernen Sie veraltete Symbole:
    • Entfernen Sie Transformer.Builder.setOutputMimeType(String). Diese Funktion wurde entfernt. Der MIME-Typ ist immer „MP4“, wenn der Standard-Muxer verwendet wird.

Version 1.0.0-beta02

21. Juli 2022

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

Dieser Release entspricht der ExoPlayer-Version 2.18.1.

  • Kernbibliothek:
    • Achte darauf, dass das Ersetzen von ShuffleOrder durch ExoPlayer.setShuffleOrder zu einem Aufruf von Player.Listener#onTimelineChanged mit reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED führt (#9889).
    • Bei progressiven Medien sollten nur ausgewählte Titel in der gepufferten Position enthalten sein (#10361).
    • Benutzerdefinierten Protokoller für die gesamte ExoPlayer-Logausgabe zulassen (#9752).
    • Fehler bei der Implementierung von setDataSourceFactory in DefaultMediaSourceFactory behoben, der in einigen Fällen zu Funktionsstörungen führte (#116).
  • Extraktoren:
    • Fehler beim Parsen von H265-Kurzzeit-Referenzbildsätzen behoben (#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ü für die Wiedergabesteuerung ansagen (#10298).
  • RTSP:
    • VP8-Fragmentierung von Paketen hinzugefügt (#110).
  • Leanback-Erweiterung:
    • Hören Sie sich die Änderungen an playWhenReady in LeanbackAdapter an (10420).
  • Streamen:
    • Verwende die MediaItem, die an die Playlist-Methoden übergeben wurde, als Window.mediaItem in CastTimeline (#25, #8212).
    • Unterstützung von Player.getMetadata() und Listener.onMediaMetadataChanged() mit CastPlayer (#25)

Version 1.0.0-beta01

16. Juni 2022

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

Dies entspricht der ExoPlayer-Version 2.18.0.

  • Kernbibliothek:
    • Aktivieren Sie die Unterstützung für die Android-Plattformdiagnose über MediaMetricsManager. ExoPlayer leitet Wiedergabeereignisse und Leistungsdaten an die Plattform weiter, um Informationen zur Systemleistung und zum Debuggen auf dem Gerät bereitzustellen. Diese Daten können auch von Google erhoben werden, wenn der Nutzer des Geräts die Freigabe von Nutzungs- und Diagnosedaten aktiviert hat. Mit ExoPlayer.Builder.setUsePlatformDiagnostics(false) können Entwickler festlegen, dass ihre Apps nicht zur Plattformdiagnose für ExoPlayer beitragen.
    • Fehler behoben, bei dem Titel bei der Verwendung von MergingMediaSource zu oft zurückgesetzt wurden, z. B. beim seitlichen Laden von Untertiteln und Ändern des ausgewählten Untertitels während der Wiedergabe (#10248).
    • Der 5G-NSA-Netzwerktyp wird in API 29 und 30 nicht mehr erkannt. Bei diesen Wiedergaben wird davon ausgegangen, dass ein 4G-Netzwerk verfügbar ist.
    • Ü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 anzugeben, die zum Abspielen von Medien erforderlich sind, wenn die genaue LocalConfiguration nicht bekannt ist. Entfernen Sie auch MediaMetadata.mediaUrl, da es jetzt in RequestMetadata enthalten ist.
    • Fügen Sie Player.Command.COMMAND_SET_MEDIA_ITEM hinzu, damit Spieler das Festlegen eines einzelnen Elements zulassen können.
  • Titelauswahl:
    • Ebenen der Klasse TrackSelectionOverrides in TrackSelectionParameters zusammenführen und TrackSelectionOverride in eine Klasse der obersten Ebene verschieben
    • Benennen Sie TracksInfo in Tracks und TracksInfo.TrackGroupInfo in Tracks.Group um. Player.getCurrentTracksInfo und Player.Listener.onTracksInfoChanged wurden in Player.getCurrentTracks und Player.Listener.onTracksChanged umbenannt. Dazu gehört auch, dass der Name der Player.Listener.onTracksChanged-Methode nicht mehr als veraltet eingestuft wird, aber mit anderen Parametertypen.
    • Ändern Sie DefaultTrackSelector.buildUponParameters und DefaultTrackSelector.Parameters.buildUpon, damit DefaultTrackSelector.Parameters.Builder anstelle der verworfenen DefaultTrackSelector.ParametersBuilder zurückgegeben wird.
    • Fügen Sie DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities hinzu, das standardmäßig aktiviert ist. Wenn diese Option aktiviert ist, werden von DefaultTrackSelector Audiotracks bevorzugt, deren Kanalanzahl die Ausgabefunktionen des Geräts nicht überschreitet. Auf Mobilgeräten bevorzugt DefaultTrackSelector Stereo-/Mono-Audioformate gegenüber Mehrkanal-Audioformaten, es sei denn, das Mehrkanal-Audioformat kann räumlich dargestellt werden (Android 12L und höher) oder es handelt sich um ein Dolby-Surround-Sound-Format. Auf Geräten, die die Audio-Raumklangtechnologie unterstützen, prüft DefaultTrackSelector außerdem, ob sich die Spatializer-Eigenschaften geändert haben, und löst bei Bedarf eine neue Titelauswahl aus. Geräte mit einem television UI-Modus sind von diesen Einschränkungen ausgenommen. Das Format mit der höchsten Kanalanzahl wird bevorzugt. Damit diese Funktion aktiviert werden kann, muss die DefaultTrackSelector-Instanz mit einer Context erstellt werden.
  • Video:
    • Benennen Sie DummySurface in PlaceholderSurface um.
    • Fügen Sie der MediaCodecVideoRenderer.getCodecMaxInputSize die AV1-Unterstützung hinzu.
  • Audio:
    • LG AC3-Audiodecoder, der einen nicht standardmäßigen MIME-Typ angibt
    • Ändern Sie den Rückgabetyp von AudioAttributes.getAudioAttributesV21() von android.media.AudioAttributes in eine neue AudioAttributesV21-Wrapper-Klasse, um eine langsame ART-Überprüfung bei einer API < 21 zu verhindern.
    • Frage die Plattform (API 29 und höher) ab oder setze die Audiocodierungskanalanzahl für die Audioweiterleitung, wenn die Audiokanalanzahl des Formats nicht festgelegt ist. Das ist bei der HLS-Chunkless-Vorbereitung 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 muss immer korrekt aktualisiert werden, wenn direkt nach einer Formatänderung vor- oder zurückgesprungen wird (10274).
  • Text:
    • Ändern Sie Player.getCurrentCues(), damit CueGroup anstelle von List<Cue> zurückgegeben wird.
    • SSA: Unterstützung der Stileinstellung OutlineColour bei BorderStyle == 3 (d.h. OutlineColour legt den Hintergrund des Cues fest) (#8435).
    • CEA-708: Daten in mehrere Dienstblöcke parsen und Blöcke ignorieren, die nicht mit der aktuell ausgewählten Dienstnummer verknüpft sind.
    • Entfernen von RawCcExtractor, das nur für ein internes Untertitelformat von Google verwendet wurde
  • Extraktoren:
    • Unterstützung für AVI hinzugefügt (#2092)
    • Matroska: DiscardPadding für Opus-Titel parsen.
    • MP4: Bitraten aus esds-Boxen werden geparst.
    • Ogg: Doppelte Opus-ID und Kommentarheader zulassen (#10038).
  • UI:
    • Korrektur der Zustellung von Ereignissen an OnClickListeners, die auf PlayerView festgelegt sind, wenn useController=false (#9605). Außerdem wurde die Übermittlung von Ereignissen an OnLongClickListener für alle Ansichtskonfigurationen korrigiert.
    • Behebung eines Fehlers, bei dem eine Touch-Ereignisanweisung, die die Grenzen von PlayerView vor ACTION_UP verlässt, fälschlicherweise als Klick behandelt wurde (#9861).
    • Behebung eines PlayerView Problems mit Bedienungshilfen, bei dem durch Tippen die Wiedergabe statt der Steuerelemente ausgeblendet wurde (#8627).
    • Erstellen Sie neue Versionen von TrackSelectionView und TrackSelectionDialogBuilder, die mit der Player-Benutzeroberfläche und nicht mit ExoPlayer funktionieren. So können die Ansichten mit anderen Player-Implementierungen verwendet werden und die Abhängigkeit des UI-Moduls vom ExoPlayer-Modul wird aufgehoben. Dies ist eine funktionsgefährdende Änderung.
    • Erzwungene Untertiteltracks werden nicht in der PlayerView-Titelauswahl angezeigt. Wenn „Kein“ ausgewählt ist, sollte ein geeigneter erzwungener Untertiteltrack ausgewählt bleiben (#9432).
  • DASH:
    • Kanalanzahl aus DTS-AudioChannelConfiguration-Elementen parsen Dadurch wird der Audio-Passthrough für DTS-Streams wieder aktiviert (#10159).
    • Übergabe von null an DashMediaSource.Factory.setCompositeSequenceableLoaderFactory nicht zulassen Instanzen von DefaultCompositeSequenceableLoaderFactory können bei Bedarf explizit übergeben werden.
  • HLS:
    • Bei der Vorbereitung in Chunks zurückfallen, wenn das CODECS-Attribut der Playlist keinen Audio-Codec enthält (#10065).
    • Übergabe von null an HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory und HlsMediaSource.Factory.setPlaylistTrackerFactory nicht zulassen Instanzen von DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory oder ein Verweis auf DefaultHlsPlaylistTracker.FACTORY können bei Bedarf explizit übergeben werden.
  • Smooth Streaming:
    • Übergabe von null an SsMediaSource.Factory.setCompositeSequenceableLoaderFactory nicht zulassen Instanzen von DefaultCompositeSequenceableLoaderFactory können bei Bedarf explizit übergeben werden.
  • RTSP:
    • RTP-Leser für H263 hinzugefügt (#63).
    • RTP-Leser für MPEG4 hinzufügen (#35)
    • RTP-Leser für HEVC hinzufügen (#36)
    • RTP-Leser für AMR hinzufügen Derzeit werden nur monokanalige, nicht interleavede AMR-Streams unterstützt. Zusammengesetzte AMR-RTP-Nutzlast wird nicht unterstützt. (#46)
    • RTP-Leser für VP8 hinzufügen (#47)
    • RTP-Leser für WAV hinzufügen (#56)
    • Korrektur des Header für die grundlegende RTSP-Autorisierung. (#9544)
    • Die Überprüfung der Pflichtfelder für SDP-Dateien wurde eingestellt, da sie für ExoPlayer nicht erforderlich sind (#10049).
    • Geprüfte Ausnahme beim Parsen von RTSP-Timings auslösen (#10165).
    • RTP-Leser für VP9 hinzugefügt (#47).
    • RTP-Leser für OPUS hinzufügen (#53)
  • Datenquellen:
    • Benennen Sie DummyDataSource in PlaceholderDataSource um.
    • Problemumgehung für die OkHttp-Unterbrechungsbehandlung
  • Sitzung:
    • Ersetzen Sie MediaSession.MediaItemFiller durch MediaSession.Callback.onAddMediaItems, um die asynchrone Auflösung von Anfragen zu ermöglichen.
    • Unterstützung von setMediaItems(s)-Methoden, wenn MediaController eine Verbindung zu einer älteren Mediensitzung herstellt.
    • Entfernen Sie MediaController.setMediaUri und MediaSession.Callback.onSetMediaUri. Die gleiche Funktionalität kann auch mit MediaController.setMediaItem und MediaSession.Callback.onAddMediaItems erreicht werden.
    • Leiten Sie alte MediaController-Anrufe zum Abspielen von Medien 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 Artwork-Bilder herunterzuladen.
    • Fügen Sie MediaSession.setCustomLayout() hinzu, um Abwärtskompatibilität mit der alten Sitzung zu ermöglichen.
    • Fügen Sie MediaSession.setSessionExtras() hinzu, um die Funktionsparität mit der bisherigen Sitzung zu ermöglichen.
    • Benennen Sie MediaSession.MediaSessionCallback in MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback in MediaLibrarySession.Callback und MediaSession.Builder.setSessionCallback in setCallback um.
    • NPE in MediaControllerImplLegacy behoben (#59).
    • Informationen zur Sitzungsposition bei Zeitachsenänderungen aktualisieren(#51).
    • Behebung des NPE in MediaControllerImplBase nach dem Freigeben des Controllers (#74).
  • Anzeigenwiedergabe / IMA:
    • Reduzieren Sie die Abfragerate für Anzeigen von 100 ms auf 200 ms, um den Empfehlungen des Media Rating Council (MRC) zu entsprechen.
  • FFmpeg-Erweiterung:
    • Aktualisieren Sie die CMake-Version auf 3.21.0+, um einen CMake-Fehler zu vermeiden, der dazu führt, dass die Gradle-Synchronisierung in Android Studio fehlschlägt (#9933).
  • Entfernen Sie veraltete Symbole:
    • Entfernen Sie Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Verwenden Sie stattdessen Player.Listener.onTracksChanged(Tracks).
    • Entfernen Sie Player.getCurrentTrackGroups und Player.getCurrentTrackSelections. Verwenden Sie stattdessen Player.getCurrentTracks. Sie können auch weiterhin ExoPlayer.getCurrentTrackGroups und ExoPlayer.getCurrentTrackSelections verwenden, diese Methoden werden jedoch nicht mehr empfohlen.
    • Entfernen Sie die Konstanten DownloadHelper DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT und DEFAULT_TRACK_SELECTOR_PARAMETERS. Verwenden Sie nach Möglichkeit getDefaultTrackSelectorParameters(Context) und andernfalls DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Entfernen Sie den Konstruktor DefaultTrackSelector(ExoTrackSelection.Factory). Verwenden Sie stattdessen DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Entfernen Sie Transformer.Builder.setContext. Die Context sollte stattdessen an den Konstruktor von Transformer.Builder übergeben werden.

Version 1.0.0-alpha03

14. März 2022

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

Dies entspricht der ExoPlayer-Version 2.17.1.

  • Audio:
    • Fehler bei der Fehlerprüfung der Audiofunktionen für Dolby Atmos (E-AC3-JOC) in HLS behoben
  • Extraktoren:
    • FMP4: Problem behoben, bei dem EMSG-Stichprobenmetadaten bei Streams, die sowohl v0- als auch v1-EMSG-Atome enthalten, in der falschen Reihenfolge ausgegeben werden konnten (#9996).
  • Text:
    • Die Interaktion von SingleSampleMediaSource.Factory.setTrackId und MediaItem.SubtitleConfiguration.Builder.setId wurde korrigiert, damit das Feld SubtitleConfiguration priorisiert wird und bei fehlendem Wert auf Factory zurückgegriffen wird (#10016).
  • Anzeigenwiedergabe:
    • Behebung von Tonaussetzern zwischen Werbeunterbrechungen in Live-HLS-SSAI-Streams.

Version 1.0.0-alpha02

2. März 2022

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

Dies entspricht der ExoPlayer-Version 2.17.0.

  • Core Library:
    • Fügen Sie die geschützte Methode DefaultRenderersFactory.getCodecAdapterFactory() hinzu, damit Unterklassen von DefaultRenderersFactory, die buildVideoRenderers() oder buildAudioRenderers() überschreiben, auf die Codec-Adapter-Fabrik zugreifen und sie an von ihnen erstellte MediaCodecRenderer-Instanzen übergeben können.
    • Übermittle die ICY-Headerfelder name und genre an MediaMetadata.station und MediaMetadata.genre, damit sie die App über Player.Listener.onMediaMetadataChanged() erreichen (#9677).
    • Entfernen Sie Nullschlüssel aus DefaultHttpDataSource#getResponseHeaders.
    • Warten Sie und versuchen Sie es noch einmal, wenn beim Erstellen einer MediaCodec-Instanz ein Fehler auftritt. Dadurch wird ein Problem auf einigen Geräten umgangen, das beim Wechseln einer Oberfläche von einem sicheren Codec zu einem anderen auftritt (#8696).
    • Fügen Sie MediaCodecAdapter.getMetrics() hinzu, damit Nutzer Messdaten von MediaCodec abrufen können. (#9766).
    • Behebung eines Problems bei der Maven-Abhängigkeitsauflösung (#8353).
    • Die automatische Geschwindigkeitsanpassung für Livestreams, die weder Funktionen mit niedriger Latenz noch eine Nutzeranfrage zur Festlegung der Geschwindigkeit haben, wurde deaktiviert (#9329).
    • Benennen Sie DecoderCounters#inputBufferCount in queuedInputBufferCount um.
    • Machen Sie SimpleExoPlayer.renderers zu einem privaten Konto. Der Zugriff auf Renderer erfolgt über ExoPlayer.getRenderer.
    • Einige Konstantenwerte für AnalyticsListener.EventFlags wurden aktualisiert, damit sie mit den Werten in Player.EventFlags übereinstimmen.
    • Teilen Sie AnalyticsCollector in eine Schnittstelle und eine Standardimplementierung auf, damit es von R8 entfernt werden kann, wenn eine App es nicht benötigt.
  • Titelauswahl:
    • Unterstützung von Flags für die bevorzugte Videorolle bei der Titelauswahl (#9402)
    • Die Logik für die Auswahl von Videotracks wurde aktualisiert, damit bei der Auswahl mehrerer Videotracks für die Anpassung bevorzugte MIME-Typen und Rollen-Flags berücksichtigt werden (#9519).
    • Die Logik für die Auswahl von Video- und Audiotracks wurde aktualisiert, sodass für adaptive Auswahlen nur Formate ausgewählt werden, die dieselbe Dekoder- und Hardwareunterstützung haben (#9565).
    • Die Logik für die Videotrackauswahl wurde aktualisiert, um effizientere Codecs zu bevorzugen, wenn mehrere Codecs von primären, hardwarebeschleunigten Decodern unterstützt werden (#4835).
    • Bevorzuge Einstellungen für Audioinhalte (z. B. den „Standard“-Audiotrack oder einen Track, der der Systemsprache entspricht) gegenüber technischen Einschränkungen bei der Trackauswahl (z. B. bevorzugter MIME-Typ oder maximale Kanalanzahl).
    • Problem mit der Titelauswahl behoben, bei dem durch das Überschreiben einer Titelgruppe andere Titelgruppen desselben Typs nicht deaktiviert wurden (#9675).
    • Ein Problem bei der Titelauswahl wurde behoben, bei dem eine Mischung aus nicht leeren und leeren Titelüberschreibungen nicht richtig angewendet wurde (#9649).
    • Doppelte TrackGroup in einer TrackGroupArray sind nicht zulässig. TrackGroups können immer unterschieden werden, indem im TrackGroup-Konstruktor ein id festgelegt wird. Dadurch wird ein Absturz behoben, der beim Fortsetzen der Wiedergabe auftritt, nachdem die App mit einer aktiven Track-Überschreibung im Hintergrund ausgeführt wurde (#9718).
    • Die Logik in AdaptiveTrackSelection wurde geändert, um bei ausreichender Netzwerkbandbreite eine Qualitätssteigerung zu ermöglichen, auch wenn die Wiedergabe sehr nah am Live-Edge liegt (#9784).
  • Video:
    • Fehlerbehebung bei der Fallback-Logik des Decoders für Dolby Vision, damit bei Bedarf ein kompatibler H264/H265-Decoder verwendet wird.
  • Audio:
    • Die Fallback-Logik für den Decoder für Dolby Atmos (E-AC3-JOC) wurde korrigiert, damit bei Bedarf ein kompatibler E-AC3-Decoder verwendet wird.
    • Ändern Sie die AudioCapabilities APIs so, dass AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES anstelle von null explizit übergeben werden muss.
    • Die Berechnung der AudioTrack-Puffergröße kann angepasst werden, indem eine AudioTrackBufferSizeProvider in DefaultAudioSink eingefügt wird. (#8891).
    • Wiederholen Sie die Erstellung von AudioTrack, wenn die angeforderte Puffergröße größer als 1 MB war. (#9712).
  • Extraktoren:
    • WAV: Unterstützung für RF64-Streams hinzugefügt (#9543).
    • Fehler beim Parsen von H.265 SPS-NAL-Einheiten behoben (#9719).
    • Vorbis-Kommentare (einschließlich METADATA_BLOCK_PICTURE) in Ogg Opus- und Ogg Vorbis-Dateien parsen
  • Text:
    • Füge ein MediaItem.SubtitleConfiguration.id-Feld hinzu, das an das Format.id-Feld des Untertitel-Tracks weitergegeben wird, der aus der Konfiguration erstellt wurde (#9673).
    • Grundlegende Unterstützung für WebVTT-Untertitel in Matroska-Containern hinzufügen (#9886)
    • Verhindern, dass Cea708Decoder mehr als die angegebene Größe eines Dienstblocks liest
  • Digitale Rechteverwaltung:
    • Entfernen Sie playbackLooper aus DrmSessionManager.(pre)acquireSession. Wenn eine DrmSessionManager von einer App in einem benutzerdefinierten MediaSource verwendet wird, muss die playbackLooper stattdessen an DrmSessionManager.setPlayer übergeben werden.
  • Anzeigenwiedergabe / IMA:
    • Unterstützung für die dynamische Anzeigenbereitstellung (Dynamic Ad Insertion, DAI) mit IMA hinzugefügt (#8213).
    • AdPlaybackState soll eine Methode hinzugefügt werden, mit der eine Anzeigengruppe zurückgesetzt werden kann, damit sie noch einmal wiedergegeben werden kann (#9615).
    • Wiedergabegeschwindigkeit von 1,0 bei der Wiedergabe von Anzeigen erzwingen (#9018)
    • Ein Problem wurde behoben, durch das eine nicht geladene Anzeigengruppe zu einem sofortigen Zurücksetzen der Wiedergabe führte (#9929).
  • UI:
    • Die Farbe der Zahlen auf den Schaltflächen „StyledPlayerView“ (Zurückspulen) und „“ (Vorspulen) wurde bei bestimmten Themen korrigiert (#9765).
    • Strings für die Wiedergabegeschwindigkeit korrekt übersetzen (#9811).
  • DASH:
    • Fügen Sie der Representation geparste wichtige und ergänzende Properties hinzu (#9579).
    • Unterstützung der Rolle „forced-subtitle“ für den Titel (#9727)
    • Die Trackrolle main wird nicht mehr als C.SELECTION_FLAG_DEFAULT interpretiert.
    • Logik für den Ausschluss von Basis-URLs für Manifeste korrigiert, in denen der DVB-Namespace nicht deklariert ist (#9856).
    • Unterstützung relativer MPD.Location-URLs (#9939)
  • HLS:
    • Format.label muss für HLS-Streams mit reinem Audioinhalt korrekt ausgefüllt sein (#9608).
    • Verwenden Sie standardmäßig die chunklose Vorbereitung, um die Startzeit zu verkürzen. Wenn deine Titel muxierte Untertiteltracks enthalten, die nicht in der Masterplaylist deklariert sind, solltest du sie der Masterplaylist hinzufügen, damit sie zur Wiedergabe verfügbar sind. Du kannst auch die chunklose Vorbereitung mit HlsMediaSource.Factory.setAllowChunklessPreparation(false) deaktivieren.
    • Unterstützung der genauen Suche nach Keyframes in HLS (#2882).
  • RTSP:
    • Biete eine Client-API an, um die SocketFactory zu überschreiben, die für jede Serververbindung verwendet wird (#9606).
    • Wenn beide vorhanden sind, bevorzuge die DIGEST-Authentifizierungsmethode gegenüber der BASIC-Authentifizierungsmethode (#9800).
    • Umgang mit dem Fall, dass das RTSP-Track-Timing nicht verfügbar ist (#9775)
    • Ungültige RTP-Info-Headerwerte ignorieren (#9619).
  • Transformator:
    • Erforderliche Mindest-API-Version auf 21 erhöhen
    • TransformationException wird jetzt verwendet, um Fehler zu beschreiben, die während einer Transformation auftreten.
    • Fügen Sie TransformationRequest hinzu, um die Transformationsoptionen anzugeben.
    • Es können mehrere Zuhörer registriert werden.
    • Behebung eines Problems, bei dem der Transformer hängen blieb, wenn die Codec-Ausgabe nur teilweise gelesen wurde.
    • Potenzieller NPE in Transformer.getProgress beim Freigeben des Muxers behoben
    • Fügen Sie eine Demo-App zum Anwenden von Transformationen hinzu.
  • MediaSession-Erweiterung:
    • Wenn du MediaSessionConnector drückst, wird die Playlist jetzt standardmäßig gelöscht. Apps, die die Playlist beibehalten möchten, können setClearMediaItemsOnStop(false) über den Connector aufrufen.
  • Cast-Erweiterung:
    • Fehler behoben, durch den CastPlayer onIsPlayingChanged nicht richtig aufrufen konnte (#9792).
    • Unterstützung von Audiometadaten, einschließlich Artwork, mit DefaultMediaItemConverter (#9663)
  • FFmpeg-Erweiterung:
    • build_ffmpeg.sh ist jetzt von den Bin-Utils von LLVM statt von denen von GNU abhängig (#9933).
  • Kompatibilität mit Android 12:
    • Aktualisieren Sie die Cast-Erweiterung, sodass 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. Beim Erstellen von PendingIntents kommt es zu einem Absturz mit einer IllegalArgumentException (#9528).
  • Entfernen Sie veraltete Symbole:
    • Entfernen Sie Player.EventListener. Verwenden Sie stattdessen Player.Listener.
    • Entfernen Sie MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory und MediaSourceFactory#setDrmUserAgent. Verwenden Sie stattdessen MediaSourceFactory#setDrmSessionManagerProvider.
    • Entfernen Sie MediaSourceFactory#setStreamKeys. Verwenden Sie stattdessen MediaItem.Builder#setStreamKeys.
    • Entfernen Sie MediaSourceFactory#createMediaSource(Uri). Verwenden Sie stattdessen MediaSourceFactory#createMediaSource(MediaItem).
    • Entfernen Sie setTag aus DashMediaSource, HlsMediaSource und SsMediaSource. Verwenden Sie stattdessen MediaItem.Builder#setTag.
    • Entfernen Sie DashMediaSource#setLivePresentationDelayMs(long, boolean). Verwenden Sie MediaItem.Builder#setLiveConfiguration und MediaItem.LiveConfiguration.Builder#setTargetOffsetMs, um das Manifest zu überschreiben, oder DashMediaSource#setFallbackTargetLiveOffsetMs, um einen Fallbackwert anzugeben.
    • Entfernen Sie (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. Die Funktion kann nicht mehr deaktiviert werden.
    • Entfernen Sie ActionFile und ActionFileUpgradeUtil. Wenn du ExoPlayer 2.16.1 oder älter verwendest, kannst du mit ActionFileUpgradeUtil alte Aktionsdateien in DefaultDownloadIndex zusammenführen.
    • Entfernen Sie ProgressiveMediaSource#setExtractorsFactory. Verwenden Sie stattdessen den ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)-Konstruktor.
    • 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 nur die folgende IntDefs in @Target(TYPE_USE). Dies kann die Kompilierung von Verwendungen in Kotlin beeinträchtigen. Das Problem lässt sich beheben, indem die Anmerkung auf den Typ (Int) verschoben wird.
    • @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 com.google.android.exoplayer2.ext.flac-Paket)
    • @FlacExtractor.Flags (im com.google.android.exoplayer2.extractor.flac-Paket)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

Version 1.0.0-alpha01

27. Oktober 2021

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

Neue Funktionen

Media3 ist die neue Heimat für Media-Support-Bibliotheken, 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 einfach anpassen und erweitern lässt.
  • Mediensitzungsfunktionen zum Bereitstellen 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 für die Verwendung mit ExoPlayer einschließen, z. B. Anzeigenbereitstellung über das IMA SDK.

Weitere Informationen finden Sie im GitHub-Projekt Media3.

Zuvor wurde ExoPlayer in einem separaten ExoPlayer-GitHub-Projekt gehostet. In Media3 lautet der Paketname androidx.media3.exoplayer. Wir planen, das GitHub-Projekt „ExoPlayer“ noch einige Zeit lang zu pflegen und neue Versionen zu veröffentlichen, damit Entwickler Zeit haben, 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.