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 lokaler Wiedergabe 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.  


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:

  • 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 bereits Connector-Code zwischen Compose-UI-Elementen und Ihrer Player-Instanz bereitgestellt. 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 Steuerleiste, 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 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()

}
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 erfolgt, 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 das Tool sehr leistungsstark ist, 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 in DefaultPreloadManager.Builder ein Cache 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. Die Standardeinstellung ist 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. Hier 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 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 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 : Das Ändern von TrackSelectionParameters in „Untertitel ein-/ausschalten“ war überraschend schwierig. 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 Medienbenachrichtigungsleiste auf 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()
))
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 für ein einheitliches Verhalten über alle API-Versionen hinweg sorgt. 

Beachten Sie, dass Transformer zwar nicht mehr standardmäßig MediaMuxer der Android-Plattform verwendet, Sie aber weiterhin FrameworkMuxer.Factory über setMuxerFactory bereitstellen können, 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 der gewünschte Ausgabetrack-Typ angegeben werden. Diese Änderung sorgt für eine explizitere und robustere Track-Verarbeitung in der gesamten Komposition. 

Dazu wird ein neuer EditedMediaItemSequence.Builder Konstruktor verwendet, 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 auf Ihre Antwort.

Verfasst von:

Weiterlesen