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 kombiniert alle Dienstprogramme zum Untersuchen von Medien ohne Wiedergabe an einem Ort:
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 formatierten 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 einen 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. Weitere Informationen zu den Compose-UI-Modulen finden Sie auf unseren erweiterten Leitfadenseiten.
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-Benutzeroberfläche 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
Version 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:
- Unterstützung für Caching : 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 Vorladen bereitstellen, da die Elemente, die weiter vom aktuellen Element entfernt sind, nicht mehr Speicherplatz 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 ganz einfach wiederherzustellen, ohne dass Sie sie sich 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 z. B. 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 Wakelock-Verwaltung 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
TrackSelectionParametersin „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 WearOS 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äche 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 Annotation 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.
Transformer verwendet standardmäßig nicht mehr MediaMuxer der Android-Plattform. 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 und in einem zukünftigen Release entfernt wird.
Einführung von Track-Typen für EditedMediaItemSequence
In Version 1.9.0 muss für EditedMediaItemSequence bei der Sequenzerstellung der gewünschte Ausgabetracktyp angegeben werden. Durch diese Änderung wird die Verarbeitung von Tracks in der gesamten Komposition expliziter und robuster.
Dies erfolgt über einen neuen EditedMediaItemSequence.Builder-Konstruktor, der eine Reihe von Tracktypen akzeptiert (z.B. C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
Zur Vereinfachung der Erstellung 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
Auf der Google I/O werden jedes Jahr neue Ankündigungen und Ressourcen für Ökosysteme und Produkte, einschließlich der Android-Entwicklung, vorgestellt. Da sich die Entwicklung hin zu KI- und Agent-basierten Tools verschiebt, haben wir unser Angebot erweitert, um Sie bei der Entwicklung für Android besser zu unterstützen.
Simona Milanovic • Lesezeit: 2 Minuten
-
Produktneuheiten
Auf der Google I/O 2026 haben wir gezeigt, wie Sie mit den neuesten Entwicklungen im Android-Ökosystem die Qualität Ihrer App steigern und gleichzeitig die Entwicklungseffizienz maximieren können.
Ataul Munim • Lesezeit: 3 Minuten
-
Produktneuheiten
Auf der Google I/O 2026 haben wir vorgestellt, wie sich Android von einem Betriebssystem zu einem intelligenten System entwickelt. Außerdem haben wir gezeigt, wie Sie intelligente Funktionen nativ mit dem System entwickeln und die Leistungsfähigkeit von Google AI in Ihre Apps einbinden können.
Jingyu Shi • Lesezeit: 2 Minuten
Auf dem Laufenden bleiben
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.