Media3 1.9.0 ist da! Neben den üblichen Fehlerkorrekturen und Leistungsverbesserungen enthält die aktuelle Version auch vier neue oder weitgehend neu geschriebene Module:
media3-inspector– Metadaten und Frames außerhalb der Wiedergabe extrahierenmedia3-ui-compose-material3– In wenigen Schritten eine einfache Media-Benutzeroberfläche mit Material3 Compose erstellenmedia3-cast– Übergänge zwischen Cast- und lokaler Wiedergabe automatisch verarbeitenmedia3-decoder-av1– Einheitliche AV1-Wiedergabe mit dem neu geschriebenen Erweiterungsdecoder auf Grundlage der dav1d-Bibliothek
Außerdem haben wir Verbesserungen beim Caching und bei der Speicherverwaltung in PreloadManager vorgenommen und mehrere neue ExoPlayer-, Transformer- und MediaSession-Vereinfachungen eingeführt.
Mit diesem Release erhalten Sie auch den ersten experimentellen Zugriff auf CompositionPlayer, um Medienbearbeitungen in der Vorschau anzusehen.
Weitere Informationen finden Sie unten. Eine umfassende Übersicht der Änderungen in dieser Version finden Sie wie immer in den Versionshinweisen.
Metadaten und Frames außerhalb der Wiedergabe extrahieren
Es gibt viele Fälle, in denen Sie sich Medien ansehen möchten, ohne die Wiedergabe zu starten. Sie können beispielsweise erkennen, welche Formate sie enthält oder wie lang sie ist, oder Thumbnails abrufen.
Das neue Modul media3-inspector fasst alle Dienstprogramme zum Untersuchen von Medien ohne Wiedergabe an einem Ort zusammen:
MetadataRetrieverzum Lesen von Dauer, Format und statischen Metadaten aus einemMediaItem.FrameExtractor, um Frames oder Thumbnails aus einem Element abzurufen.MediaExtractorCompatals direkter Ersatz für die MediaExtractor-Klasse der Android-Plattform, um detaillierte Informationen zu den Samples in der Datei zu erhalten.
MetadataRetriever und FrameExtractor folgen einem einfachen AutoCloseable-Muster. Weitere Informationen finden Sie auf unseren neuen Leitfadenseiten.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}
Einfache Media-Benutzeroberfläche mit Material3 Compose in wenigen Schritten erstellen
In früheren Versionen haben wir begonnen, Connector-Code zwischen Compose-UI-Elementen und Ihrer Player-Instanz bereitzustellen. Mit Media3 1.9.0 haben wir das neue Modul „media3-ui-compose-material3“ mit vollständig gestalteten Material3-Schaltflächen und Inhaltselementen hinzugefügt. Sie ermöglichen es Ihnen, in nur wenigen Schritten eine Media-Benutzeroberfläche zu erstellen, und bieten gleichzeitig die Flexibilität, den Stil anzupassen. Wenn Sie lieber Ihren eigenen UI-Stil erstellen möchten, können Sie die Bausteine verwenden, die sich um die gesamte Update- und Verbindungslogik kümmern. Sie müssen sich dann nur auf das Design des UI-Elements konzentrieren. Erweiterte Leitfadenseiten für die Compose-UI-Module
Wir arbeiten auch noch an weiteren Compose-Komponenten, z. B. einer integrierten Steuerleiste, einem vollständigen Ersatz für PlayerView, sowie an der Integration von Untertiteln und Anzeigen.
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}
Einfache Compose-Player-UI mit sofort einsatzbereiten Elementen
Übergänge zwischen Cast- und lokaler Wiedergabe automatisch verarbeiten
Der CastPlayer im media3-cast-Modul wurde neu geschrieben, um Übergänge zwischen lokaler Wiedergabe (z. B. mit ExoPlayer) und Remote-Cast-Wiedergabe automatisch zu verarbeiten.
Wenn Sie Ihr MediaSession einrichten, erstellen Sie einfach ein CastPlayer um Ihr ExoPlayer und fügen Sie Ihrer Benutzeroberfläche ein MediaRouteButton hinzu. Das war's!
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}
Neue CastPlayer-Integration in der Media3-Sitzungs-Demo-App
Konsistente AV1-Wiedergabe mit der neu geschriebenen Erweiterung basierend auf dav1d
Das Release 1.9.0 enthält ein vollständig neu geschriebenes AV1-Erweiterungsmodul, das auf der beliebten dav1d-Bibliothek basiert.
Wie bei allen Erweiterungsdecodermodulen ist es erforderlich, aus dem Quellcode zu erstellen , um den relevanten nativen Code richtig zu bündeln. Durch das Bündeln eines Decoders wird die Konsistenz und Formatunterstützung auf allen Geräten gewährleistet. Da die Decodierung in Ihrem Prozess erfolgt, eignet sich diese Methode am besten für Inhalte, denen Sie vertrauen.
Caching und Arbeitsspeicherverwaltung in PreloadManager integrieren
Wir haben auch unsere PreloadManager verbessert. Damit konnten Sie Medien bereits vor der Wiedergabe in den Arbeitsspeicher laden und sie dann bei Bedarf nahtlos an einen Player übergeben. Obwohl die Leistung recht gut war, mussten Sie darauf achten, dass Sie die Arbeitsspeicherlimits nicht überschreiten, indem Sie versehentlich zu viel vorab laden. Mit Media3 1.9.0 haben wir zwei Funktionen hinzugefügt, die das viel einfacher und stabiler machen:
- Caching-Unterstützung : Wenn Sie festlegen, wie weit im Voraus geladen werden soll, können Sie jetzt
PreloadStatus.specifiedRangeCached(0, 5000)als Zielstatus für vorab geladene Elemente auswählen. Dadurch wird der angegebene Bereich Ihrem Cache auf der Festplatte hinzugefügt, anstatt die Daten in den Arbeitsspeicher zu laden. So können Sie eine viel größere Auswahl an Elementen für das Vorabladen bereitstellen, da die Elemente, die weiter vom aktuellen Element entfernt sind, nicht mehr Arbeitsspeicher belegen müssen. Dazu muss inDefaultPreloadManager.BuildereinCachefestgelegt werden. - Automatische Speicherverwaltung : Wir haben auch unsere
LoadControl-Schnittstelle aktualisiert, um den Fall des Vorabladens besser zu handhaben. Sie können jetzt ein explizites oberes Speicherlimit für alle vorab geladenen Elemente im Speicher festlegen. Der Standardwert ist 144 MB. Sie können das Limit inDefaultLoadControl.Builderkonfigurieren. DasDefaultPreloadManagerbeendet das Vorabladen automatisch, sobald das Limit erreicht ist, und gibt bei Bedarf automatisch Speicher für Elemente mit niedrigerer Priorität frei.
Neue vereinfachte Standardverhalten in ExoPlayer nutzen
Wie immer haben wir auch viele inkrementelle Verbesserungen an ExoPlayer vorgenommen. Hier nur einige Beispiele:
- Stummschalten und Stummschaltung aufheben: Wir hatten bereits eine
setVolume-Methode, haben aber jetzt die praktischen Methodenmuteundunmutehinzugefügt, um die vorherige Lautstärke einfach wiederherzustellen, ohne dass Sie sie sich selbst merken müssen. - Erkennung von hängengebliebenen Playern: In seltenen Fällen kann es vorkommen, dass der Player in einem Pufferungs- oder Wiedergabezustand hängen bleibt, ohne dass Fortschritte erzielt werden. Das kann beispielsweise an Codec-Problemen oder Fehlkonfigurationen liegen. Ihre Nutzer sind genervt, aber Sie sehen diese Probleme nie in Ihren Analysen. Um dies deutlicher zu machen, meldet der Player jetzt ein
StuckPlayerException, wenn ein solcher Zustand erkannt wird. - Wakelock standardmäßig: Die Verwaltung von Wake Locks war bisher optional. Das führte zu schwer zu findenden Grenzfallen, in denen der Wiedergabefortschritt bei der Ausführung im Hintergrund stark verzögert werden konnte. Diese Funktion ist jetzt deaktivierbar. Sie müssen sich also keine Sorgen machen und können auch die gesamte manuelle Verarbeitung von Wakelocks bei der Wiedergabe entfernen.
- Vereinfachte Einstellung für die Logik der Untertitel-Schaltfläche: Die Änderung von
TrackSelectionParameterszu „Untertitel ein-/ausschalten“ war überraschend schwierig. Deshalb haben wir für diesen Anwendungsfall eine einfache boolesche OptionselectTextByDefaulthinzugefügt.
Einstellungen für Medientasten in MediaSession vereinfachen
Bisher mussten Sie benutzerdefinierte Befehle und Schaltflächen definieren, um festzulegen, welche Schaltflächen in der Benachrichtigungsleiste für Medien in Android Auto oder Wear OS angezeigt werden sollen, auch wenn Sie nur eine Standard-Player-Methode auslösen wollten.
Media3 1.9.0 bietet neue Funktionen, die das Ganze viel einfacher machen. Sie können jetzt die Einstellungen für die Media-Schaltflächen mit einem Standard-Player-Befehl definieren, ohne dass eine benutzerdefinierte Befehlsverarbeitung erforderlich ist.
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
Einstellungen für Medientasten mit der Schaltfläche „Vorspulen“
CompositionPlayer für die Echtzeitvorschau
Mit Version 1.9.0 wird CompositionPlayer unter einer neuen @ExperimentalApi-Annotation eingeführt. Die Anmerkung weist darauf hin, dass die Funktion für Tests verfügbar ist, sich aber noch in der Entwicklung befindet.
CompositionPlayer ist eine neue Komponente in den Media3-Bearbeitungs-APIs, die für die Echtzeitvorschau von Medienbearbeitungen entwickelt wurde. CompositionPlayer basiert auf der vertrauten Media3-Player-Schnittstelle und ermöglicht es Nutzern, ihre Änderungen in Aktion zu sehen, bevor sie den Exportprozess starten. Dabei wird dasselbe Composition-Objekt verwendet, das Sie zum Exportieren an Transformer übergeben würden. So wird der Bearbeitungsworkflow optimiert, da das Datenmodell für Vorschau und Export vereinheitlicht wird.
Wir empfehlen Ihnen, CompositionPlayer zu verwenden und Feedback zu geben. Weitere Informationen finden Sie in den demnächst erscheinenden Beiträgen und Updates der Dokumentation.
InAppMuxer als Standard-Muxer in Transformer
Transformer verwendet jetzt InAppMp4Muxer als Standard-Muxer zum Schreiben von Media-Containerdateien. Intern hängt InAppMp4Muxer vom Media3-Modul Muxer ab, was für einheitliches Verhalten über alle API-Versionen hinweg sorgt.
Beachten Sie, dass Transformer standardmäßig nicht mehr MediaMuxer der Android-Plattform verwendet. Sie können aber weiterhin FrameworkMuxer.Factory über setMuxerFactory bereitstellen, wenn dies für Ihren Anwendungsfall erforderlich ist.
Neue APIs zur Geschwindigkeitsanpassung
Mit Version 1.9.0 werden die APIs zum Anpassen der Geschwindigkeit für die Medienbearbeitung vereinfacht. Wir haben neue Methoden direkt in EditedMediaItem.Builder eingeführt, um die Geschwindigkeit zu steuern. Dadurch wird die API intuitiver. Sie können die Geschwindigkeit eines Clips jetzt ändern, indem Sie setSpeed(SpeedProvider provider) für EditedMediaItem.Builder aufrufen:
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()
Dieser neue Ansatz ersetzt die bisherige Methode mit Effects#createExperimentalSpeedChangingEffects(), die eingestellt wurde und in einem zukünftigen Release entfernt wird.
Einführung von Track-Typen für EditedMediaItemSequence
In Version 1.9.0 muss bei der Erstellung einer Sequenz der gewünschte Ausgabetracktyp für EditedMediaItemSequence angegeben werden. Diese Änderung sorgt dafür, dass die Verarbeitung von Tracks in der gesamten Komposition expliziter und robuster ist.
Dies erfolgt über einen neuen EditedMediaItemSequence.Builder-Konstruktor, der eine Reihe von Tracktypen akzeptiert (z.B. C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
Um die Erstellung zu vereinfachen, haben wir neue statische Convenience-Methoden hinzugefügt:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
Wir empfehlen Ihnen, zur neuen Konstruktor- oder Convenience-Methode zu migrieren, um klarere und zuverlässigere Sequenzdefinitionen zu erhalten.
Beispiel für das Erstellen einer reinen Videosequenz:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()
Wenn Sie auf Fehler stoßen oder Fragen oder Feature Requests haben, wenden Sie sich bitte über die Media3-Problemverfolgung an uns. Wir freuen uns auf Ihre Antwort.
Weiterlesen
-
Produktneuheiten
Wie heute bei The Android Show angekündigt wurde, entwickelt sich Android von einem Betriebssystem zu einem intelligenten System weiter. Das bietet Ihnen mehr Möglichkeiten, Nutzer mit Ihren Apps zu erreichen.
Matthew McCullough • Lesezeit: 4 Minuten
-
Produktneuheiten
Das mobile Ökosystem entwickelt sich ständig weiter und bringt sowohl neue Möglichkeiten als auch neue Bedrohungen mit sich. Mit diesen Änderungen möchten Android und Google Play dafür sorgen, dass Milliarden von Nutzern ihre Apps weiterhin bedenkenlos nutzen können und dass Entwickler Innovationen vorantreiben können.
Vijaya Kaza • Lesezeit: 3 Minuten
-
Produktneuheiten
Die Jetpack Compose-Version vom April 2026 ist stabil. Diese Version enthält Version 1.11 der Compose-Kernmodule (siehe vollständige BOM-Zuordnung), Debugging-Tools für gemeinsame Elemente, Trackpad-Ereignisse und mehr.
Meghan Mehta • Lesezeit: 5 Minuten
Auf dem Laufenden bleiben
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.