Media3
Letzte Aktualisierung | Stabile Version | Releasekandidat | Betarelease | Alpha-Release |
---|---|---|---|---|
22. Oktober 2025 | 1.8.0 | - | - | 1.9.0-alpha01 |
Abhängigkeiten deklarieren
Wenn Sie eine Abhängigkeit von Media3 hinzufügen möchten, müssen Sie Ihrem Projekt das Google Maven-Repository hinzufügen. Weitere Informationen finden Sie im Maven-Repository von Google.
Fügen Sie der Datei build.gradle
für Ihre App oder Ihr Modul die Abhängigkeiten für die benötigten Artefakte hinzu:
Cool
dependencies { def media3_version = "1.8.0" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs using Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs using Views implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs using Jetpack Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.8.0" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs using Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs using Views implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs using Jetpack Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
Weitere Informationen zu Abhängigkeiten finden Sie unter Build-Abhängigkeiten hinzufügen.
Feedback
Ihr Feedback hilft uns, Jetpack zu verbessern. Im Media3-Issue Tracker finden Sie Antworten auf Fragen, bekannte Probleme und Funktionsanfragen. Außerdem können Sie dort neue Probleme melden.
Version 1.9.0
Version 1.9.0-alpha01
22. Oktober 2025
androidx.media3:media3-*:1.9.0-alpha01
ist veröffentlicht.
Version 1.9.0-alpha01 enthält diese Commits.
- Gemeinsame Mediathek:
- Aktualisieren Sie
minSdk
auf23
, um die Bibliothek an andere AndroidX-Bibliotheken anzugleichen. PlayerTransferState
wurde hinzugefügt, um die Übertragung des Wiedergabestatus zwischenPlayer
-Instanzen zu ermöglichen.- Füge der Klasse „Player“ die Methoden
void mute()
undvoid unmute()
hinzu, um die Lautstärke des Players zu speichern und wiederherzustellen, bevor und nachdem sie auf null gesetzt wurde. - Die Dienstprogrammklassen
WakeLockManager
,WifiLockManager
,AudioFocusManager
,AudioBecomingNoisyManager
undStuckPlayerDetector
, die zuvor intern vonExoPlayer
verwendet wurden, werden veröffentlicht, damit sie von anderen Playern wiederverwendet werden können (#1893). - Problem behoben:
ForwardingPlayer
-Listener-Verarbeitung, wenn der zugrunde liegende Delegate-Player Referenzgleichheit zum Vergleichen von Listener-Instanzen verwendet (#2675). - Fügen Sie der
media3-common-ktx
-Bibliothek einePlayer.listenTo
-Erweiterungsfunktion hinzu, die diePlayer.Events
angibt, auf die reagiert werden soll. - Ein Absturz in
BasePlayer.getBufferedPercentage
wurde behoben, der durch einen Ganzzahlüberlauf verursacht wurde, wenn die gemeldete gepufferte Position unplausibel viel größer als die gemeldete Dauer war (#2750).
- Aktualisieren Sie
- ExoPlayer:
- Eine Erkennung für hängende Player hinzufügen, die einen
StuckPlayerException
-Playerfehler auslöst, wenn der Player hängen bleibt. Dies geschieht in den folgenden Fällen, wobei jedes Standard-Zeitlimit bei Bedarf inExoPlayer.Builder
konfiguriert werden kann:- Nach 10 Minuten
STATE_BUFFERING
beim Versuch, die Wiedergabe zu starten, ohne dass der Puffer fortschreitet. - Nach 10 Sekunden
STATE_READY
beim Versuch, die Wiedergabe zu starten, ohne dass die Wiedergabe fortschreitet. - Nach 1 Minute
STATE_READY
über die angegebene Dauer hinaus, ohne dass das Ende des Artikels erreicht wird. - Nach 10 Minuten mit einem Grund für die Wiedergabeunterdrückung beim Versuch, die Wiedergabe zu starten.
- Nach 10 Minuten
- Die Verarbeitung von Wake Locks ist standardmäßig aktiviert, um Probleme mit dem Puffern bei der Wiedergabe im Hintergrund zu beheben. Dies entspricht dem Festlegen von
ExoPlayer.Builder.setWakeMode
aufC.WAKE_MODE_LOCAL
. - Füge eine Listener-Logik hinzu, um die ID des virtuellen Geräts automatisch zu aktualisieren, wenn eine Änderung an
Context
gemeldet wird, die ursprünglich anExoPlayer.Builder
übergeben wurde. - Fügen Sie
ExoPlayer.setVirtualDeviceId
hinzu, um die vomContext
abgeleitete virtuelle Geräte-ID, die anExoPlayer.Builder
übergeben wird, manuell zu aktualisieren. - Achte darauf, dass Renderer nicht mehr als 10 Sekunden vor dem Ende des aktuellen Elements Daten aus dem nächsten Playlist-Element abrufen.
- Fügen Sie
setSeekBackIncrementMs
,setSeekForwardIncrementMs
undsetMaxSeekToPreviousPositionMs
zuExoPlayer
hinzu, um diese Einstellungen nach der Erstellung zu aktualisieren (#2736). - Fügen Sie in
DefaultPreloadManager
eine Funktion für das Vorab-Caching hinzu. Apps können jetzt überTargetPreloadStatusControl.getTargetPreloadStatus(T rankingData)
DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)
oderDefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)
zurückgeben, um anzugeben, dass ein Media-Element vorab im Cache gespeichert werden muss. - Verwenden Sie die Pre-Caching-Funktion von
DefaultPreloadManager
in der Shortform-Demo-App. - Füge
DefaultLoadControl.Builder
-Setter für die lokale Wiedergabe hinzu und passe die Standardwerte vonDefaultLoadControl
so an, dass sie mit einer Vielzahl lokaler Dateien funktionieren. - Ein Fehler wurde behoben, bei dem der Player nach dem Festlegen einer leeren Playlist im Status
STATE_READY
oderSTATE_BUFFERING
verblieb. - Die APIs des Preload-Managers wurden verbessert:
- Fügen Sie
addMediaItems(List<MediaItem>, List<T>)
undaddMediaSources(List<MediaSource>, List<T>)
hinzu, um die Media-Elemente oder Media-Quellen im Batch hinzuzufügen undinvalidate()
automatisch aufzurufen. - Fügen Sie
removeMediaItems((List<MediaItem>)
undremoveMediaSources(List<MediaSource>)
hinzu, um die Media-Elemente oder Media-Quellen im Batch zu entfernen. Achten Sie darauf, dass der Preload-Manager nach dem Entfernen nicht mit dem Preload beginnt oder den Preload für eines der Elemente fortsetzt. DefaultPreloadManager.setCurrentPlayingIndex(int)
darf sich automatisch ungültig machen. Apps müsseninvalidate()
nicht mehr explizit aufrufen, nachdem der aktuelle Wiedergabeindex aktualisiert wurde.
- Fügen Sie
- Es ist jetzt möglich, das Zurücksetzen von Keyframes bei Vorwärtssuchen innerhalb derselben Gruppe von Bildern im Scrubbing-Modus zu überspringen.
- Fügen Sie
DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)
für Apps hinzu, um einen Wert für die Zielpufferbytes für einen Player mit dem angegebenenplayerName
festzulegen. DerDefaultLoadControl
kann jetzt Entscheidungen für jeden Player separat auf Grundlage der zugewiesenen Bytes und der Zielpufferbytes treffen. - Fügen Sie
SkipInfo
demAdPlaybackState.AdGroup
hinzu, um Informationen zum Überspringen für jede Anzeige in der Anzeigengruppe zu übertragen. - Ein Fehler wurde behoben, bei dem das Aufrufen von
removeMediaItems(List)
während der Wiedergabe eines Post-Roll-Ads zu einem Absturz führte (#2746). - Wir haben ein Problem behoben, durch das es bei der Wiedergabe von Playlists zu Rucklern kam, weil Frames fälschlicherweise immer als letztes Sample festgelegt und gerendert wurden.
- Wiederholungsversuch aktivieren, wenn der Player keine Audio-Sitzungs-ID generieren kann (#2382, #2678).
- Unterstützung zum Steuern der gesamten Pufferbytes für die Quellen in
DefaultPreloadManager
hinzugefügt, um zu verhindern, dass die gesamten Pufferbytes für das Vorladen beliebig ansteigen. Um die Standardsteuerungslogik zu verwenden, können Apps die Zielpufferbytes für das Vorabladen überDefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)
für einplayerName
vonPlayerId.Preload.name
(„preload“) festlegen und das erstellteDefaultLoadControl
überDefaultPreloadManager.Builder.setLoadControl(LoadControl)
einfügen.
- Eine Erkennung für hängende Player hinzufügen, die einen
- CompositionPlayer:
- Veröffentlichen Sie
CompositionPlayer
mit der neuen Anmerkung@ExperimentalApi
, um anzugeben, dass sie für Tests verfügbar ist, sich aber noch in der Entwicklung befindet. Einige APIs werden sich in zukünftigen Versionen wahrscheinlich erheblich ändern. Außerdem gibt es bekannte Probleme und Einschränkungen bei einigen Anwendungsfällen (einige sind nicht dokumentiert). - Unterstützung für
COMMAND_SET_AUDIO_ATTRIBUTES
und die Verarbeitung des Audiofokus inCompositionPlayer
hinzugefügt. - Unterstützung für das Ändern der Geschwindigkeit in sekundären Sequenzen in
CompositionPlayer
hinzugefügt.
- Veröffentlichen Sie
- Transformer:
InAppMp4Muxer
als Standard-Muxer verwenden.- Fügen Sie
EditedMediaItem.Builder#setSpeed()
hinzu und stellen SieEffects#createExperimentalSpeedChangingEffects()
ein. - Ersetzen Sie
forceAudioTrack
undforceVideoTrack
durchtrackTypes
inEditedMediaItemSequence
.
- Titelauswahl:
- Fügen Sie
TrackSelectionParameters.selectTextByDefault
hinzu, um die Auswahl eines beliebigen Text-Tracks zu bevorzugen, ohne andere spezifischere Einstellungen anzugeben. - Fügen Sie
preferredVideoLabels
,preferredAudioLabels
undpreferredTextLabels
inTrackSelectionParameters
hinzu, um eine Präferenz für Tracks mit einem bestimmten Label anzugeben, z. B. für Tracks, die aus HLS-NAME-Tags (#1666) gelesen werden.
- Fügen Sie
- Extraktoren:
- FLAC: Die Header-Erkennung wurde optimiert, um die Wahrscheinlichkeit zu verringern, dass in den codierten FLAC-Daten fälschlicherweise Header gefunden werden, was zu Decodierungsfehlern führt (#558).
- MP3: Lücken zwischen (und vor) ID3-Tags am Anfang von MP3-Dateien zulassen (#811, #5718).
- MP4: Unterscheide zwischen den MIME-Typen
audio/mpeg
(MP3),audio/mpeg-L1
undaudio/mpeg-L2
, indem du den Layer-Wert des ersten Samples prüfst, bevor du ein Trackformat vom Extractor ausgibst (#2683). - MP4: Die Effizienz des Sniffing-Vorgangs bei sehr großen Dateien wird verbessert, indem davon ausgegangen wird, dass ein
stbl
-Feld, das größer als 1 MB ist, bedeutet, dass die Datei nicht fragmentiert sein darf (#2650). - Matroska: Unterstützung für die DTS‑HD-Erkennung hinzugefügt (#6225).
- Ein Problem in
MatroskaExtractor
wurde behoben, bei dem die Suche bei Dateien mit mehreren Tracks ungenau sein konnte. Cue-Punkte sind jetzt korrekt den jeweiligen Tracks zugeordnet, was zu einer präziseren Suche führt. - MP4: Unterstützung für die Metadaten
©mvn
(Name der Bewegung) und©mvi
(Bewegungsindex) hinzugefügt. Diese werden jetzt alsTextInformationFrame
-Objekte inFormat.metadata
mit den IDsMVNM
bzw.MVIN
ausgegeben (#2754). - MPEG-TS: Fehler
IllegalArgumentException
ausReorderingBufferQueue
behoben, der durch PES-Pakete ohne Zeitstempel verursacht wurde (#2764). - MP4: Tracks mit fehlendem
stsd
-Feld werden ignoriert (anstatt die gesamte Datei nicht zu parsen). - Unterstützung für das Extrahieren von HEIC-Bewegungsfotos hinzugefügt. Die
HeifExtractor
kann jetzt HEIC-Dateien mit eingebetteten Video- und Audiotracks parsen. - MP3: Ändern Sie
FLAG_ENABLE_INDEX_SEEKING
, um die Suche nach Informationen aus Metadaten-Headern (wie Xing und VBRI) zu bevorzugen, sofern verfügbar. Wenn keine anderen Suchinformationen vorhanden sind, wird auf die indexbasierte Suche zurückgegriffen. Dadurch wird die Leistung für Dateien mit Suchmetadaten verbessert (#2839).
- Prüfer:
- Ein neues
:media3-inspector
-Modul wurde eingeführt, das als dedizierter Ort für Media-Prüftools dient. Dieses Modul enthält jetzt eine neueandroidx.media3.inspector.MetadataRetriever
, die eine einheitliche API für die Metadaten- und Frame-Extraktion bietet. Die vorhandeneandroidx.media3.exoplayer.MetadataRetriever
wird zugunsten dieser neuen Version eingestellt. - Einführung von
androidx.media3.inspector.FrameExtractor
, einer neuen öffentlichen API für die Frame-Extraktion. DieseAutoCloseable
-Klasse bietet eine Möglichkeit, Frames mit Unterstützung für HDR-Video, Videoeffekte und die Auswahl benutzerdefinierter Decoder zu extrahieren. Es sollte über dasBuilder
für ein bestimmtesMediaItem
erstellt werden. - FrameExtractor: Mit
getThumbnail()
kann ein repräsentativer Miniaturbild-Frame aus einer Media-Datei extrahiert werden, ohne dass ein bestimmter Zeitstempel erforderlich ist.
- Ein neues
- Audio:
AudioProcessor
-Instanzen über die Suche informieren- Ermöglicht das Einfügen der neuen
AudioOutputProvider
-Schnittstelle inDefaultAudioSink.Builder
zur Unterstützung benutzerdefinierter Audioausgabepfade. Der Standardwert istAudioTrackAudioOutputProvider
. - Suche in
GainProcessor
. - AC‑4‑Decoderprofil- und ‑pegel-Funktionen bei der Bewertung der Unterstützung von Trackformaten nutzen (#2580).
- Potenzielle Verzögerungen durch die Verarbeitung von Rückrufen für Routing-Änderungen zu Beginn der Wiedergabe vermeiden (#2646).
- Wiederverwendung von Codecs für die Formate EAC3, EAC3-JOC und AC-4 zulassen (#1346).
- Unterstützung für Float-PCM-Samples in
Sonic
hinzugefügt. - Unterstützung für 16-Bit-PCM-Samples in
ToFloatPcmAudioProcessor
hinzugefügt.
- Video:
- Deaktivieren Sie die Codec-Wiederverwendung für Dolby Vision-Inhalte mit unterschiedlichen Profilen.
- Text:
- Die Analyse von CEA-608/708-Untertiteln in Dolby Vision-Inhalten wurde korrigiert (#2775).
- Bild:
- Ein Problem mit „ScrubbingMode“ wurde behoben, bei dem der Player beim Scrubben eines DASH-Thumbnail-Tracks hängen blieb (#2815).
- DRM:
- Der Rückgabetyp von
MediaDrmCallback
-Methoden wird vonbyte[]
in einen neuenMediaDrmCallback.Response
-Typ geändert, um die Rückgabe zusätzlicher optionaler Informationen zu ermöglichen. Dies ist eine Quelländerung, die zu Problemen führen kann. Diese lassen sich jedoch leicht beheben, indem Sie den vorherigen Rückgabewertbyte[]
vor der Rückgabe mitnew Response
umschließen. - Fügen Sie Informationen zur Schlüsselanfrage wie URL und Latenz zu
AnalyticsListener.onDrmKeysLoaded
hinzu (#1001). - Daten der Bereitstellungsanfrage von einem URL-Parameter in den POST-Hauptteil verschieben.
- Der Rückgabetyp von
- Muxer:
- Fügen Sie
MediaMuxerCompat
hinzu, einen Drop-in-Ersatz für das FrameworkMediaMuxer
. - Fügen Sie
MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo()
hinzu, um die Erstellung von Bewegtbildfotos zu ermöglichen. - Fügen Sie
WebmMuxer
hinzu, um das Multiplexen vonOPUS
-,VORBIS
-,VP8
- undVP9
-Medienstreams in das Dateiformatwebm
zu ermöglichen.
- Fügen Sie
- IMA-Erweiterung:
- Benutzerdefinierte ProGuard-Regeln werden entfernt, damit Apps stattdessen die im IMA-Android-Archiv veröffentlichten Regeln verwenden können.
ImaServerSideAdInsertionUriBuilder.setNetworkCode
: Neue API zum Festlegen des Google Ad Manager-Netzwerkcodes für das IMA SDK, damit Anzeigenkennungen wie in den Google Ad Manager-Einstellungen angegeben verarbeitet werden. Netzwerkcodes sind optional, werden aber für Anfragen für Full-Service-Streams empfohlen. Informationen dazu, wie du den Netzwerkcode ermittelst, findest du in diesem Artikel.- Die IMA-Abhängigkeit wurde auf Version 3.37.0 aktualisiert. Dazu ist es erforderlich, das Desugaring der Core-Bibliothek zu aktivieren. Dies muss auch von abhängigen Apps aktiviert werden. Weitere Informationen finden Sie in den Konfigurationshinweisen von IMA.
- Unterstützung von benutzerdefinierten IMA DAI-UI-Optionen im SSAI-URI-Generator. Zu den benutzerdefinierten UI-Optionen für die serverseitige dynamische Anzeigenbereitstellung gehören die Unterstützung für das Rendern von „Überspringbar“ und „Informationen zur Anzeige“. Die Funktion ist derzeit für ausgewählte Publisher verfügbar, die auf einer Zulassungsliste stehen. Durch diese Änderung wird auch die IMA SDK-Version auf 3.38.0 aktualisiert (Versionshinweise), um auf die API für benutzerdefinierte UI-Optionen zuzugreifen.
- Sitzung:
- Neuer Parameter für
MediaSession.Callback.onPlaybackResumption
, um anzugeben, ob der Aufruf nur zum Erfassen von Informationen oder zum Starten der Wiedergabe erfolgt (#1764). - Aktualisiere
MediaSession.ControllerInfo.isTrusted
, um auch Controller aus der eigenen App als vertrauenswürdig zu deklarieren (#2542). - Fügen Sie
MediaSessionService.triggerNotificationUpdate
hinzu, um eine Benachrichtigungsaktualisierung manuell auszulösen (#1833). ProgressListener
wurde benutzerdefinierten Befehlsmethoden hinzugefügt.- Ändern Sie den Standardwert für
MediaLibrarySession.Builder.setLibraryErrorReplicationMode
in „nicht schwerwiegend“. - Fügen Sie der Funktion
MediaButtonReceiver.onForegroundServiceStartNotAllowedException
einenContext
-Parameter hinzu (#2625). - Die Lautstärkeregelungs-ID wird von der Plattform
PlaybackInfo
gelesen, anstatt sie über den Binder abzurufen. So wird sichergestellt, dass Wiedergabetyp und Lautstärkeregelungs-ID atomar gelesen werden und zueinander passen. - Es wurde ein Fehler behoben, bei dem
ACTION_UP
-Schlüsselereignisse herausgefiltert wurden, bevor sie zur benutzerdefinierten Verarbeitung an den Callback übergeben wurden. Dadurch wird die Parität mit dem erreicht, was media1 getan hat und was die Plattform tut (#2637). - Ein Fehler wurde behoben, bei dem
getCurrentTimeline()
vonPlayerWrapper
aufgerufen wurde, auch wenn der Befehl nicht verfügbar ist (#2665). - Ein Fehler wurde behoben, bei dem eine Nachricht in der Nachrichtenwarteschlange des Hauptloopers verblieb, was nach dem Beenden des Dienstes zu einem Speicherleck führte (#2692).
- Wenn eine Verbindung zu einer alten Sitzungs-App mit einem
MediaBrowser
besteht, werden benutzerdefinierte Befehle nur dann an die Sitzung gesendet, wenn die benutzerdefinierte Aktion inPlaybackStateCompat
der alten Sitzung als benutzerdefinierte Aktion beworben wird. Alle anderen benutzerdefinierten Aktionen werden an den Dienst gesendet. onAudioSessionIdChanged
wurde implementiert, um Media-Controller zu benachrichtigen, wenn eine Audio-Sitzungs-ID von der Sitzung festgelegt wird (#244).- Ein Fehler wurde behoben, bei dem
KEYCODE_HEADSETHOOK
den Player nicht gestartet hat, nachdem das Media-SchlüsselereignisIntent
inonStartCommand()
eingetroffen ist. Das Problem wird behoben, indem „KEYCODE_HEADSETHOOK“ wieKEYCODE_MEDIA_PLAY_PAUSE
(#2816) behandelt wird. - Es wurde ein Fehler behoben, bei dem die Größe der Oberfläche nicht zwischen der Sitzung und dem Controller kommuniziert wurde. Dadurch konnten in der Demo-Sitzung keine Videoeffekte angewendet werden. Wenn Sie einen Controller verwenden, kann dies eine schwerwiegende Änderung sein, wenn Ihr Player keinen
setVideoSurfaceHolder
-Aufruf verarbeiten kann. - Die Weitergabe von Nicht-
String
-CharSequence
-Metadatenwerten wie span-formatierten Strings wurde korrigiert (#2853).
- Neuer Parameter für
- UI:
- Fügen Sie dem Modul
media3-ui-compose
die KlasseProgressStateWithTickInterval
und das entsprechende ComposablerememberProgressStateWithTickInterval
hinzu. Dieser Status-Holder wird indemo-compose
verwendet, um die aktuelle Position und Dauer in Textform anzuzeigen. - Fügen Sie
MuteButtonState
zuui-compose
hinzu, um die Stummschaltung desPlayer
-Volumes zu verarbeiten. Dieser Status-Holder wird indemo-compose
verwendet, um die Ein/Aus-Schaltfläche für die Stummschaltung anzuzeigen. - Fügen Sie dem Modul
media3-ui-compose
dieProgressStateWithTickCount
-Klassen und die entsprechenderememberProgressStateWithTickCount
-Composable hinzu. Dieser Status-Holder wird indemo-compose
verwendet, um den Fortschritt als horizontalen schreibgeschützten Fortschrittsbalken anzuzeigen. - Fügen Sie
ContentFrame
Composable zumedia3-ui-compose
hinzu. Dadurch wird die Verwaltung vonPlayerSurface
mit dem Anpassen des Seitenverhältnisses und dem Abdecken mit einem Verschluss kombiniert. - Umgehen eines bekannten Plattformfehlers in API 34, der dazu führt, dass Videos gestreckt oder zugeschnitten werden, wenn
SurfaceView
in einem Compose-AndroidView
verwendet wird. Dies betrifft daher die ComposablesContentFrame
undPlayerSurface
mitSURFACE_TYPE_SURFACE_VIEW
(#1237, #2811). - Erstelle ein neues
media3-ui-compose-material3
-Modul und füge ihm Composables mit Material3-Design hinzu (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton). - Unterstützung für das Platzieren einer Schaltfläche für die Media-Route in
PlayerView
hinzugefügt.
- Fügen Sie dem Modul
- HLS-Erweiterung:
- HLS-Attribute zum Überspringen von Interstitials parsen.
- Ordnen Sie die Attribute für die Überspringen-Steuerung aus der HLS-Playlist und dem Asset-Listendokument dem
AdPlaybackState
für den öffentlichen Zugriff zu. - Ein Fehler wurde behoben, durch den die Startzeit der Playlist verloren ging, wenn das Tag EXT-X-PROGRAM-START-DATE, das die Startzeit definiert, aus einer Playlist entfernt wurde (#2760).
- Verwenden Sie die binäre Suche, um den Segmentindex einer bestimmten Position in der Playlist zu finden (#2826).
- DASH-Erweiterung:
- Problem mit
UnsupportedOperationException
bei der Wiedergabe von DASH-Streams mit einem nicht hierarchischendata:
-URI-Manifest behoben (#2688). - Setzen Sie
LiveConfiguration
auf den Wert zurück, der von derMediaItem
derDashMediaSource
bei der Veröffentlichung und bei der Aktualisierung des Media-Elements durch den Nutzer bereitgestellt wird (#2606). - Abstürze vermeiden, die durch ungültige Manifestaktualisierungen verursacht werden, die nicht als Player-Fehler gemeldet wurden (#2805).
- Problem mit
- RTSP-Erweiterung:
- Fehlerbehandlung für fehlende RTP-Pakete bei der Verarbeitung fragmentierter NAL-Einheiten für H264 und H265 (#2613).
- Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
- AV1-Erweiterung: Der AV1-Softwaredecoder verwendet jetzt die leistungsstarke
dav1d
-Bibliothek. Die vorherigelibgav1
-Implementierung wurde ersetzt, um die Decodierungsgeschwindigkeit zu verbessern.
- AV1-Erweiterung: Der AV1-Softwaredecoder verwendet jetzt die leistungsstarke
- Cast-Erweiterung:
- Füge
CastPlayer.Builder
hinzu, damitCastPlayer
sowohl die lokale als auch die Cast-Wiedergabe ausführen kann. Wenn Sie das alteCastPlayer
-Verhalten beibehalten möchten, bei dem nur die Cast-Wiedergabe unterstützt wird, können SieRemoteCastPlayer
verwenden. Die vorhandenenCastPlayer
-Konstruktoren behalten ihr altes Verhalten bei, sind aber zugunsten der Verwendung derCastPlayer
- oderRemoteCastPlayer
-Builder veraltet. - Die Erzwingung eines MIME-Typs, der nicht null ist, in
DefaultMediaItemConverter
wird beendet. - Verwende
MediaItem.mediaMetadata.mediaType
, um den MEDIA_TYPE für Cast abzuleiten, der inDefaultCastOptionsProvider#toMediaQueueItem
verwendet werden soll, sofern verfügbar. - Aktiviere die Übertragung von Inhalten von einem Remote-Gerät auf ein lokales Gerät in
DefaultCastOptionsProvider
. - Unterstützung für Cast in der Sitzungsdemo hinzugefügt
- Unterstützung für die Anzeige einer Schaltfläche für die Media-Route in einer zusammensetzbaren Benutzeroberfläche hinzugefügt.
- Unterstützung für die Anzeige einer Schaltfläche für die Media-Route in einem Menü der Aktionsleiste hinzugefügt.
- Unterstützung für die Anzeige einer Schaltfläche für die Media-Route als View-UI hinzugefügt.
- Füge
- Test-Tools:
- Fügen Sie die maximale Zeitdifferenz für das automatische Vorrücken von
FakeClock
hinzu. Der Standardwert ist 1 Sekunde, er kann aber überFakeClock.Builder
konfiguriert werden. - Fügen Sie die maximale Zeitdifferenz zwischen Nachrichten für
RobolectricUtil.runMainLooperUntil
(undrunLooperUntil
) hinzu. Der Standardwert ist 1 Sekunde, kann aber über neue Überladungen dieser Methoden konfiguriert werden. - Verschiebe
CapturingRenderersFactory
vontest-utils
nachtest-utils-robolectric
.
- Fügen Sie die maximale Zeitdifferenz für das automatische Vorrücken von
- Entfernen Sie die veralteten Symbole:
- Entfernen Sie den eingestellten Konstruktor
DefaultPreloadManager
. Verwenden Sie stattdessenDefaultPreloadManager.Builder
. - Veraltete
EditedMediaItemSequence
-Konstruktoren wurden entfernt. Verwenden Sie stattdessenEditedMediaItemSequence.Builder
.
- Entfernen Sie den eingestellten Konstruktor
Version 1.8.0
Version 1.8.0
30. Juli 2025
Version 1.8.0 enthält diese Commits.
- Gemeinsame Mediathek:
- Unterstützung für das Ersetzen des Players in
ForwardingSimpleBasePlayer
hinzugefügt.
- Unterstützung für das Ersetzen des Players in
- ExoPlayer:
- Getter für den Zufallsmodus zur
ExoPlayer
-Schnittstelle hinzufügen (#2522). - Es wird deutlicher eine Ausnahme ausgelöst, wenn auf
DefaultAudioSink
über mehrere Threads zugegriffen wird. Wenn dies aufgrund eines Aufrufs vonRendererCapabilities.getFormatSupport
außerhalb des Players geschieht, rufen Sie diese Methode im selben Thread wie den Wiedergabe-Thread von ExoPlayer auf oder verwenden Sie eine andere Instanz als die für die Wiedergabe verwendete (#1191). - Ein Fehler wurde behoben, durch den Nicht-Stereo-Audioformate auf Fernsehern möglicherweise als nicht unterstützt von
DefaultTrackSelector
gekennzeichnet wurden. - Achte darauf, dass der letzte Frame korrekt gerendert wird, wenn du das
DECODE_ONLY
-Flag von MediaCodec verwendest (das im Scrubbing-Modus standardmäßig aktiviert ist). - Unterstützung für die Verwendung der virtuellen Geräte-ID aus dem
Context
, die anExoPlayer.Builder
übergeben wird, hinzufügen. - Dynamische Planung im Scrubbing-Modus standardmäßig aktivieren
- Vermeide unnötiges Neuladen einer Quelle, wenn du zum Ende eines Elements springst.
- Standardmäßig
MediaCodec.BUFFER_FLAG_DECODE_ONLY
im Scrubbing-Modus verwenden - Löst
IllegalStateException
aus, wennPreloadMediaSource
von einemExoPlayer
mit einem Wiedergabethread wiedergegeben wird, der sich vom Preload-Thread unterscheidet (#2495). cloneAndMove
zuShuffleMode
mit einer Standardimplementierung hinzufügen (#2226).- Das Standardverhalten von
Renderer.getMinDurationToProgressUs
wird so geändert, dass ein größerer Wert zurückgegeben wird, wenn kein Aufruf vonrender
erforderlich ist. - Es wurde ein Fehler behoben, durch den die interne Planung den letzten Frame verzögerte, wenn während der Pause zum Ende gesucht wurde. Der Fehlerkorrektur ist derzeit nur wirksam, wenn
ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled
aktiviert ist. - Die Methode
ExoPlayer.setScrubbingModeEnabled(boolean)
wurde hinzugefügt. Dadurch wird der Player für viele häufige Suchvorgänge optimiert, z. B. wenn ein Nutzer den Scrubbing-Balken zieht. Das Verhalten des Scrubbing-Modus kann mitsetScrubbingModeParameters(..)
aufExoPlayer
undExoPlayer.Builder
angepasst werden. - Anpassen der Toleranz für die Suche nach Bruchteilen im Scrubbing-Modus zulassen.
- Die Codec-Betriebsrate im Scrubbing-Modus wurde erhöht.
- Es wurde ein Fehler behoben, bei dem Vorbereitungsfehler im Inhalt von
AdsMediaSource
möglicherweise nie gemeldet wurden (#2337). - Speicherleck in
MergingMediaSource
behoben, das z. B. beim Sideloading von Untertiteln verwendet wird (#2338). - Ermöglichen Sie, dass
CmcdConfiguration.Factory
null
zurückgibt, um das CMCD-Logging für bestimmte Media-Elemente zu deaktivieren (#2386). - Die Standardgröße des Bildpuffers wurde von 128 KB (Kopierfehler aus Text-Tracks) auf 26 MB erhöht. Das ist groß genug für Ultra-HDR-Bilder mit 50 MP (#2417).
- Füge
PreCacheHelper
hinzu, damit Apps ein einzelnes Medium mit einer bestimmten Startposition und Dauer vorab im Cache speichern können. - Unterstützung für das Vorladen ab einer bestimmten Position in
DefaultPreloadManager
hinzugefügt.
- Getter für den Zufallsmodus zur
- Transformer:
CodecDbLite
hinzugefügt, um chipsatzspezifische Optimierungen der Video-Codierungseinstellungen zu ermöglichen.- Fügen Sie dem
DefaultEncoderFactory
das FlagsetEnableCodecDbLite
hinzu, um die Optimierung der CodecDB Lite-Einstellungen zu aktivieren. Dieses Flag ist standardmäßig auf „false“ gesetzt. - Wenn Sie eine anfängliche Lücke (die über
addGap()
hinzugefügt wurde) mit stummem Audio füllen möchten, müssen Sie jetztexperimentalSetForceAudioTrack(true)
inEditedMediaItemSequence.Builder
explizit festlegen. Wenn sich die Lücke in der Mitte der Sequenz befindet, ist dieses Flag nicht erforderlich. - Verschieben Sie die
Muxer
-Schnittstelle vonmedia3-transformer
nachmedia3-muxer
. - Die Einstellung
MediaItem.Builder().setImageDuration(long)
ist jetzt erforderlich, um ein Media-Element als Bild zu importieren. - Füge
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean)
hinzu. Diese enthält eine MP4-Bearbeitungsliste, die Playern mitteilt, dass sie Samples zwischen dem Keyframe vor dem Startpunkt des Schnitts und dem Startpunkt des Schnitts ignorieren sollen. - Die Composition Demo-App wurde aktualisiert, um Kotlin und Jetpack Compose zu verwenden. Außerdem wurde ein benutzerdefiniertes
VideoCompositorSettings
hinzugefügt, um Sequenzen in einem 2×2- oder BiB-Layout anzuordnen.
- Extraktoren:
- Metadaten aus fragmentierten MP4-Dateien parsen (#2084)
- JPEG: Unterstützung von Fotos mit Bewegtbild, die kein EXIF-Segment am Anfang haben (#2552).
- Unterstützung für das Suchen in fragmentierten MP4-Dateien mit mehreren
sidx
-Atomen hinzugefügt. Dieses Verhalten kann mit dem FlagFLAG_MERGE_FRAGMENTED_SIDX
inFragmentedMp4Extractor
aktiviert werden (#9373). - Leere Suchtabellen in FLAC-Dateien (einschließlich solcher, die nur Platzhalter-Suchpunkte enthalten) werden ignoriert und es wird auf die binäre Suche zurückgegriffen, wenn die Dauer der Datei bekannt ist (#2327).
- Das Parsen von H.265‑SEI-Einheiten wurde korrigiert, um unbekannte SEI-Typen vollständig zu überspringen (#2456).
- Aktualisieren Sie
WavExtractor
, damit die SubFormat-Daten der Header-Erweiterung für das Audioformat verwendet werden, wenn eine Datei vom TypWAVE_FORMAT_EXTENSIBLE
geparst wird. - MP4: Unterstützung für die Felder
ipcm
undfpcm
zum Definieren von PCM-Rohaudiotracks (64-Bit-Gleitkomma-PCM wird nicht unterstützt). - MP4: Verarbeitet den Rotationsanteil von
tkhd
-Transformationsmatrizen, die das Video sowohl drehen als auch spiegeln. So wird dafür gesorgt, dass mit der nach vorn gerichteten iPhone-Kamera aufgenommene gespiegelte Videos richtig ausgerichtet, aber falsch an der Y-Achse gespiegelt werden (#2012). - MP3: Verwenden Sie Dauer und Datengröße aus nicht suchbaren Xing-, VBRI- und ähnlichen Metadaten mit variabler Bitrate, wenn aufgrund von
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)
(#2194) auf die Suche mit konstanter Bitrate zurückgegriffen wird.
- Audio:
- Ein Fehler wurde behoben, bei dem
AnalyticsListener.onAudioPositionAdvancing
nicht aufgerufen wurde, wenn die Audiowiedergabe sehr kurz vor dem Ende der Medien gestartet wurde. - Unterstützung für alle linearen PCM-Beispielformate in
ChannelMappingAudioProcessor
undTrimmingAudioProcessor
hinzugefügt. - Unterstützung für Audio-Lücken in
CompositionPlayer
hinzugefügt. - Entferne den fälschlichen Anruf an
BaseAudioProcessor#flush()
vonBaseAudioProcessor#reset()
. - Konstantes Power-Upmixing/Downmixing in DefaultAudioMixer zulassen.
ChannelMappingAudioProcessor
,TrimmingAudioProcessor
undToFloatPcmAudioProcessor
öffentlich machen (#2339).- Verwenden Sie
AudioTrack#getUnderrunCount()
inAudioTrackPositionTracker
, um Unterläufe inDefaultAudioSink
zu erkennen, anstatt eine Schätzung nach dem Best-Effort-Prinzip zu verwenden. - Die Glättung von Audio-Zeitstempeln wurde verbessert, um unerwartete Positionsabweichungen des Audioausgabegeräts zu berücksichtigen.
- Es wurde ein Fehler behoben, bei dem die A/V-Synchronisierung in den ersten 10 Sekunden nach dem Fortsetzen der Wiedergabe nach einer Pause unterbrochen wurde, wenn das Gerät mit Bluetooth-Geräten verbunden war.
- Es wurde ein Fehler behoben, durch den
AnalyticsListener.onAudioPositionAdvancing
nicht die Zeit angab, zu der die Audioausgabe begann, sondern die Zeit der ersten Messung. - Problem behoben, bei dem die Wiederherstellung von Mehrkanal-Audio nach dem Fallback auf Stereo-Audio auf einigen Geräten nicht funktionierte (#2258).
- Ein Fehler wurde behoben, bei dem
- Video:
- Problemumgehung für abgelöste Oberflächen auf Geräten von Lenovo und Motorola erweitert (#2059).
- Die reibungslose Videofreigabe bei der Initialisierung wurde verbessert, wenn Audio-Samples nicht genau an der angeforderten Position beginnen.
- Workaround für abgelöste Oberflächen auf Realme-Geräten ausweiten (#2059).
- Experimentelle
ExoPlayer
-API hinzugefügt, um das FlagMediaCodec.BUFFER_FLAG_DECODE_ONLY
beim Einreihen von Eingabepuffern nur für die Decodierung zu verwenden. Dieses Flag weist den Decoder an, die reinen Decodierungspuffer zu überspringen, was zu einem schnelleren Suchen führt. Aktivieren Sie die Funktion mitDefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag
. - Verbesserte Codec-Leistungsprüfungen für Software-Video-Codecs. Dies kann dazu führen, dass einige zusätzliche Tracks als
EXCEEDS_CAPABILITIES
markiert werden. - Problem behoben, bei dem es auf einigen Geräten zu VP9-Widevine-Wiedergabefehlern kam (#2408).
- Text:
- Unterstützung für VobSub-Tracks in MP4-Dateien hinzugefügt (#2510).
- Ein Wiedergabestopp wurde behoben, der auftrat, wenn ein Untertitelsegment zuerst nicht geladen werden konnte, dann aber erfolgreich geladen wurde, gefolgt von mehreren leeren Untertitelsegmenten (#2517).
- Das Problem, dass bei SSA- und SubRip-Dateien kein Cue für den Fortschritt angezeigt wurde, wenn Untertitel aktiviert wurden, wurde behoben (#2309).
- Das Problem, dass die Wiedergabe beim Wechsel von einem Stream mit Untertitel-Fehler zu einem Livestream mit einem leeren Untertitel-Track hängen bleibt, wurde behoben (#2328).
- Es wurde ein Fehler behoben, durch den CEA-608-Untertitel bei der Wiedergabe von H.262-Streams mit B-Frames verstümmelt wurden (#2372).
- Unterstützung für SSA-Untertitel mit
CodecId = S_TEXT/SSA
in Matroska-Dateien hinzugefügt. Bisher wurde inMatroskaExtractor
nurCodecId = S_TEXT/ASS
unterstützt, was die „erweiterte“ (v4+) Variante von SubStation Alpha-Untertiteln darstellen soll. Die Parsing-Logik von ExoPlayer ist jedoch für beide Varianten gleich (#2384). - Unterstützung für das Attribut
layer
in SubStation Alpha-Untertiteldateien (SSA) hinzugefügt, mit dem die Z-Reihenfolge von Cues definiert wird, wenn mehrere gleichzeitig auf dem Bildschirm angezeigt werden (#2124).
- Metadaten:
- Die Unterstützung für das Abrufen der Medienlänge und
Timeline
fürMetadataRetriever
wurde hinzugefügt und zur instanzbasiertenAutoCloseable
API migriert. Verwenden Sie die neueBuilder
, um eine Instanz für eineMediaItem
zu erstellen, und rufen Sie dannretrieveTrackGroups()
,retrieveTimeline()
undretrieveDurationUs()
auf, umListenableFuture
s für die Metadaten abzurufen. Die bisherigen statischen Methoden sind jetzt veraltet (#2462).
- Die Unterstützung für das Abrufen der Medienlänge und
- Bild:
- Beschränken Sie die decodierten Bitmaps auf die Displaygröße in
BitmapFactoryImageDecoder
, um zu vermeiden, dass eine App mitCanvas: trying to draw too large bitmap.
ausPlayerView
abstürzt, wenn versucht wird, sehr große Bilder (z.B. 50 MP) anzuzeigen. - Ändern Sie die Signatur von
DefaultRenderersFactory.getImageDecoderFactory()
, sodass sie einenContext
-Parameter akzeptiert. - Richten Sie die maximale Bitmap-Ausgabegröße, die in
CompositionPlayer
verwendet wird, an der Größe aus, die bereits inTransformer
verwendet wird. Das bedeutet, dass beiCompositionPlayer
im Gegensatz zuExoPlayer
die Displaygröße beim Decodieren von Bitmaps nicht berücksichtigt wird.
- Beschränken Sie die decodierten Bitmaps auf die Displaygröße in
- DRM:
- Es wurde eine neue Überladung von
OfflineLicenseHelper.newWidevineInstance
hinzugefügt, die einMediaItem.DrmConfiguration
akzeptiert, damit HTTP-Anfrageheader korrekt angewendet werden können (#2169).
- Es wurde eine neue Überladung von
- Wirkung:
- Fügen Sie
Presentation.createForShortSide(int)
hinzu, um einPresentation
zu erstellen, bei dem die kürzeste Seite immer dem angegebenen Wert entspricht, unabhängig von der Ausrichtung der Eingabe.
- Fügen Sie
- Muxer:
- Ein Fehler wurde behoben, bei dem für Audio-Samples in fragmentierten MP4-Dateien nicht die richtigen Sample-Flags festgelegt wurden.
- Die
writeSampleData()
API verwendet jetzt die muxerspezifischeBufferInfo
-Klasse anstelle vonMediaCodec.BufferInfo
. - Fügen Sie
Muxer.Factory#supportsWritingNegativeTimestampsInEditList
hinzu, das standardmäßig auf „false“ gesetzt ist.
- IMA-Erweiterung:
- Ein Fehler wurde behoben, durch den ein Ladefehler in einer Anzeige versehentlich eine andere Anzeigengruppe ungültig machen konnte.
- Es wurde ein Fehler behoben, durch den die Wiedergabe von Anzeigengruppen nach dem Ende eines VOD-Fensters angehalten wurde.
Anzeigengruppen mit einer Startzeit nach dem Fenster werden nicht mehr in die
MediaPeriodQueue
eingereiht (#2215).
- Sitzung:
- Es wurde ein Fehler behoben, bei dem Verbindungen von nicht privilegierten Media3-Controllern von Drittanbietern ignoriert wurden.
- Die Prüfung auf verfügbare Befehle wird entfernt, wenn benutzerdefinierte Befehle an ein altes
MediaBrowserServiceCompat
gesendet werden. Das Verhalten entspricht dem von älteren Controllern/Browsern, wenn sie mit einer älteren App verbunden sind. - Ein Fehler wurde behoben, der dazu führte, dass der erste Wiedergabefehler eines Nutzers fälschlicherweise als dauerhafte benutzerdefinierte Ausnahme behandelt wurde. Dadurch kann sich die Anwendung nicht erholen.
- Es wurde ein Fehler behoben, bei dem einige Controller-Änderungen, die nicht von der Sitzung verarbeitet werden,
IllegalStateExceptions
verursachen konnten. - Es wurde ein Fehler behoben, bei dem Controlleraktionen, die nicht von der Sitzung verarbeitet werden, den Controller in einem ungültigen Zustand hinterlassen konnten.
- Warnung zu StrictMode-Verstoß bei unsicherem Start behoben (#2330).
- Es wurde ein Fehler behoben, bei dem der Aufruf von
setSessionExtras
über den Hauptthread beim Ausführen des Players über einen anderen Anwendungs-Thread als den Hauptthread zu einemIllegalStateException
geführt hat (#2265). - Es wird nicht automatisch eine Benachrichtigung angezeigt, wenn ein Player mit Media-Elementen eingerichtet wird, ohne sie vorzubereiten oder abzuspielen (#2423https://github.com/androidx/media/issues/2423). Dieses Verhalten kann über
MediaSessionService.setShowNotificationForIdlePlayer
konfiguriert werden. - Fügen Sie allen oder ausgewählten Controllern benutzerdefinierte
PlaybackException
hinzu. - Ein Fehler wurde behoben, durch den das Suchen in einem Livestream auf einem
MediaController
zu einemIllegalArgumentException
führen konnte. - Bei Livestreams wird die Veröffentlichung einer Wiedergabeposition und die Möglichkeit, im aktuellen Element für Media-Controller der Plattform zu suchen, beendet, um Positionsartefakte in der Android Auto-Benutzeroberfläche (und anderen Controllern, die diese Informationen aus der Media-Sitzung der Plattform verwenden) zu vermeiden (#1758).
- Ein Fehler wurde behoben, bei dem das Übergeben von „null“ in
getLibraryRoot
einerMediaBrowser
, die mit einer altenMediaBrowserServiceCompat
verbunden ist, zu einerNullPointerException
führte. - Ein Fehler wurde behoben, durch den das Senden benutzerdefinierter Aktionen, eines Suchergebnisses oder einer „getItem“-Anfrage die Legacy-Sitzungs-App mit einem
ClassNotFoundException
zum Absturz brachte. - Es wurde ein Fehler behoben, durch den
MediaItem.LocalConfiguration.uri
für dieMediaMetadata
der Plattform-Sitzungen freigegeben wurde. Wenn Sie absichtlich einen URI freigeben möchten, damit Controller die Medien noch einmal anfordern können, legen Sie stattdessenMediaItem.RequestMetadata.mediaUri
fest.
- UI:
- Ein Fehler wurde behoben, durch den
PlayerSurface
in wiederverwendbaren Komponenten wieLazyColumn
nicht richtig funktionierte (#2493). - Es wurde ein Fehler in Compose behoben, der zu einer Lücke zwischen dem Festlegen der anfänglichen Schaltflächenstatus und dem Beobachten der Statusänderung (z.B. Symbolformen oder Aktivierung) geführt hat. Änderungen, die außerhalb des Beobachtungszeitraums am Player vorgenommen wurden, werden jetzt berücksichtigt (#2313).
- Fügen Sie dem
media3-ui-compose
-Modul Status-Holder und Composables fürSeekBackButtonState
undSeekForwardButtonState
hinzu. - Unterstützung für den Scrubbing-Modus von ExoPlayer für
PlayerControlView
hinzugefügt. Wenn diese Option aktiviert ist, wird der Player in den Scrubbing-Modus versetzt, wenn der Nutzer beginnt, die Scrubbing-Leiste zu ziehen. Für jede Bewegung wird einplayer.seekTo
-Aufruf ausgegeben. Der Scrubbing-Modus wird beendet, wenn die Berührung vom Bildschirm entfernt wird. Diese Integration kann entweder mittime_bar_scrubbing_enabled = true
in XML oder mit der MethodesetTimeBarScrubbingEnabled(boolean)
aus Java/Kotlin aktiviert werden. PlayerSurface
soll ein Argument vom Typ „nullable“Player
akzeptieren.
- Ein Fehler wurde behoben, durch den
- Downloads:
- Unterstützung für partielle Downloads für progressive Streams hinzugefügt. Apps können mit
DownloadHelper
einen progressiven Stream vorbereiten und mit Angabe der zeitbasierten Media-Start- und ‑Endpositionen, die der Download abdecken soll, eineDownloadRequest
vom Helper anfordern. Die zurückgegebeneDownloadRequest
enthält den aufgelösten Bytebereich, mit dem einProgressiveDownloader
erstellt und der Inhalt entsprechend heruntergeladen werden kann. - Fügen Sie
DownloadHelper.Factory
hinzu, durch die die statischenDownloadHelper.forMediaItem()
-Methoden ersetzt werden. - Fügen Sie
Factory
fürSegmentDownloader
-Implementierungen hinzu. - Unterstützung für partielle Downloads für adaptive Streams hinzugefügt. Apps können einen adaptiven Stream mit
DownloadHelper
vorbereiten und mit Angabe der zeitbasierten Start- und Endpositionen der Medien, die der Download abdecken soll, eineDownloadRequest
vom Helfer anfordern. Der zurückgegebeneDownloadRequest
enthält den aufgelösten Zeitraum, mit dem ein konkreterSegmentDownloader
erstellt und der Inhalt entsprechend heruntergeladen werden kann.
- Unterstützung für partielle Downloads für progressive Streams hinzugefügt. Apps können mit
- Cronet-Erweiterung:
- Automatische Cookie-Verarbeitung hinzufügen (#5975).
- HLS-Erweiterung:
- Es wurde ein Fehler behoben, bei dem
HlsSampleStreamWrapper
versucht, im Puffer zu suchen, wenn keine Chunks im Puffer verfügbar sind. #2598 - Ein Fehler wurde behoben, durch den sich die Auswahl des Tracks nach dem Laden von Teilen mit geringer Latenz ändert. Außerdem kann es durch Preload-Hinweise dazu kommen, dass die Wiedergabe hängen bleibt oder einfriert (#2299).
- Verhindern Sie übermäßige Neuladevorgänge, indem Sie die Hälfte der Zieldauer abwarten, wenn
CAN-BLOCK-RELOAD=YES
vom Server nicht berücksichtigt wird (#2317). - Ein Fehler wurde behoben, bei dem die Wiedergabe beim Starten eines Interstitial-Streams vor einem Mid-Roll unterbrochen wurde und die Asset-Liste für die falsche Anzeige aufgelöst wurde (#2558).
- Die Playlist-Analyse wurde korrigiert, sodass
\f
(Seitenvorschub) in Attributwerten mit Anführungszeichen akzeptiert wird (#2420). - Unterstützung für das Aktualisieren von Interstitials mit derselben ID (#2427).
- Ein Fehler wurde behoben, bei dem Fehler beim Laden von Playlists manchmal nicht weitergegeben wurden, wenn bei einem Livestream keine Segmente mehr zum Laden vorhanden waren (#2401https://github.com/androidx/media/issues/2401).
- Untertitel-Renditionen nach NAME-Tag gruppieren, ähnlich wie Audio-Renditionen bereits gruppiert werden (#1666).
- Unterstützung von X-ASSET-LIST und Livestreams mit
HlsInterstitialsAdsLoader
.
- Es wurde ein Fehler behoben, bei dem
- DASH-Erweiterung:
- Es wurde ein Problem behoben, bei dem der Trickplay-Anpassungssatz mit dem zugehörigen Hauptanpassungssatz zusammengeführt wurde, um ein ungültiges
TrackGroup
zu bilden (#2148). - Es wurde ein Fehler behoben, durch den beim Verkürzen der Dauer eines DASH-Zeitraums eine Ausnahme ausgelöst werden konnte, wenn Samples, die über die neue Dauer hinausgehen, bereits von der Rendering-Pipeline gelesen wurden (#2440).
- Ein Fehler wurde behoben, bei dem Weiterleitungen bei Verwendung von CMCD-Suchparametern nicht gefolgt wurde (#2475).
- Es wurde ein Problem behoben, bei dem der Trickplay-Anpassungssatz mit dem zugehörigen Hauptanpassungssatz zusammengeführt wurde, um ein ungültiges
- RTSP-Erweiterung:
- Unterstützung für RTP-Aggregationspakete für H265 gemäß RFC 7798#4.4.2 hinzugefügt (#2413).
- Der Fehler
RtspClient
wurde behoben, sodass der Standort-URI verwendet wird, der bei der Verarbeitung einer HTTP 302-Antwort angegeben wurde (#2398). - Unterstützung für das Parsen von SessionDescriptions mit Zeilen mit nachfolgenden Leerzeichen wurde hinzugefügt (#2357).
- Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
- Fehler behoben, bei dem
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange
keine Auswirkungen auf Audio-Decoder-Erweiterungen hatte (#2258).
- Fehler behoben, bei dem
- Cast-Erweiterung:
- Test-Tools:
- Fügen Sie
advance(player).untilPositionAtLeast
unduntilMediaItemIndex
zuTestPlayerRunHelper
hinzu, um den Spieler bis zu einer bestimmten Position zu bewegen. In den meisten Fällen sind diese Methoden zuverlässiger als die vorhandenen MethodenuntilPosition
unduntilStartOfMediaItem
. - Verschieben Sie
FakeDownloader
in das Modultest-utils-robolectric
, um es in anderen Tests wiederzuverwenden. transformer.TestUtil.addAudioDecoders(String...)
,transformer.TestUtil.addAudioEncoders(String...)
undtransformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...)
wurden entfernt. Verwenden Sie stattdessenShadowMediaCodecConfig
, um Shadow-Encoder und ‑Decoder zu konfigurieren.- Das Präfix „exotest“ wurde in den von
ShadowMediaCodecConfig
gemeldeten Codec-Namen durch „media3“ ersetzt.
- Fügen Sie
- Entfernen Sie die veralteten Symbole:
- Der veraltete
SegmentDownloader
-KonstruktorSegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor)
und die entsprechenden Konstruktoren in den UnterklassenDashDownloader
,HlsDownloader
undSsDownloader
wurden entfernt. - Die eingestellten
Player.hasNext()
undPlayer.hasNextWindow()
wurden entfernt. Verwenden Sie stattdessenPlayer.hasNextMediaItem()
. - Die veraltete Funktion
Player.next()
wurde entfernt. Verwenden Sie stattdessenPlayer.seekToNextMediaItem()
. - Die veraltete Funktion
Player.seekToPreviousWindow()
wurde entfernt. Verwenden Sie stattdessenPlayer.seekToPreviousMediaItem()
. - Die veraltete Funktion
Player.seekToNextWindow()
wurde entfernt. Verwenden Sie stattdessenPlayer.seekToNextMediaItem()
. - Veraltetes
BaseAudioProcessor
im Modulexoplayer
entfernt. VerwendeBaseAudioProcessor
im Modulcommon
. - Entfernen Sie den verworfenen Konstruktor
MediaCodecVideoRenderer
MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider)
.
- Der veraltete
Version 1.8.0-rc02
24. Juli 2025
Verwenden Sie die stabile Version 1.8.0.
Version 1.8.0-rc01
16. Juli 2025
Verwenden Sie die stabile Version 1.8.0.
Version 1.8.0-beta01
2. Juli 2025
Verwenden Sie die stabile Version 1.8.0.
Version 1.8.0-alpha01
19. Mai 2025
Verwenden Sie die stabile Version 1.8.0.
Version 1.7.0
Version 1.7.1
16. Mai 2025
Diese Version hat denselben Code wie 1.6.1 und wird veröffentlicht, damit sie als „neuere“ Version als 1.7.0 angezeigt wird. 1.7.0 war eine Alphaversion, die versehentlich als stabil gekennzeichnet wurde (siehe unten).
Version 1.7.0
16. Mai 2025
Diese Version sollte 1.7.0-alpha01
sein, wurde aber auf maven.google. com versehentlich mit 1.7.0
(d.h.stabil) getaggt. Bitte verwenden Sie sie nicht. Sie können bei Version 1.6.1 bleiben oder auf Version 1.7.1 aktualisieren (die denselben Code wie Version 1.6.1 hat).
Version 1.6.0
1.6.1
14. April 2025
androidx.media3:media3-*:1.6.1
ist veröffentlicht.
Version 1.6.1 enthält diese Commits.
- Gemeinsame Mediathek:
- Die Methode
PlaybackParameters.withPitch(float)
wurde hinzugefügt, um das Kopieren einesPlaybackParameters
mit einem neuenpitch
-Wert zu vereinfachen (#2257).
- Die Methode
- ExoPlayer:
- Ein Problem wurde behoben, bei dem der Übergang von Media-Elementen aufgrund eines behebaren Renderer-Fehlers während der Initialisierung des nächsten Media-Elements fehlgeschlagen ist (#2229).
- Ein Problem wurde behoben, bei dem
ProgressiveMediaPeriod
eineIllegalStateException
auslöst, wennPreloadMediaSource
versucht,getBufferedDurationUs()
aufzurufen, bevor sie vorbereitet wurde (#2315). - Das Senden von
CmcdData
in Manifestanfragen für DASH, HLS und SmoothStreaming wurde korrigiert (#2253). - Prüfen Sie, ob
AdPlaybackState.withAdDurationsUs(long[][])
auch nach dem Entfernen von Anzeigengruppen verwendet werden kann. Der Nutzer muss weiterhin ein Array mit Zeiträumen für entfernte Anzeigengruppen übergeben, das leer oder null sein kann (#2267).
- Extraktoren:
- MP4: Parsen Sie
alternate_group
aus dem Feldtkhd
und stellen Sie es alsMp4AlternateGroupData
-Eintrag imFormat.metadata
jedes Tracks bereit (#2242).
- MP4: Parsen Sie
- Audio:
- Ein Problem beim Offload wurde behoben, bei dem die Position beim Abspielen einer Playlist mit kurzen Inhalten hängen bleiben konnte (#1920).
- Sitzung:
- Das Aggregations-Zeitlimit für
MediaSession
-Callbacks der Plattform wurde von 500 auf 100 Millisekunden gesenkt. Außerdem wurde ein experimenteller Setter hinzugefügt, mit dem Apps diesen Wert konfigurieren können. - Es wurde ein Problem behoben, bei dem Benachrichtigungen wieder angezeigt wurden, nachdem sie vom Nutzer geschlossen worden waren (#2302).
- Ein Fehler wurde behoben, bei dem in der Sitzung eine Timeline mit einem einzelnen Element zurückgegeben wurde, obwohl der umhüllte Player leer war. Das ist der Fall, wenn der umhüllte Player
COMMAND_GET_TIMELINE
nicht unterstützt,COMMAND_GET_CURRENT_MEDIA_ITEM
aber schon, und der umhüllte Player leer ist (#2320). - Ein Fehler wurde behoben, bei dem der Aufruf von
MediaSessionService.setMediaNotificationProvider
nach anderen Interaktionen mit dem Dienst wiesetForegroundServiceTimeoutMs
stillschweigend ignoriert wurde (#2305).
- Das Aggregations-Zeitlimit für
- UI:
- Aktivieren Sie
PlayerSurface
, um mitExoPlayer.setVideoEffects
undCompositionPlayer
zu arbeiten. - Es wurde ein Fehler behoben, bei dem
PlayerSurface
nicht mit einem neuenPlayer
neu zusammengesetzt werden konnte.
- Aktivieren Sie
- HLS-Erweiterung:
- Ein Problem wurde behoben, bei dem die Chunk-Dauer in
CmcdData
für HLS-Media nicht festgelegt wurde, was zu einem Zusicherungsfehler bei der Verarbeitung verschlüsselter Media-Segmente führte (#2312).
- Ein Problem wurde behoben, bei dem die Chunk-Dauer in
- RTSP-Erweiterung:
- Unterstützung für URI mit RTSPT-Schema als Möglichkeit zum Konfigurieren der RTSP-Sitzung für die Verwendung von TCP hinzugefügt (#1484).
- Cast-Erweiterung:
- Unterstützung für Playlist-Metadaten hinzugefügt (#2235).
1.6.0
26. März 2025
androidx.media3:media3-*:1.6.0
ist veröffentlicht.
Version 1.6.0 enthält diese Commits.
- Gemeinsame Mediathek:
- Fügen Sie
AudioManagerCompat
undAudioFocusRequestCompat
hinzu, um die entsprechenden Klassen inandroidx.media
zu ersetzen. - Führen Sie ein Upgrade von Kotlin von 1.9.20 auf 2.0.20 durch und verwenden Sie das Compose Compiler Gradle-Plug-in. Aktualisieren Sie die KotlinX Coroutines-Bibliothek von Version 1.8.1 auf Version 1.9.0.
- Entfernen Sie die Methode
Format.toBundle(boolean excludeMetadata)
und verwenden Sie stattdessenFormat.toBundle()
. - Fehler in
SimpleBasePlayer
behoben, bei dem das Festlegen eines neuencurrentMediaItemIndex
inState
nachsetPlaylist
mitnull
MediaMetadata
die Metadaten nicht neu bewertet (#1940). - Der Zugriff auf
SimpleBasePlayer.State
wird von „protected“ zu „public“ geändert, um Updates in anderen Klassen zu vereinfachen (#2128).
- Fügen Sie
- ExoPlayer:
MediaExtractorCompat
wurde hinzugefügt, eine neue Klasse, die ähnliche Funktionen wie die PlattformMediaExtractor
bietet.- Experimentelle Unterstützung für das Vorbereiten von ExoPlayer für die Wiedergabe mit
MediaCodecVideoRenderer
hinzugefügt. Sie könnenDefaultRenderersFactory
überexperimentalSetEnableMediaCodecVideoRendererPrewarming
konfigurieren, um einen sekundärenMediaCodecVideoRenderer
bisExoPlayer
bereitzustellen. Wenn diese Option aktiviert ist, verarbeitetExoPlayer
das Video aufeinanderfolgender Media-Elemente während der Wiedergabe vorab, um die Latenz beim Übergang zwischen Media-Elementen zu verringern. - Reduzieren Sie die Standardwerte für
bufferForPlaybackMs
undbufferForPlaybackAfterRebufferMs
inDefaultLoadControl
auf 1.000 bzw. 2.000 ms. - Initialisiere
DeviceInfo
und die Lautstärke des Geräts asynchron (falls mitsetDeviceVolumeControlEnabled
aktiviert). Diese Werte sind nicht sofort nachExoPlayer.Builder.build()
verfügbar.Player.Listener
benachrichtigt über Änderungen überonDeviceInfoChanged
undonDeviceVolumeChanged
. - Die ursprüngliche Audio-Sitzungs-ID ist nicht mehr sofort nach dem Erstellen des Players verfügbar. Bei Bedarf können Sie sich die erste Aktualisierung mit
AnalyticsListener.onAudioSessionIdChanged
vorlesen lassen. - Berücksichtige die Sprache bei der Auswahl eines Videotracks. Standardmäßig wird ein „Haupt“-Videotrack ausgewählt, der der Sprache des ausgewählten Audiotracks entspricht, sofern verfügbar. Explizite Einstellungen für die Videosprache können mit
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)
angegeben werden. - Fügen Sie der Methode
DefaultTrackSelector.selectVideoTrack()
den ParameterselectedAudioLanguage
hinzu. - Fügen Sie den Parameter
retryCount
zuMediaSourceEventListener.onLoadStarted
und den entsprechendenMediaSourceEventListener.EventDispatcher
-Methoden hinzu. - Es wurde ein Fehler behoben, bei dem es bei Playlist-Elementen oder Zeiträumen in DASH-Streams mit mehreren Zeiträumen mit einer Dauer, die nicht mit dem tatsächlichen Inhalt übereinstimmt, am Ende des Elements zu Frame-Freezes kommen konnte (#1698).
- Verschieben Sie
BasePreloadManager.Listener
in einPreloadManagerListener
auf oberster Ebene. RenderersFactory.createSecondaryRenderer
kann implementiert werden, um sekundäre Renderer für das Vorwärmen bereitzustellen. Durch das Vorab-Caching können Medienübergänge während der Wiedergabe schneller erfolgen.- Das Senden von
CmcdData
für Manifestanfragen in adaptiven Streamingformaten wie DASH, HLS und SmoothStreaming wurde aktiviert (#1951). - Geben Sie
MediaCodecInfo
des Codecs an, der inMediaCodecRenderer.onReadyToInitializeCodec
initialisiert wird (#1963). - Ändern Sie
AdsMediaSource
, damit dieAdPlaybackStates
durch Anhängen von Anzeigengruppen erweitert werden kann. Es wurden ungültige Änderungen erkannt, die eine Ausnahme auslösen. - Es wurde ein Problem behoben, durch das beim Übergang zu Inhaltsmedien nach einer Mid-Roll-Anzeige möglicherweise zusätzliche Frames nur zum Decodieren in schneller Folge angezeigt wurden.
DefaultRenderersFactory
fügt zweiMetadataRenderer
-Instanzen hinzu, damit Apps standardmäßig zwei verschiedene Metadatenschemas empfangen können.- Es wurde neu bewertet, ob das laufende Laden eines Chunks abgebrochen werden sollte, wenn die Wiedergabe pausiert wird (#1785).
- Es wurde eine Option für
ClippingMediaSource
hinzugefügt, mit der das Erstellen von Clips in nicht suchbaren Medien möglich ist. - Ein Fehler wurde behoben, durch den das Suchen mit Pre-Warming den Übergang zum nächsten Medienelement blockieren konnte.
- Es wurde ein Fehler behoben, bei dem
ExoPlayer.isLoading()
true
blieb, obwohl es zuSTATE_IDLE
oderSTATE_ENDED
gewechselt war (#2133). - Fügen Sie
lastRebufferRealtimeMs
zuLoadControl.Parameter
hinzu (#2113).
- Transformer:
- Unterstützung für das Transmuxing in alternative abwärtskompatible Formate hinzugefügt.
- Unterstützung für die Transcodierung und das Transmuxing von Dolby Vision (Profil 8) wurde hinzugefügt.
- Aktualisieren Sie die Parameter von
VideoFrameProcessor.registerInputStream
undVideoFrameProcessor.Listener.onInputStreamRegistered
, umFormat
zu verwenden. - Generieren Sie statische HDR-Metadaten, wenn Sie
DefaultEncoderFactory
verwenden. - Aktivieren Sie die Unterstützung für Android-Plattformdiagnosen mit
MediaMetricsManager
. Der Transformer leitet Bearbeitungsereignisse und Leistungsdaten an die Plattform weiter, was dazu beiträgt, Systemleistungs- und Debugging-Informationen auf dem Gerät bereitzustellen. Diese Daten können auch von Google erhoben werden, wenn der Nutzer des Geräts die Weitergabe von Nutzungs- und Diagnosedaten aktiviert hat. Apps können die Teilnahme an der Plattformdiagnose für Transformer mitTransformer.Builder.setUsePlatformDiagnostics(false)
deaktivieren. - Teile
InAppMuxer
inInAppMp4Muxer
undInAppFragmentedMp4Muxer
auf. MitInAppMp4Muxer
wird eine nicht fragmentierte MP4-Datei erstellt, mitInAppFragmentedMp4Muxer
eine fragmentierte MP4-Datei. - Verschiebe die
Muxer
-Schnittstelle vonmedia3-muxer
nachmedia3-transformer
. - Fügen Sie
MediaProjectionAssetLoader
hinzu, das Medien aus einemMediaProjection
für die Bildschirmaufzeichnung bereitstellt, und fügen Sie der Transformer-Demo-App Unterstützung für die Bildschirmaufzeichnung hinzu. - Fügen Sie
#getInputFormat()
derCodec
-Schnittstelle hinzu. - Übertrage die Verantwortung für die Freigabe des
GlObjectsProvider
nach Möglichkeit auf den Anrufer inDefaultVideoFrameProcessor
undDefaultVideoCompositor
.
- Extraktoren:
- AVI: Die Verarbeitung von Dateien mit Audio, das mit konstanter Bitrate komprimiert wurde und bei denen im Streamheader die Anzahl der Byte anstelle der Anzahl der Chunks gespeichert ist, wurde korrigiert.
- Die Verarbeitung von NAL-Einheiten mit Längen, die in 1 oder 2 Bytes (statt 4) ausgedrückt werden, wurde korrigiert.
- Fehler bei
ArrayIndexOutOfBoundsException
in MP4-Bearbeitungslisten behoben, wenn die Bearbeitungsliste mit einem nicht synchronisierten Frame ohne vorherigen synchronisierten Frame beginnt (#2062). - Problem behoben, bei dem TS-Streams auf einigen Geräten hängen bleiben konnten (#2069).
- FLAC: Unterstützung für 32‑Bit-FLAC-Dateien hinzugefügt. Bisher konnten diese Inhalte mit
IllegalStateException: Playback stuck buffering and not loading
nicht wiedergegeben werden (#2197).
- Audio:
- Der Fehler wurde behoben, sodass
onAudioPositionAdvancing
jetzt aufgerufen wird, wenn die Wiedergabe fortgesetzt wird (zuvor wurde sie aufgerufen, wenn die Wiedergabe pausiert wurde). - Umgehen Sie
SonicAudioProcessor
nicht, wennSpeedChangingAudioProcessor
mit Standardparametern konfiguriert ist. - Ein Unterlauf in
Sonic#getOutputSize()
wurde behoben, der dazu führen konnte, dassDefaultAudioSink
nicht mehr reagierte. - Korrigieren Sie
MediaCodecAudioRenderer.getDurationToProgressUs()
undDecoderAudioRenderer.getDurationToProgressUs()
, damit die Suchvorgänge die angegebenen Zeiträume korrekt zurücksetzen. androidx.media3.common.audio.SonicAudioProcessor
abschließen.- Unterstützung für Float-PCM zu
ChannelMappingAudioProcessor
undTrimmingAudioProcessor
hinzufügen.
- Der Fehler wurde behoben, sodass
- Video:
- Ändere
MediaCodecVideoRenderer.shouldUsePlaceholderSurface
in „protected“, damit Anwendungen die Verwendung von Platzhalter-Oberflächen blockieren können (#1905). - Es wurde eine experimentelle
ExoPlayer
AV1-Beispielabhängigkeitsanalyse hinzugefügt, um das Suchen zu beschleunigen. Aktivieren Sie sie mit der neuenDefaultRenderersFactory.experimentalSetParseAv1SampleDependencies
API. - Die experimentelle
ExoPlayer
API wurde hinzugefügt, um späteMediaCodecVideoRenderer
-Decodereingabepuffer zu verwerfen, von denen keine Abhängigkeiten bestehen. Aktivieren Sie die Funktion mitDefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs
. - Ein Problem wurde behoben, bei dem ein Player ohne Oberfläche sofort bereit war und alle ausstehenden Frames sehr langsam decodiert wurden (#1973).
- Xiaomi- und OPPO-Geräte aus dem Modus „Abgenommenes Display“ ausschließen, um Bildschirmflackern zu vermeiden (#2059).
- Ändere
- Text:
- Unterstützung für VobSub-Untertitel hinzugefügt (#8260).
- Das eifrige Laden aller Untertiteldateien, die mit
MediaItem.Builder.setSubtitleConfigurations
konfiguriert sind, wird beendet. Stattdessen wird nur eine Datei geladen, wenn sie durch die Auswahl des Tracks ausgewählt wird (#1721). - TTML: Unterstützung für das Referenzieren von
tts:origin
undtts:extent
mitstyle
wurde hinzugefügt (#2953). - Beschränken Sie WebVTT- und SubRip-Zeitstempel auf genau 3 Dezimalstellen. Bisher haben wir eine beliebige Anzahl von Dezimalstellen falsch geparst, aber immer davon ausgegangen, dass der Wert in Millisekunden angegeben ist. Das hat zu falschen Zeitstempeln geführt (#1997).
- Es wurde ein Fehler behoben, der dazu führte, dass die Wiedergabe hängen blieb, wenn eine Playlist gekürzte Elemente mit CEA-608- oder CEA-708-Untertiteln enthielt.
- Fehlerbehebung für
IllegalStateException
, wenn eine SSA-Datei einen Cue mit der Dauer null enthält (Start- und Endzeit sind gleich) (#2052). - Unterdrücken (und protokollieren) von Fehlern beim Parsen von Untertiteln, wenn Untertitel in denselben Container wie Audio und Video gemuxt werden (#2052).
- Der Umgang mit Multibyte-UTF-8-Zeichen in WebVTT-Dateien mit CR-Zeilenenden wurde korrigiert (#2167).
- DRM:
- Fehler
MediaCodec$CryptoException: Operation not supported in this configuration
beim Abspielen von ClearKey-Inhalten auf Geräten mit API-Version < 27 behoben (#1732).
- Fehler
- Wirkung:
- Die Funktionalität von
OverlaySettings
wurde inStaticOverlaySettings
verschoben.OverlaySettings
kann abgeleitet werden, um dynamische Overlays zu ermöglichen.
- Die Funktionalität von
- Muxer:
MuxerException
wurde aus derMuxer
-Schnittstelle entfernt, um einen sehr langen vollständig qualifizierten Namen zu vermeiden.- Die Methode
setSampleCopyEnabled()
wurde sowohl inMp4Muxer.Builder
als auch inFragmentedMp4Muxer.Builder
insetSampleCopyingEnabled()
umbenannt. Mp4Muxer.addTrack()
undFragmentedMp4Muxer.addTrack()
geben jetzt eineint
-Track-ID anstelle einerTrackToken
zurück.Mp4Muxer
undFragmentedMp4Muxer
implementieren dieMuxer
-Schnittstelle nicht mehr.Mp4Muxer
-Stichproben-Batching und ‑Kopieren standardmäßig deaktivieren- Ein Fehler in
FragmentedMp4Muxer
wurde behoben, der viele Fragmente erstellte, wenn nur der Audiotrack geschrieben wurde.
- Sitzung:
- Der Status des Vordergrunddiensts wird für weitere 10 Minuten beibehalten, wenn die Wiedergabe pausiert, beendet oder fehlgeschlagen ist. So können Nutzer die Wiedergabe innerhalb dieses Zeitlimits fortsetzen, ohne dass auf verschiedenen Geräten Einschränkungen für Dienste im Vordergrund drohen. Beachten Sie, dass der Aufruf von
player.pause()
nicht mehr verwendet werden kann, um den Dienst im Vordergrund vorstopSelf()
zu beenden. Verwenden Sie stattdessenMediaSessionService.pauseAllPlayersAndStopSelf()
, wenn SieonTaskRemoved
überschreiben. - Benachrichtigung sichtbar lassen, wenn die Wiedergabe in einen Fehler- oder Stoppstatus wechselt. Die Benachrichtigung wird nur entfernt, wenn die Playlist gelöscht oder der Player freigegeben wird.
- Die Verarbeitung der MediaSession-Aktionen ACTION_PLAY und ACTION_PAUSE der Android-Plattform wurde verbessert. Es wird nur eine der beiden Aktionen entsprechend den verfügbaren Befehlen festgelegt. Außerdem wird akzeptiert, wenn nur eine der beiden Aktionen festgelegt ist.
- Fügen Sie
Context
als Parameter zuMediaButtonReceiver.shouldStartForegroundService
hinzu (#1887). - Es wurde ein Fehler behoben, bei dem durch den Aufruf einer
Player
-Methode für einMediaController
, das mit einer alten Sitzung verbunden war, Änderungen aus einem ausstehenden Update verloren gingen. MediaSession.setSessionActivity(PendingIntent)
akzeptiert jetzt „null“ (#2109).- Es wurde ein Fehler behoben, durch den eine alte Benachrichtigung sichtbar blieb, wenn die Playlist gelöscht wurde (#2211).
- Der Status des Vordergrunddiensts wird für weitere 10 Minuten beibehalten, wenn die Wiedergabe pausiert, beendet oder fehlgeschlagen ist. So können Nutzer die Wiedergabe innerhalb dieses Zeitlimits fortsetzen, ohne dass auf verschiedenen Geräten Einschränkungen für Dienste im Vordergrund drohen. Beachten Sie, dass der Aufruf von
- UI:
- Fügen Sie dem
media3-ui-compose
-Modul Status-Holder und Composables fürPlayerSurface
,PresentationState
,PlayPauseButtonState
,NextButtonState
,PreviousButtonState
,RepeatButtonState
,ShuffleButtonState
undPlaybackSpeedState
hinzu.
- Fügen Sie dem
- Downloads:
- Fehler in
CacheWriter
behoben, durch den Datenquellen offen und Cachebereiche gesperrt bleiben, wenn die Datenquelle einen anderenException
alsIOException
(#9760) ausgibt.
- Fehler in
- HLS-Erweiterung:
- Fügen Sie eine erste Version von
HlsInterstitialsAdsLoader
hinzu. Der Anzeigen-Loader liest die HLS-Interstitials einer HLS-Mediaplaylist und ordnet sie demAdPlaybackState
zu, das anAdsMediaSource
übergeben wird. Diese erste Version unterstützt nur HLS-VOD-Streams mitX-ASSET-URI
-Attributen. - Fügen Sie
HlsInterstitialsAdsLoader.AdsMediaSourceFactory
hinzu. Apps können damitAdsMediaSource
-Instanzen erstellen, die auf bequeme und sichere Weise einHlsInterstitialsAdsLoader
verwenden. - Das
SUPPLEMENTAL-CODECS
-Tag aus der HLS-Playlist wird geparst, um Dolby Vision-Formate zu erkennen (#1785). - Die Bedingung für das Suchen nach Synchronisierungspositionen in einem HLS-Stream wurde gelockert (#2209).
- Fügen Sie eine erste Version von
- DASH-Erweiterung:
- Unterstützung für das AC-4-Format der Stufe 4 für DASH hinzufügen (#1898).
- Problem bei der Berechnung des Updateintervalls für das Einfügen von Anzeigen in Live-Streams mit mehreren Zeiträumen behoben (#1698).
- Das Attribut
scte214:supplementalCodecs
wird aus dem DASH-Manifest geparst, um Dolby Vision-Formate zu erkennen (#1785). - Die Verarbeitung von Periodenübergängen in Livestreams wurde verbessert, wenn die Periode Mediensamples enthält, die über die angegebene Periodendauer hinausgehen (#1698).
- Ein Problem wurde behoben, bei dem Anpassungssätze, die mit
adaptation-set-switching
gekennzeichnet sind, aber unterschiedliche Sprach- oder Rollen-Flags haben, zusammengeführt wurden (#2222).
- Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
- Das MPEG-H-Decodermodul wurde hinzugefügt, das den integrierten MPEG-H-Decoder zum Decodieren von MPEG-H-Audio verwendet (#1826).
- MIDI-Erweiterung:
- Benutzerdefinierte
AudioSink
- undAudioRendererEventListener
-Instanzen inMidiRenderer
einbinden
- Benutzerdefinierte
- Cast-Erweiterung:
- Aktualisieren Sie die
play-services-cast-framework
-Abhängigkeit auf Version 21.5.0, um einenFLAG_MUTABLE
-Absturz in Apps zu beheben, die auf API 34 oder höher ausgerichtet sind und auf Geräten mit installierten, aber deaktivierten Google Play-Diensten ausgeführt werden (#2178).
- Aktualisieren Sie die
- Demo-App:
demo-compose
mit zusätzlichen Schaltflächen erweitern und diePlayerSurface
-Integration mit Skalierungs- und Auslöserunterstützung verbessern.
- Entfernen Sie die veralteten Symbole:
- Veraltete
AudioMixer.create()
-Methode entfernt. Verwenden Sie stattdessenDefaultAudioMixer.Factory().create()
. - Entfernen Sie die folgenden veralteten
Transformer.Builder
-Methoden:setTransformationRequest()
: Verwenden Sie stattdessensetAudioMimeType()
,setVideoMimeType()
undsetHdrMode()
.setAudioProcessors()
, legen Sie den Audioprozessor in einemEditedMediaItem.Builder.setEffects()
fest und übergeben Sie ihn stattdessen anTransformer.start()
.setVideoEffects()
, setze den Videoeffekt in einemEditedMediaItem.Builder.setEffects()
und übergib ihn stattdessen anTransformer.start()
.setRemoveAudio()
. Verwenden Sie stattdessenEditedMediaItem.Builder.setRemoveAudio()
, um das Audio aus dem anTransformer.start()
übergebenenEditedMediaItem
zu entfernen.setRemoveVideo()
. VerwendeEditedMediaItem.Builder.setRemoveVideo()
, um das Video aus demEditedMediaItem
zu entfernen, das anTransformer.start()
übergeben wird.setFlattenForSlowMotion()
. Verwenden Sie stattdessenEditedMediaItem.Builder.setFlattenForSlowMotion()
, um das anTransformer.start()
übergebeneEditedMediaItem
zu reduzieren.setListener()
: Verwenden Sie stattdessenaddListener()
,removeListener()
oderremoveAllListeners()
.
- Entfernen Sie die folgenden veralteten
Transformer.Listener
-Methoden:onTransformationCompleted(MediaItem)
. Verwenden Sie stattdessenonCompleted(Composition, ExportResult)
.onTransformationCompleted(MediaItem, TransformationResult)
. Verwenden Sie stattdessenonCompleted(Composition, ExportResult)
.onTransformationError(MediaItem, Exception)
. Verwenden Sie stattdessenonError(Composition, ExportResult, ExportException)
.onTransformationError(MediaItem, TransformationException)
. Verwenden Sie stattdessenonError(Composition, ExportResult, ExportException)
.onTransformationError(MediaItem, TransformationResult, TransformationException)
. Verwenden Sie stattdessenonError(Composition, ExportResult, ExportException)
.onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest)
. Verwenden Sie stattdessenonFallbackApplied(Composition, TransformationRequest, TransformationRequest)
.
- Entfernen Sie die eingestellte Klasse
TransformationResult
. Verwenden Sie stattdessenExportResult
. - Entfernen Sie die eingestellte Klasse
TransformationException
. Verwenden Sie stattdessenExportException
. - Entfernen Sie die veraltete
Transformer.PROGRESS_STATE_NO_TRANSFORMATION
. Verwenden Sie stattdessenTransformer.PROGRESS_STATE_NOT_STARTED
. - Entfernen Sie die veraltete
Transformer.setListener()
. Verwenden Sie stattdessenTransformer.addListener()
,Transformer.removeListener()
oderTransformer.removeAllListeners()
. - Entfernen Sie die veraltete
Transformer.startTransformation()
. Verwenden Sie stattdessenTransformer.start(MediaItem, String)
. - Entfernen Sie die veraltete
SingleFrameGlShaderProgram
. Verwenden Sie stattdessenBaseGlShaderProgram
. - Entfernen Sie
Transformer.flattenForSlowMotion
. Verwenden Sie stattdessenEditedMediaItem.flattenForSlowMotion
. ExoPlayer.VideoComponent
,ExoPlayer.AudioComponent
,ExoPlayer.TextComponent
undExoPlayer.DeviceComponent
wurden entfernt.androidx.media3.exoplayer.audio.SonicAudioProcessor
wurde entfernt.- Die folgenden veralteten
DownloadHelper
-Methoden wurden entfernt:- Konstruktor
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[])
, verwenden Sie stattdessenDownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList)
. getRendererCapabilities(RenderersFactory)
: Eine entsprechende Funktion kann erreicht werden, indem Sie eineDefaultRendererCapabilitiesList
mit einemRenderersFactory
erstellen undDefaultRendererCapabilitiesList.getRendererCapabilities()
aufrufen.
- Konstruktor
- Die Methode
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat)
wurde entfernt. Verwenden Sie stattdessenPlayerNotificationManager.setMediaSessionToken(MediaSession.Token)
und übergeben Sie(MediaSession.Token) compatToken.getToken()
.
- Veraltete
1.6.0-rc02
19. März 2025
Verwenden Sie die stabile Version 1.6.0.
1.6.0-rc01
12. März 2025
Verwenden Sie die stabile Version 1.6.0.
1.6.0-beta01
26. Februar 2025
Verwenden Sie die stabile Version 1.6.0.
Version 1.6.0-alpha03
6. Februar 2025
Verwenden Sie die stabile Version 1.6.0.
Version 1.6.0-alpha02
30. Januar 2025
Verwenden Sie die stabile Version 1.6.0.
Version 1.6.0-alpha01
20. Dezember 2024
Verwenden Sie die stabile Version 1.6.0.
Version 1.5
Version 1.5.1
19. Dezember 2024
androidx.media3:media3-*:1.5.1
ist veröffentlicht.
Version 1.5.1 enthält diese Commits.
- ExoPlayer:
- Deaktivieren Sie die Verwendung der asynchronen Entschlüsselung in MediaCodec, um die gemeldeten Probleme mit dem Codec-Timeout bei dieser Plattform-API zu vermeiden (#1641).
- Extraktoren:
- MP3: Die Wiedergabe darf nicht vorzeitig beendet werden, wenn das Inhaltsverzeichnis eines
VBRI
-Frames nicht alle MP3-Daten in einer Datei abdeckt (#1904).
- MP3: Die Wiedergabe darf nicht vorzeitig beendet werden, wenn das Inhaltsverzeichnis eines
- Video:
- Rollback der Verwendung von
MediaCodecAdapter
-Werten für das bereitgestellte Pixel-Seitenverhältnis bei der Verarbeitung vononOutputFormatChanged
(#1371).
- Rollback der Verwendung von
- Text:
- Es wurde ein Fehler in
ReplacingCuesResolver.discardCuesBeforeTimeUs
behoben, bei dem der Cue, der beitimeUs
aktiv war (vorher gestartet, aber noch nicht beendet), fälschlicherweise verworfen wurde (#1939).
- Es wurde ein Fehler in
- Metadaten:
- Extrahieren der Datenträger-/Tracknummerierung und des Genres aus Vorbis-Kommentaren in
MediaMetadata
(#1958).
- Extrahieren der Datenträger-/Tracknummerierung und des Genres aus Vorbis-Kommentaren in
Version 1.5.0
27. November 2024
androidx.media3:media3-*:1.5.0
ist veröffentlicht.
Version 1.5.0 enthält diese Commits.
- Gemeinsame Mediathek:
- Füge
ForwardingSimpleBasePlayer
hinzu, das das Weiterleiten an einen anderen Player mit kleinen Anpassungen ermöglicht und gleichzeitig für vollständige Konsistenz und Listener-Verarbeitung sorgt (#1183). - Ersetzen Sie
SimpleBasePlayer.State.playlist
durch die MethodegetPlaylist()
. - Fügen Sie einen Überschreibungsbefehl für
SimpleBasePlayer.State.Builder.setPlaylist()
hinzu, um direkt einTimeline
und das aktuelleTracks
undMetadata
anzugeben, anstatt eine Playliststruktur zu erstellen. - Erhöhen Sie
minSdk
auf 21 (Android Lollipop). Dies entspricht allen anderen AndroidX-Bibliotheken. - Fügen Sie das
androidx.media3:media3-common-ktx
-Artefakt hinzu, das Kotlin-spezifische Funktionen bietet, die auf der Common-Bibliothek basieren. - Fügen Sie der
media3-common-ktx
-Bibliothek die suspendierende ErweiterungsfunktionPlayer.listen
hinzu, um eine Coroutine zu starten, die aufPlayer.Events
wartet. - Entfernen Sie
@DoNotInline
-Annotationen aus manuell ausgelagerten inneren Klassen, die dazu dienen, Fehler bei der Laufzeitklassenüberprüfung zu vermeiden. In aktuellen Versionen von R8 werden solche Inline-Aufrufe jetzt automatisch ausgelagert, um Laufzeitfehler zu vermeiden. Die manuelle Auslagerung ist also nicht mehr erforderlich. Alle Gradle-Nutzer der Bibliothek müssen bereits eine Version des Android-Gradle-Plug-ins verwenden, in der eine R8-Version enthalten ist, die dies unterstützt, aufgrund voncompileSdk = 35
. Nutzer der Bibliothek mit Build-Systemen, die nicht auf Gradle basieren, müssen dafür sorgen, dass ihr R8-äquivalenter Schritt zum Verkleinern/Verschleiern einen ähnlichen automatischen Out-of-Lining-Prozess durchführt, um Laufzeitfehler bei der Klassenüberprüfung zu vermeiden. Diese Änderung wurde bereits in anderen AndroidX-Bibliotheken vorgenommen.
- Füge
- ExoPlayer:
MediaCodecRenderer.onProcessedStreamChange()
kann jetzt für jedes Medienelement aufgerufen werden. Bisher wurde sie für die erste nicht aufgerufen. Verwenden SieMediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()
, um diese Funktion zu aktivieren.- Fügen Sie
PreloadMediaSource.PreloadControl.onPreloadError
hinzu, damitPreloadMediaSource.PreloadControl
-Implementierungen Aktionen ausführen können, wenn ein Fehler auftritt. - Fügen Sie
BasePreloadManager.Listener
hinzu, um Preload-Ereignisse an Apps weiterzugeben. - Ändern des SNTP-Client-Timeouts und Wiederholen alternativer Adressen bei Timeout zulassen (#1540).
- Entfernen Sie
MediaCodecAdapter.Configuration.flags
, da das Feld immer null war. - Der Nutzer kann den integrierten Lautsprecher für die Wiedergabe auf Wear OS ab API 35 auswählen, sofern das Gerät dies unterstützt.
- Den blockierenden Aufruf an
Context.getSystemService(Context.AUDIO_SERVICE)
bis zur Aktivierung der Audiofokus-Verarbeitung verschieben. Dadurch wird sichergestellt, dass der blockierende Aufruf nicht erfolgt, wenn die Verarbeitung des Audiofokus nicht aktiviert ist (#1616). - Wiedergabe unabhängig von der gepufferten Dauer zulassen, wenn das Laden fehlschlägt (#1571).
- Fügen Sie
AnalyticsListener.onRendererReadyChanged()
hinzu, um zu signalisieren, wann die Wiedergabe auf einzelnen Renderern bereit ist. - Der Fehler
MediaCodec.CryptoException
wird manchmal als „unerwarteter Laufzeitfehler“ gemeldet, wennMediaCodec
im asynchronen Modus ausgeführt wird (Standardverhalten bei API 31 und höher). - Übergeben Sie
bufferedDurationUs
anstelle vonbufferedPositionUs
mitPreloadMediaSource.PreloadControl.onContinueLoadingRequested()
. Außerdem wirdDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS
inDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS
geändert. Apps müssen dann anstelle einer Position einen Wert übergeben, der eine bestimmte Dauer ab der Standardstartposition angibt, für die die entsprechende Media-Quelle mit diesem IntDef vorab geladen werden muss. - Fügen Sie die
ForwardingRenderer
-Implementierung hinzu, die alle Methodenaufrufe an einen anderen Renderer weiterleitet (1703). - Vorabladen von Playlists für das nächste Element in der Playlist hinzufügen Apps können das Vorabladen aktivieren, indem sie
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)
aufrufen. Das Vorabladen ist standardmäßig deaktiviert. Wenn Sie die Funktion aktiviert haben, wird das Vorabladen durchDefaultLoadControl
eingeschränkt. Es wird nur gestartet und fortgesetzt, wenn der Player nicht für die Wiedergabe geladen wird. Apps können dieses Verhalten ändern, indem sieLoadControl.shouldContinuePreloading()
entsprechend implementieren (z. B. durch Überschreiben dieser Methode inDefaultLoadControl
). Bei der Standardimplementierung vonLoadControl
wird das Vorabladen deaktiviert, wenn eine App eine benutzerdefinierte Implementierung vonLoadControl
verwendet. - Die Methode
MediaSourceEventListener.EventDispatcher.dispatchEvent()
wurde hinzugefügt, um das Aufrufen von Ereignissen von Unterklassen-Listenern zu ermöglichen (1736). - Fügen Sie
DefaultPreloadManager.Builder
hinzu, mit dem dieDefaultPreloadManager
- undExoPlayer
-Instanzen mit einheitlich freigegebenen Konfigurationen erstellt werden. - Entfernen Sie den Parameter
Renderer[]
ausLoadControl.onTracksSelected()
, da dieDefaultLoadControl
-Implementierung die Streamtypen ausExoTrackSelection[]
abrufen kann. - Die Methode
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])
ist veraltet und wurde als „final“ markiert, um Überschreibungen zu verhindern. Verwenden Sie stattdessen die neueDefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
. MediaSourceEventListener
-Ereignisse aus sekundären Quellen inMergingMediaSource
melden Dies führt dazu, dass für per Sideloading hinzugefügte Untertitel (die mitMediaItem.LocalConfiguration.subtitleConfigurations
hinzugefügt wurden) Ereignisse vom Typ „loadstart“/„error“/„cancelled“/„completed“ gemeldet werden. Diese Ereignisse werden möglicherweise als doppelte Ladevorgänge angezeigt, die vonAnalyticsListener
ausgegeben werden.- Verhindern, dass Fehler bei Untertiteln und Metadaten die Wiedergabe vollständig stoppen.
Stattdessen wird der problematische Titel deaktiviert und die Wiedergabe der verbleibenden Titel wird fortgesetzt (#1722).
- Bei der neuen Untertitelverarbeitung (während der Extraktion) werden zugehörige Parse- (z.B. ungültige Untertiteldaten) und Ladefehler (z.B. HTTP 404) über
onLoadError
-Callbacks ausgegeben. - Bei der alten Untertitelverarbeitung (während des Renderns) werden nur zugehörige Ladefehler über
onLoadError
-Callbacks ausgegeben, während Parsing-Fehler stillschweigend ignoriert werden (dies ist das bisherige Verhalten).
- Bei der neuen Untertitelverarbeitung (während der Extraktion) werden zugehörige Parse- (z.B. ungültige Untertiteldaten) und Ladefehler (z.B. HTTP 404) über
- Es wurde ein Fehler behoben, bei dem es bei Playlist-Elementen oder Zeiträumen in DASH-Streams mit mehreren Zeiträumen mit einer Dauer, die nicht mit dem tatsächlichen Inhalt übereinstimmt, am Ende des Elements zu Frame-Freezes kommen konnte (#1698).
- Setter für
SntpClient
hinzufügen, um die maximale verstrichene Zeit seit der letzten Aktualisierung festzulegen, nach der der Client neu initialisiert wird (#1794).
- Transformer:
- Füge
SurfaceAssetLoader
hinzu, das das Einreihen von Videodaten in die Transformer-Warteschlange über eineSurface
unterstützt. ImageAssetLoader
meldet nicht unterstützte Eingaben überAssetLoader.onError
, anstatt eineIllegalStateException
auszulösen.- Die Einstellung der Bilddauer über
MediaItem.Builder.setImageDurationMs
ist für den Bildexport obligatorisch. - Unterstützung für den Export von Lücken in Sequenzen von bearbeiteten Audio-MediaItems hinzugefügt.
- Füge
- Titelauswahl:
DefaultTrackSelector
: Objektbasierte Audioinhalte sollten kanalbasierten Audioinhalten vorgezogen werden, wenn andere Faktoren gleich sind.
- Extraktoren:
- Mit
Mp4Extractor
undFragmentedMp4Extractor
können H264-Samples identifiziert werden, die nicht als Referenz für nachfolgende Samples verwendet werden. - Option zum Aktivieren der indexbasierten Suche in
AmrExtractor
hinzugefügt. - MP3-Dateien mit mehr als 128 KB zwischen gültigen Frames werden als gekürzt (und nicht als ungültig) behandelt. Das bedeutet, dass die Wiedergabe von Dateien mit Nicht-MP3-Daten am Ende, bei denen keine anderen Metadaten die Länge der MP3-Bytes angeben, jetzt am Ende der MP3-Daten beendet wird, anstatt mit
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
(#1563) zu fehlschlagen. - Die Verarbeitung von Preroll-Samples für Media-Startpositionen, die keine Keyframes sind, wurde korrigiert, wenn Bearbeitungslisten in MP4-Dateien verarbeitet werden (#1659).
- Die Berechnung der Frame-Rate wurde verbessert, indem die Medienlänge aus dem Feld
mdhd
inMp4Extractor
undFragmentedMp4Extractor
verwendet wird (#1531). - Falsche Skalierung von
media_time
in MP4-Bearbeitungslisten korrigieren Währendsegment_duration
bereits korrekt mit der Zeiteinteilung des Films skaliert wurde, wirdmedia_time
jetzt korrekt mit der Zeiteinteilung des Tracks skaliert, wie im MP4-Formatstandard angegeben (#1792). - Behandlung von Frames in falscher Reihenfolge bei der
endIndices
-Berechnung für MP4-Dateien mit Bearbeitungsliste (#1797). - Die Analyse der Medienlänge im
mdhd
-Feld von MP4-Dateien wurde korrigiert, um-1
-Werte zu verarbeiten (#1819). - Unterstützung für die Identifizierung des
h263
-Felds in MP4-Dateien für H.263-Video hinzugefügt (#1821). - Unterstützung für das ISO-Basismediendateiformat AC-4 Level 4 hinzugefügt (#1265).
- Mit
- DataSource:
- Aktualisierung von
HttpEngineDataSource
, sodass die Verwendung ab Version S-Extension 7 anstelle von API-Level 34 möglich ist (#1262). DataSourceContractTest
: Bestätigen, dassDataSource.getUri()
den aufgelösten URI zurückgibt (wie dokumentiert). Wenn dies vom angeforderten URI abweicht, kann dies in Tests mit der neuen MethodeDataSourceContractTest.TestResource.Builder.setResolvedUri()
angegeben werden.DataSourceContractTest
: Es wird geprüft, obDataSource.getUri()
undgetResponseHeaders()
ihren „open“-Wert nach einem fehlgeschlagenen Aufruf vonopen()
(aufgrund einer nicht gefundenen Ressource) und vor einem nachfolgendenclose()
-Aufruf zurückgeben.- Durch Überschreiben von
DataSourceContractTest.getNotFoundResources()
können Testunterklassen mehrere „nicht gefunden“-Ressourcen und alle erwarteten Header bereitstellen. So kann zwischen HTTP 404 (mit Headern) und „Server nicht gefunden“ (ohne Header) unterschieden werden.
- Durch Überschreiben von
- Aktualisierung von
- Audio:
- Konfiguriert automatisch CTA-2075-Lautheitsmetadaten für den Codec, sofern sie in den Media vorhanden sind.
- Achte darauf, dass die Lautstärke beim Suchen gleichmäßig verringert wird.
- Problem mit Knackgeräuschen behoben, die bei der Suche auftreten können.
- Die Anhäufung von Rundungsfehlern beim Time-Stretching-/Pitch-Shifting-Algorithmus von Sonic wurde behoben.
- Fehler in
SpeedChangingAudioProcessor
beheben, der zu fehlenden Ausgabeframes führt.
- Video:
MediaCodecVideoRenderer
vermeidet das Decodieren von Samples, die weder gerendert noch von anderen Samples als Referenz verwendet werden.- Bei API 35 und höher kann
MediaCodecAdapter
jetzt einnull
-Surface
inconfigure
empfangen und eine neue MethodedetachOutputSurface
aufrufen, um ein zuvor festgelegtesSurface
zu entfernen, wenn der Codec dies unterstützt (MediaCodecInfo.detachedSurfaceSupported
). - Verwenden Sie die bereitgestellten Werte für das Pixel-Seitenverhältnis
MediaCodecAdapter
, falls verfügbar, wenn SieonOutputFormatChanged
verarbeiten (#1371). - Es wurde eine Behelfslösung für ein Geräteproblem auf dem Galaxy Tab S7 FE hinzugefügt, das dazu führt, dass sichere H264-Streams mit 60 fps als nicht unterstützt markiert werden (#1619).
- Es wurde eine Problemumgehung für Codecs hinzugefügt, die nach dem letzten Sample hängen bleiben, ohne ein End-of-Stream-Signal zurückzugeben.
- Text:
- Fügen Sie eine benutzerdefinierte
VoiceSpan
hinzu und füllen Sie sie für WebVTT-Voice-Spans aus (#1632). - Achte darauf, dass WebVTT in HLS mit sehr großen Untertitel-Zeitstempeln (die einen 64-Bit-
long
überlaufen, wenn sie als Mikrosekunden dargestellt und mit der90,000
-MPEG-Zeitbasis multipliziert werden) angezeigt werden (#1763). - Unterstützung von CEA-608-Untertiteln in Dolby Vision-Inhalten (#1820).
- Das Problem, dass die Wiedergabe bei DASH-Streams mit mehreren Zeiträumen hängen bleibt, wenn CEA-608-Untertitel aktiviert sind, wurde behoben (#1863).
- Fügen Sie eine benutzerdefinierte
- Metadaten:
- Weisen Sie Tracks mit icy- oder vnd.dvb.ait-Inhalten den Typ
C.TRACK_TYPE_METADATA
zu.
- Weisen Sie Tracks mit icy- oder vnd.dvb.ait-Inhalten den Typ
- Bild:
- Fügen Sie
ExternallyLoadedImageDecoder
hinzu, um die Integration in externe Bibliotheken zum Laden von Bildern wie Glide oder Coil zu vereinfachen.
- Fügen Sie
- DataSource:
FileDescriptorDataSource
wurde hinzugefügt, ein neuesDataSource
, das zum Lesen aus einemFileDescriptor
verwendet werden kann (#3757).
- Wirkung:
- Es wurde eine
DefaultVideoFrameProcessor
-Problemumgehung für die geringfügigeSurfaceTexture
-Skalierung hinzugefügt.SurfaceTexture
kann eine kleine Skalierung enthalten, durch die ein 1-Texel-Rahmen am Rand eines zugeschnittenen Puffers abgeschnitten wird. Das Problem wurde behoben und die Ausgabe entspricht nun eher den Erwartungen. - Schnelleres
DefaultVideoFrameProcessor.queueInputBitmap()
Dadurch geht der Export von Bildern in Videos mitTransformer
schneller.
- Es wurde eine
- IMA-Erweiterung:
- Ein Fehler wurde behoben, bei dem das Löschen der Playlist zu einem
ArrayIndexOutOfBoundsException
inImaServerSideAdInsertionMediaSource
führen konnte. - Es wurde ein Fehler behoben, bei dem serverseitig eingefügte DAI-Streams ohne Preroll bei der Wiedergabe nach dem letzten Mid-Roll zu einem
ArrayIndexOutOfBoundsException
führen konnten (#1741).
- Ein Fehler wurde behoben, bei dem das Löschen der Playlist zu einem
- Sitzung:
- Füge
MediaButtonReceiver.shouldStartForegroundService(Intent)
hinzu, damit Apps einen eingehenden Play-Befehl zum Fortsetzen der Wiedergabe unterdrücken können, indem sie diese Methode überschreiben. Standardmäßig wird der Dienst immer gestartet und die Wiedergabe kann nicht unterdrückt werden, ohne dass der Dienst mit einemForegroundServiceDidNotStartInTimeException
(#1528) abstürzt. - Ein Fehler wurde behoben, der dazu führte, dass benutzerdefinierte Befehle, die von einem
MediaBrowser
gesendet wurden, an dieMediaSessionCompat.Callback
anstatt an dieMediaBrowserServiceCompat
-Variante der Methode gesendet wurden, wenn eine Verbindung zu einem Legacy-Dienst bestand. Dadurch konnteMediaBrowser
den tatsächlichen Rückgabewert, der vom alten Dienst zurückgesendet wurde, nicht empfangen (#1474). - Behandlung von
IllegalArgumentException
, das von Geräten bestimmter Hersteller ausgelöst wird, wenn der Broadcast-Empfänger für Media-Button-Intents festgelegt wird (#1730). - Befehlsschaltflächen für Media-Elemente hinzufügen Dadurch wird die Media3 API für das hinzugefügt, was als
Custom browse actions
mit der alten Bibliothek mitMediaBrowserCompat
bekannt war. Hinweis: Mit Media3 sind Befehlsschaltflächen für Media-Elemente sowohl fürMediaBrowser
als auch fürMediaController
verfügbar. Weitere Informationen finden Sie unter Benutzerdefinierte Suchaktionen implementieren. - Es wurde ein Fehler behoben, bei dem ein Media3-Controller manchmal nicht zulassen konnte, dass eine Sitzungs-App einen Dienst im Vordergrund startet, nachdem
play()
angefordert wurde. - Beschränken Sie
CommandButton.Builder.setIconUri
so, dass nur Inhalts-URIs akzeptiert werden. - Übergeben Sie Verbindungshinweise eines Media3-Browsers an das ursprüngliche
MediaBrowserCompat
, wenn Sie eine Verbindung zu einem Legacy-MediaBrowserCompat
herstellen. Der Dienst kann die als Stammhinweise übergebenen Verbindungshinweise mit dem ersten Aufruf vononGetRoot()
empfangen. - Ein Fehler wurde behoben, bei dem ein
MediaBrowser
, das mit einem Legacy-Browserdienst verbunden war, keinen vom Dienst gesendeten Fehler empfangen hat, nachdem der Browser einenparentid
abonniert hatte. - Das Interoperabilitätsverhalten wurde verbessert, sodass ein Media3-Browser, der mit einem Legacy-
MediaBrowserService
verbunden ist, die untergeordneten Elemente einesparentId
nicht zweimal anfordert, wenn er einen übergeordneten Dienst abonniert.
- Füge
- UI:
- Das gestreckte/zugeschnittene Video im
PlayerView
-in-Compose-AndroidView
-Workaround aktivieren, da es Probleme mit XML-basierten gemeinsamen Übergängen gibt. Apps, diePlayerView
innerhalb vonAndroidView
verwenden, müssenPlayerView.setEnableComposeSurfaceSyncWorkaround
aufrufen, um die Funktion zu aktivieren (#1237, #1594). - Füge
setFullscreenButtonState
zuPlayerView
hinzu, um Updates des Symbols der Vollbildschaltfläche auf Anfrage zu ermöglichen, d.h. außerhalb des Bandes und nicht reaktiv auf eine Klickinteraktion (#1590, #184). - Es wurde ein Fehler behoben, bei dem die Option „Keine“ in der Textauswahl nicht funktionierte, wenn von der App definierte Einstellungen für die Auswahl von Text-Tracks vorhanden waren.
- Das gestreckte/zugeschnittene Video im
- DASH-Erweiterung:
- Unterstützung für Zeiträume hinzugefügt, die in der Mitte eines Segments beginnen (#1440).
- Smooth Streaming-Erweiterung:
- Ein
Bad magic number for Bundle
-Fehler beim Abspielen von SmoothStreaming-Streams mit Text-Tracks wurde behoben (#1779).
- Ein
- RTSP-Erweiterung:
- Decoder-Erweiterungen (FFmpeg, VP9, AV1 usw.):
- Fügen Sie das IAMF-Decodermodul hinzu, das die Wiedergabe von MP4-Dateien mit IAMF-Tracks unterstützt. Dazu wird die native libiamf-Bibliothek verwendet, um Audio zu synthetisieren.
- Die Wiedergabe ist mit einem Stereolayout sowie mit 5.1 mit Räumlichkeit und optional aktivierter Erfassung von Kopfbewegungen möglich. Die Unterstützung der binauralen Wiedergabe ist derzeit jedoch nicht verfügbar.
- Unterstützung von 16‑KB-Seiten für Decodererweiterungen unter Android 15 hinzugefügt (#1685).
- Fügen Sie das IAMF-Decodermodul hinzu, das die Wiedergabe von MP4-Dateien mit IAMF-Tracks unterstützt. Dazu wird die native libiamf-Bibliothek verwendet, um Audio zu synthetisieren.
- Cast-Erweiterung:
- Die Bereinigung der Zeitachse wird nach dem Trennen der CastSession beendet. So kann die Sender-App die Wiedergabe nach dem Trennen der Verbindung lokal fortsetzen.
- Füllen Sie
DeviceInfo
von CastPlayer aus, wenn einContext
angegeben wird. Dadurch kann dieMediaSession
mit einerRoutingSession
verknüpft werden, was für die Integration von Output Switcher erforderlich ist (#1056).
- Test-Tools:
DataSourceContractTest
enthält jetzt Tests, um Folgendes zu überprüfen:- Der Eingabestream
read position
wurde aktualisiert. - Der Ausgabepuffer
offset
wird korrekt angewendet.
- Der Eingabestream
- Demo-App
- Beheben Sie die Speicherlecks in der Demo-App für Kurzvideos (#1839).
- Entfernen Sie die veralteten Symbole:
- Die eingestellten
Player.hasPrevious
undPlayer.hasPreviousWindow()
wurden entfernt. Verwenden Sie stattdessenPlayer.hasPreviousMediaItem()
. - Veraltete
Player.previous()
-Methode entfernt. Verwenden Sie stattdessenPlayer.seekToPreviousMediaItem()
. - Veraltete
DrmSessionEventListener.onDrmSessionAcquired
-Methode entfernt. - Entfernen Sie eingestellte
DefaultEncoderFactory
-Konstruktoren. Verwenden Sie stattdessenDefaultEncoderFactory.Builder
.
- Die eingestellten
Version 1.5.0-rc02
19. November 2024
Verwenden Sie die stabile Version 1.5.0.
Version 1.5.0-rc01
13. November 2024
Verwenden Sie die stabile Version 1.5.0.
Version 1.5.0-beta01
30. Oktober 2024
Verwenden Sie die stabile Version 1.5.0.
Version 1.5.0-alpha01
10. September 2024
Verwenden Sie die stabile Version 1.5.0.
Version 1.4.0
Version 1.4.1
27. August 2024
androidx.media3:media3-*:1.4.1
ist veröffentlicht.
Version 1.4.1 enthält diese Commits.
- ExoPlayer:
- Extraktoren:
- MP3: Der
Searched too many bytes
-Fehler wird behoben, indem nachfolgende Nicht-MP3-Daten basierend auf dem Längenfeld in einemInfo
-Frame korrekt ignoriert werden (#1480).
- MP3: Der
- Text:
- TTML: Die Verarbeitung von Prozentwerten für
tts:fontSize
wurde korrigiert, damit sie korrekt von übergeordneten Knoten mit Prozentwerten fürtts:fontSize
übernommen werden. - Fehler
IndexOutOfBoundsException
inLegacySubtitleUtil
behoben, der durch die falsche Verarbeitung des Falls verursacht wurde, in dem die angeforderte Startzeit der Ausgabe größer oder gleich der Endzeit des Ereignisses inSubtitle
ist (#1516).
- TTML: Die Verarbeitung von Prozentwerten für
- DRM:
- Fehler
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE
auf Geräten mit API 31 oder höher beheben, auf denen L1-Widevine-Inhalte wiedergegeben werden. Dieser Fehler wird durch eine unvollständige Implementierung der Framework-MethodeMediaDrm.requiresSecureDecoder
(#1603) verursacht.
- Fehler
- Wirkung:
- Fügen Sie
GlObjectsProvider
einerelease()
-Methode hinzu.
- Fügen Sie
- Sitzung:
- Wandle ein Doppeltippen auf
KEYCODE_HEADSETHOOK
in die Aktion „Zum nächsten Titel springen“ um, wie dokumentiert (#1493). - Behandle
KEYCODE_HEADSETHOOK
als „play“-Befehl inMediaButtonReceiver
, wenn du entscheidest, ob du ihn ignorieren möchtest, um einenForegroundServiceDidNotStartInTimeException
(#1581) zu vermeiden.
- Wandle ein Doppeltippen auf
- RTSP-Erweiterung:
- Ungültige Media-Beschreibungen beim SDP-Parsing überspringen (#1087).
Version 1.4.0
25. Juli 2024
androidx.media3:media3-*:1.4.0
ist veröffentlicht.
Version 1.4.0 enthält diese Commits.
- Gemeinsame Mediathek:
- Leiten Sie mutmaßliche No-Op-Suchaufrufe an die geschützten Methoden
BasePlayer.seekTo()
undSimpleBasePlayer.handleSeek()
weiter, anstatt sie zu ignorieren. Wenn Sie diese Methoden in einem benutzerdefinierten Player implementieren, müssen Sie diese zusätzlichen Aufrufe möglicherweise mitmediaItemIndex == C.INDEX_UNSET
verarbeiten. - Die Kompilierungsabhängigkeit von der erweiterten Java 8-Desugarisierung wurde entfernt (#1312).
- Achten Sie darauf, dass die an
MediaItem.Builder.setImageDurationMs()
übergebene Dauer für einMediaItem
, das kein Bild ist, ignoriert wird (wie dokumentiert). - Fügen Sie
Format.customData
hinzu, um benutzerdefinierte Informationen zuFormat
-Instanzen zu speichern, die von der App bereitgestellt werden.
- Leiten Sie mutmaßliche No-Op-Suchaufrufe an die geschützten Methoden
- ExoPlayer:
- Fügen Sie
BasePreloadManager
hinzu, um das Vorladen für mehrere Quellen basierend auf den Prioritäten zu koordinieren, die durch ihrrankingData
definiert werden. Sie können diese Klasse erweitern, um sie anzupassen. Fügen SieDefaultPreloadManager
hinzu, dasPreloadMediaSource
verwendet, um Media-Samples der Quellen in den Arbeitsspeicher vorzuladen, und eine GanzzahlrankingData
, die den Index eines Elements auf der Benutzeroberfläche angibt. - Fügen Sie
PlayerId
zu den meisten Methoden vonLoadControl
hinzu, damitLoadControl
-Implementierungen mehrere Spieler unterstützen. - Entfernen Sie
Buffer.isDecodeOnly()
undC.BUFFER_FLAG_DECODE_ONLY
. Dieses Flag muss nicht festgelegt werden, da Renderer und Decoder entscheiden, ob Puffer basierend auf dem Zeitstempel übersprungen werden. Bei benutzerdefiniertenRenderer
-Implementierungen sollte geprüft werden, ob die Pufferzeit mindestensBaseRenderer.getLastResetPositionUs()
beträgt, um zu entscheiden, ob eine Probe angezeigt werden soll. BenutzerdefinierteSimpleDecoder
-Implementierungen können bei BedarfisAtLeastOutputStartTimeUs()
prüfen oder andere Puffer mitDecoderOutputBuffer.shouldBeSkipped
markieren, um sie zu überspringen. - Ermöglicht, dass von
TargetPreloadStatusControl.getTargetPreloadStatus(T)
ein Nullwert zurückgegeben wird, um anzugeben, dass keinMediaSource
mit dem angegebenenrankingData
vorab geladen werden soll. - Fügen Sie
remove(MediaSource)
zuBasePreloadManager
hinzu. - Fügen Sie
reset()
zuBasePreloadManager
hinzu, um alle Quellen freizugeben, die gehalten werden, und die Preload Manager-Instanz beizubehalten. - Fügen Sie
ExoPlayer.setPriority()
(undBuilder.setPriority()
) hinzu, um den Prioritätswert zu definieren, der inPriorityTaskManager
und für die MediaCodec-Wichtigkeit ab API 35 verwendet wird. - Problem mit der Aktualisierung der letzten Rebuffer-Zeit behoben, das zu einem falschen
bs
-Schlüssel (Buffer Starvation) in CMCD geführt hat (#1124). - Fügen Sie
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
hinzu, um anzugeben, dass die Quelle bis zum Ende geladen wurde. So können die Implementierungen vonDefaultPreloadManager
undPreloadMediaSource.PreloadControl
die nächste Quelle vorab laden oder andere Aktionen ausführen. - Ein Fehler wurde behoben, durch den das Überspringen von Stille am Ende von Elementen eine Wiedergabeausnahme auslösen konnte.
- Fügen Sie
clear
zuPreloadMediaSource
hinzu, um den Zeitraum für das Vorabladen zu verwerfen. - Neuen Fehlercode
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
hinzufügen, der verwendet wird, wenn Codec-Ressourcen für Aufgaben mit höherer Priorität freigegeben werden. AdsMediaSource
kann Pre-Roll-Anzeigen laden, bevor die Vorbereitung der ersten Inhalte abgeschlossen ist (#1358).- Ein Fehler wurde behoben, durch den die Wiedergabe zu
STATE_ENDED
wechselte, wenn ein DASH-Livestream mit mehreren Zeiträumen neu vorbereitet wurde, nachdem der ursprüngliche Zeitraum bereits aus dem Manifest entfernt worden war. - Benennen Sie
onTimelineRefreshed()
inonSourcePrepared()
undonPrepared()
inonTracksSelected()
inPreloadMediaSource.PreloadControl
um. Benennen Sie auch die IntDefs inDefaultPreloadManager.Stage
entsprechend um. - Experimentelle Unterstützung für dynamische Planung hinzugefügt, um die Arbeit besser an CPU-Aktivierungszyklen auszurichten und das Aktivieren zu verzögern, bis Renderer Fortschritte machen können.
Sie können diese Funktion aktivieren, indem Sie
experimentalSetDynamicSchedulingEnabled()
verwenden, wenn Sie Ihre ExoPlayer-Instanz einrichten. - Fügen Sie
Renderer.getDurationToProgressUs()
hinzu. EinRenderer
kann diese Methode implementieren, um ExoPlayer die Dauer zurückzugeben, um die die Wiedergabe voranschreiten muss, damit der Renderer fortfahren kann. WennExoPlayer
mitexperimentalSetDynamicSchedulingEnabled()
festgelegt ist, ruftExoPlayer
diese Methode auf, wenn die Zeit für die Planung der Arbeitsaufgabe berechnet wird. - Fügen Sie
MediaCodecAdapter#OnBufferAvailableListener
hinzu, um eine Benachrichtigung zu erhalten, wenn Ein- und Ausgabepuffer für die Verwendung durchMediaCodecRenderer
verfügbar sind.MediaCodecRenderer
signalisiertExoPlayer
beim Empfang dieser Callbacks. WennExoPlayer
mitexperimentalSetDynamicSchedulingEnabled()
festgelegt ist, plantExoPlayer
seinen Arbeitszyklus, da Renderer Fortschritte machen können. - Verwenden Sie für
LoadControl
-Methoden eine Datenklasse anstelle einzelner Parameter. - Fügen Sie
ExoPlayer.isReleased()
hinzu, um zu prüfen, obExoplayer.release()
aufgerufen wurde. - Fügen Sie
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
hinzu, um die maximale Position zu konfigurieren, für dieseekToPrevious()
nach dem vorherigen Element sucht (#1425). - Einige Inkonsistenzen beim Audiofokus wurden behoben, z.B. wenn der vollständige oder vorübergehende Fokusverlust nicht gemeldet wurde, während der Player pausiert war (#1436).
- Behebe potenzielle
IndexOutOfBoundsException
, die dadurch entstehen, dass Extractor nach dem ersten Vorbereitungsschritt zusätzliche Tracks melden (#1476). Effects
inExoPlayer.setVideoEffect()
erhält die Zeitstempel ohne Renderer-Offset (#1098).- Mögliche
IllegalArgumentException
beim Behandeln eines Player-Fehlers behoben, der beim Vorlesen eines anderen Playlist-Elements aufgetreten ist (#1483).
- Fügen Sie
- Transformer:
- Fügen Sie
audioConversionProcess
undvideoConversionProcess
zuExportResult
hinzu, um anzugeben, wie der jeweilige Track in der Ausgabedatei erstellt wurde. - Die H.264-Level-Prüfungen für die Schnittoptimierung werden gelockert.
- Unterstützung für den Wechsel zwischen SDR- und HDR-Eingabemedien in einer Sequenz wurde hinzugefügt.
- Unterstützung für Audioeffekte auf Kompositionsebene hinzugefügt
- Unterstützung für das Transcodieren von Ultra-HDR-Bildern in HDR-Videos hinzugefügt
- Ein Problem wurde behoben, bei dem
DefaultAudioMixer
nach dem Zurücksetzen und Wiederverwenden nicht die richtige Anzahl von Byte ausgegeben hat. - Es wurde ein Decoder-Fehler behoben, bei dem die Anzahl der Audiokanäle bei der Verarbeitung von PCM-Eingaben auf Stereo begrenzt war.
- Wenn Sie in
ExoPlayerAssetLoader
Tracks auswählen, ignorieren Sie die Einschränkungen für die Anzahl der Audiokanäle, da sie nur für die Wiedergabe gelten. - Ersetzen Sie die
androidx.media3.transformer.Muxer
-Schnittstelle durchandroidx.media3.muxer.Muxer
und entfernen Sieandroidx.media3.transformer.Muxer
. - Das Laden von HEIC-Bildern über Content-URI-Schemas wurde korrigiert. (#1373).
- Passe die Dauer des Audiotracks in
AudioGraphInput
an, um die A/V-Synchronisierung zu verbessern. - Entfernen Sie das Feld „
ExportResult.processedInputs
“. Wenn Sie dieses Feld für Codec-Details verwenden, nutzen Sie stattdessenDefaultDecoderFactory.listener
. Bei einer Codec-Ausnahme sind die Codec-Details in derExportException.codecInfo
verfügbar.
- Fügen Sie
- Extraktoren:
- MPEG-TS: Führe die Änderung aus, sodass der letzte Frame gerendert wird, indem du die letzte Zugriffseinheit eines Streams an die Sample-Warteschlange übergibst (#7909). Es wurden Korrekturen vorgenommen, um die Probleme zu beheben, die bei HLS-Streams mit nur I-Frames(#1150) und H.262-HLS-Streams (#1126) aufgetreten sind.
- MP3: Bevorzugen Sie die Datengröße aus einem
Info
-Frame gegenüber der Größe, die vom zugrunde liegenden Stream gemeldet wird (z.B. Dateigröße oder HTTP-Content-Length
-Header). So werden nicht abspielbare Trailerdaten (z.B. Albumcover) aus den Berechnungen für die Suche mit konstanter Bitrate ausgeschlossen, wodurch die Suche genauer wird (#1376). - MP3: Verwenden Sie die Frame-Anzahl und andere Daten in einem
Info
-Frame (falls vorhanden), um eine durchschnittliche Bitrate für die Suche mit konstanter Bitrate zu berechnen, anstatt die Bitrate des Frames nach demInfo
-Frame zu extrapolieren, die künstlich klein sein kann, z.B.PCUT
-Frame (#1376). - Die Extraktion des PCM-Audioformats in AVI-Containern wurde korrigiert.
- Audio:
- DTS:X Profile 2-Codierungsattribute für die Passthrough-Wiedergabe korrigieren (#1299).
- Setze für die ausgelagerte Wiedergabe das Tracking-Feld für den Abschluss des Streams in
DefaultAudioSink
zurück, bevor duAudioTrack.stop()
aufrufst, damitAudioTrack.StreamEventCallback#onPresentationEnded
korrekt erkennt, wann alle ausstehenden Daten wiedergegeben wurden. - Ein Fehler in
SilenceSkippingAudioProcessor
wurde behoben, bei dem Übergänge zwischen verschiedenen Audioformaten (z. B. von Stereo zu Mono) dazu führen konnten, dass der Prozessor eine Ausnahme ausgibt (#1352). - Implementieren Sie
MediaCodecAudioRenderer.getDurationToProgressUs()
, damit ExoPlayer seine Hauptarbeitsloop dynamisch für den Zeitpunkt plant, zu dem der MediaCodecAudioRenderer Fortschritte machen kann.
- Video:
- Ein Problem wurde behoben, durch das
Listener.onRenderedFirstFrame()
beim Wechseln von Oberflächen während der Wiedergabe zu früh angezeigt wurde. - Die Fallback-Logik für den Dolby Vision-Decoder wurde korrigiert, sodass bei Bedarf ein kompatibler AV1-Decoder verwendet wird (#1389).
- Es wurde eine Codec-Ausnahme behoben, die durch das Aktivieren eines Video-Renderers während der Wiedergabe verursacht werden konnte.
- Ein Problem wurde behoben, durch das
- Text:
- Es wurde ein Problem behoben, bei dem Untertitel, die vor einer Suchposition beginnen, übersprungen wurden. Dieses Problem wurde erst in Media3 1.4.0-alpha01 eingeführt.
- Das Standardverhalten für das Parsen von Untertiteln wird so geändert, dass es während der Extraktion statt während des Renderns erfolgt (siehe Architekturdiagramm von ExoPlayer für den Unterschied zwischen Extraktion und Rendern).
- Diese Änderung kann durch Aufrufen von sowohl
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
als auchTextRenderer.experimentalSetLegacyDecodingEnabled(true)
überschrieben werden. In der Dokumentation zur Anpassung erfahren Sie, wie Sie diese Komponenten in eineExoPlayer
-Instanz einbinden. Diese Methoden und die Unterstützung für die alte Untertiteldecodierung werden in einer zukünftigen Version entfernt. - Apps mit benutzerdefinierten
SubtitleDecoder
-Implementierungen müssen aktualisiert werden, um stattdessenSubtitleParser
zu implementieren (undSubtitleParser.Factory
anstelle vonSubtitleDecoderFactory
).
- Diese Änderung kann durch Aufrufen von sowohl
- PGS: Die Run-Length-Decodierung wurde korrigiert, um
0
als Farbindex anstelle eines Literal-Farbwerts (#1367) aufzulösen. - CEA-708: Ignoriere den Wert
rowLock
. In der CEA-708-E S-2023-Spezifikation wird angegeben, dass sowohlrowLock
als auchcolumnLock
als „true“ angenommen werden sollten, unabhängig von den im Stream vorhandenen Werten (columnLock
wird nicht unterstützt, daher wird effektiv immer „false“ angenommen).- Diese Änderung war ursprünglich in den Versionshinweisen für
1.3.0-alpha01
enthalten, wurde aber vor dem Release von1.3.0-rc01
versehentlich rückgängig gemacht. Das Problem wurde behoben und die Änderung ist wieder vorhanden.
- Diese Änderung war ursprünglich in den Versionshinweisen für
- CEA-708: Vermeiden Sie, dass durch die naive Verarbeitung des Befehls „Stiftposition festlegen“ durch ExoPlayer doppelte Zeilenumbrüche hinzugefügt werden (#1315).
- Beheben Sie einen
IllegalArgumentException
ausLegacySubtitleUtil
, wenn ein WebVTT-Untertitelbeispiel keine Cues enthält, z.B. als Teil eines DASH-Streams (#1516).
- Metadaten:
- Die Zuordnung von MP4-Dateien zu ID3-Sortiertags wurde korrigiert. Bisher wurden die MP4-Tags „album sort“ (
soal
), „artist sort“ (soar
) und „album artist sort“ (soaa
) fälschlicherweise den ID3-TagsTSO2
,TSOA
undTSOP
zugeordnet (#1302). - Das Lesen von numerischen
gnre
- (Genre) undtmpo
-Tags (Tempo) in MP4-Dateien (/iTunes) wurde korrigiert, wenn der Wert mehr als ein Byte lang ist. - ID3-Frame
TCON
anMediaMetadata.genre
weitergeben (#1305).
- Die Zuordnung von MP4-Dateien zu ID3-Sortiertags wurde korrigiert. Bisher wurden die MP4-Tags „album sort“ (
- Bild:
- Unterstützung für nicht quadratische DASH-Miniaturansichtraster hinzugefügt (#1300).
- Unterstützung für AVIF für API 34+ hinzugefügt.
- Lassen Sie
null
als Parameter fürExoPlayer.setImageOutput()
zu, um eine zuvor festgelegteImageOutput
zu löschen.
- DataSource:
- Implementieren Sie die Unterstützung für
android.resource://package/id
-Rohressourcen-URIs, wobeipackage
sich vom Paket der aktuellen Anwendung unterscheidet. Das war bisher nicht dokumentiert, ist aber eine effizientere Methode, um auf Ressourcen in einem anderen Paket zuzugreifen als über den Namen. - Prüfen Sie in den
DataSpec
-Konstruktoren, oburl
nicht null ist. Dieser Parameter wurde bereits als „nicht null“ annotiert. - Ermöglichen Sie
ByteArrayDataSource
, einen URI währendopen()
in ein Byte-Array aufzulösen, anstatt ihn bei der Erstellung fest zu codieren (#1405).
- Implementieren Sie die Unterstützung für
- DRM:
- Das Festlegen eines
LoadErrorHandlingPolicy
fürDefaultDrmSessionManagerProvider
ist jetzt möglich. (#1271)
- Das Festlegen eines
- Wirkung:
- Unterstützung mehrerer Geschwindigkeitsänderungen innerhalb desselben
EditedMediaItem
oderComposition
inSpeedChangeEffect
. - Unterstützung für HLG- und PQ-Ausgabe aus Ultra HDR-Bitmap-Eingabe.
- Unterstützung für EGL_GL_COLORSPACE_BT2020_HLG_EXT hinzugefügt, wodurch die HLG-Oberflächenausgabe in ExoPlayer.setVideoEffect und Transformer DebugSurfaceView verbessert wird.
- Aktualisieren Sie die Implementierung der Overlay-Matrix, damit sie mit der Dokumentation übereinstimmt. Dazu müssen Sie die in
setOverlayFrameAnchor()
angewendeten x- und y-Werte tauschen. Wenn SieOverlaySettings.Builder.setOverlayFrameAnchor()
verwenden, tauschen Sie die x- und y-Werte, indem Sie sie mit-1
multiplizieren. - Ein Fehler wurde behoben, bei dem
TimestampWrapper
bei Verwendung mitExoPlayer#setVideoEffects
abgestürzt ist (#821). - Ändern Sie den Standard-SDR-Farbarbeitsbereich von linearen Farben zu elektrischem BT.709-SDR-Video. Außerdem gibt es eine dritte Option, um den ursprünglichen Farbraum beizubehalten.
- Es ist jetzt möglich, eine unbestimmte Z-Reihenfolge für EditedMediaItemSequences zu definieren (#1055).
- Behalten Sie einen einheitlichen Luminanzbereich für verschiedene HDR-Inhalte bei (HLG-Bereich).
- Unterstützung für Ultra HDR-Overlays (Bitmap) auf HDR-Inhalten hinzugefügt
- Zulassen, dass
SeparableConvolution
-Effekte vor API 26 verwendet werden. - Entfernen Sie nicht verwendete
OverlaySettings.useHdr
, da der dynamische Bereich von Overlay und Frame übereinstimmen muss. - HDR-Unterstützung für
TextOverlay
hinzufügen Die Luminanz des Text-Overlays kann mitOverlaySettings.Builder.setHdrLuminanceMultiplier()
angepasst werden.
- Unterstützung mehrerer Geschwindigkeitsänderungen innerhalb desselben
- IMA-Erweiterung:
- Die Promote API, die für die Wiedergabe von DAI-Anzeigenstreams in Apps erforderlich ist, ist jetzt stabil.
- Fügen Sie
replaceAdTagParameters(Map <String, String>)
zuImaServerSideAdInsertionMediaSource.AdLoader
hinzu, damit Parameter für Anzeigen-Tags zur Laufzeit ersetzt werden können. - Ein Fehler wurde behoben, bei dem
VideoAdPlayer.VideoAdPlayerCallback.onError()
nicht aufgerufen wurde, wenn während der Anzeigenwiedergabe ein Playerfehler aufgetreten ist (#1334). - Die IMA SDK-Version wurde auf 3.33.0 aktualisiert, um einen
NullPointerException
bei Verwendung vondata://
-Anzeigen-Tag-URIs zu beheben (#700).
- Sitzung:
- Ändere den Standardwert von
CommandButton.enabled
intrue
und sorge dafür, dass der Wert für Controller auch dann „false“ bleiben kann, wenn der zugehörige Befehl verfügbar ist. - Fügen Sie Symbolkonstanten für
CommandButton
hinzu, die anstelle von benutzerdefinierten Symbolressourcen verwendet werden sollen. - Fügen Sie
MediaSessionService.isPlaybackOngoing()
hinzu, damit Apps abfragen können, ob der Dienst inonTaskRemoved()
beendet werden muss (#1219). - Füge
MediaSessionService.pauseAllPlayersAndStopSelf()
hinzu, um die Wiedergabe aller Sitzungen anzuhalten, und rufestopSelf()
auf, um den Lebenszyklus vonMediaSessionService
zu beenden. - Überschreiben Sie
MediaSessionService.onTaskRemoved(Intent)
, um eine sichere Standardimplementierung bereitzustellen, die den Dienst im Vordergrund ausführt, wenn die Wiedergabe läuft, oder den Dienst andernfalls beendet. - Die Fortschrittsanzeige in der Medienbenachrichtigung für Livestreams wird ausgeblendet, wenn die Dauer nicht in den Metadaten der Plattform-Sitzung festgelegt wird (#1256).
- Die Konvertierung von
MediaMetadata
zuMediaDescriptionCompat
muss so erfolgen, dass bei der Auswahl von Metadateneigenschaften dieselbe bevorzugte Reihenfolge und Logik wie in media1 verwendet wird. MediaSession.sendError()
hinzugefügt, damit nicht schwerwiegende Fehler an den Media3-Controller gesendet werden können. Wenn Sie den Notification Controller verwenden (sieheMediaSession.getMediaNotificationControllerInfo()
), wird der benutzerdefinierte Fehler verwendet, um denPlaybackState
der Plattform-Session mit den angegebenen Fehlerinformationen in einen Fehlerstatus zu ändern (#543).- Fügen Sie
MediaSession.Callback.onPlayerInteractionFinished()
hinzu, um Sitzungen darüber zu informieren, wenn eine Reihe von Spielerinteraktionen von einem bestimmten Controller abgeschlossen ist. - Fügen Sie
SessionError
hinzu und verwenden Sie es inSessionResult
undLibraryResult
anstelle des Fehlercodes, um weitere Informationen zum Fehler und zur Behebung des Fehlers (falls möglich) bereitzustellen. - Veröffentliche den Code für die Media3 Controller Test App, mit der Interaktionen mit Apps getestet werden können, die eine Mediensitzung veröffentlichen.
- Extras, die an
MediaSession[Builder].setSessionExtras()
von Media3 übergeben werden, anPlaybackStateCompat.getExtras()
eines Media1-Controllers weitergeben. - Schwerwiegende und nicht schwerwiegende Fehler der Plattform-Session zuordnen. Ein
PlaybackException
wird einem schwerwiegenden Fehlerstatus desPlaybackStateCompat
zugeordnet. EinSessionError
, das mitMediaSession.sendError(ControllerInfo, SessionError)
an den Media Notification Controller gesendet wird, wird inPlaybackStateCompat
einem nicht schwerwiegenden Fehler zugeordnet. Das bedeutet, dass Fehlercode und ‑meldung festgelegt werden, der Status der Plattform-Session jedoch nicht inSTATE_ERROR
geändert wird. - Ermöglicht es, die Sitzungsaktivität pro Controller festzulegen, um die globale Sitzungsaktivität zu überschreiben. Die Sitzungsaktivität kann für einen Controller bei der Verbindung definiert werden, indem ein
ConnectionResult
mitAcceptedResultBuilder.setSessionActivivty(PendingIntent)
erstellt wird. Sobald die Verbindung hergestellt ist, kann die Sitzungsaktivität mitMediaSession.setSessionActivity(ControllerInfo, PendingIntent)
aktualisiert werden. - Die Fehlerreplikation von Aufrufen von
MediaLibrarySession.Callback
wurde verbessert. Die Fehlerreplikation kann jetzt mitMediaLibrarySession.Builder.setLibraryErrorReplicationMode()
konfiguriert werden, um den Fehlertyp auszuwählen oder die Fehlerreplikation zu deaktivieren, die standardmäßig aktiviert ist.
- Ändere den Standardwert von
- UI:
- Unterstützung für die Bildanzeige in
PlayerView
hinzufügen, wenn eine Verbindung zu einemExoPlayer
besteht (#1144). - Es wurde die Möglichkeit hinzugefügt, verschiedene Symbole in
PlayerControlView
über XML-Attribute anzupassen, um unterschiedliche Drawables proPlayerView
-Instanz zu ermöglichen und nicht nur globale Überschreibungen (#1200). - Umgehen eines Plattformfehlers, der bei Verwendung von
SurfaceView
in einem Compose-AndroidView
auf API 34 zu gestreckten oder zugeschnittenen Videos führt (#1237).
- Unterstützung für die Bildanzeige in
- Downloads:
- Achten Sie darauf, dass
DownloadHelper
keine nicht veröffentlichtenRenderer
-Instanzen weitergibt, da dies letztendlich dazu führen kann, dass eine App mitIllegalStateException: Too many receivers, total of 1000, registered for pid
abstürzt (#1224).
- Achten Sie darauf, dass
- Cronet-Erweiterung:
- Behebe das Problem
SocketTimeoutException
inCronetDataSource
. In einigen Versionen von Cronet ist die vom Callback bereitgestellte Anfrage nicht immer dieselbe. Dies führt dazu, dass der Callback nicht abgeschlossen wird und die Zeit für die Anfrage abläuft (https://issuetracker.google.com/328442628).
- Behebe das Problem
- HLS-Erweiterung:
- Es wurde ein Fehler behoben, bei dem ausstehende EMSG-Samples, die auf eine Unterbrechung warteten, in
HlsSampleStreamWrapper
mit einem falschen Offset delegiert wurden, was zu einemIndexOutOfBoundsException
oder einemIllegalArgumentException
führte (#1002). - Ein Fehler wurde behoben, durch den nicht primäre Playlists für LL-HLS-Streams immer wieder neu geladen wurden (#1240).
- Es wurde ein Fehler behoben, durch den die Aktivierung von CMCD für HLS mit Initialisierungssegmenten zu
Source Error
undIllegalArgumentException
führte. - Behebung eines Fehlers, durch den nicht primäre Playlists während der Livewiedergabe nicht aktualisiert wurden (#1240).
- Ein Fehler wurde behoben, bei dem die Aktivierung von CMCD für HLS-Livestreams zu
ArrayIndexOutOfBoundsException
führte ( (#1395).
- Es wurde ein Fehler behoben, bei dem ausstehende EMSG-Samples, die auf eine Unterbrechung warteten, in
- DASH-Erweiterung:
- Cast-Erweiterung:
- Fehler behoben, durch den der Albumtitel von
MediaQueueItem
im Media3-Media-Item in den Künstlernamen umgewandelt wurde (#1255).
- Fehler behoben, durch den der Albumtitel von
- Test-Tools:
- Implementieren Sie
onInit()
undonRelease()
inFakeRenderer
. - Ändern Sie
TestPlayerRunHelper.runUntil()/playUntil()
-Methoden so, dass sie bei nicht schwerwiegenden Fehlern (z.B. bei Fehlern, die anAnalyticsListener.onVideoCodecError()
gemeldet werden) fehlschlagen. Verwenden Sie die neueTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
-Methodenkette, um dieses Verhalten zu deaktivieren.
- Implementieren Sie
- Demo-App:
- Verwenden Sie
DefaultPreloadManager
in der Demo-App für Kurzformen. - Wiederholungsmodus kann mit
Intent
-Argumenten über die Befehlszeile festgelegt werden (#1266). - Verwenden Sie
HttpEngineDataSource
alsHttpDataSource
, wenn das Gerät dies unterstützt.
- Verwenden Sie
- Entfernen Sie die veralteten Symbole:
- Entfernen Sie
CronetDataSourceFactory
. Verwenden Sie stattdessenCronetDataSource.Factory
. - Einige
DataSpec
-Konstruktoren entfernen. Verwenden Sie stattdessenDataSpec.Builder
. - Entfernen Sie die Methode
setContentTypePredicate(Predicate)
ausDefaultHttpDataSource
,OkHttpDataSource
undCronetDataSource
. Verwenden Sie stattdessen die entsprechende Methode für jedesXXXDataSource.Factory
. - Entfernen Sie
OkHttpDataSource
-Konstruktoren undOkHttpDataSourceFactory
. Verwenden Sie stattdessenOkHttpDataSource.Factory
. - Entfernen Sie
PlayerMessage.setHandler(Handler)
. Verwenden Sie stattdessensetLooper(Looper)
. - Entfernen Sie das Feld „
Timeline.Window.isLive
“. Verwenden Sie stattdessen die MethodeisLive()
. - Entfernen Sie
DefaultHttpDataSource
-Konstruktoren. Verwenden Sie stattdessenDefaultHttpDataSource.Factory
. - Entfernen Sie
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
. Verwenden Sie stattdessenDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
. - Entfernen Sie
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
. Verwenden Sie stattdessenMediaCodecInfo.canReuseCodec(Format, Format)
. - Entfernen Sie die Methode
DrmSessionManager.DUMMY
undgetDummyDrmSessionManager()
. Verwenden Sie stattdessenDrmSessionManager.DRM_UNSUPPORTED
. - Entferne
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)
,AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)
,AudioRendererEventListener.onAudioInputFormatChanged(Format)
,VideoRendererEventListener.onVideoInputFormatChanged(Format)
. Verwenden Sie stattdessen die Überladungen, die einDecoderReuseEvaluation
akzeptieren. - Entfernen Sie die Konstanten
RendererSupport.FormatSupport
IntDef undFORMAT_HANDLED
,FORMAT_EXCEEDS_CAPABILITIES
,FORMAT_UNSUPPORTED_DRM
,FORMAT_UNSUPPORTED_SUBTYPE
undFORMAT_UNSUPPORTED_TYPE
. Verwenden Sie stattdessen die entsprechenden IntDef- und Konstanten inandroidx.media3.common.C
(z.B.C.FORMAT_HANDLED
). - Entfernen Sie die
Bundleable
-Schnittstelle. Dazu gehört auch das Entfernen aller konstantenBundleable.Creator<Foo> CREATOR
-Felder. Aufrufer sollten stattdessen die MethodenBundle toBundle()
undstatic Foo fromBundle(Bundle)
für jeden Typ verwenden.
- Entfernen Sie
Version 1.4.0-rc01
10. Juli 2024
Verwenden Sie die stabile Version 1.4.0.
Version 1.4.0-beta01
26. Juni 2024
Verwenden Sie die stabile Version 1.4.0.
Version 1.4.0-alpha02
7. Juni 2024
Verwenden Sie die stabile Version 1.4.0.
Version 1.4.0-alpha01
17. April 2024
Verwenden Sie die stabile Version 1.4.0.
Version 1.3.0
Version 1.3.1
11. April 2024
androidx.media3:media3-*:1.3.1
ist veröffentlicht.
Version 1.3.1 enthält diese Commits.
- Gemeinsame Mediathek:
- Fügen Sie
Format.labels
hinzu, um lokalisierte oder andere alternative Labels zuzulassen.
- Fügen Sie
- ExoPlayer:
- Das Problem, dass
PreloadMediaPeriod
die Streams nicht beibehalten kann, wenn sie noch einmal vorab geladen wird, wurde behoben. - Wenden Sie bei der erneuten Auswahl von Tracks das richtige
TrackSelectionResult
für den Wiedergabezeitraum an. - Renderer mit Early-Enablement sollten erst nach dem Fortschreiten des Wiedergabezeitraums gestartet werden, wenn zwischen Media-Elementen gewechselt wird (#1017).
- Der ProGuard-Regel
-keepclasseswithmembers
fürDefaultVideoFrameProcessor.Factory.Builder.build()
wurde der fehlende Rückgabetyp hinzugefügt (#1187).
- Das Problem, dass
- Transformer:
- Es wurde eine Problemumgehung für Ausnahmen hinzugefügt, die aufgrund von
MediaMuxer
ausgelöst werden, da negative Präsentationszeitstempel vor API 30 nicht unterstützt werden.
- Es wurde eine Problemumgehung für Ausnahmen hinzugefügt, die aufgrund von
- Titelauswahl:
DefaultTrackSelector
: Bevorzuge Videotracks mit einer „angemessenen“ Framerate (>=10 fps) gegenüber solchen mit einer niedrigeren oder nicht festgelegten Framerate. So wird sichergestellt, dass der Player den „echten“ Videotrack in MP4-Dateien auswählt, die aus Bewegungsfotos extrahiert wurden. Diese können zwei HEVC-Tracks enthalten, von denen einer eine höhere Auflösung, aber eine sehr geringe Anzahl von Frames hat (#1051).
- Extraktoren:
- Ein Problem wurde behoben, bei dem das Padding beim Lesen von Chunks mit ungerader Größe aus WAV-Dateien nicht übersprungen wurde (#1117).
- MP3: Füllen Sie
Format.averageBitrate
aus Metadaten-Frames wieXING
undVBRI
. - MPEG-TS: Eine Änderung wurde rückgängig gemacht, die sicherstellen sollte, dass der letzte Frame gerendert wird. Dazu wurde die letzte Zugriffseinheit eines Streams an die Sample-Warteschlange übergeben (#7909). Das liegt daran, dass die Änderung neue Probleme mit reinen I-Frame-HLS-Streams (#1150) und H.262-HLS-Streams (#1126) verursacht.
- Audio:
- Wiedergabe-Engine-Wiederherstellung ermöglichen, indem das Offloading deaktiviert wird, wenn die Initialisierung des Audiotracks im Offload-Modus fehlschlägt.
- Video:
- Es wurde eine Problemumgehung für ein Geräteproblem auf dem Galaxy Tab S7 FE, dem Chromecast mit Google TV und dem Lenovo M10 FHD Plus hinzugefügt, das dazu führt, dass H265-Streams mit 60 fps als nicht unterstützt markiert werden.
- Es wurde ein Workaround hinzugefügt, der dafür sorgt, dass der erste Frame beim Tunneling immer gerendert wird, auch wenn das Gerät dies nicht automatisch wie von der API gefordert tut (#1169). (#966).
- Es wurde ein Problem behoben, bei dem die Verarbeitung von HDR-Farbinformationen zu einem fehlerhaften Verhalten des Codecs führte und adaptive Formatwechsel für SDR-Videotracks verhindert wurden (#1158).
- Text:
- WebVTT: Verhindern, dass direkt aufeinanderfolgende Cues fälschlicherweise zusätzliche
CuesWithTiming
-Instanzen ausWebvttParser.parse
erstellen (#1177).
- WebVTT: Verhindern, dass direkt aufeinanderfolgende Cues fälschlicherweise zusätzliche
- DRM:
- Umgehen Sie eine
NoSuchMethodError
, die vomMediaDrm
-Framework anstelle vonResourceBusyException
oderNotProvisionedException
auf einigen Android 14-Geräten ausgelöst werden kann (#1145).
- Umgehen Sie eine
- Wirkung:
- Verbessertes Tone-Mapping von PQ zu SDR durch Konvertieren von Farbräumen.
- Sitzung:
- UI:
- Als Fallback wird der Name der Audiotrack-Sprache verwendet, wenn
Locale
keinen Anzeigenamen ermitteln kann (#988).
- Als Fallback wird der Name der Audiotrack-Sprache verwendet, wenn
- DASH-Erweiterung:
- Füllen Sie alle
Label
-Elemente aus dem Manifest inFormat.labels
ein (#1054).
- Füllen Sie alle
- RTSP-Erweiterung:
- Leere Werte für Sitzungsinformationen (i-Tags) beim SDP-Parsing überspringen (#1087).
- Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
- Die MIDI-Erweiterung ist standardmäßig als lokale Abhängigkeit deaktiviert, da ein zusätzliches Maven-Repository konfiguriert werden muss. Nutzer, die dieses Modul aus einer lokalen Abhängigkeit benötigen, können es wieder aktivieren.
Version 1.3.0
6. März 2024
androidx.media3:media3-*:1.3.0
ist veröffentlicht.
Version 1.3.0 enthält diese Commits.
- Gemeinsame Mediathek:
- Implementieren Sie die Unterstützung für
android.resource://package/[type/]name
-Rohressourcen-URIs, wobei sichpackage
vom Paket der aktuellen Anwendung unterscheidet. Das hat immer funktioniert, war aber bisher nicht richtig implementiert. - MIME-Typen, die vom App-Code festgelegt oder aus Medien gelesen werden, werden normalisiert, sodass sie nur aus Kleinbuchstaben bestehen.
- Definieren Sie Anzeigen mit einem vollständigen
MediaItem
anstelle eines einzelnenUri
inAdPlaybackState
. - Erhöhen Sie
minSdk
auf 19 (Android KitKat). Dies entspricht allen anderen AndroidX-Bibliotheken und ist erforderlich, damit wir auf die neuesten Versionen unserer AndroidX-Abhängigkeiten aktualisieren können. - Füllen Sie sowohl
artworkUri
als auchartworkData
inMediaMetadata.Builder.populate(MediaMetadata)
aus, wenn mindestens eines der beiden Elemente nicht null ist (#964).
- Implementieren Sie die Unterstützung für
- ExoPlayer:
- Fügen Sie
PreloadMediaSource
undPreloadMediaPeriod
hinzu, damit Apps eine Inhaltsquelle für Medien an einer bestimmten Startposition vor der Wiedergabe vorab laden können.PreloadMediaSource
bereitet die Inhaltsmedienquelle für den Empfang vonTimeline
vor, bereitet den Zeitraum an der angegebenen Startposition vor und speichert ihn im Cache, wählt Tracks aus und lädt die Media-Daten für den Zeitraum. Apps steuern den Preload-Fortschritt durch die Implementierung vonPreloadMediaSource.PreloadControl
und legen die vorab geladene Quelle für die Wiedergabe im Player fest. - Fügen Sie
ExoPlayer.setImageOutput
hinzu, damit AppsImageRenderer.ImageOutput
festlegen können. DefaultRenderersFactory
stellt dem Player jetzt standardmäßig einImageRenderer
mit nullImageOutput
undImageDecoder.Factory.DEFAULT
zur Verfügung.- Das
Player.Listener.onPositionDiscontinuity
-Ereignis wird ausgegeben, wenn Stille übersprungen wird (#765). - Experimentelle Unterstützung für das Parsen von Untertiteln während der Extraktion hinzugefügt. Sie können diese Option mit
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
aktivieren. - Unterstützung für adaptive Media-Quellen mit
PreloadMediaSource
. - Implementieren Sie
HttpEngineDataSource
, eineHttpDataSource
mit der HttpEngine API. - Unterklassenbildung verhindern
CompositeSequenceableLoader
Diese Komponente wurde bereits erweiterbar gemacht, aber nie in der Bibliothek untergeordnet. Sie können eine Instanz mit dem Decorator-Muster umschließen und eine benutzerdefinierteCompositeSequenceableLoaderFactory
implementieren. - Ein Problem wurde behoben, bei dem durch Wiederholen derselben Zeit die Metadaten dieses Elements gelöscht wurden (#1007).
- Benennen Sie die
experimentalSetSubtitleParserFactory
-Methoden fürBundledChunkExtractor.Factory
undDefaultHlsExtractorFactory
insetSubtitleParserFactory
um und verbieten Sie die Übergabe vonnull
. Verwenden Sie die neuenexperimentalParseSubtitlesDuringExtraction(boolean)
-Methoden, um das Parsing-Verhalten zu steuern. - Unterstützung für die Anpassung des
SubtitleParser.Factory
hinzugefügt, das während der Extraktion verwendet wird. Dies kann mitMediaSource.Factory.setSubtitleParserFactory()
erreicht werden. - Fügen Sie allen
Format.id
-Feldern, die ausMergingMediaSource
generiert werden, das Quellpräfix hinzu. So lässt sich ermitteln, welche Quelle eineFormat
generiert hat (#883). - Der reguläre Ausdruck, der zum Validieren benutzerdefinierter CMCD-Schlüsselnamen (Common Media Client Data) verwendet wird, wurde korrigiert. Er prüft jetzt nur noch auf Bindestriche (#1028).
- Doppelte Codierung von CMCD-Abfrageparametern beenden (#1075).
- Fügen Sie
- Transformer:
- Unterstützung für das Zusammenführen von H.265/HEVC-Zeitlupenvideos im SEF-Format hinzugefügt
- Die Transmuxing-Geschwindigkeit wurde erhöht, insbesondere bei Bearbeitungen vom Typ „Video entfernen“.
- Fügen Sie eine API hinzu, damit die Ausgabedatei mit einem Videobild beginnt. Dadurch kann die Ausgabe von Zuschneidevorgängen besser mit Player-Implementierungen kompatibel sein, die den ersten Videoframes erst dann anzeigen, wenn ihr Präsentationszeitstempel (#829) erreicht ist.
- Unterstützung für die Optimierung von MP4-Zuschneidevorgängen für einzelne Assets wurde hinzugefügt.
- Unterstützung hinzugefügt, um sicherzustellen, dass ein Videobild den ersten Zeitstempel in der Ausgabedatei hat. Es wurde ein Fehler behoben, durch den Ausgabedateien auf iOS-basierten Playern mit einem schwarzen Frame begannen (#829).
- Titelauswahl:
- Fügen Sie
DefaultTrackSelector.selectImageTrack
hinzu, um die Auswahl von Bild-Tracks zu aktivieren. - Fügen Sie
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
hinzu, um festzulegen, ob ein Bild-Track ausgewählt werden soll, wenn sowohl ein Bild- als auch ein Video-Track verfügbar sind. Der Standardwert istfalse
. Das bedeutet, dass die Auswahl eines Videotracks priorisiert wird.
- Fügen Sie
- Extraktoren:
- Dem MP4-Extractor wurde zusätzliches AV1C-Parsing hinzugefügt, um die Werte
ColorInfo.colorSpace
,ColorInfo.colorTransfer
undColorInfo.colorRange
abzurufen (#692). - MP3: Verwenden Sie die Suche mit konstanter Bitrate (CBR) für Dateien mit einem
Info
-Header (das CBR-Äquivalent desXing
-Headers). Bisher haben wir die Suchtabelle aus demInfo
-Header verwendet. Dies führt jedoch zu einer weniger präzisen Suche als wenn wir sie ignorieren und davon ausgehen, dass die Datei CBR ist. - MPEG2-TS: Unterstützung für DTS, DTS-LBR und DTS:X Profile2 hinzugefügt (#275).
- Audiotypen aus TS-Deskriptoren extrahieren und Rollenflags zuordnen, damit Nutzer fundiertere Entscheidungen bei der Auswahl von Audiotracks treffen können (#973).
- Dem MP4-Extractor wurde zusätzliches AV1C-Parsing hinzugefügt, um die Werte
- Audio:
- Video:
- Ändern Sie den
MediaCodecVideoRenderer
-Konstruktor, der einVideoFrameProcessor.Factory
-Argument verwendet, und ersetzen Sie ihn durch einen Konstruktor, der einVideoSinkProvider
-Argument verwendet. Apps, die ein benutzerdefiniertesVideoFrameProcessor.Factory
einfügen möchten, können einCompositingVideoSinkProvider
instanziieren, das das benutzerdefinierteVideoFrameProcessor.Factory
verwendet, und den Video-Sink-Anbieter anMediaCodecVideoRenderer
übergeben.
- Ändern Sie den
- Text:
- Die Serialisierung von Bitmap-Hinweisen wurde korrigiert, um den Fehler
Tried to marshall a Parcel that contained Binder objects
bei Verwendung vonDefaultExtractorsFactory.setTextTrackTranscodingEnabled
zu beheben (#836). - CEA-708: Ignoriere den Wert
rowLock
. In der CEA-708-E S-2023-Spezifikation wird angegeben, dass sowohlrowLock
als auchcolumnLock
als „true“ angenommen werden sollten, unabhängig von den im Stream vorhandenen Werten (columnLock
wird nicht unterstützt, daher wird effektiv immer „false“ angenommen).
- Die Serialisierung von Bitmap-Hinweisen wurde korrigiert, um den Fehler
- Bild:
- Unterstützung für DASH-Thumbnails hinzugefügt Rasterbilder werden zugeschnitten und einzelne Thumbnails werden
ImageOutput
kurz vor dem jeweiligen Präsentationszeitpunkt bereitgestellt.
- Unterstützung für DASH-Thumbnails hinzugefügt Rasterbilder werden zugeschnitten und einzelne Thumbnails werden
- DRM:
- Spiele unverschlüsselte „Clear Lead“-Samples in DRM-Inhalten sofort ab, auch wenn die Schlüssel für die späteren verschlüsselten Samples noch nicht verfügbar sind. Dies kann zu Unterbrechungen während der Wiedergabe führen, wenn die Schlüssel noch nicht bereit sind, wenn die Wiedergabeposition die verschlüsselten Samples erreicht. Zuvor hätte die Wiedergabe jedoch überhaupt nicht begonnen. Dieses Verhalten kann mit
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
oderDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
deaktiviert werden.
- Spiele unverschlüsselte „Clear Lead“-Samples in DRM-Inhalten sofort ab, auch wenn die Schlüssel für die späteren verschlüsselten Samples noch nicht verfügbar sind. Dies kann zu Unterbrechungen während der Wiedergabe führen, wenn die Schlüssel noch nicht bereit sind, wenn die Wiedergabeposition die verschlüsselten Samples erreicht. Zuvor hätte die Wiedergabe jedoch überhaupt nicht begonnen. Dieses Verhalten kann mit
- IMA-Erweiterung:
- Ein Problem wurde behoben, durch das DASH- und HLS-Anzeigen ohne die entsprechende Dateiendung nicht abgespielt werden konnten.
- Sitzung:
- Doppelklickerkennung für TV-Apps deaktivieren (#962).
- Ein Problem wurde behoben, bei dem
MediaItem.RequestMetadata
mit nur nicht leeren Extras nicht zwischen Media-Controllern und Sitzungen übertragen wurde. - Fügen Sie
MediaLibrarySession.Builder
einen Konstruktor hinzu, der nur einContext
anstelle einesMediaLibraryService
akzeptiert.
- HLS-Erweiterung:
- Reduzieren Sie
HlsMediaPeriod
auf die Sichtbarkeit „package-private“. Von außerhalb des HLS-Pakets sollte nicht direkt von diesem Typ abgeleitet werden. - Die Auflösung wird effizienter zum Beginn eines Segments gesucht (#1031).
- Reduzieren Sie
- Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
- MIDI-Decoder: SysEx-Ereignismeldungen ignorieren (#710).
- Test-Tools:
- Pausiere die Wiedergabe in
TestPlayerRunHelper.playUntilPosition
nicht. Beim Test wird die Wiedergabe fortgesetzt, aber der Fortschritt wird angehalten, bis der Test Zusicherungen und weitere Aktionen hinzufügen kann.
- Pausiere die Wiedergabe in
- Demo-App:
- Füge ein Shortform-Demomodul hinzu, um die Verwendung von
PreloadMediaSource
im Anwendungsfall für Shortform-Inhalte zu demonstrieren.
- Füge ein Shortform-Demomodul hinzu, um die Verwendung von
Version 1.3.0-rc01
22. Februar 2024
Verwenden Sie die stabile Version 1.3.0.
Version 1.3.0-beta01
7. Februar 2024
Verwenden Sie die stabile Version 1.3.0.
Version 1.3.0-alpha01
15. Januar 2024
Verwenden Sie die stabile Version 1.3.0.
Version 1.2.0
Version 1.2.1
9. Januar 2024
- ExoPlayer:
- Ein Problem wurde behoben, durch das bei manuellen Suchvorgängen außerhalb des Bereichs
LiveConfiguration.min/maxOffset
der Offset immer wieder aufmin/maxOffset
zurückgesetzt wurde. - Das Problem wurde behoben, dass die OPUS- und VORBIS-Channel-Layouts für 3, 5, 6, 7 und 8 Channels falsch waren (#8396).
- Ein Problem wurde behoben, durch das die Auswahl von Tracks nach dem Zurückspulen auf null in einem Livestream fälschlicherweise dazu führte, dass der Stream an der Standardposition gestartet wurde (#9347).
- Das Problem wurde behoben, dass neue Instanzen von
CmcdData.Factory
negative Werte fürbufferedDurationUs
aus Chunk-Quellen erhalten haben, was zu einemIllegalArgumentException
(#888) geführt hat.
- Ein Problem wurde behoben, durch das bei manuellen Suchvorgängen außerhalb des Bereichs
- Transformer:
- Problem umgehen, bei dem der Encoder bei der Konfiguration aufgrund einer hohen Betriebsrate einen Fehler ausgibt.
- Extraktoren:
- Markieren Sie sekundäre (nicht abspielbare) HEVC-Tracks in JPEG-Bewegungsfotos als
ROLE_FLAG_ALTERNATE
, damit sie aufgrund ihrer höheren Auflösung nicht automatisch für die Wiedergabe ausgewählt werden. - Falsche Keyframe-Erkennung für TS-H264-Streams korrigieren (#864)
- Die Schätzung der Dauer von TS-Streams, die länger als 47.721 Sekunden sind, wurde korrigiert (#855).
- Markieren Sie sekundäre (nicht abspielbare) HEVC-Tracks in JPEG-Bewegungsfotos als
- Audio:
- Die Verarbeitung von EOS für
SilenceSkippingAudioProcessor
wurde korrigiert, wenn sie mehrmals aufgerufen wird (#712).
- Die Verarbeitung von EOS für
- Video:
- Es wurde eine Problemumgehung für ein Geräteproblem auf dem Galaxy Tab S7 FE, Chromecast mit Google TV und Lenovo M10 FHD Plus hinzugefügt, das dazu führt, dass AVC-Streams mit 60 fps als nicht unterstützt gekennzeichnet werden (#693).
- Metadaten:
- Ein Fehler wurde behoben, bei dem
MediaMetadata
nur aus Vorbis-Kommentaren mit Großbuchstabenschlüsseln gefüllt wurde (#876). OutOfMemoryError
wird abgefangen, wenn sehr große ID3-Frames geparst werden. Die Wiedergabe kann also ohne die Tag-Informationen fortgesetzt werden, anstatt dass sie komplett fehlschlägt.
- Ein Fehler wurde behoben, bei dem
- DRM:
- Die Problemumgehung für die fälschliche ClearKey-Lizenz-URL
https://default.url
wurde auf API 33 und höher ausgeweitet. Zuvor wurde sie nur auf API 33 angewendet (#837). - Es wurde ein Problem mit
ERROR_DRM_SESSION_NOT_OPENED
behoben, das beim Wechsel von verschlüsselten zu unverschlüsselten Inhalten auftrat, wenn dem Player keine Oberfläche zugewiesen war. Der Fehler ist aufgetreten, weil ein sicherer Decoder fälschlicherweise zum Abspielen der unverschlüsselten Inhalte verwendet wurde.
- Die Problemumgehung für die fälschliche ClearKey-Lizenz-URL
- Sitzung:
- Die benutzerdefinierten Schlüssel und Werte werden in
MediaMetadataCompat
bisMediaMetadata.extras
undMediaMetadata.extras
bisMediaMetadataCompat
eingefügt (#756, #802). - Problem mit der Übertragung
notifyChildrenChanged
für Legacy-Controller behoben (#644). - Ein Fehler wurde behoben, bei dem das Festlegen einer negativen Zeit für einen deaktivierten
setWhen
-Timer der Benachrichtigung auf einigen Geräten zu einem Absturz führte (#903). - Behebe
IllegalStateException
, wenn der Media-Benachrichtigungscontroller die Verbindung noch nicht abgeschlossen hat, wenn das erste Benachrichtigungsupdate angefordert wird (#917).
- Die benutzerdefinierten Schlüssel und Werte werden in
- UI:
- Ein Problem wurde behoben, bei dem die Schaltflächen zum Vor- und Zurückspulen nicht sichtbar waren, wenn sie mit Material Design in einem BottomSheetDialogFragment verwendet wurden (#511).
- Das Problem, dass die Zahlen auf der Schnellvorlauftaste des
PlayerControlView
falsch ausgerichtet waren (#547), wurde behoben.
- DASH-Erweiterung:
- „f800“ als Kanalanzahl 5 für Dolby im DASH-Manifest parsen (#688).
- Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
- Cast-Erweiterung:
- Die Erstellung von
Timeline
wurde bereinigt, damit die App nicht abstürzt, wenn das Laden von Media auf dem Cast-Gerät fehlschlägt (#708).
- Die Erstellung von
Version 1.2.0
15. November 2023
- Gemeinsame Mediathek:
- Fügen Sie den Methoden in der
Log.Logger
-Schnittstelle einen@Nullable Throwable
-Parameter hinzu. Der Parametermessage
für diese Methoden enthält keine Informationen mehr zuThrowable
, das an dieLog.{d,i,w,e}()
-Methoden übergeben wurde. Implementierungen müssen diese Informationen daher bei Bedarf manuell anhängen (möglicherweise mitLogger.appendThrowableString(String, Throwable)
). - Ein Kotlin-Kompatibilitätsproblem wurde behoben, bei dem generische Typparameter, die Nullwerte zulassen, und Array-Elementtypen, die Nullwerte zulassen, nicht als Nullwerte zulassend erkannt wurden. Beispiele sind die Methodenparameter
TrackSelectorResult
undSimpleDecoder
(#6792). - Ändern Sie das Standardverhalten der Benutzeroberfläche und der Benachrichtigungen in
Util.shouldShowPlayButton
, um eine Schaltfläche zum Abspielen anzuzeigen, wenn die Wiedergabe vorübergehend unterdrückt wird (z.B. aufgrund eines vorübergehenden Verlusts des Audiofokus). Das alte Verhalten kann beibehalten werden, indem SiePlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
oderMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
verwenden (#11213). - Führen Sie ein Upgrade von
androidx.annotation:annotation-experimental
auf1.3.1
durch, um das Problem unter https://issuetracker.google.com/251172715 zu beheben. - Verschieben Sie
ExoPlayer.setAudioAttributes
zurPlayer
-Schnittstelle.
- Fügen Sie den Methoden in der
- ExoPlayer:
- Problem mit der Suche in AC4-Streams behoben, das dadurch verursacht wurde, dass „decode-only“-Samples nicht richtig identifiziert wurden (#11000).
- Wiedergabe auf ungeeigneten Audioausgabegeräten (z.B. dem integrierten Lautsprecher auf Wear OS-Geräten) unterdrücken, wenn diese Funktion über
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
aktiviert ist. Der Grund für die Unterdrückung der Wiedergabe wird aufPlayer.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, wenn eine geeignete Ausgabe verbunden ist. - Fügen Sie
MediaSource.canUpdateMediaItem
undMediaSource.updateMediaItem
hinzu, umMediaItem
-Aktualisierungen nach der Erstellung überPlayer.replaceMediaItem(s)
zu akzeptieren. MediaItem
-Updates für alleMediaSource
-Klassen, die von der Bibliothek bereitgestellt werden, überPlayer.replaceMediaItem(s)
zulassen (#33, #9978).- Benennen Sie
MimeTypes.TEXT_EXOPLAYER_CUES
inMimeTypes.APPLICATION_MEDIA3_CUES
um. - Fügen Sie
PngExtractor
hinzu, um eine ganze PNG-Datei als ein Beispiel inTrackOutput
zu senden und zu lesen. - Die Methode
SequenceableLoader.continueLoading(long)
in der SchnittstelleSequenceableLoader
wurde verbessert, umSequenceableLoader.continueLoading(LoadingInfo loadingInfo)
.LoadingInfo
enthält neben dem vorhandenenplaybackPositionUs
zusätzliche Parameter, darunterplaybackSpeed
undlastRebufferRealtimeMs
. - Erweitere die Methode
ChunkSource.getNextChunk(long, long, List, ChunkHolder)
in der SchnittstelleChunkSource
zuChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
. - Dem CMCD-Logging (Common Media Client Data) wurden zusätzliche Felder hinzugefügt: „buffer starvation“ (
bs
), „deadline“ (dl
), „playback rate“ (pr
) und „startup“ (su
) (#8699). - Luma- und Chroma-Bit-Tiefe zu
ColorInfo
hinzufügen (#491). - Dem CMCD-Logging (Common Media Client Data) wurden zusätzliche Felder hinzugefügt: nächste Objektanfrage (
nor
) und nächste Bereichsanfrage (nrr
) (#8699). - Funktionalität zum Übertragen von CMCD-Daten (Common Media Client Data) mithilfe von Abfrageparametern hinzufügen (#553).
- Behebe das Problem mit
ConcurrentModificationException
inExperimentalBandwidthMeter
(#612). - Fügen Sie
CompositeMediaSource.getMediaTimeForChildMediaTime
den ParameterMediaPeriodId
hinzu. - Unterstützung von
ClippingMediaSource
(und anderen Quellen mit Zeitversatz für Zeitraum/Zeitfenster) inConcatenatingMediaSource2
(#11226). - Ändern Sie
BaseRenderer.onStreamChanged()
so, dass auch einMediaPeriodId
-Argument empfangen wird.
- Transformer:
- EXIF-Rotationsdaten für Bildeingaben parsen.
- Entfernen Sie den Annotationstyp
TransformationRequest.HdrMode
und die zugehörigen Konstanten. Verwenden Sie stattdessenComposition.HdrMode
und die zugehörigen Konstanten. - Vereinfachen Sie die
OverlaySettings
, um Probleme mit der Drehung zu beheben. - Die Parameter
frameRate
unddurationUs
vonSampleConsumer.queueInputBitmap
wurden inTimestampIterator
geändert.
- Titelauswahl:
- Fügen Sie
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
hinzu, um die nicht nahtlose Anpassung explizit zuzulassen oder zu verbieten. Die Standardeinstellung bleibt beitrue
.
- Fügen Sie
- Extraktoren:
- MPEG-TS: Achten Sie darauf, dass der letzte Frame gerendert wird, indem Sie die letzte Zugriffseinheit eines Streams an die Sample-Warteschlange übergeben (#7909).
- Tippfehler bei der Bestimmung von
rotationDegrees
behoben.projectionPosePitch
wurde inprojectionPoseRoll
geändert (#461). - Die Annahme, dass
Extractor
-Instanzen direkt mitinstanceof
geprüft werden können, wird entfernt. Wenn Sie Laufzeitzugriff auf die Implementierungsdetails einesExtractor
benötigen, müssen Sie zuerstExtractor.getUnderlyingInstance
aufrufen. - Fügen Sie
BmpExtractor
hinzu. - Fügen Sie
WebpExtractor
hinzu. - Fügen Sie
HeifExtractor
hinzu. - QuickTime Classic-Unterstützung für
Mp4Extractor
hinzufügen
- Audio:
- Unterstützung für 24-/32-Bit-Big-Endian-PCM in MP4 und Matroska hinzugefügt und PCM-Codierung für
lpcm
in MP4 geparst. - Unterstützung für das Extrahieren von Vorbis-Audio in MP4 hinzugefügt.
- Füge
AudioSink.getFormatOffloadSupport(Format)
hinzu, um den Grad der Offload-Unterstützung abzurufen, die das Senken für das Format über eineDefaultAudioOffloadSupportProvider
bieten kann. Es wird das neueAudioOffloadSupport
zurückgegeben, dasisFormatSupported
,isGaplessSupported
undisSpeedChangeSupported
enthält. - Fügen Sie
AudioSink.setOffloadMode()
hinzu, über das die Offload-Konfiguration auf der Audio-Senke konfiguriert wird. Der Standardwert istAudioSink.OFFLOAD_MODE_DISABLED
. - Die Auslagerung kann über
setAudioOffloadPreference
inTrackSelectionParameters
aktiviert werden. Wenn die festgelegte Einstellung „Aktivieren“ lautet, das Gerät das Offload für das Format unterstützt und die Titelauswahl ein einzelner Audiotrack ist, wird Audio-Offload aktiviert. - Wenn
audioOffloadModePreference
aufAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
gesetzt ist, wird mitDefaultTrackSelector
nur ein Audiotrack ausgewählt und nur, wenn das Format dieses Tracks im Offload unterstützt wird. Wenn kein Audiotrack für den Offload unterstützt wird, wird kein Track ausgewählt. - Die Unterstützung von nahtlosem Offload wird für Geräte vor API-Level 33 deaktiviert, da es nach dem Übergang zwischen Titeln zu Problemen mit der Wiedergabeposition kommt.
- Entfernen Sie den Parameter
enableOffload
aus der MethodensignaturDefaultRenderersFactory.buildAudioSink
. - Entfernen Sie die Methode
DefaultAudioSink.Builder.setOffloadMode
. - Entfernen Sie den intdef-Wert
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
. - Unterstützung für Opus-Metadaten für lückenlose Wiedergabe während der Offload-Wiedergabe hinzugefügt.
- Renderer-Wiederherstellung durch Deaktivieren des Offloads ermöglichen, wenn der erste Schreibvorgang fehlgeschlagen ist (#627).
- Standardmäßig die Offload-Planung für die Offload-Wiedergabe nur von Audio aktivieren.
- Löschen Sie
ExoPlayer.experimentalSetOffloadSchedulingEnabled
undAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
. onExperimentalSleepingForOffloadChanged
wurde inonSleepingForOffloadChanged
undonExperimentalOffloadedPlayback
inonOffloadedPlayback
umbenannt.- Verschieben Sie die
TrackSelectionParameters
-Schnittstellen und ‑Definitionen für den Audio-Offload-Modus in eine innereAudioOffloadPreferences
-Klasse. - Fügen Sie
onAudioTrackInitialized
- undonAudioTrackReleased
-Callbacks zuAnalyticsListener
,AudioRendererEventListener
undAudioSink.Listener
hinzu. - Problem mit DTS Express-Audio-Pufferunterlauf behoben (#650).
- Fehler behoben, bei dem die Prüfung der E-AC3-JOC-Funktionen einen
IllegalArgumentException
-Fehler auslöste (#677).
- Unterstützung für 24-/32-Bit-Big-Endian-PCM in MP4 und Matroska hinzugefügt und PCM-Codierung für
- Video:
MediaCodecVideoRenderer
darf eine benutzerdefinierteVideoFrameProcessor.Factory
verwenden.- Es wurde ein Fehler behoben, bei dem der erste Frame nicht gerendert werden konnte, wenn der Audiostream mit negativen Zeitstempeln beginnt (#291).
- Text:
- Entfernen Sie
ExoplayerCuesDecoder
. Textspuren mitsampleMimeType = application/x-media3-cues
werden jetzt direkt vonTextRenderer
verarbeitet, ohne dass eineSubtitleDecoder
-Instanz erforderlich ist.
- Entfernen Sie
- Metadaten:
MetadataDecoder.decode
wird für „Nur-Decodieren“-Samples nicht mehr aufgerufen, da die Implementierung ohnehin „null“ zurückgeben muss.
- Wirkung:
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
-Bitmap-Eingabe nach Zeitstempel hinzufügen.- Ändern Sie
VideoFrameProcessor.registerInputStream()
in einen nicht blockierenden Aufruf. Apps müssenVideoFrameProcessor.Listener#onInputStreamRegistered()
implementieren. - Die Parameter
frameRate
unddurationUs
vonVideoFrameProcessor.queueInputBitmap
wurden inTimestampIterator
geändert.
- IMA-Erweiterung:
- Es wurde ein Fehler behoben, durch den bei einem DASH-Livestream mit mehreren Zeiträumen, der nicht das erste Element in einer Playlist ist, eine Ausnahme ausgelöst werden konnte (#571).
- StreamManager vor dem Aufrufen von
AdsLoader.destroy()
freigeben - IMA SDK-Version auf 3.31.0 aktualisiert.
- Sitzung:
- Legen Sie das Verhalten des Benachrichtigungsdienstes im Vordergrund auf
FOREGROUND_SERVICE_IMMEDIATE
inDefaultMediaNotificationProvider
fest (#167). - Verwenden Sie nur
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
über API 31, um Probleme mit der eingestellten API auf Samsung-Geräten zu vermeiden (#167). - Verwenden Sie den Media-Benachrichtigungs-Controller als Proxy, um verfügbare Befehle und das benutzerdefinierte Layout festzulegen, mit denen die Benachrichtigung und die Plattform-Sitzung gefüllt werden.
- Medientastenereignisse, die von
MediaSessionService.onStartCommand()
in Media3 empfangen werden, werden konvertiert, anstatt an die Plattform-Session und zurück an Media3 weitergeleitet zu werden. Dadurch ist der Anrufer-Controller immer der Controller für Medienbenachrichtigungen und Apps können Anrufe, die über die Benachrichtigung eingehen, auf allen unterstützten API-Ebenen auf dieselbe Weise erkennen. - Es wurde ein Fehler behoben, durch den
MediaController.getCurrentPosition()
nicht weiterging, wenn eine Verbindung zu einem altenMediaSessionCompat
bestand. - Fügen Sie
MediaLibrarySession.getSubscribedControllers(mediaId)
hinzu, um die Bedienung zu vereinfachen. - Überschreiben Sie
MediaLibrarySession.Callback.onSubscribe()
, um die Verfügbarkeit der übergeordneten ID zu bestätigen, für die der Controller abonniert ist. Wenn die Anfrage erfolgreich ist, wird das Abo akzeptiert undnotifyChildrenChanged()
wird sofort aufgerufen, um den Browser zu informieren (#561). - Sitzungsdemomodul für Automotive OS hinzugefügt und Sitzungsdemo für Android Auto aktiviert.
- Legen Sie die Warteschlange der Framework-Sitzung nicht fest, wenn
COMMAND_GET_TIMELINE
für den Media Notification Controller nicht verfügbar ist. Wenn Android Auto als Clientcontroller die Daten aus der Framework-Sitzung liest, hat dies zur Folge, dass die Schaltflächequeue
in der Benutzeroberfläche von Android Auto nicht angezeigt wird (#339). - Verwenden Sie standardmäßig
DataSourceBitmapLoader
anstelle vonSimpleBitmapLoader
(#271, #327). - Fügen Sie
MediaSession.Callback.onMediaButtonEvent(Intent)
hinzu, damit Apps die Standardbehandlung von Medientastenereignissen überschreiben können.
- Legen Sie das Verhalten des Benachrichtigungsdienstes im Vordergrund auf
- UI:
- Füge eine
Player.Listener
-Implementierung für Wear OS-Geräte hinzu, die die Wiedergabeunterdrückung aufgrund vonPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
verarbeitet, indem ein Systemdialogfeld gestartet wird, in dem ein Nutzer einen geeigneten Audioausgang (z.B. Bluetooth-Kopfhörer) verbinden kann. Die Wiedergabe wird automatisch fortgesetzt, wenn innerhalb eines konfigurierbaren Zeitlimits (Standard: 5 Minuten) ein geeignetes Gerät verbunden wird.
- Füge eine
- Downloads:
- Deklarieren Sie den Typ des Dienstes im Vordergrund „dataSync“ für
DownloadService
, um die Kompatibilität mit Android 14 zu gewährleisten. Wenn Sie diesen Dienst verwenden, muss die App auchdataSync
alsforegroundServiceType
im Manifest hinzufügen und die BerechtigungFOREGROUND_SERVICE_DATA_SYNC
(#11239) hinzufügen.
- Deklarieren Sie den Typ des Dienstes im Vordergrund „dataSync“ für
- HLS-Erweiterung:
- Die HLS-Live-Playlist wird in einem Intervall aktualisiert, das auf Grundlage der letzten Startzeit des Ladevorgangs und nicht der letzten Abschlusszeit des Ladevorgangs berechnet wird (#663).
- DASH-Erweiterung:
- Mehrere DASH-IDs desselben Typs in der Segmentvorlagen-URL zulassen.
- Experimentelle Unterstützung für das Parsen von Untertiteln während der Extraktion hinzugefügt. Das Zusammenführen von sich überschneidenden Untertiteln wird besser unterstützt, einschließlich der Behebung von Flackern beim Übergang zwischen Untertitelsegmenten. Sie können diese Option mit
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
(#288) aktivieren.
- RTSP-Erweiterung:
- Eine Race-Bedingung wurde behoben, die beim Fallback auf TCP zu
IndexOutOfBoundsException
oder in einigen Situationen zu einer hängenden Wiedergabe führen konnte. - Prüfe den Status bei der RTSP-Einrichtung, wenn der Ladestatus von
RtspMediaPeriod
zurückgegeben wird (#577). - Benutzerdefinierte RTSP-Anfragemethoden im öffentlichen Header der Options-Antwort ignorieren (#613).
- Verwenden Sie den RTSP-Setup-Antwort-Zeitlimitwert im Zeitintervall zum Senden von Keep-Alive-RTSP-Optionsanfragen (#662).
- Eine Race-Bedingung wurde behoben, die beim Fallback auf TCP zu
- Decoder-Erweiterungen (FFmpeg, VP9, AV1, MIDI usw.):
- Das MIDI-Decodermodul wird veröffentlicht. Es bietet Unterstützung für die Wiedergabe von Standard-MIDI-Dateien mithilfe der Jsyn-Bibliothek zur Audiosynthese.
- Fügen Sie
DecoderOutputBuffer.shouldBeSkipped
hinzu, um Ausgabepuffer direkt zu markieren, die nicht präsentiert werden müssen. Diese Methode wird gegenüberC.BUFFER_FLAG_DECODE_ONLY
bevorzugt, da diese eingestellt wird. - Fügen Sie
Decoder.setOutputStartTimeUs
undSimpleDecoder.isAtLeastOutputStartTimeUs
hinzu, damit Decoder reine Decodierungs-Samples vor der Startzeit verwerfen können. Diese Methode sollte gegenüberBuffer.isDecodeOnly
bevorzugt werden, daBuffer.isDecodeOnly
eingestellt wird. - Fehler beim Veröffentlichen des MIDI-Decoder-Artefakts im Maven-Repository behoben. Das Artefakt wird in
media3-exoplayer-midi
umbenannt (#734).
- Leanback-Erweiterung:
- Fehler behoben, bei dem das Deaktivieren einer Oberfläche zu einem
ArithmeticException
im Leanback-Code führen konnte (#617).
- Fehler behoben, bei dem das Deaktivieren einer Oberfläche zu einem
- Test-Tools:
TestExoPlayerBuilder
undFakeClock
mit Espresso-UI-Tests und Compose-UI-Tests kompatibel machen Damit wird ein Fehler behoben, bei dem die Wiedergabe während Espresso- oder Compose-Ansichtsinteraktionen nicht deterministisch fortgesetzt wurde.
- Entfernen Sie die veralteten Symbole:
- Entfernen Sie
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
undTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
. Verwenden SieComposition.Builder.setHdrMode(int)
und übergeben SieComposition
stattdessen anTransformer.start(Composition, String)
. - Die verworfene Methode
DownloadNotificationHelper.buildProgressNotification
wurde entfernt. Verwenden Sie stattdessen eine nicht verworfene Methode, die den ParameternotMetRequirements
akzeptiert.
- Entfernen Sie
Version 1.2.0-rc01
1. November 2023
Verwenden Sie die stabile Version 1.2.0.
Version 1.2.0-beta01
19. Oktober 2023
Verwenden Sie die stabile Version 1.2.0.
Version 1.2.0-alpha02
29. September 2023
Verwenden Sie die stabile Version 1.2.0.
Version 1.2.0-alpha01
17. August 2023
Verwenden Sie die stabile Version 1.2.0.
Version 1.1.0
Version 1.1.1
16. August 2023
- Gemeinsame Mediathek:
- Entfernen Sie die versehentlich hinzugefügte
multidex
-Abhängigkeit aus allen Modulen (#499).
- Entfernen Sie die versehentlich hinzugefügte
- ExoPlayer:
- Ein Problem in
PlaybackStatsListener
wurde behoben, bei dem nach dem Löschen der Playlist fälschlicherweisePlaybackStats
erstellt wurden. - Zusätzliche Felder für die Protokollierung von Common Media Client Data (CMCD) hinzugefügt: Streamingformat (sf), Streamtyp (st), Version (v), höchste Bitrate (tb), Objektdauer (d), gemessener Durchsatz (mtp) und Objekttyp (ot) (#8699).
- Ein Problem in
- Audio:
- Es wurde ein Fehler behoben, durch den
Player.getState()
bei der Wiedergabe sehr kurzer Dateien nie inSTATE_ENDED
überging (#538).
- Es wurde ein Fehler behoben, durch den
- Audio-Offload:
- Füge dem Bitstream gemäß RFC 7845 den Ogg-ID-Header und die Kommentar-Header-Seiten für die ausgelagerte Opus-Wiedergabe voran.
- Video:
- H.265/HEVC: Das Parsen von SPS-Informationen zu kurz- und langfristigen Referenzbildern wurde korrigiert.
- Text:
- CEA-608: Die Logik zum Kürzen von Cues wurde so geändert, dass nur sichtbarer Text berücksichtigt wird. Bisher wurden Einrückung und Tabulatorversatz berücksichtigt, wenn die Cue-Länge auf 32 Zeichen begrenzt wurde (was technisch gesehen der Spezifikation entsprach) (#11019).
- IMA-Erweiterung:
- IMA SDK-Version auf 3.30.3 aktualisiert.
- Sitzung:
- Fügen Sie dem Status des Controllers ein benutzerdefiniertes Layout hinzu und stellen Sie eine Getter-Methode für den Zugriff darauf bereit. Wenn sich das benutzerdefinierte Layout ändert, wird
MediaController.Listener.onCustomLayoutChanged
aufgerufen. Apps, die verschiedenen Media3-Controllern unterschiedliche benutzerdefinierte Layouts senden möchten, können dies inMediaSession.Callback.onConnect
tun. Verwenden Sie dazu einAcceptedResultBuilder
, um dafür zu sorgen, dass das benutzerdefinierte Layout für den Controller verfügbar ist, wenn die Verbindung hergestellt wurde. - Es wurde ein Problem behoben, bei dem
MediaLibraryServiceLegacyStub
einen Fehler an eineResult
gesendet hat, die dies nicht unterstützt hat, was zu einemUnsupportedOperationException
(#78) geführt hat. - Die Art und Weise, wie
PlayerWrapper
eineVolumeProviderCompat
erstellt, wurde korrigiert, indemvolumeControlType
sowohl über Legacy-Befehle (COMMAND_ADJUST_DEVICE_VOLUME
undCOMMAND_SET_DEVICE_VOLUME
) als auch über neue Befehle (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
undCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) ermittelt wird (#554).
- Fügen Sie dem Status des Controllers ein benutzerdefiniertes Layout hinzu und stellen Sie eine Getter-Methode für den Zugriff darauf bereit. Wenn sich das benutzerdefinierte Layout ändert, wird
Version 1.1.0
5. Juli 2023
- Gemeinsame Mediathek:
- Grund für die Unterdrückung für ungeeignete Audio-Route hinzufügen und bei Bedarf wiedergeben Grund für die Unterdrückung zu lang ändern. (#15).
- Befehle zum Player hinzufügen:
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- Dem Player wurden überlastete Methoden hinzugefügt, mit denen Nutzer Lautstärke-Flags angeben können:
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
Builder
fürDeviceInfo
hinzugefügt und vorhandener Konstruktor eingestellt.- Fügen Sie
DeviceInfo.routingControllerId
hinzu, um die ID des Routing-Controllers für die Remote-Wiedergabe anzugeben. Player.replaceMediaItem(s)
als Tastenkombination zum Hinzufügen und Entfernen von Elementen an derselben Position hinzugefügt (#8046).
- ExoPlayer:
- ExoPlayer darf nur dann die Methoden zur Steuerung der Gerätelautstärke verwenden, wenn dies explizit aktiviert wurde. Mit
ExoPlayer.Builder.setDeviceVolumeControlEnabled
haben Sie Zugriff auf Folgendes:getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
undsetDeviceVolume(int, int)
increaseDeviceVolume(int)
undincreaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
unddecreaseDeviceVolume(int, int)
- Fügen Sie
FilteringMediaSource
hinzu, damit verfügbare Tracktypen aus einemMediaSource
gefiltert werden können. - Unterstützung für die Einbeziehung von Common Media Client Data (CMCD) in die ausgehenden Anfragen der adaptiven Streamingformate DASH, HLS und SmoothStreaming. Die folgenden Felder wurden integriert:
br
,bl
,cid
,rtp
undsid
(#8699). API-Struktur und API-Methoden:- CMCD-Logging ist standardmäßig deaktiviert. Verwenden Sie
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
, um es zu aktivieren. - Alle Schlüssel sind standardmäßig aktiviert. Überschreiben Sie
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
, um zu filtern, welche Schlüssel protokolliert werden. - Überschreiben Sie
CmcdConfiguration.RequestConfig.getCustomData()
, um das benutzerdefinierte Schlüssel-Logging zu aktivieren.
- CMCD-Logging ist standardmäßig deaktiviert. Verwenden Sie
- 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()
für die Verwendung vonEffect
während der Videowiedergabe hinzu. - Aktualisieren Sie
SampleQueue
, umsourceId
alslong
anstatt alsint
zu speichern. Dadurch ändern sich die Signaturen der öffentlichen MethodenSampleQueue.sourceId
undSampleQueue.peekSourceId
. - Fügen Sie den
LoadControl
-MethodenshouldStartPlayback
undonTracksSelected
Parameter hinzu, mit denen diese Methoden den relevantenMediaPeriod
zugeordnet werden können. - Ändern Sie die Signatur von
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
, indem Sie einen Zeitachsenparameter hinzufügen, der die Zeiträume mit den UIDs enthält, die als Schlüssel in der Karte verwendet werden. Dies ist erforderlich, um Probleme mit der Gleichzeitigkeit bei Livestreams mit mehreren Zeiträumen zu vermeiden. EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
undBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
einstellen. Stattdessen kann die Variante der Methoden ohnemediaTimeOffsetUs
aufgerufen werden. Auch bei den verworfenen Varianten wird der Offset nicht mehr zustartTimeUs
undendTimeUs
derMediaLoadData
-Objekte hinzugefügt, die vom Dispatcher gesendet werden.- Benennen Sie
ExoTrackSelection.blacklist
inexcludeTrack
undisBlacklisted
inisTrackExcluded
um. - Es wurde ein Problem behoben, bei dem das Verhalten von
ExoPlayer.setMediaItem(s)
undaddMediaItem(s)
bei Aufruf für eine leere Playlist inkonsistent war.
- ExoPlayer darf nur dann die Methoden zur Steuerung der Gerätelautstärke verwenden, wenn dies explizit aktiviert wurde. Mit
- Transformer:
- Entfernen Sie
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)
. Verwenden Sie stattdessenExoPlayerAssetLoader.Factory(MediaSource.Factory)
undTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory)
. - Entfernen Sie
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)
. - Es wurde ein Fehler behoben, durch den die Transformation hängen bleiben konnte (was zu einem Muxer-Zeitüberschreitungsfehler führte), wenn das Ende des Videostreams zu dem Zeitpunkt signalisiert wurde, als ein Eingabe-Frame noch auf die Verarbeitung wartete.
- Verwenden Sie für Codec-Abfragen
MediaCodecList
anstelle vonfindDecoder/EncoderForFormat
-Dienstprogrammen, um die Unterstützung zu erweitern. - Entferne die B-Frame-Konfiguration in
DefaultEncoderFactory
, da sie auf einigen Geräten nicht funktioniert.
- Entfernen Sie
- Titelauswahl:
- Fügen Sie
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
hinzu, das standardmäßig deaktiviert ist. Wenn diese Option aktiviert ist, wird durchDefaultTrackSelector
eine neue Auswahl des Tracks ausgelöst, wenn sich die Renderer-Funktionen geändert haben.
- Fügen Sie
- Extraktoren:
- Audio:
- Ein Fehler wurde behoben, bei dem einige Wiedergaben fehlschlugen, wenn Tunneling aktiviert und
AudioProcessors
aktiv waren, z.B. beim nahtlosen Zuschneiden (#10847). - Opus-Frames in Ogg-Pakete für die direkte Wiedergabe (Offload) einbetten.
- Die aktuelle Position während des Schlafs wird durch Offload-Planung extrapoliert.
- Fügen Sie
Renderer.release()
undAudioSink.release()
hinzu, um die Ressourcen am Ende des Lebenszyklus des Players freizugeben. - Änderungen der Audiofunktionen in
DefaultAudioSink
beobachten Fügen Sie im Konstruktor vonDefaultAudioSink
den erforderlichen Parametercontext
hinzu, mit dem sichDefaultAudioSink
als Listener fürAudioCapabilitiesReceiver
registriert und seineaudioCapabilities
-Property aktualisiert, wenn eine Änderung der Funktionen gemeldet wird. - Änderungen an den Audiofunktionen über ein neues Ereignis in der
onAudioCapabilitiesChanged
-Schnittstelle und eine neue SchnittstelleRendererCapabilities.Listener
weitergeben, dieonRendererCapabilitiesChanged
-Ereignisse auslöst.AudioSink.Listener
- Fügen Sie
ChannelMixingAudioProcessor
hinzu, um Skalierung/Mixing auf Audiochannels anzuwenden. - Füge den neuen int-Wert
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
zuDecoderDiscardReasons
hinzu, um den Audio-Decoder zu verwerfen, wenn der Bypass-Modus nach einer Änderung der Audiofunktionen möglich ist. - Unterstützung für die direkte Wiedergabe von DTS Express und DTS:X hinzugefügt (#335).
- Ein Fehler wurde behoben, bei dem einige Wiedergaben fehlschlugen, wenn Tunneling aktiviert und
- Video:
- Sorgen Sie dafür, dass
MediaCodecVideoRenderer
eineVideoSize
mit einer Breite und Höhe von 0 meldet, wenn der Renderer deaktiviert ist.Player.Listener.onVideoSizeChanged
wird entsprechend aufgerufen, wenn sichPlayer.getVideoSize()
ändert. Durch diese Änderung hat die Videogröße von ExoPlayer mitMediaCodecVideoRenderer
eine Breite und Höhe von 0, wennPlayer.getCurrentTracks
keine Videos unterstützt oder die Größe des unterstützten Videotracks noch nicht bestimmt wurde.
- Sorgen Sie dafür, dass
- DRM:
- Die Sichtbarkeit mehrerer interner Methoden in
DefaultDrmSession
wurde reduziert, da sie voraussichtlich nicht von außerhalb des DRM-Pakets aufgerufen werden:void onMediaDrmEvent(int)
void provision()
void onProvisionCompleted()
onProvisionError(Exception, boolean)
- Die Sichtbarkeit mehrerer interner Methoden in
- Muxer:
- Eine neue Muxer-Bibliothek wird hinzugefügt, mit der eine MP4-Containerdatei erstellt werden kann.
- IMA-Erweiterung:
- Aktivieren Sie DASH-Livestreams mit mehreren Zeiträumen für die dynamische Anzeigenbereitstellung. Die aktuelle Implementierung unterstützt das Suchen in Livestreams noch nicht (#10912).
- Es wurde ein Fehler behoben, durch den eine neue Anzeigengruppe in Livestreams eingefügt wurde, weil die berechnete Inhaltsposition in aufeinanderfolgenden Zeitachsen leicht variierte.
- Sitzung:
- Die Hilfsmethode
MediaSession.getControllerForCurrentRequest
wurde hinzugefügt, um Informationen zum Controller abzurufen, der gerade einePlayer
-Methode aufruft. - Füge
androidx.media3.session.MediaButtonReceiver
hinzu, damit Apps die Wiedergabe mit Media-Schaltflächen-Ereignissen fortsetzen können, die beispielsweise von einem Bluetooth-Headset gesendet werden (#167). - Fügen Sie
MediaSession.Callback.onAddMediaItems
eine Standardimplementierung hinzu, damit angeforderteMediaItems
anPlayer
übergeben werden können, wenn sieLocalConfiguration
haben (z.B. URI) (#282). - Für Android 12 und niedriger werden in der kompakten Benachrichtigungsansicht für Medien standardmäßig Schaltflächen für die Befehle „Zum vorherigen Titel springen“ und „Zum nächsten Titel springen“ hinzugefügt (#410).
- Fügen Sie
MediaSession.Callback.onAddMediaItems
eine Standardimplementierung hinzu, damit angeforderteMediaItems
anPlayer
übergeben werden können, wenn sieLocalConfiguration
haben (z.B. URI) (#282). - Für Android 12 und niedriger werden in der kompakten Benachrichtigungsansicht für Medien standardmäßig Schaltflächen für die Befehle „Zum vorherigen Titel springen“ und „Zum nächsten Titel springen“ hinzugefügt (#410).
- Die Hilfsmethode
- UI:
- Fügen Sie die Util-Methoden
shouldShowPlayButton
undhandlePlayPauseButtonAction
hinzu, um benutzerdefinierte UI-Elemente mit einer Schaltfläche zum Abspielen/Pausieren zu erstellen.
- Fügen Sie die Util-Methoden
- RTSP-Erweiterung:
- DASH-Erweiterung:
- Entfernen Sie den Media-Zeitversatz aus
MediaLoadData.startTimeMs
undMediaLoadData.endTimeMs
für DASH-Streams mit mehreren Zeiträumen. - Ein Fehler wurde behoben, bei dem das erneute Vorbereiten einer Live-DASH-Media-Quelle mit mehreren Zeiträumen einen
IndexOutOfBoundsException
-Fehler verursacht hat (#10838).
- Entfernen Sie den Media-Zeitversatz aus
- HLS-Erweiterung:
- Fügen Sie
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
hinzu, um ein Zeitlimit für den Ladethread festzulegen, bisTimestampAdjuster
initialisiert wird. Wenn die Initialisierung nicht vor dem Zeitlimit abgeschlossen wird, wird einePlaybackException
ausgelöst, um zu verhindern, dass die Wiedergabe endlos verzögert wird. Das Zeitlimit ist standardmäßig auf null gesetzt (#323).
- Fügen Sie
- Test-Tools:
- Prüfen Sie, ob das URI-Schema in
DataSourceContractTest
unabhängig von der Groß-/Kleinschreibung ist.
- Prüfen Sie, ob das URI-Schema in
- Entfernen Sie die veralteten Symbole:
- Entfernen Sie
DefaultAudioSink
-Konstruktoren und verwenden Sie stattdessenDefaultAudioSink.Builder
. - Entfernen Sie
HlsMasterPlaylist
und verwenden Sie stattdessenHlsMultivariantPlaylist
. - Entfernen Sie
Player.stop(boolean)
. Verwenden Sie stattdessenPlayer.stop()
undPlayer.clearMediaItems()
(wennreset
gleichtrue
ist). - Entfernen Sie zwei eingestellte
SimpleCache
-Konstruktoren und verwenden Sie stattdessen einen nicht eingestellten Konstruktor, der einDatabaseProvider
akzeptiert, um eine bessere Leistung zu erzielen. - Entfernen Sie den Konstruktor
DefaultBandwidthMeter
und verwenden Sie stattdessenDefaultBandwidthMeter.Builder
. - Entfernen Sie
DefaultDrmSessionManager
-Konstruktoren und verwenden Sie stattdessenDefaultDrmSessionManager.Builder
. - Entfernen Sie zwei verworfene
HttpDataSource.InvalidResponseCodeException
-Konstruktoren und verwenden Sie einen nicht verworfenen Konstruktor, der zusätzliche Felder(cause
,responseBody
) akzeptiert, um die Fehlerprotokollierung zu verbessern. - Entfernen Sie
DownloadHelper.forProgressive
,DownloadHelper.forHls
,DownloadHelper.forDash
undDownloadHelper.forSmoothStreaming
und verwenden Sie stattdessenDownloadHelper.forMediaItem
. - Entfernen Sie den eingestellten
DownloadService
-Konstruktor und verwenden Sie einen nicht eingestellten Konstruktor, der die Option zum Bereitstellen eineschannelDescriptionResourceId
-Parameters enthält. - Entfernen Sie die eingestellten Stringkonstanten für Zeichensätze (
ASCII_NAME
,UTF8_NAME
,ISO88591_NAME
,UTF16_NAME
undUTF16LE_NAME
) und verwenden Sie stattdessen Kotlin-Zeichensätze aus dem Paketkotlin.text
,java.nio.charset.StandardCharsets
odercom.google.common.base.Charsets
. - Entfernen Sie den eingestellten Konstruktor
WorkManagerScheduler
und verwenden Sie stattdessen einen nicht eingestellten Konstruktor, der die Option bietet, einenContext
-Parameter anzugeben. - Entfernen Sie die verworfenen Methoden
createVideoSampleFormat
,createAudioSampleFormat
,createContainerFormat
undcreateSampleFormat
, die zum Instanziieren der KlasseFormat
verwendet wurden. Verwenden Sie stattdessenFormat.Builder
, um Instanzen vonFormat
zu erstellen. - Entfernen Sie die verworfenen Methoden
copyWithMaxInputSize
,copyWithSubsampleOffsetUs
,copyWithLabel
,copyWithManifestFormatInfo
,copyWithGaplessInfo
,copyWithFrameRate
,copyWithDrmInitData
,copyWithMetadata
,copyWithBitrate
undcopyWithVideoSize
und verwenden Sie stattdessenFormat.buildUpon()
und Setter-Methoden. - Entfernen Sie das verworfene
ExoPlayer.retry()
und verwenden Sie stattdessenprepare()
. - Entfernen Sie den verworfenen
DefaultTrackSelector
-Konstruktor ohne Argumente und verwenden Sie stattdessenDefaultTrackSelector(Context)
. - Entfernen Sie den verworfenen Konstruktor
OfflineLicenseHelper
und verwenden Sie stattdessenOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Entfernen Sie den eingestellten Konstruktor
DownloadManager
und verwenden Sie stattdessen den Konstruktor, der einExecutor
akzeptiert. - Entfernen Sie die verworfenen
Cue
-Konstruktoren und verwenden Sie stattdessenCue.Builder
. - Entfernen Sie den verworfenen Konstruktor
OfflineLicenseHelper
und verwenden Sie stattdessenOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Vier veraltete
AnalyticsListener
-Methoden wurden entfernt:onDecoderEnabled
. Verwenden Sie stattdessenonAudioEnabled
und/oderonVideoEnabled
.onDecoderInitialized
. Verwenden Sie stattdessenonAudioDecoderInitialized
und/oderonVideoDecoderInitialized
.onDecoderInputFormatChanged
. Verwenden Sie stattdessenonAudioInputFormatChanged
und/oderonVideoInputFormatChanged
.onDecoderDisabled
. Verwenden Sie stattdessenonAudioDisabled
und/oderonVideoDisabled
.
- Entfernen Sie die verworfenen
Player.Listener.onSeekProcessed
undAnalyticsListener.onSeekProcessed
und verwenden Sie stattdessenonPositionDiscontinuity
mitDISCONTINUITY_REASON_SEEK
. - Entfernen Sie
ExoPlayer.setHandleWakeLock(boolean)
und verwenden Sie stattdessensetWakeMode(int)
. - Entfernen Sie das verworfene
DefaultLoadControl.Builder.createDefaultLoadControl()
und verwenden Sie stattdessenbuild()
. - Entfernen Sie das verworfene
MediaItem.PlaybackProperties
und verwenden Sie stattdessenMediaItem.LocalConfiguration
. Das nicht mehr unterstützte FeldMediaItem.playbackProperties
hat jetzt den TypMediaItem.LocalConfiguration
.
- Entfernen Sie
Version 1.1.0-rc01
21. Juni 2023
Verwenden Sie die stabile Version 1.1.0.
Version 1.1.0-beta01
7. Juni 2023
Verwenden Sie die stabile Version 1.1.0.
Version 1.1.0-alpha01
10. Mai 2023
Verwenden Sie die stabile Version 1.1.0.
Version 1.0.0
Version 1.0.2
18. Mai 2023
androidx.media3:media3-*:1.0.2
ist veröffentlicht.
Version 1.0.2 enthält diese Commits.
Dieser Release entspricht ExoPlayer 2.18.7.
Diese Version enthält die folgenden Änderungen seit der Version 1.0.1:
- Core-Bibliothek:
- Fügen Sie
Buffer.isLastSample()
hinzu, um anzugeben, obBuffer
das FlagC.BUFFER_FLAG_LAST_SAMPLE
enthält. - Es wurde ein Problem behoben, bei dem der letzte Frame möglicherweise nicht gerendert wurde, wenn das letzte Sample mit Frames aus der Warteschlange entfernt wurde, ohne das Sample „end of stream“ (Ende des Streams) zu lesen. (#11079).
- Fügen Sie
- Extraktoren:
- Die Verarbeitung von H.265-SPS in MPEG-TS-Dateien wurde korrigiert, indem die bereits von RTSP- und MP4-Extraktoren verwendete Parsing-Logik wiederverwendet wurde (#303).
- Text:
- SSA: Unterstützung für UTF-16-Dateien wurde hinzugefügt, wenn sie mit einer Bytereihenfolge-Marke (Byte Order Mark, BOM) beginnen (#319).
- Sitzung:
- Ein Problem wurde behoben, bei dem
MediaController
seine verfügbaren Befehle nicht aktualisiert hat, wenn es mit einem altenMediaSessionCompat
verbunden war, das seine Aktionen aktualisiert hat. - Es wurde ein Fehler behoben, der verhindert hat, dass
MediaLibraryService
für einen Aufruf von der System-UI anCallback.onGetLibraryRoot
mitparams.isRecent == true
auf API 30 (#355) „null“ zurückgegeben hat. - Speicherleck von
MediaSessionService
oderMediaLibraryService
behoben (#346). - Ein Fehler wurde behoben, bei dem eine kombinierte
Timeline
- und Positionsaktualisierung in einemMediaSession
dazu führen konnte, dass einMediaController
eineIllegalStateException
auslöste.
- Ein Problem wurde behoben, bei dem
Version 1.0.1
18. April 2023
androidx.media3:media3-*:1.0.1
ist veröffentlicht.
Version 1.0.1 enthält diese Commits.
Dieser Release entspricht ExoPlayer 2.18.6.
- Core-Bibliothek:
- Überschreibung des Ziel-Livestreams beim Suchen zur Standardposition zurücksetzen ( #11051).
- Es wurde ein Fehler behoben, durch den die Wiedergabe hängen blieb, wenn leere Beispielstreams in den Medien vorhanden waren.
- Sitzung:
- Ein Fehler wurde behoben, bei dem mehrere identische Warteschlangenelemente, die von einem Legacy-
MediaSessionCompat
veröffentlicht wurden, zu einer Ausnahme inMediaController
führten (#290). - Die Weiterleitung von
MediaSession.broadcastCustomCommand
an das alteMediaControllerCompat.Callback.onSessionEvent
wurde hinzugefügt (#293). - Ein Fehler wurde behoben, bei dem durch Aufrufen von
MediaSession.setPlayer
die verfügbaren Befehle nicht aktualisiert wurden. - Ein Problem wurde behoben, bei dem
TrackSelectionOverride
-Instanzen, die von einemMediaController
gesendet wurden, ignoriert wurden, wenn sie auf eine Gruppe mitFormat.metadata
verwiesen haben (#296). - Problem beheben, bei dem
Player.COMMAND_GET_CURRENT_MEDIA_ITEM
verfügbar sein muss, um über die alteMediaSessionCompat
auf Metadaten zuzugreifen. - Problem behoben, bei dem
MediaSession
-Instanzen in einem Hintergrundthread Abstürze verursacht haben, wenn sie inMediaSessionService
verwendet wurden (#318). - Ein Problem wurde behoben, bei dem ein Media-Button-Receiver von der Bibliothek deklariert wurde, ohne dass die App dies beabsichtigt hatte (#314).
- Ein Fehler wurde behoben, bei dem mehrere identische Warteschlangenelemente, die von einem Legacy-
- DASH:
- Die Verarbeitung leerer Segmentzeitachsen wurde korrigiert (#11014).
- RTSP:
- Versuchen Sie es noch einmal mit TCP, wenn die RTSP-Einrichtung mit UDP mit dem RTSP-Fehler 461 „UnsupportedTransport“ (#11069) fehlschlägt.
Version 1.0.0
22. März 2023
androidx.media3:media3-*:1.0.0
ist veröffentlicht.
Version 1.0.0 enthält diese Commits.
Dieser Release entspricht ExoPlayer 2.18.5.
Seit Version 1.0.0-rc02 hat sich nichts geändert.
Version 1.0.0-rc02
2. März 2023
androidx.media3:media3-*:1.0.0-rc02
ist veröffentlicht.
Version 1.0.0-rc02 enthält diese Commits.
Dieser Release entspricht dem ExoPlayer-Release 2.18.4.
- Core-Bibliothek:
- Downloads:
- Die maximale Differenz der Startzeit von zwei Segmenten, die zusammengeführt werden sollen, kann in
SegmentDownloader
und Unterklassen konfiguriert werden (#248).
- Die maximale Differenz der Startzeit von zwei Segmenten, die zusammengeführt werden sollen, kann in
- Audio:
- Problem mit der lückenlosen MP3-Wiedergabe auf Samsung-Geräten behoben (#8594).
- Ein Fehler wurde behoben, durch den Wiedergabegeschwindigkeiten, die unmittelbar nach dem Deaktivieren von Audio festgelegt wurden, möglicherweise durch eine vorherige Geschwindigkeitsänderung überschrieben wurden (#10882).
- Video:
- HEVC-HDR10-Format wird
HEVCProfileMain10HDR10
stattHEVCProfileMain10
zugeordnet. - Es wurde eine Problemumgehung für ein Geräteproblem auf dem Chromecast mit Google TV und dem Lenovo M10 FHD Plus hinzugefügt, das dazu führt, dass AVC-Streams mit 60 fps als nicht unterstützt markiert werden (#10898).
- Probleme mit der Frame-Ausgabe bei der Wiedergabe von Medien mit einer Framerate, die viel höher als die Aktualisierungsrate des Displays ist, wurden behoben.
- HEVC-HDR10-Format wird
- Besetzung:
- Problem mit vorübergehenden
STATE_IDLE
beim Übergang zwischen Media-Elementen behoben (#245).
- Problem mit vorübergehenden
- RTSP:
- Die beim Parsen ungültiger RTSP-Describe-Antwortnachrichten ausgelöste IllegalArgumentException wird abgefangen (#10971).
- Sitzung:
- Es wurde ein Fehler behoben, durch den die Schaltfläche „Wiedergabe/Pause“ in Benachrichtigungen nicht mit dem Playerstatus aktualisiert wurde (#192).
- IMA-Erweiterung:
- Ein Fehler wurde behoben, der verhinderte, dass DAI-Streams ohne Anzeigen gestartet wurden, da das erste (und im Fall ohne Anzeigen das einzige)
LOADED
-Ereignis nicht empfangen wurde.
- Ein Fehler wurde behoben, der verhinderte, dass DAI-Streams ohne Anzeigen gestartet wurden, da das erste (und im Fall ohne Anzeigen das einzige)
Version 1.0.0-rc01
16. Februar 2023
androidx.media3:media3-*:1.0.0-rc01
ist veröffentlicht.
Version 1.0.0-rc01 enthält diese Commits.
Dieser Release entspricht ExoPlayer 2.18.3.
- Core-Bibliothek:
- Die Decoder-Reihenfolgelogik des Renderers wird so angepasst, dass die Einstellungen von
MediaCodecSelector
eingehalten werden, auch wenn ein Decoder meldet, dass er die Medien möglicherweise nicht leistungsstark wiedergeben kann. Beispielsweise wird bei der Standardauswahl ein Hardware-Decoder mit nur funktionaler Unterstützung einem Software-Decoder vorgezogen, der das Format vollständig unterstützt (#10604). - Fügen Sie
ExoPlayer.Builder.setPlaybackLooper
hinzu, um einen vorhandenen Wiedergabethread für eine neue ExoPlayer-Instanz festzulegen. - Download-Manager-Helfer können gelöscht werden (#10776).
- Fügen Sie dem Parameter
BasePlayer.seekTo
den Befehl hinzu, der für die Suche verwendet wurde. - Design beim Laden von Drawables unter API 21 und höher verwenden (#220).
ConcatenatingMediaSource2
hinzugefügt, mit der mehrere Media-Elemente in einem einzigen Fenster kombiniert werden können (#247).
- Die Decoder-Reihenfolgelogik des Renderers wird so angepasst, dass die Einstellungen von
- Extraktoren:
- Löst beim Parsen von „trak“-Atomen einen
ParserException
anstelle einesNullPointerException
aus, wenn in der Beispieltabellenbox (stbl) eine erforderliche Beispielbeschreibung (stsd) fehlt. - Behebung eines Problems, bei dem Samples beim direkten Suchen nach einem Synchronisationsframe in fMP4 nicht korrekt übersprungen wurden (#10941).
- Löst beim Parsen von „trak“-Atomen einen
- Audio:
- Verwende die Bitrate des komprimierten Audioformats, um die Mindestpuffergröße für
AudioTrack
bei direkter Wiedergabe (Passthrough) zu berechnen.
- Verwende die Bitrate des komprimierten Audioformats, um die Mindestpuffergröße für
- Text:
- Es wurde ein ungültiger (negativer) Index an
Subtitle.getEventTime
übergeben, wenn eine Untertiteldatei keine Cues enthält.TextRenderer
- SubRip: Unterstützung für UTF-16-Dateien hinzugefügt, wenn sie mit einer Byte Order Mark beginnen.
- Es wurde ein ungültiger (negativer) Index an
- Metadaten:
- Mehrere durch Null getrennte Werte aus ID3-Frames parsen, wie in ID3 v2.4 zulässig.
- Fügen Sie
MediaMetadata.mediaType
hinzu, um den Inhaltstyp oder den Typ des Ordners anzugeben, der in den Metadaten beschrieben wird. - Fügen Sie
MediaMetadata.isBrowsable
als Ersatz fürMediaMetadata.folderType
hinzu. Der Ordner wird im nächsten Release eingestellt.
- DASH:
- Vollständiges Parsen für Bildanpassungssätze wurde hinzugefügt, einschließlich der Anzahl der Kacheln (#3752).
- UI:
- Beheben Sie die Einstellung der
PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener)
-Eigenschaft, damit Änderungen an der Sichtbarkeit an den registrierten Listener übergeben werden (#229). - Die Reihenfolge der Steuerelemente für den mittleren Player in
PlayerView
wurde korrigiert, wenn ein RTL-Layout (Right-to-Left, von rechts nach links) verwendet wird (#227).
- Beheben Sie die Einstellung der
- Sitzung:
- Fügen Sie die abstrakte Klasse
SimpleBasePlayer
hinzu, um diePlayer
-Schnittstelle für benutzerdefinierte Player zu implementieren. - Hilfsmethode zum Konvertieren des Plattform-Sitzungstokens in Media3 hinzugefügt
SessionToken
(#171). - Verwende
onMediaMetadataChanged
, um Updates der Media-Session der Plattform auszulösen (#219). - Fügen Sie die Mediensitzung als Argument von
getMediaButtons()
desDefaultMediaNotificationProvider
hinzu und verwenden Sie zur besseren Übersicht unveränderliche Listen (#216). onSetMediaItems
-Callback-Listener hinzugefügt, um die Möglichkeit zu bieten, die ListeMediaItem
, den Startindex und die Position nach Sitzung zu ändern/festzulegen, bevor sie im Player festgelegt werden (#156).- Doppeltippen für Media-Schaltflächenereignisse, die nicht über Bluetooth gesendet werden, vermeiden (#233).
QueueTimeline
wurde robuster gemacht, falls ein fragwürdiger alter Sitzungsstatus vorliegt (#241).
- Fügen Sie die abstrakte Klasse
- Metadaten:
- Mehrere durch Null getrennte Werte aus ID3-Frames parsen, wie in ID3 v2.4 zulässig.
- Fügen Sie
MediaMetadata.mediaType
hinzu, um den Inhaltstyp oder den Typ des Ordners anzugeben, der in den Metadaten beschrieben wird. - Fügen Sie
MediaMetadata.isBrowsable
als Ersatz fürMediaMetadata.folderType
hinzu. Der Ordner wird im nächsten Release eingestellt.
- Cast-Erweiterung:
- Die Cast SDK-Version wurde auf 21.2.0 aktualisiert.
- IMA-Erweiterung:
- Entfernen Sie den Player-Listener von
ImaServerSideAdInsertionMediaSource
im Anwendungs-Thread, um Threading-Probleme zu vermeiden. - Fügen Sie dem
ImaServerSideAdInsertionMediaSource.AdsLoader.Builder
das AttributfocusSkipButtonWhenAvailable
hinzu, um die Skip-Schaltfläche auf TV-Geräten zu fokussieren, und legen Sie es standardmäßig auf „true“ fest. - Fügen Sie der
ImaServerSideAdInsertionMediaSource.AdsLoader
eine MethodefocusSkipButton()
hinzu, um den Fokus programmatisch auf die Schaltfläche „Überspringen“ zu legen. - IMA SDK-Version auf 3.29.0 aktualisiert.
- Entfernen Sie den Player-Listener von
- 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
ist veröffentlicht.
Version 1.0.0-beta03 enthält diese Commits.
Diese Version entspricht ExoPlayer 2.18.2.
- Core-Bibliothek:
- Fügen Sie
ExoPlayer.isTunnelingEnabled
hinzu, um zu prüfen, ob Tunneling für die aktuell ausgewählten Tracks aktiviert ist (#2518). WrappingMediaSource
wurde hinzugefügt, um das Umbrechen eines einzelnenMediaSource
zu vereinfachen (#7279).- Verwerfe den Backbuffer, bevor die Wiedergabe aufgrund von zu wenig verfügbarem Arbeitsspeicher hängen bleibt.
- Schließe den Tracing-Block „doSomeWork“, wenn die Auslagerung aktiviert ist.
- Problem mit der Sitzungsanalyse bei schnellen Suchvorgängen in
PlaybackStatsListener
behoben (#180). - Fehlenden
onMediaItemTransition
-Callback beim Aufrufen vonseekToNext
oderseekToPrevious
in einer Playlist mit einem einzelnen Element senden (#10667). - Fügen Sie
Player.getSurfaceSize
hinzu, um die Größe der Oberfläche zurückzugeben, auf der das Video gerendert wird. - Fehler behoben, bei dem das Entfernen von Listenern während der Player-Freigabe zu einem
IllegalStateException
führen konnte (#10758).
- Fügen Sie
- Build:
- Mindestversion von
compileSdkVersion
erzwingen, um Kompilierungsfehler zu vermeiden (#10684). - Veröffentlichen Sie den Block nicht, wenn er in einem anderen Gradle-Build enthalten ist.
- Mindestversion von
- Titelauswahl:
- Andere Tracks als Dolby Vision bevorzugen, wenn das Display diese Technologie nicht unterstützt. (#8944).
- Downloads:
- Potenzielle Endlosschleife in
ProgressiveDownloader
behoben, die durch gleichzeitiges Herunterladen und Abspielen mit demselbenPriorityTaskManager
verursacht wurde (#10570). - Downloadbenachrichtigung sofort anzeigen lassen ( #183).
- Die Anzahl paralleler Downloads wurde auf 1 begrenzt, um die Erstellung zu vieler Threads zu vermeiden (#10458).
- Potenzielle Endlosschleife in
- Video:
- Verwende einen alternativen Decoder für Dolby Vision, wenn das Display diese Funktion nicht unterstützt. (#9794).
- Audio:
- Verwenden Sie
SingleThreadExecutor
, umAudioTrack
-Instanzen freizugeben, damit beim gleichzeitigen Freigeben mehrerer Player keine OutOfMemory-Fehler auftreten (#10057). - Fügt
AudioOffloadListener.onExperimentalOffloadedPlayback
für den Offload-Status von AudioTrack hinzu. (#134). - Machen Sie
AudioTrackBufferSizeProvider
zu einer öffentlichen Schnittstelle. - Fügen Sie
ExoPlayer.setPreferredAudioDevice
hinzu, um das bevorzugte Audioausgabegerät festzulegen (#135). - Benennen Sie
androidx.media3.exoplayer.audio.AudioProcessor
inandroidx.media3.common.audio.AudioProcessor
um. - 8‑Kanal- und 12‑Kanal-Audio auf allen Android-Versionen den Kanalmasken 7.1 bzw. 7.1.4 zuordnen (#10701).
- Verwenden Sie
- Metadaten:
MetadataRenderer
kann jetzt so konfiguriert werden, dass Metadaten gerendert werden, sobald sie verfügbar sind. Erstellen Sie eine Instanz mitMetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean)
, um anzugeben, ob der Renderer Metadaten frühzeitig oder synchron mit der Position des Players ausgeben soll.
- DRM:
- Umgehen Sie einen Fehler in der ClearKey-Implementierung von Android 13, der eine nicht leere, aber ungültige Lizenz-URL zurückgibt.
- Der
setMediaDrmSession failed: session not opened
-Fehler beim Wechseln zwischen DRM-Schemata in einer Playlist (z.B. von Widevine zu ClearKey) wurde behoben.
- Text:
- CEA-608: Befehle zum Umschalten des Dienstes in Feld 2 werden korrekt verarbeitet (#10666).
- DASH:
EventStream.presentationTimeOffset
aus Manifesten parsen (#10460).
- UI:
- Verwenden Sie die aktuellen Überschreibungen des Players als Voreinstellung in
TrackSelectionDialogBuilder
(#10429).
- Verwenden Sie die aktuellen Überschreibungen des Players als Voreinstellung in
- Sitzung:
- Achten Sie darauf, dass Befehle immer in der richtigen Reihenfolge ausgeführt werden, auch wenn für einige eine asynchrone Auflösung erforderlich ist (#85).
- Fügen Sie
DefaultMediaNotificationProvider.Builder
hinzu, umDefaultMediaNotificationProvider
-Instanzen zu erstellen. Der Builder kann die Benachrichtigungs-ID, die Benachrichtigungskanal-ID und den vom Anbieter verwendeten Benachrichtigungskanalnamen konfigurieren. Fügen Sie außerdem die MethodeDefaultMediaNotificationProvider.setSmallIcon(int)
hinzu, um das kleine Symbol für Benachrichtigungen festzulegen. (#104). - Befehle, die vor
MediaController.release()
gesendet werden, dürfen nicht verloren gehen (#99). SimpleBitmapLoader
kann Bitmaps ausfile://
-URIs laden (#108).- Behebe die Assertion, die verhindert, dass
MediaController
in einem Zeitraum über eine Anzeige hinweg sucht (#122). - Wenn die Wiedergabe endet, wird die
MediaSessionService
im Vordergrund beendet und eine Benachrichtigung wird angezeigt, um die Wiedergabe des zuletzt wiedergegebenen Media-Elements neu zu starten (#112). - Starte keinen Dienst im Vordergrund mit einem ausstehenden Intent zum Pausieren (#167).
- Blenden Sie das Symbol, das mit der von
DefaultNotificationProvider
erstellten Benachrichtigung verknüpft ist, unter API 26 und API 27 manuell aus. Unter API 28 und höher wird das Symbol automatisch ausgeblendet (#131). - Fehler behoben, bei dem eine zweite Binder-Verbindung von einer alten MediaSession zu einem Media3-MediaController IllegalStateExceptions verursacht hat (#49).
- RTSP:
- IMA:
- Es wurde ein Zeitlimit für das Laden von Anzeigeninformationen hinzugefügt, um Fälle zu berücksichtigen, in denen das IMA SDK beim Laden einer Anzeige hängen bleibt (#10510).
- Das Überspringen von Mid-Roll-Anzeigen beim Vorspulen zum Ende des Inhalts wird verhindert. (#10685)
- Die Fensterdauer für Livestreams mit serverseitig eingefügten Anzeigen, z. B. IMA DAI, wird korrekt berechnet (#10764).
- FFmpeg-Erweiterung:
- Es wurden neue erforderliche Flags hinzugefügt, um FFmpeg-Bibliotheken mit NDK 23.1.7779620 und höher zu verknüpfen (#9933).
- AV1-Erweiterung:
- Die CMake-Version wurde aktualisiert, um Inkompatibilitäten mit den neuesten Android Studio-Versionen zu vermeiden (#9933).
- Cast-Erweiterung:
- Implementiere
getDeviceInfo()
, umCastPlayer
identifizieren zu können, wenn die Wiedergabe mit einemMediaController
gesteuert wird (#142).
- Implementiere
- Transformer:
- Es wurde ein Muxer-Watchdog-Timer hinzugefügt, um zu erkennen, wenn das Generieren einer Ausgabeprobe zu langsam ist.
- Entfernen Sie die veralteten Symbole:
- Entfernen Sie
Transformer.Builder.setOutputMimeType(String)
. Diese Funktion wurde entfernt. Der MIME-Typ ist immer MP4, wenn der Standard-Muxer verwendet wird.
- Entfernen Sie
Version 1.0.0-beta02
21. Juli 2022
androidx.media3:media3-*:1.0.0-beta02
ist veröffentlicht.
Version 1.0.0-beta02 enthält diese Commits.
Dieser Release entspricht ExoPlayer 2.18.1.
- Core-Bibliothek:
- Achten Sie darauf, dass das Ändern von
ShuffleOrder
inExoPlayer.setShuffleOrder
einen Aufruf vonPlayer.Listener#onTimelineChanged
mitreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
zur Folge hat (#9889). - Bei progressiven Media werden nur ausgewählte Tracks in der gepufferten Position berücksichtigt. (#10361)
- Benutzerdefiniertes Logger für alle ExoPlayer-Logausgaben zulassen (#9752).
- Die Implementierung von
setDataSourceFactory
inDefaultMediaSourceFactory
wurde korrigiert. Sie war in einigen Fällen nicht funktionsfähig (#116).
- Achten Sie darauf, dass das Ändern von
- Extraktoren:
- DASH:
- ClearKey-Lizenz-URL aus Manifesten parsen (#10246).
- UI:
- Achte darauf, dass TalkBack die aktuell aktive Geschwindigkeitsoption im Menü für die Wiedergabesteuerung ansagt (#10298).
- RTSP:
- Verarbeitung fragmentierter VP8-Pakete hinzugefügt (#110).
- Leanback-Erweiterung:
- Änderungen an
playWhenReady
inLeanbackAdapter
anhören (10420).
- Änderungen an
- Besetzung:
Version 1.0.0-beta01
16. Juni 2022
androidx.media3:media3-*:1.0.0-beta01
ist veröffentlicht.
Version 1.0.0-beta01 enthält diese Commits.
Dies entspricht der ExoPlayer-Version 2.18.0.
- Core-Bibliothek:
- Aktivieren Sie die Unterstützung für die Android-Plattformdiagnose über
MediaMetricsManager
. ExoPlayer leitet Wiedergabeereignisse und Leistungsdaten an die Plattform weiter, was dazu beiträgt, Informationen zur Systemleistung und zum Debugging auf dem Gerät bereitzustellen. Diese Daten können auch von Google erhoben werden, wenn der Nutzer des Geräts die Weitergabe von Nutzungs- und Diagnosedaten aktiviert hat. Apps können die Teilnahme an der Plattformdiagnose für ExoPlayer mitExoPlayer.Builder.setUsePlatformDiagnostics(false)
deaktivieren. - Es wurde ein Fehler behoben, durch den Tracks bei Verwendung von
MergingMediaSource
zu oft zurückgesetzt wurden, z. B. beim Sideloading von Untertiteln und beim Ändern der ausgewählten Untertitel während der Wiedergabe (#10248). - Die Erkennung des 5G-NSA-Netzwerktyps auf API 29 und 30 wird eingestellt. Bei diesen Wiedergaben wird von einem 4G-Netzwerk ausgegangen.
- Das Übergeben von
null
anMediaSource.Factory.setDrmSessionManagerProvider
undMediaSource.Factory.setLoadErrorHandlingPolicy
nicht zulassen. Instanzen vonDefaultDrmSessionManagerProvider
undDefaultLoadErrorHandlingPolicy
können bei Bedarf explizit übergeben werden. - Fügen Sie
MediaItem.RequestMetadata
hinzu, um Metadaten darzustellen, die zum Abspielen von Media erforderlich sind, wenn der genaueLocalConfiguration
nicht bekannt ist. Entferne auchMediaMetadata.mediaUrl
, da es jetzt inRequestMetadata
enthalten ist. - Fügen Sie
Player.Command.COMMAND_SET_MEDIA_ITEM
hinzu, damit Spieler ein einzelnes Element festlegen können.
- Aktivieren Sie die Unterstützung für die Android-Plattformdiagnose über
- Titelauswahl:
- Fasse die Klasse
TrackSelectionOverrides
inTrackSelectionParameters
zusammen und stufeTrackSelectionOverride
in eine Klasse der obersten Ebene hoch. - Benennen Sie
TracksInfo
inTracks
undTracksInfo.TrackGroupInfo
inTracks.Group
um.Player.getCurrentTracksInfo
undPlayer.Listener.onTracksInfoChanged
wurden inPlayer.getCurrentTracks
undPlayer.Listener.onTracksChanged
umbenannt. Dazu gehört auch, den MethodennamenPlayer.Listener.onTracksChanged
wieder zu aktivieren, jedoch mit anderen Parametertypen. - Ändern Sie
DefaultTrackSelector.buildUponParameters
undDefaultTrackSelector.Parameters.buildUpon
so, dassDefaultTrackSelector.Parameters.Builder
anstelle vonDefaultTrackSelector.ParametersBuilder
zurückgegeben wird. - Fügen Sie
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
hinzu, das standardmäßig aktiviert ist. Wenn diese Option aktiviert ist, werden fürDefaultTrackSelector
Audiotracks bevorzugt, deren Kanalanzahl die Ausgabefunktionen des Geräts nicht überschreitet. Auf Mobilgeräten wird beiDefaultTrackSelector
Stereo-/Mono-Audioformaten gegenüber Mehrkanal-Audioformaten der Vorzug gegeben, es sei denn, das Mehrkanalformat kann räumlich wiedergegeben werden (Android 12L+) oder ist ein Dolby-Surround-Sound-Format. Außerdem wird auf Geräten, die die räumliche Audioausgabe unterstützen, mitDefaultTrackSelector
nach Änderungen an den Spatializer-Eigenschaften gesucht und bei Änderungen eine neue Titelauswahl ausgelöst. Geräte mit demtelevision
-UI-Modus sind von diesen Einschränkungen ausgeschlossen und das Format mit der höchsten Anzahl an Kanälen wird bevorzugt. Damit diese Funktion aktiviert werden kann, muss dieDefaultTrackSelector
-Instanz mit einemContext
erstellt werden.
- Fasse die Klasse
- Video:
- Benennen Sie
DummySurface
inPlaceholderSurface
um. - AV1-Unterstützung für
MediaCodecVideoRenderer.getCodecMaxInputSize
hinzugefügt
- Benennen Sie
- Audio:
- Der LG AC3-Audiodecoder wirbt mit einem nicht standardmäßigen MIME-Typ.
- Ändern Sie den Rückgabetyp von
AudioAttributes.getAudioAttributesV21()
vonandroid.media.AudioAttributes
in eine neue Wrapper-KlasseAudioAttributesV21
, um eine langsame ART-Überprüfung bei API < 21 zu verhindern. - Frage die Plattform ab (API 29+) oder gehe von der Anzahl der Audio-Encodierungskanäle für die Audio-Passthrough-Funktion aus, wenn die Anzahl der Audio-Kanäle des Formats nicht festgelegt ist. Das ist bei der HLS-Chunkless-Vorbereitung (10204) der Fall.
- Konfiguriere
AudioTrack
mit der ChannelmaskeAudioFormat.CHANNEL_OUT_7POINT1POINT4
, wenn der Decoder 12‑Kanal-PCM-Audio ausgibt (#10322.
- DRM
- Achte darauf, dass die DRM-Sitzung beim Suchen unmittelbar nach einer Formatänderung immer korrekt aktualisiert wird (10274).
- Text:
- Ändern Sie
Player.getCurrentCues()
so, dassCueGroup
anstelle vonList<Cue>
zurückgegeben wird. - SSA: Unterstützung der Stileinstellung
OutlineColour
beiBorderStyle == 3
(d.h.OutlineColour
legt den Hintergrund des Cues fest) (#8435). - CEA-708: Daten in mehrere Serviceblöcke parsen und Blöcke ignorieren, die nicht mit der aktuell ausgewählten Servicenummer verknüpft sind.
- Entfernen Sie
RawCcExtractor
, das nur für ein Google-internes Untertitelformat verwendet wurde.
- Ändern Sie
- Extraktoren:
- UI:
- Die Zustellung von Ereignissen an
OnClickListener
, die inPlayerView
festgelegt sind, wird korrigiert, wennuseController=false
(#9605). Außerdem wurde die Übermittlung von Ereignissen anOnLongClickListener
für alle Ansichtskonfigurationen korrigiert. - Es wurde ein Problem behoben, bei dem eine Folge von Touch-Ereignissen, die die Grenzen von
PlayerView
vorACTION_UP
verlassen, fälschlicherweise als Klick behandelt wurden (#9861). - Das Problem mit der Bedienungshilfe
PlayerView
wurde behoben. Durch Tippen wird jetzt nicht mehr die Wiedergabe umgeschaltet, sondern die Steuerelemente werden ausgeblendet (#8627). - Schreibe
TrackSelectionView
undTrackSelectionDialogBuilder
so um, dass sie mit derPlayer
-Schnittstelle anstelle vonExoPlayer
funktionieren. Dadurch können die Ansichten mit anderenPlayer
-Implementierungen verwendet werden und die Abhängigkeit des UI-Moduls vom ExoPlayer-Modul wird entfernt. Dies ist eine funktionsgefährdende Änderung. - Erzwungene Text-Tracks werden nicht in der
PlayerView
-Track-Auswahl angezeigt und ein geeigneter erzwungener Text-Track bleibt ausgewählt, wenn „Keine“ ausgewählt ist (#9432).
- Die Zustellung von Ereignissen an
- DASH:
- Parsen der Kanalanzahl aus DTS-
AudioChannelConfiguration
-Elementen. Dadurch wird das Audio-Passthrough für DTS-Streams wieder aktiviert (#10159). - Das Übergeben von
null
anDashMediaSource.Factory.setCompositeSequenceableLoaderFactory
nicht zulassen. Instanzen vonDefaultCompositeSequenceableLoaderFactory
können bei Bedarf explizit übergeben werden.
- Parsen der Kanalanzahl aus DTS-
- HLS:
- Wenn das Attribut „CODECS“ der Playlist den Audio-Codec nicht enthält (#10065), wird auf die Vorbereitung in Chunks zurückgegriffen.
- Die Übergabe von
null
anHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
,HlsMediaSource.Factory.setPlaylistParserFactory
undHlsMediaSource.Factory.setPlaylistTrackerFactory
nicht zulassen. Instanzen vonDefaultCompositeSequenceableLoaderFactory
,DefaultHlsPlaylistParserFactory
oder ein Verweis aufDefaultHlsPlaylistTracker.FACTORY
können bei Bedarf explizit übergeben werden.
- Smooth Streaming:
- Das Übergeben von
null
anSsMediaSource.Factory.setCompositeSequenceableLoaderFactory
nicht zulassen. Instanzen vonDefaultCompositeSequenceableLoaderFactory
können bei Bedarf explizit übergeben werden.
- Das Übergeben von
- RTSP:
- RTP-Reader für H263 hinzugefügt (#63).
- RTP-Leser für MPEG4 hinzufügen (#35).
- RTP-Leser für HEVC hinzugefügt (#36).
- RTP-Reader für AMR hinzufügen. Derzeit werden nur Mono-Channel-AMR-Streams ohne Interleaving unterstützt. Die zusammengesetzte AMR-RTP-Nutzlast wird nicht unterstützt. (#46)
- RTP-Leser für VP8 hinzufügen (#47).
- RTP-Leser für WAV hinzufügen (#56).
- RTSP-Header für die grundlegende Autorisierung korrigieren. (#9544).
- Die Prüfung von obligatorischen SDP-Feldern wird beendet, da ExoPlayer sie nicht benötigt (#10049).
- Es wird eine geprüfte Ausnahme ausgelöst, wenn die RTSP-Zeitangabe geparst wird (#10165).
- RTP-Leser für VP9 hinzugefügt (#47).
- RTP-Reader für OPUS hinzufügen (#53).
- Datenquellen:
- Benennen Sie
DummyDataSource
inPlaceholderDataSource
um. - Problemumgehung für die Unterbrechungsbehandlung von OkHttp.
- Benennen Sie
- Sitzung:
- Ersetzen Sie
MediaSession.MediaItemFiller
durchMediaSession.Callback.onAddMediaItems
, um die asynchrone Auflösung von Anfragen zu ermöglichen. - Unterstützung von
setMediaItems(s)
-Methoden, wennMediaController
eine Verbindung zu einer alten Media Session herstellt. - Entfernen Sie
MediaController.setMediaUri
undMediaSession.Callback.onSetMediaUri
. Dieselbe Funktionalität kann mitMediaController.setMediaItem
undMediaSession.Callback.onAddMediaItems
erreicht werden. - Leite alte
MediaController
-Anrufe zur Medienwiedergabe anMediaSession.Callback.onAddMediaItems
statt anonSetMediaUri
weiter. - Fügen Sie
MediaNotification.Provider
undDefaultMediaNotificationProvider
hinzu, um die Benachrichtigung anzupassen. - Fügen Sie
BitmapLoader
undSimpleBitmapLoader
zum Herunterladen von Artwork-Bildern hinzu. - Fügen Sie
MediaSession.setCustomLayout()
hinzu, um die Abwärtskompatibilität mit der alten Sitzung zu gewährleisten. - Fügen Sie
MediaSession.setSessionExtras()
hinzu, um die Funktionsparität mit der alten Sitzung zu erreichen. - Benenne
MediaSession.MediaSessionCallback
inMediaSession.Callback
,MediaLibrarySession.MediaLibrarySessionCallback
inMediaLibrarySession.Callback
undMediaSession.Builder.setSessionCallback
insetCallback
um. - NPE in
MediaControllerImplLegacy
behoben. (#59) - Aktualisieren der Informationen zur Sitzungsposition in der Zeitachse bei Änderungen(#51).
- NPE in
MediaControllerImplBase
nach dem Loslassen des Controllers behoben (#74).
- Ersetzen Sie
- Anzeigenwiedergabe / IMA:
- Die Abrufrate für Anzeigen wird von 100 ms auf 200 ms gesenkt, um den Empfehlungen des Media Rating Council (MRC) zu entsprechen.
- FFmpeg-Erweiterung:
- Aktualisieren Sie die CMake-Version auf
3.21.0+
, um einen CMake-Fehler zu vermeiden, der dazu führt, dass die Gradle-Synchronisierung von Android Studio fehlschlägt (#9933).
- Aktualisieren Sie die CMake-Version auf
- Entfernen Sie die veralteten Symbole:
- Entfernen Sie
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
. Verwenden Sie stattdessenPlayer.Listener.onTracksChanged(Tracks)
. - Entfernen Sie
Player.getCurrentTrackGroups
undPlayer.getCurrentTrackSelections
. Verwenden Sie stattdessenPlayer.getCurrentTracks
. Sie könnenExoPlayer.getCurrentTrackGroups
undExoPlayer.getCurrentTrackSelections
weiterhin verwenden, obwohl diese Methoden weiterhin als veraltet gelten. - Entfernen Sie die Konstanten
DownloadHelper
,DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
undDEFAULT_TRACK_SELECTOR_PARAMETERS
. Verwenden Sie nach MöglichkeitgetDefaultTrackSelectorParameters(Context)
und andernfallsDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT
. - Entfernen Sie den Konstruktor
DefaultTrackSelector(ExoTrackSelection.Factory)
. Verwenden Sie stattdessenDefaultTrackSelector(Context, ExoTrackSelection.Factory)
. - Entfernen Sie
Transformer.Builder.setContext
. DieContext
sollte stattdessen an denTransformer.Builder
-Konstruktor übergeben werden.
- Entfernen Sie
Version 1.0.0-alpha03
14. März 2022
androidx.media3:media3-*:1.0.0-alpha03
ist veröffentlicht.
Version 1.0.0-alpha03 enthält diese Commits.
Dies entspricht der ExoPlayer-Version 2.17.1.
- Audio:
- Fehler beim Prüfen der Audiofunktionen für Dolby Atmos (E-AC3-JOC) in HLS behoben.
- Extraktoren:
- FMP4: Das Problem wurde behoben, dass die emsg-Beispielmetadaten für Streams mit v0- und v1-emsg-Atomen in der falschen Reihenfolge ausgegeben werden konnten (#9996).
- Text:
- Beheben Sie die Interaktion von
SingleSampleMediaSource.Factory.setTrackId
undMediaItem.SubtitleConfiguration.Builder.setId
, um das FeldSubtitleConfiguration
zu priorisieren und auf den WertFactory
zurückzugreifen, wenn er nicht festgelegt ist (#10016).
- Beheben Sie die Interaktion von
- Anzeigenwiedergabe:
- Audio-Underruns zwischen Anzeigenblöcken in HLS-Livestreams mit SSAI beheben.
Version 1.0.0-alpha02
2. März 2022
androidx.media3:media3-*:1.0.0-alpha02
ist veröffentlicht.
Version 1.0.0-alpha02 enthält diese Commits.
Dies entspricht der ExoPlayer-Version 2.17.0.
- Core-Bibliothek:
- Füge die geschützte Methode
DefaultRenderersFactory.getCodecAdapterFactory()
hinzu, damit Unterklassen vonDefaultRenderersFactory
, diebuildVideoRenderers()
oderbuildAudioRenderers()
überschreiben, auf die Codec-Adapter-Factory zugreifen und sie anMediaCodecRenderer
-Instanzen übergeben können, die sie erstellen. - Leite die ICY-Headerfelder
name
undgenre
anMediaMetadata.station
bzw.MediaMetadata.genre
weiter, damit sie die App überPlayer.Listener.onMediaMetadataChanged()
(#9677) erreichen. - Nullschlüssel aus
DefaultHttpDataSource#getResponseHeaders
entfernen. - Wenn das Erstellen einer
MediaCodec
-Instanz fehlschlägt, wird eine Pause eingelegt und der Vorgang wird wiederholt. Damit wird ein Problem umgangen, das auf einigen Geräten auftritt, wenn eine Oberfläche von einem sicheren Codec zu einem anderen Codec gewechselt wird (#8696). - Fügen Sie
MediaCodecAdapter.getMetrics()
hinzu, damit Nutzer Messwertdaten ausMediaCodec
abrufen können. (#9766). - Problem mit der Maven-Abhängigkeitsauflösung behoben (#8353).
- Deaktiviere die automatische Geschwindigkeitsanpassung für Livestreams, die weder Low-Latency-Funktionen noch eine Nutzereinstellung für die Geschwindigkeit haben (#9329).
- Benennen Sie
DecoderCounters#inputBufferCount
inqueuedInputBufferCount
um. SimpleExoPlayer.renderers
privat machen Auf Renderers kann überExoPlayer.getRenderer
zugegriffen werden.- Einige
AnalyticsListener.EventFlags
-Konstantenwerte wurden aktualisiert, damit sie mit den Werten inPlayer.EventFlags
übereinstimmen. AnalyticsCollector
in eine Schnittstelle und eine Standardimplementierung aufteilen, damit sie von R8 entfernt werden kann, wenn eine App sie nicht benötigt.
- Füge die geschützte Methode
- Titelauswahl:
- Unterstützung bevorzugter Video-Rollen-Flags bei der Titelauswahl (#9402).
- Die Logik für die Auswahl von Videotracks wurde aktualisiert, um bevorzugte MIME-Typen und Rollen-Flags bei der Auswahl mehrerer Videotracks für die Anpassung zu berücksichtigen (#9519).
- Die Logik für die Auswahl von Video- und Audio-Tracks wurde aktualisiert, sodass nur Formate für adaptive Auswahlen ausgewählt werden, die dasselbe Niveau an Decoder- und Hardwareunterstützung haben (#9565).
- Die Logik für die Auswahl von Videotracks wurde aktualisiert, um effizientere Codecs zu bevorzugen, wenn mehrere Codecs von primären, hardwarebeschleunigten Decodern unterstützt werden (#4835).
- Bevorzuge Einstellungen für Audioinhalte (z. B. den „Standard“-Audio-Track oder einen Track, der der Sprache des Systemgebietsschemas entspricht) gegenüber technischen Einschränkungen bei der Trackauswahl (z. B. bevorzugter MIME-Typ oder maximale Anzahl von Kanälen).
- Ein Problem bei der Auswahl von Tracks wurde behoben. Wenn eine Trackgruppe überschrieben wurde, wurden andere Trackgruppen desselben Typs nicht deaktiviert (#9675).
- Ein Problem bei der Auswahl von Tracks wurde behoben, bei dem eine Mischung aus nicht leeren und leeren Track-Überschreibungen nicht korrekt angewendet wurde (#9649).
- Doppelte
TrackGroup
in einemTrackGroupArray
verbieten.TrackGroup
s können immer durch Festlegen einesid
imTrackGroup
-Konstruktor unterschieden werden. Dadurch wird ein Absturz behoben, der beim Fortsetzen der Wiedergabe nach dem Minimieren der App mit einer aktiven Track-Überschreibung aufgetreten ist (#9718). - Die Logik in
AdaptiveTrackSelection
wurde so geändert, dass die Qualität auch bei ausreichender Netzwerkbandbreite erhöht werden kann, selbst wenn die Wiedergabe sehr nah am Live-Edge liegt (#9784).
- Video:
- Die Decoder-Fallback-Logik für Dolby Vision wurde korrigiert, sodass bei Bedarf ein kompatibler H264/H265-Decoder verwendet wird.
- Audio:
- Die Fallback-Logik des Decoders für Dolby Atmos (E-AC3-JOC) wurde korrigiert, sodass bei Bedarf ein kompatibler E-AC3-Decoder verwendet wird.
- Bei
AudioCapabilities
-APIs muss explizitAudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
anstelle vonnull
übergeben werden. - Die Berechnung der
AudioTrack
-Puffergröße kann angepasst werden, indem einAudioTrackBufferSizeProvider
inDefaultAudioSink
eingefügt wird. (#8891). - Wiederholen Sie die Erstellung von
AudioTrack
, wenn die angeforderte Puffergröße > 1 MB war. (#9712).
- Extraktoren:
- Text:
- Fügen Sie ein
MediaItem.SubtitleConfiguration.id
-Feld hinzu, das in dasFormat.id
-Feld des Untertitel-Tracks übernommen wird, der aus der Konfiguration erstellt wurde (#9673). - Grundlegende Unterstützung für WebVTT-Untertitel in Matroska-Containern hinzugefügt (#9886).
- Verhindern Sie, dass
Cea708Decoder
mehr als die deklarierte Größe eines Serviceblocks liest.
- Fügen Sie ein
- DRM:
- Entfernen Sie
playbackLooper
ausDrmSessionManager.(pre)acquireSession
. Wenn einDrmSessionManager
von einer App in einem benutzerdefiniertenMediaSource
verwendet wird, muss dasplaybackLooper
stattdessen anDrmSessionManager.setPlayer
übergeben werden.
- Entfernen Sie
- Anzeigenwiedergabe / IMA:
- Unterstützung für die IMA-Lösung für die dynamische Anzeigenbereitstellung hinzugefügt (#8213).
- Eine Methode für
AdPlaybackState
hinzufügen, um eine Anzeigengruppe zurückzusetzen, damit sie noch einmal abgespielt werden kann (#9615). - Wiedergabegeschwindigkeit von 1,0 während der Anzeigenwiedergabe erzwingen ( #9018).
- Ein Problem wurde behoben, bei dem eine Anzeigengruppe, die nicht geladen werden konnte, zu einem sofortigen Zurücksetzen der Wiedergabe geführt hat (#9929).
- UI:
- DASH:
- Fügen Sie dem
Representation
(#9579) geparste wichtige und zusätzliche Properties hinzu. - Unterstützung der Trackrolle
forced-subtitle
(#9727). - Die Rolle des
main
-Tracks nicht mehr alsC.SELECTION_FLAG_DEFAULT
interpretieren. - Die Ausschlusslogik für die Basis-URL für Manifeste, in denen der DVB-Namespace nicht deklariert wird, wurde korrigiert (#9856).
- Unterstützung relativer
MPD.Location
-URLs (#9939).
- Fügen Sie dem
- HLS:
Format.label
für reine Audio-HLS-Streams korrekt ausfüllen (#9608).- Verwenden Sie standardmäßig die chunklose Vorbereitung, um die Startzeit zu verkürzen. Wenn Ihre Renditionen gemischte Untertitel-Tracks enthalten, die nicht in der Master-Playlist deklariert sind, sollten Sie sie der Master-Playlist hinzufügen, damit sie für die Wiedergabe verfügbar sind, oder die chunklose Vorbereitung mit
HlsMediaSource.Factory.setAllowChunklessPreparation(false)
deaktivieren. - Unterstützung der Keyframe-genauen Suche in HLS (#2882).
- RTSP:
- Stellen Sie eine Client-API bereit, um die
SocketFactory
zu überschreiben, die für jede Serververbindung verwendet wird (#9606). - Die DIGEST-Authentifizierungsmethode sollte gegenüber BASIC bevorzugt werden, wenn beide vorhanden sind (#9800).
- Behandlung, wenn das Timing des RTSP-Tracks nicht verfügbar ist (#9775).
- Ungültige RTP-Info-Headerwerte ignorieren (#9619).
- Stellen Sie eine Client-API bereit, um die
- Transformer:
- Die erforderliche Mindest-API-Version wird auf 21 erhöht.
TransformationException
wird jetzt verwendet, um Fehler zu beschreiben, die während einer Transformation auftreten.- Fügen Sie
TransformationRequest
hinzu, um die Transformationsoptionen anzugeben. - Es können mehrere Zuhörer registriert werden.
- Das Problem, dass der Transformer hängen bleibt, wenn die Codec-Ausgabe teilweise gelesen wird, wurde behoben.
- Mögliche NPE in
Transformer.getProgress
behoben, wenn beim Freigeben des Muxers eine Ausnahme ausgelöst wird. - Demo-App zum Anwenden von Transformationen hinzufügen
- MediaSession-Erweiterung:
- Standardmäßig wird die Playlist in
MediaSessionConnector
jetzt beim Stoppen gelöscht. Apps, die die Playlist beibehalten möchten, könnensetClearMediaItemsOnStop(false)
für den Connector aufrufen.
- Standardmäßig wird die Playlist in
- Cast-Erweiterung:
- FFmpeg-Erweiterung:
build_ffmpeg.sh
von den Binärdienstprogrammen von LLVM anstelle von GNU abhängig machen (#9933).
- Android 12-Kompatibilität:
- Aktualisieren Sie die Cast-Erweiterung, sodass sie von
com.google.android.gms:play-services-cast-framework:20.1.0
abhängt. Ältere Versionen vonplay-services-cast-framework
sind nicht mit Apps kompatibel, die auf Android 12 ausgerichtet sind, und stürzen mit einemIllegalArgumentException
ab, wennPendingIntent
s erstellt werden (#9528).
- Aktualisieren Sie die Cast-Erweiterung, sodass sie von
- Entfernen Sie die veralteten Symbole:
- Entfernen Sie
Player.EventListener
. Verwenden Sie stattdessenPlayer.Listener
. - Entfernen Sie
MediaSourceFactory#setDrmSessionManager
,MediaSourceFactory#setDrmHttpDataSourceFactory
undMediaSourceFactory#setDrmUserAgent
. Verwenden Sie stattdessenMediaSourceFactory#setDrmSessionManagerProvider
. - Entfernen Sie
MediaSourceFactory#setStreamKeys
. Verwenden Sie stattdessenMediaItem.Builder#setStreamKeys
. - Entfernen Sie
MediaSourceFactory#createMediaSource(Uri)
. Verwenden Sie stattdessenMediaSourceFactory#createMediaSource(MediaItem)
. - Entferne
setTag
ausDashMediaSource
,HlsMediaSource
undSsMediaSource
. Verwenden Sie stattdessenMediaItem.Builder#setTag
. - Entfernen Sie
DashMediaSource#setLivePresentationDelayMs(long, boolean)
. Verwenden SieMediaItem.Builder#setLiveConfiguration
undMediaItem.LiveConfiguration.Builder#setTargetOffsetMs
, um das Manifest zu überschreiben, oderDashMediaSource#setFallbackTargetLiveOffsetMs
, um einen Fallback-Wert anzugeben. - Entfernen Sie
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
. Die Deaktivierung der Thread-Durchsetzung ist nicht mehr möglich. - Entfernen Sie
ActionFile
undActionFileUpgradeUtil
. Verwenden Sie ExoPlayer 2.16.1 oder früher, um mitActionFileUpgradeUtil
Legacy-Aktionsdateien inDefaultDownloadIndex
zusammenzuführen. - Entfernen Sie
ProgressiveMediaSource#setExtractorsFactory
. Verwenden Sie stattdessen denProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
-Konstruktor. - Entfernen Sie
ProgressiveMediaSource.Factory#setTag
undProgressiveMediaSource.Factory#setCustomCacheKey
. Verwenden Sie stattdessenMediaItem.Builder#setTag
undMediaItem.Builder#setCustomCacheKey
. - Entfernen Sie die Konstruktoren
DefaultRenderersFactory(Context, @ExtensionRendererMode int)
undDefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
. Verwenden Sie stattdessen denDefaultRenderersFactory(Context)
-Konstruktor,DefaultRenderersFactory#setExtensionRendererMode
undDefaultRenderersFactory#setAllowedVideoJoiningTimeMs
. - Entfernen Sie alle öffentlichen
CronetDataSource
-Konstruktoren. Verwenden Sie stattdessenCronetDataSource.Factory
.
- Entfernen Sie
- Ändern Sie nur die folgenden
IntDefs
in@Target(TYPE_USE)
. Dies kann die Kompilierung von Verwendungen in Kotlin unterbrechen. Das Problem lässt sich beheben, indem Sie die Annotation zum Annotieren des Typs (Int
) verschieben.@AacAudioObjectType
@Ac3Util.SyncFrameInfo.StreamType
@AdLoadException.Type
@AdtsExtractor.Flags
@AmrExtractor.Flags
@AspectRatioFrameLayout.ResizeMode
@AudioFocusManager.PlayerCommand
@AudioSink.SinkFormatSupport
@BinarySearchSeeker.TimestampSearchResult.Type
@BufferReplacementMode
@C.BufferFlags
@C.ColorRange
@C.ColorSpace
@C.ColorTransfer
@C.CryptoMode
@C.Encoding
@C.PcmEncoding
@C.Projection
@C.SelectionReason
@C.StereoMode
@C.VideoOutputMode
@CacheDataSource.Flags
@CaptionStyleCompat.EdgeType
@DataSpec.Flags
@DataSpec.HttpMethods
@DecoderDiscardReasons
@DecoderReuseResult
@DefaultAudioSink.OutputMode
@DefaultDrmSessionManager.Mode
@DefaultTrackSelector.SelectionEligibility
@DefaultTsPayloadReaderFactory.Flags
@EGLSurfaceTexture.SecureMode
@EbmlProcessor.ElementType
@ExoMediaDrm.KeyRequest.RequestType
@ExtensionRendererMode
@Extractor.ReadResult
@FileTypes.Type
@FlacExtractor.Flags
(im Paketcom.google.android.exoplayer2.ext.flac
)@FlacExtractor.Flags
(im Paketcom.google.android.exoplayer2.extractor.flac
)@FragmentedMp4Extractor.Flags
@HlsMediaPlaylist.PlaylistType
@HttpDataSourceException.Type
@IllegalClippingException.Reason
@IllegalMergeException.Reason
@LoadErrorHandlingPolicy.FallbackType
@MatroskaExtractor.Flags
@Mp3Extractor.Flags
@Mp4Extractor.Flags
@NotificationUtil.Importance
@PlaybackException.FieldNumber
@PlayerNotificationManager.Priority
@PlayerNotificationManager.Visibility
@PlayerView.ShowBuffering
@Renderer.State
@RendererCapabilities.AdaptiveSupport
@RendererCapabilities.Capabilities
@RendererCapabilities.DecoderSupport
@RendererCapabilities.FormatSupport
@RendererCapabilities.HardwareAccelerationSupport
@RendererCapabilities.TunnelingSupport
@SampleStream.ReadDataResult
@SampleStream.ReadFlags
@StyledPlayerView.ShowBuffering
@SubtitleView.ViewType
@TextAnnotation.Position
@TextEmphasisSpan.MarkFill
@TextEmphasisSpan.MarkShape
@Track.Transformation
@TrackOutput.SampleDataPart
@Transformer.ProgressState
@TsExtractor.Mode
@TsPayloadReader.Flags
@WebvttCssStyle.FontSizeUnit
Version 1.0.0-alpha01
27. Oktober 2021
androidx.media3:media3-*:1.0.0-alpha01
ist veröffentlicht.
Version 1.0.0-alpha01 enthält diese Commits.
Neue Funktionen
Media3 ist der neue Ort für Media-Support-Bibliotheken, einschließlich ExoPlayer. Die erste Alphaversion enthält frühe, funktionale Implementierungen von Bibliotheken für die Implementierung von Media-Anwendungsfällen, darunter:
- ExoPlayer, ein Mediaplayer auf Anwendungsebene für Android, der sich einfach anpassen und erweitern lässt.
- Media Session-Funktionen zum Bereitstellen und Steuern der Wiedergabe. Dieses neue Sitzungsmodul verwendet dieselbe
Player
-Schnittstelle wie ExoPlayer. - UI-Komponenten zum Erstellen von Benutzeroberflächen für die Medienwiedergabe.
- Module, die Funktionen in anderen Bibliotheken für die Verwendung mit ExoPlayer umschließen, z. B. das Einfügen von Anzeigen über das IMA SDK.
Weitere Informationen finden Sie im Media3-GitHub-Projekt.
ExoPlayer wurde zuvor in einem separaten ExoPlayer-GitHub-Projekt gehostet. In Media3 lautet der Paketname androidx.media3.exoplayer
. Wir planen, das ExoPlayer-GitHub-Projekt noch eine Weile weiter zu pflegen und zu veröffentlichen, damit Apps Zeit für die Migration zu Media3 haben. Media3 bietet Ersatz für alle ExoPlayer-Module, mit Ausnahme der alten Media2- und Mediasession-Erweiterungen, die durch das neue media3-session
-Modul ersetzt werden. Dadurch ist eine direkte Integration zwischen Playern und Mediensitzungen möglich, ohne dass eine Adapter-/Connector-Klasse verwendet werden muss.