Produktneuheiten

Media3 1.9.0 – Das ist neu

Lesezeit: 6 Minuten
Kristina Simakova
Engineering Manager

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 extrahieren
  • media3-ui-compose-material3 – In nur wenigen Schritten eine einfache Media-Benutzeroberfläche mit Material3 Compose erstellen
  • media3-cast – Übergänge zwischen Cast- und lokaler Wiedergabe automatisch verarbeiten
  • media3-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 Medien prüfen 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 Media ohne Wiedergabe an einem Ort zusammen:

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

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 gleichzeitig den Stil flexibel 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. Erweiterte Leitfadenseiten für die Compose-UI-Module

Wir arbeiten auch an weiteren Compose-Komponenten, z. B. einer vorgefertigten 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)
    }
  }
}

 

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 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()

}
image.png

Neue CastPlayer-Integration in der Media3-Sitzungs-Demo-App

Konsistente AV1-Wiedergabe mit der neu geschriebenen Erweiterung auf Grundlage von 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 vertrauenswürdige Inhalte. 

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 dies viel einfacher und stabiler machen:

  1. Unterstützung für Caching : 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 der Festplatte hinzugefügt, anstatt die Daten in den Arbeitsspeicher zu laden. So können Sie eine viel größere Auswahl an Elementen zum 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 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 in DefaultLoadControl.Builder konfigurieren. Das DefaultPreloadManager beendet 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 Methoden mute und unmute hinzugefügt, um die vorherige Lautstärke ganz einfach wiederherzustellen, ohne dass Sie sich selbst darum kümmern 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 Wakelock-Verarbeitung bei der Wiedergabe entfernen.
  • Vereinfachte Einstellung für die Logik der Untertitel-Schaltfläche: Die Änderung von TrackSelectionParameters zu „Untertitel ein-/ausschalten“ war überraschend schwierig. Deshalb haben wir für diesen Anwendungsfall eine einfache boolesche Option selectTextByDefault hinzugefügt.

Vereinfachte Einstellungen für Medientasten in MediaSession

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ä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()
))
image.png

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. 

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 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, zum neuen Konstruktor oder zu den Convenience-Methoden zu migrieren, um klarere und zuverlässigere Sequenzdefinitionen zu erhalten.

Beispiel für das Erstellen einer Sequenz mit Videoanzeigen:

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 darauf, von dir zu hören!

Verfasst von:

Weiterlesen