Media3 1.9.0 ist da! Neben den üblichen Fehlerkorrekturen und Leistungsverbesserungen enthält die neueste Version auch vier neue oder weitgehend überarbeitete Module:
media3-inspector- Metadaten und Frames außerhalb der Wiedergabe extrahierenmedia3-ui-compose-material3- In wenigen Schritten eine einfache Material3 Compose Media UI erstellenmedia3-cast- Übergänge zwischen Cast- und lokaler Wiedergabe automatisch verarbeitenmedia3-decoder-av1- Einheitliche AV1-Wiedergabe mit dem überarbeiteten Erweiterungsdecoder, der auf der dav1d-Bibliothek basiert
Außerdem haben wir Verbesserungen beim Caching und bei der Speicherverwaltung in PreloadManager vorgenommen und mehrere neue Vereinfachungen für ExoPlayer, Transformer und MediaSession eingeführt.
Mit dieser Version erhalten Sie auch den ersten experimentellen Zugriff auf CompositionPlayer, um Medienbearbeitungen in der Vorschau anzusehen.
Weitere Informationen finden Sie unten. Wie immer empfehlen wir Ihnen, die vollständigen Versionshinweise zu lesen, um einen umfassenden Überblick über die Änderungen in dieser Version zu erhalten.
Metadaten und Frames außerhalb der Wiedergabe extrahieren
Es gibt viele Fälle, in denen Sie Medien prüfen möchten, ohne die Wiedergabe zu starten. Beispielsweise möchten Sie vielleicht erkennen, welche Formate sie enthalten oder wie lang sie sind, oder Thumbnails abrufen.
Das neue Modul media3-inspector kombiniert alle Dienstprogramme zum Prüfen von Medien ohne Wiedergabe an einem Ort:
MetadataRetrieverzum Lesen von Dauer, Format und statischen Metadaten aus einemMediaItem.FrameExtractorzum Abrufen von Frames oder Thumbnails aus einem Element.MediaExtractorCompatals direkter Ersatz für die Android-Plattformklasse MediaExtractor, um detaillierte Informationen zu Beispielen in der Datei zu erhalten.
MetadataRetriever und FrameExtractor folgen einem einfachen AutoCloseable-Muster. Weitere Informationen finden Sie auf unseren neuen Hilfeseiten.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}In wenigen Schritten eine einfache Material3 Compose Media UI 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 ein neues Modul `media3-ui-compose-material3` mit vollständig gestalteten Material3-Schaltflächen und Inhaltselementen hinzugefügt. Damit können Sie in wenigen Schritten eine Media UI erstellen und gleichzeitig den Stil flexibel anpassen. Wenn Sie Ihren eigenen UI-Stil erstellen möchten, können Sie die Bausteine verwenden, die die gesamte Update- und Verbindungslogik übernehmen. So können Sie sich ganz auf das Design des UI-Elements konzentrieren. Weitere Informationen finden Sie auf unseren erweiterten Hilfeseiten für die Compose UI-Module.
Wir arbeiten auch weiterhin an noch mehr Compose-Komponenten, z. B. einer vorgefertigten Suchleiste, einem vollständigen sofort einsatzbereiten 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 überarbeitet, um Übergänge zwischen der lokalen Wiedergabe (z. B. mit ExoPlayer) und der Remote-Cast-Wiedergabe automatisch zu verarbeiten.
Wenn Sie Ihre MediaSession einrichten, erstellen Sie einfach einen CastPlayer um Ihren ExoPlayer und fügen Sie Ihrer UI eine 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-Sitzungsdemo-App
Einheitliche AV1-Wiedergabe mit der überarbeiteten Erweiterung, die auf dav1d basiert
Die Version 1.9.0 enthält ein vollständig überarbeitetes AV1-Erweiterungsmodul, das auf der beliebten dav1d-Bibliothek basiert.
Wie bei allen Erweiterungsdecoder-Modulen muss es aus der Quelle erstellt werden , um den relevanten nativen Code korrekt zu bündeln. Das Bündeln eines Decoders sorgt für Konsistenz und Formatunterstützung auf allen Geräten. Da die Decodierung jedoch in Ihrem Prozess ausgeführt wird, ist es am besten für Inhalte geeignet, denen Sie vertrauen.
Caching und Speicherverwaltung in PreloadManager integrieren
Wir haben auch unseren PreloadManager verbessert. Damit konnten Sie Medien bereits außerhalb der Wiedergabe in den Arbeitsspeicher vorab laden und sie dann bei Bedarf nahtlos an einen Player übergeben. Obwohl die Leistung recht gut war, mussten Sie darauf achten, die Arbeitsspeicherlimits nicht zu überschreiten, indem Sie versehentlich zu viel vorab laden. Mit Media3 1.9.0 haben wir zwei Funktionen hinzugefügt, die dies viel einfacher und stabiler machen:
- Caching-Unterstützung : Wenn Sie festlegen, wie weit vorab 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 dem Laufwerk hinzugefügt, anstatt die Daten in den Arbeitsspeicher zu laden. So können Sie einen viel größeren Bereich von Elementen zum Vorabladen bereitstellen, da die Elemente, die weiter vom aktuellen Element entfernt sind, keinen Arbeitsspeicher mehr belegen müssen. Dazu muss einCacheinDefaultPreloadManager.Builderfestgelegt werden. - Automatische Speicherverwaltung : Wir haben auch unsere
LoadControl-Schnittstelle aktualisiert, um den Fall des Vorabladens besser zu verarbeiten. Sie können jetzt ein explizites oberes Arbeitsspeicherlimit für alle vorab geladenen Elemente im Arbeitsspeicher festlegen. Die Standardeinstellung ist 144 MB. Sie können das Limit inDefaultLoadControl.Builderkonfigurieren. DerDefaultPreloadManagerbeendet das Vorabladen automatisch, sobald das Limit erreicht ist, und gibt bei Bedarf automatisch Arbeitsspeicher für Elemente mit niedrigerer Priorität frei.
Neue vereinfachte Standardverhaltensweisen in ExoPlayer verwenden
Wie immer haben wir auch viele inkrementelle Verbesserungen an ExoPlayer vorgenommen. Hier 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 sie selbst im Blick behalten zu müssen. - Erkennung von Playern, die nicht mehr reagieren : In einigen seltenen Fällen kann der Player in einem Pufferungs- oder Wiedergabestatus hängen bleiben, ohne dass etwas passiert, z. B. aufgrund von Codec-Problemen oder Fehlkonfigurationen. Ihre Nutzer werden sich ärgern, aber Sie sehen diese Probleme nie in Ihren Analysen. Um dies deutlicher zu machen, meldet der Player jetzt eine
StuckPlayerException, wenn er einen solchen Zustand erkennt. - Wakelock standardmäßig : Die Wakelock-Verwaltung war bisher optional. Das führte zu schwer zu findenden Grenzfällen, in denen die Wiedergabe im Hintergrund stark verzögert werden konnte. Jetzt ist diese Funktion standardmäßig aktiviert. Sie müssen sich also keine Gedanken mehr darüber machen und können auch die gesamte manuelle Wakelock-Verwaltung rund um die Wiedergabe entfernen.
- Vereinfachte Einstellung für die CC-Schaltflächenlogik : Es war überraschend schwierig,
TrackSelectionParametersso zu ändern, dass Untertitel ein- und ausgeschaltet werden konnten. 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 im Benachrichtigungsfeld für Medien in Android Auto oder WearOS angezeigt werden sollen. Das war auch dann erforderlich, wenn Sie einfach eine Standard-Player-Methode auslösen wollten.
Media3 1.9.0 bietet eine neue Funktion, die dies viel einfacher macht. Sie können jetzt Ihre Einstellungen für Medientasten definieren mit einem Standard-Player-Befehl, 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 „Schneller Vorlauf“
CompositionPlayer für die Echtzeitvorschau
Mit der Version 1.9.0 wird CompositionPlayer unter einer neuen Annotation @ExperimentalApi eingeführt. Die Annotation gibt an, 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. Basiert auf der bekannten Media3 Player Schnittstelle, CompositionPlayer ermöglicht es Nutzern, ihre Änderungen in Aktion zu sehen, bevor sie den Exportprozess starten. Dabei wird dasselbe Composition-Objekt verwendet, das Sie an Transformer übergeben würden, um den Bearbeitungsablauf zu optimieren, indem das Datenmodell für Vorschau und Export vereinheitlicht wird.
Wir empfehlen Ihnen, CompositionPlayer zu verwenden und uns Feedback zu geben. Weitere Informationen finden Sie in den kommenden Beiträgen und Updates der Dokumentation.
InAppMuxer als Standard-Muxer in Transformer
Transformer verwendet jetzt InAppMp4Muxer als Standard-Muxer zum Schreiben von Mediendateien. Intern hängt InAppMp4Muxer vom Media3 Muxer-Modul ab, das für ein einheitliches Verhalten über alle API-Versionen hinweg sorgt.
Transformer verwendet zwar nicht mehr standardmäßig den 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 der Version 1.9.0 werden die APIs zur Geschwindigkeitsanpassung 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 wir eingestellt haben und in einer zukünftigen Version entfernen werden.
Track-Typen für EditedMediaItemSequence einführen
In der Version 1.9.0 müssen Sie für EditedMediaItemSequence bei der Sequenzerstellung die gewünschten Ausgabetrack-Typen angeben. Diese Änderung sorgt dafür, dass die Track-Verarbeitung in der gesamten Komposition expliziter und robuster ist.
Dies erfolgt über einen neuen EditedMediaItemSequence.Builder-Konstruktor, der eine Reihe von Track-Typen akzeptiert (z.B. C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
Um die Erstellung zu vereinfachen, haben wir neue statische Hilfsmethoden hinzugefügt:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
Wir empfehlen Ihnen, zum neuen Konstruktor oder zu den Hilfsmethoden zu migrieren, um Sequenzen klarer und zuverlässiger zu definieren.
Beispiel für das Erstellen einer reinen Videosequenz:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()Wenn Sie Fehler finden oder Fragen oder Funktionsanfragen haben, wenden Sie sich bitte über den Media3-Issue-Tracker an uns. Wir freuen uns auf Ihre Antwort.
-
ProduktneuheitenIm März haben wir Android Bench eingeführt, unsere LLM-Bestenliste für Android-Entwicklungsaufgaben in der Praxis. Seitdem haben wir den Benchmark anhand Ihres Feedbacks verbessert, einschließlich der Bewertung von Modellen mit offenen Gewichten und der Hinzufügung von Kosten- und Effizienzkriterien zur Bestenliste.
Zoe Lopez-Latorre • 3 Minuten Lesezeit -
ProduktneuheitenBei Google Play ist es uns wichtig, Nutzerinnen und Nutzern die bestmögliche Nutzerfreundlichkeit zu bieten. Gleichzeitig möchten wir dafür sorgen, dass Entwicklerinnen und Entwickler die notwendigen Tools und die Flexibilität haben, um erfolgreich zu sein.
Paul Feng • 3 Minuten Lesezeit -
ProduktneuheitenLetztes Jahr haben wir die Android-Entwicklerbestätigung eingeführt, um die Sicherheit des Ökosystems zu erhöhen und zu verhindern, dass böswillige Akteure sich hinter der Anonymität verstecken, um schädliche Apps zu veröffentlichen.
Matthew Forsythe • 2 Minuten Lesezeit
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.