Produktneuigkeiten

Media3 1.9.0 – Neuerungen

Lesezeit: 6 Minuten
Profil von Kristina Simakova ansehen
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 neu geschriebene Module:

  • media3-inspector – Metadaten und Frames außerhalb der Wiedergabe extrahieren
  • media3-ui-compose-material3 – In nur wenigen Schritten eine einfache Material 3 Compose Media-Benutzeroberfläche erstellen
  • media3-cast – Übergänge zwischen Cast- und lokaler Wiedergabe automatisch verarbeiten
  • media3-decoder-av1 – Konsistente AV1-Wiedergabe mit dem neu geschriebenen Erweiterungsdecoder auf Basis der dav1d-Bibliothek

Außerdem haben wir Verbesserungen am Caching und der Speicherverwaltung in PreloadManager vorgenommen und mehrere neue Vereinfachungen für ExoPlayer, Transformer und MediaSession bereitgestellt. 

Mit dieser Version erhalten Sie außerdem den ersten experimentellen Zugriff auf CompositionPlayer, um eine Vorschau von Medienbearbeitungen zu sehen.  


Weitere Informationen findest du unten. Eine vollständige Übersicht über die Änderungen in dieser Version findest du 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 ermitteln, welche Formate sie enthält oder wie lang sie ist, oder Thumbnails abrufen.

Das neue media3-inspector-Modul bündelt alle Dienstprogramme, mit denen Medien ohne Wiedergabe geprüft werden können, an einem Ort:

  • MetadataRetriever, um Dauer, Format und statische Metadaten aus einem MediaItem zu lesen.
  • FrameExtractor, um Frames oder Thumbnails aus einem Element abzurufen.
  • MediaExtractorCompat als direkten Ersatz für die MediaExtractor-Klasse der Android-Plattform, 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 Leitfadenseiten.

suspend fun extractThumbnail(mediaItem: MediaItem) {

  FrameExtractor.Builder(context, mediaItem).build().use {

    val thumbnail = frameExtractor.getThumbnail().await()

  } 

}

In wenigen Schritten eine einfache Material 3 Compose Media-UI erstellen

In früheren Versionen haben wir damit 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 nur wenigen Schritten eine Medien-UI erstellen und haben gleichzeitig die Möglichkeit, den Stil anzupassen. Wenn Sie lieber einen eigenen UI-Stil erstellen möchten, können Sie die Bausteine verwenden, die die gesamte Aktualisierungs- und Verbindungslogik übernehmen. Sie müssen sich dann nur auf das Design des UI-Elements konzentrieren. Weitere Informationen finden Sie in unseren erweiterten Leitfäden zu den Compose-UI-Modulen.

Wir arbeiten außerdem an weiteren Compose-Komponenten, z. B. einer vordefinierten Steuerleiste, einem vollständigen Ersatz für PlayerView sowie 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 vordefinierten Elementen

Übergänge zwischen Cast- und lokaler Wiedergabe automatisch verarbeiten

Der CastPlayer im Modul media3-cast wurde neu geschrieben, um Übergänge zwischen der lokalen Wiedergabe (z. B. mit ExoPlayer) und der Remote-Cast-Wiedergabe automatisch zu verarbeiten.

Wenn du dein MediaSession einrichtest, musst du nur ein CastPlayer um dein ExoPlayer erstellen und deiner Benutzeroberfläche ein MediaRouteButton hinzufügen. Das ist alles!

// 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 Basis von dav1d

Die 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 auch hier ein Build aus der Quelle  erforderlich, um den relevanten nativen Code korrekt zu bündeln. Die Einbindung eines Decoders sorgt für Konsistenz und Formatunterstützung auf allen Geräten. Da die Decodierung jedoch in deinem Prozess ausgeführt wird, eignet sich diese Methode am besten für Inhalte, denen du vertrauen kannst. 

Caching und Speicherverwaltung in PreloadManager einbinden

Auch unsere PreloadManager haben wir verbessert. Damit konnten Sie Medien bereits außerhalb der Wiedergabe in den Arbeitsspeicher vorladen und bei Bedarf nahtlos an einen Player übergeben. Obwohl die Leistung recht gut war, musste man darauf achten, die Arbeitsspeicherlimits nicht zu überschreiten, indem man versehentlich zu viele Daten vorab lud. In Media3 1.9.0 haben wir zwei Funktionen hinzugefügt, die das Ganze viel einfacher und stabiler machen:

  1. Caching-Unterstützung : Wenn Sie festlegen, wie weit im Voraus Inhalte geladen werden sollen, können Sie jetzt PreloadStatus.specifiedRangeCached(0, 5000) als Zielstatus für vorab geladene Elemente auswählen. Dadurch wird der angegebene Bereich dem Cache auf dem Laufwerk 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, keinen Speicherplatz mehr belegen müssen. Dazu muss ein Cache in DefaultPreloadManager.Builder festgelegt werden.
  2. Automatische Speicherverwaltung : Wir haben auch die LoadControl-Schnittstelle aktualisiert, um den Preload-Fall besser zu verarbeiten. 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 Vorabladen von DefaultPreloadManager wird automatisch beendet, sobald das Limit erreicht ist. Bei Bedarf wird automatisch Speicherplatz von Elementen mit niedrigerer Priorität freigegeben.

Neue vereinfachte Standardverhalten in ExoPlayer nutzen

Wie immer haben wir auch viele schrittweise Verbesserungen an ExoPlayer vorgenommen. Hier nur einige Beispiele:

  • Stummschalten und Stummschaltung aufheben: Die Methode setVolume gab es bereits, aber wir haben jetzt die praktischen Methoden mute und unmute hinzugefügt, mit denen die vorherige Lautstärke ganz einfach wiederhergestellt werden kann, ohne dass Sie sie selbst im Auge behalten müssen.
  • Erkennung von hängenden Playern: In seltenen Fällen kann der Player im Zwischenspeicher- oder Wiedergabestatus hängen bleiben, ohne dass ein Fortschritt erzielt wird, z. B. aufgrund von Codec-Problemen oder Fehlkonfigurationen. Ihre Nutzer werden sich ärgern, aber Sie werden diese Probleme nie in Ihren Analysen sehen! Um dies deutlicher zu machen, meldet der Player jetzt StuckPlayerException, wenn er einen hängenden Zustand erkennt.
  • Wakelock standardmäßig aktiviert: Die Wakelock-Verwaltung war bisher optional. Das führte zu schwer zu findenden Grenzfällen, in denen der Wiedergabefortschritt im Hintergrund stark verzögert werden konnte. Diese Funktion ist jetzt deaktivierbar. Sie müssen sich also nicht darum kümmern und können auch alle manuellen Wakelock-Verarbeitungen im Zusammenhang mit der Wiedergabe entfernen.
  • Vereinfachte Einstellung für die Logik der Untertitelschaltfläche: Es war überraschend schwierig, TrackSelectionParameters so zu ändern, dass „Untertitel aktivieren/deaktivieren“ angezeigt wird. 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 Buttons definieren, um festzulegen, welche Buttons 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 erheblich vereinfachen. Sie können jetzt Ihre Einstellungen für Medienschaltflächen 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 Vorspultaste

CompositionPlayer für die Echtzeitvorschau

In Version 1.9.0 wird CompositionPlayer unter einer neuen @ExperimentalApi-Annotation eingeführt. Die Annotation gibt an, dass die Funktion zum Testen 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-Schnittstelle Player und ermöglicht es Nutzern, ihre Änderungen in Aktion zu sehen, bevor sie den Exportvorgang starten. Es wird dasselbe Composition-Objekt verwendet, das Sie für den Export an Transformer übergeben würden. Dadurch wird der Bearbeitungsworkflow optimiert, da das Datenmodell für Vorschau und Export vereinheitlicht wird.

Wir empfehlen Ihnen, CompositionPlayer zu verwenden und Ihr Feedback zu teilen. Weitere Informationen finden Sie in den kommenden Beiträgen und Aktualisierungen der Dokumentation.

InAppMuxer als Standard-Muxer in Transformer

Transformer verwendet jetzt InAppMp4Muxer als Standard-Muxer zum Schreiben von Mediencontainerdateien. Intern hängt InAppMp4Muxer vom Media3-Muxer-Modul ab, was für ein einheitliches Verhalten über alle API-Versionen hinweg sorgt. 

Beachten Sie, dass Transformer standardmäßig nicht mehr den MediaMuxer der Android-Plattform verwendet. Sie können jedoch weiterhin FrameworkMuxer.Factory über setMuxerFactory bereitstellen, wenn Ihr Anwendungsfall dies erfordert.

Neue APIs zur Geschwindigkeitsanpassung

In Version 1.9.0 wurden die APIs für die Geschwindigkeitsanpassung bei der Medienbearbeitung vereinfacht. Wir haben neue Methoden direkt in EditedMediaItem.Builder eingeführt, um die Geschwindigkeit zu steuern, wodurch die API intuitiver wird. Sie können jetzt die Geschwindigkeit eines Clips ä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.

Einführung von Track-Typen für EditedMediaItemSequence 

In der Version 1.9.0 müssen Sie bei EditedMediaItemSequence die gewünschten Ausgabetracktypen während der Sequenzerstellung angeben. 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 reinen Videosequenz:

EditedMediaItemSequence videoOnlySequence =
    EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
        .addItem(editedMediaItem)
        .build()

Wenn Sie Fehler finden oder Fragen oder Feature Requests haben, wenden Sie sich bitte über den Media3 Issue Tracker an uns. Wir freuen uns auf Ihre Antwort.

Verfasst von:
Weiterlesen