Produktneuheiten

Media3 1.9.0 – Neuigkeiten

Lesezeit: 6 Minuten
Kristina Simakova
Engineering Manager

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 extrahieren
  • media3-ui-compose-material3 - In wenigen Schritten eine einfache Material3 Compose-Medien-UI erstellen
  • media3-cast - Übergänge zwischen Cast- und lokalen Wiedergaben automatisch verarbeiten
  • media3-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.  


Lesen Sie weiter, um mehr zu erfahren. Wie immer finden Sie in den vollständigen Versionshinweisen eine umfassende Übersicht über die Änderungen in dieser Version.

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 möglicherweise 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:

  • MetadataRetriever zum Lesen von Dauer, Format und statischen Metadaten aus einem MediaItem.
  • FrameExtractor zum Abrufen von Frames oder Thumbnails aus einem Element.
  • MediaExtractorCompat als 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-Medien-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 Medien-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)
    }
  }
}

 

image.png

Einfache Compose-Player-UI mit sofort einsatzbereiten Elementen

Übergänge zwischen Cast- und lokalen Wiedergaben 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()

}
image.png

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 bereits Medien 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:

  1. 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 für das Vorabladen bereitstellen, da die Elemente, die weiter vom aktuellen Element entfernt sind, nicht mehr Arbeitsspeicher belegen müssen. Dazu muss ein Cache in DefaultPreloadManager.Builder festgelegt werden.
  2. Automatische Speicherverwaltung : Wir haben auch unsere LoadControl-Schnittstelle aktualisiert, um den Fall des Vorabladens besser zu verarbeiten. So können Sie jetzt ein explizites oberes Arbeitsspeicherlimit für alle vorab geladenen Elemente im Arbeitsspeicher festlegen. Standardmäßig sind das 144 MB. Sie können das Limit in DefaultLoadControl.Builder konfigurieren. Der DefaultPreloadManager beendet 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 nutzen

Wie immer haben wir auch viele inkrementelle Verbesserungen an ExoPlayer vorgenommen. Einige Beispiele:

  • Stummschalten und Stummschaltung aufheben : Wir hatten bereits eine setVolume-Methode, haben aber jetzt die praktischen Methoden mute und unmute hinzugefü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 diese Probleme werden in Ihren Analysen nicht angezeigt. Um dies deutlicher zu machen, meldet der Player jetzt eine StuckPlayerException, wenn er einen solchen Zustand erkennt.
  • Wakelock standardmäßig : Die Verwaltung von Wakelocks 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 darüber machen und können auch die gesamte manuelle Wakelock-Verwaltung für die Wiedergabe entfernen.
  • Vereinfachte Einstellung für die Logik der Untertitelschaltfläche : Es war überraschend schwierig, TrackSelectionParameters so zu ändern, dass Untertitel ein- und ausgeschaltet werden konnten. Deshalb haben wir für diesen Anwendungsfall eine einfache boolesche Option selectTextByDefault hinzugefügt.

Einstellungen für Medientasten in MediaSession vereinfachen

Bisher mussten Sie benutzerdefinierte Befehle und Schaltflächen definieren, um festzulegen, welche Schaltflächen in der Medienbenachrichtigung auf Android Auto oder WearOS angezeigt werden sollen. Das galt auch, 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()
))
image.png

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 ein einheitliches Verhalten über alle API-Versionen hinweg bietet. 

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 muss für EditedMediaItemSequence bei der Sequenzerstellung die gewünschten Ausgabetrack-Typen angegeben werden. 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 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 Fehler finden oder Fragen oder Funktionsanfragen haben, wenden Sie sich bitte über den Media3-Issue-Tracker an uns. Wir freuen uns darauf, von Ihnen zu hören!

Verfasst von:

Weiterlesen