How-to

Media3 1.11 - Novità

Tempo di lettura: 3 minuti
Visualizza il profilo di Toni Heidenreich
Toni Heidenreich Software Engineer, Android

È disponibile Media3 1.11. Questa release, che supporta la stragrande maggioranza delle principali app multimediali Android, offre nuove funzionalità, correzioni di bug e miglioramenti per i componenti di riproduzione, modifica e UI. Stiamo espandendo i nostri moduli UI Jetpack Compose con slot Player personalizzabili e impostazioni predefinite facili da usare, gesti interattivi, osservatori di stato e precaricamento di video brevi utilizzando PlayerPool. Abbiamo anche modernizzato l'integrazione di Media3 Cast con il supporto del selettore di output SystemUI, introdotto una nuova estensione di rete del client HTTP Ktor e aggiunto nuove utilità di muxing per i file Ogg e WAV.

Continua a leggere per scoprire i punti salienti e consulta le note di rilascio complete per un elenco esaustivo delle modifiche.

UI di riproduzione e Compose

Poiché Android sta diventando Compose-first, continuiamo a espandere i moduli media3-ui-compose e media3-ui-compose-material3. Questo aggiornamento introduce un controllo più granulare sul layout del player, pattern di interazione più ricchi e un'integrazione più approfondita con Material3.

Layout del player personalizzabile

Il componente componibile del player Material 3 ora supporta slot di contenuti dedicati per topControls, centerControls, bottomControls e errorOverlay. Puoi inserire i tuoi componenti componibili o utilizzare le impostazioni predefinite già pronte pubblicate in PlayerDefaults:

Player(
  player = player,
  topControls = { PlayerDefaults.TopControls(player) },
  centerControls = { PlayerDefaults.CenterControls(player) },
  bottomControls = { PlayerDefaults.BottomControls(player) },
)

Il componente componibile Player integra anche il supporto di FocusRequester, che consente una navigazione fluida con D-pad e tastiera su Android TV, dispositivi pieghevoli e ambienti desktop. 

player_video.png
Esempio di un player componibile con controlli personalizzati

Gesti e controllo della velocità di riproduzione

PlaybackSpeedState ora fornisce un'API di avanzamento rapido/rallentamento. Il demo-compose app mostra questa funzionalità con un gesto di pressione prolungata per avanzare rapidamente la riproduzione e la ricerca con un doppio tocco. In combinazione con ProgressSlider introdotto nella versione 1.10, l'UI del player Compose ora offre interazioni touch e gestuali avanzate.

Precaricamento di video brevi con PlayerPool

Per le app con feed multimediali a finestra scorrevole (ad esempio, video verticali brevi), la gestione efficiente di più istanze ExoPlayer è una sfida comune. Media3 1.11 introduce PlayerPool (in common-ktx) e rememberPooledPlayer (in ui-compose) per gestire automaticamente il riciclo e il precaricamento del player.

Il nuovo ShortFormPlayerScreen in demo-compose mostra questa funzionalità in azione, un feed di paging verticale in cui i player vengono raggruppati, precaricati e riciclati senza problemi durante lo scorrimento dell'utente.

MiniController

Un nuovo componente componibile MiniController in media3-ui-compose-material3 fornisce una barra di riproduzione compatta che mostra il titolo, l'artista, l'artwork e l'avanzamento dell'elemento corrente insieme ai controlli di riproduzione/pausa. Come tutti i nostri componenti componibili predefiniti in media3-ui-compose-material3, MiniController supporta l'integrazione di Material3 Dynamic Color, che gli consente di adattarsi automaticamente al tema dello sfondo dell'utente.Questa funzionalità è ideale per le affordance persistenti del foglio inferiore o del mini player, ad esempio mentre l'utente sfoglia i contenuti o durante le sessioni Cast attive.

mini_player.png
Il MiniController di Media3 che mostra la copertina dell'album, i metadati multimediali e i controlli di base

Holder di stato espansi per metadati ed errori

Abbiamo aggiunto diversi nuovi holder di stato reattivi a media3-ui-compose:

  • rememberCurrentMediaItemState: osserva i metadati relativi all'elemento in riproduzione.
  • rememberPlaylistState: osserva l'intera playlist e gli indici attivi.
  • rememberErrorState: monitora gli errori di riproduzione, con un componente componibile ErrorText corrispondente e ErrorOverlay predefinito in Material3.

Continueremo a lavorare su nuove aggiunte e altre opzioni di personalizzazione nelle release future. Condividi le tue opinioni nel tracker dei problemi del progetto.

Integrazione di Cast modernizzata

Media3 1.11 aggiorna l'estensione Cast con opzioni di configurazione programmatica e supporto per il routing a livello di sistema operativo.

CastParams e selettore di output SystemUI

Ora puoi configurare l'estensione Cast utilizzando CastParams:

val castParams = CastParams.Builder()
  .setShowSystemOutputSwitcherOnCastButtonClick(true)
  .build()


Cast.getSingletonInstance(context).initialize(castParams)

L'impostazione di setShowSystemOutputSwitcherOnCastIconClick(true) configura MediaRouteButton per aprire il selettore di output SystemUI nativo di Android sulle versioni della piattaforma supportate, fornendo un'esperienza di selezione dell'output unificata.

Stato reattivo di MediaRouteButton in Compose

Le app che utilizzano Jetpack Compose ora possono aggiungere facilmente il pulsante di routing multimediale (noto anche come pulsante Trasmetti), che osserva automaticamente lo stato della finestra di dialogo e si aggiorna di conseguenza. Non è necessaria ulteriore logica se utilizzato insieme a CastPlayer di Media3.

@Composable
fun TopAppBarWithCast() {
  Row {
    Text(text = "App Title")
    MediaRouteButton()
  }
}
cast_button_2.png
Pulsante di routing multimediale di Media3 in un'app che avvia la finestra di dialogo del selettore di output predefinita

Miglioramenti principali della riproduzione e della sessione

Eclipsa Video - Metadati HDR dinamici HAGC (API 37+)

_Eclipsa Video_ promette un'esperienza HDR più coerente su tutti i dispositivi, con un bianco HDR di base coerente, un headroom adattivo a seconda dello schermo e dell'ambiente circostante, garantendo che l'intento creativo venga mantenuto su tutti i dispositivi.

ExoPlayer ora supporta la riproduzione dei metadati temporizzati HAGC (ST 2094-50) necessari per i contenuti multimediali progressivi (MP4, Matroska). Il player unisce automaticamente le tracce di metadati HAGC con la traccia video associata e fornisce i metadati fuori banda al decoder sui dispositivi con API 37+. Sui dispositivi meno recenti, ExoPlayer esegue automaticamente il fallback per fornire un'esperienza di riproduzione HDR standard senza le regolazioni.  

eclipsa.png
Illustrazione per mostrare i vantaggi di Eclipsa Video HDR, come un contrasto di colore più coerente

Nuova estensione del client HTTP Ktor

Un nuovo modulo di estensione media3-datasource-ktor fornisce KtorDataSource, supportato dallo stack HTTP Ktor. Questa opzione offre un'alternativa Kotlin-first e compatibile con le coroutine ai moduli di origine dati Cronet e OkHttp esistenti.

Connessioni MediaSession asincrone

MediaSession.Callback ora include onConnectAsync(), che consente di elaborare in modo asincrono i tentativi di connessione del controller, ad esempio per verificare l'autorizzazione prima di accettare una connessione. Puoi restituire un Future immediato con Futures.immediateFuture(ConnectionResult) per lo stesso comportamento di onConnect esistente. 

override fun onConnectAsync(
  session: MediaSession,
  controller: MediaSession.ControllerInfo
): ListenableFuture<MediaSession.ConnectionResult> {
  return authenticateControllerAsync(controller)
}

Impostazioni predefinite di MediaSession più sicure

Per le app che non sostituiscono onConnect o onConnectAsync in MediaSession.Callback, la libreria ora utilizza una configurazione più sicura per impostazione predefinita. In particolare, i dati della sessione non vengono più condivisi per impostazione predefinita con i controller non attendibili, il che significa che le app di terze parti o non di sistema che non hanno accesso alle notifiche non possono accedere ai dati della sessione, a meno che tu non implementi esplicitamente questi metodi di callback per autorizzare la connessione.

Nuove implementazioni di Muxer e analisi dei container

OggMuxer e WavMuxer

Abbiamo aggiunto due nuovi muxer dedicati: OggMuxer per il muxing di stream OPUS e VORBIS in file .ogg standard e WavMuxer per la generazione di file audio .wav PCM non compressi e in rappresentazione in virgola mobile.

Analisi dei container e riferimenti alle tracce

  • Riferimenti alle tracce MP4 (tref): Mp4Muxer.addTrackReference consente di collegare i metadati dipendenti o le tracce ausiliarie agli stream video principali.
  • Estrazione dei capitoli: i capitoli QuickTime e Nero dai file MP4 (.m4a, .m4b) e i capitoli Matroska vengono ora estratti come voci di metadati Chapter per la navigazione di audiolibri e podcast.

Utilizza il tracker dei problemi per segnalare eventuali bug o se hai domande o richieste di funzionalità. Restiamo in attesa della tua risposta.

Continua a leggere