Media3 1.9.0 è disponibile. Oltre alle consuete correzioni di bug e ai miglioramenti delle prestazioni, l'ultima release contiene anche quattro moduli nuovi o in gran parte riscritti:
media3-inspector- Estrai metadati e frame al di fuori della riproduzionemedia3-ui-compose-material3- Crea una UI multimediale di base di Material3 Compose in pochi passaggimedia3-cast- Gestisce automaticamente le transizioni tra la trasmissione e le riproduzioni localimedia3-decoder-av1: riproduzione AV1 coerente con il decodificatore di estensioni riscritto basato sulla libreria dav1d
Abbiamo anche aggiunto miglioramenti alla gestione della cache e della memoria a PreloadManager e fornito diverse nuove semplificazioni di ExoPlayer, Transformer e MediaSession.
Questa release ti offre anche il primo accesso sperimentale a CompositionPlayer per visualizzare l'anteprima delle modifiche ai contenuti multimediali.
Continua a leggere per scoprire di più e, come sempre, consulta le note di rilascio complete per una panoramica esaustiva delle modifiche apportate a questa release.
Estrazione di metadati e frame al di fuori della riproduzione
In molti casi, vuoi ispezionare i contenuti multimediali senza avviare la riproduzione. Ad esempio, potresti voler rilevare i formati che contiene o la sua durata oppure recuperare le miniature.
Il nuovo modulo media3-inspector combina tutte le utilità per ispezionare i contenuti multimediali senza riproduzione in un unico posto:
MetadataRetrieverper leggere la durata, il formato e i metadati statici di unMediaItem.FrameExtractorper ottenere i fotogrammi o le miniature di un elemento.MediaExtractorCompatcome sostituzione diretta della classe MediaExtractor della piattaforma Android, per ottenere informazioni dettagliate sui campioni nel file.
MetadataRetriever e FrameExtractor seguono un semplice pattern AutoCloseable. Per ulteriori dettagli, consulta le nostre nuove pagine della guida.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}
Crea una UI multimediale di base di Material3 Compose in pochi passaggi
Nelle release precedenti abbiamo iniziato a fornire il codice del connettore tra gli elementi UI di Compose e l'istanza del player. Con Media3 1.9.0, abbiamo aggiunto un nuovo modulo media3-ui-compose-material3 con pulsanti ed elementi di contenuti Material3 completamente stilizzati. Ti consentono di creare un'interfaccia utente multimediale in pochi passaggi, offrendo al contempo tutta la flessibilità per personalizzare lo stile. Se preferisci creare il tuo stile di UI, puoi utilizzare i componenti di base che si occupano di tutta la logica di aggiornamento e connessione, in modo da concentrarti solo sulla progettazione dell'elemento UI. Consulta le nostre pagine della guida estesa per i moduli dell'interfaccia utente di Compose.
Stiamo anche lavorando ad altri componenti Compose, come una barra di ricerca predefinita, una sostituzione completa e pronta all'uso per PlayerView, nonché l'integrazione di sottotitoli codificati e annunci.
@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)
}
}
}
UI del player di Compose semplice con elementi pronti all'uso
Gestire automaticamente le transizioni tra Cast e le riproduzioni locali
CastPlayer nel modulo media3-cast è stato riscritto per gestire automaticamente le transizioni tra la riproduzione locale (ad esempio con ExoPlayer) e la riproduzione remota di Cast.
Quando configuri MediaSession, crea semplicemente un CastPlayer intorno a ExoPlayer e aggiungi un MediaRouteButton alla tua UI. Il gioco è fatto.
// 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()
}
Nuova integrazione di CastPlayer nell'app demo di sessione Media3
Riproduzione AV1 coerente con l'estensione riscritta basata su dav1d
La release 1.9.0 contiene un modulo di estensione AV1 completamente riscritto basato sulla popolare libreria dav1d.
Come per tutti i moduli di decodifica delle estensioni, tieni presente che è necessario compilare dal codice sorgente per raggruppare correttamente il codice nativo pertinente. Il raggruppamento di un decodificatore garantisce coerenza e supporto del formato su tutti i dispositivi, ma poiché esegue la decodifica nel tuo processo, è più adatto ai contenuti di cui ti fidi.
Integra la gestione della cache e della memoria in PreloadManager
Abbiamo migliorato anche il nostro PreloadManager. Ti consentiva già di precaricare i contenuti multimediali nella memoria al di fuori della riproduzione e poi di trasferirli senza problemi a un player quando necessario. Sebbene piuttosto efficiente, dovevi comunque fare attenzione a non superare i limiti di memoria precaricando accidentalmente troppi dati. Pertanto, con Media3 1.9.0, abbiamo aggiunto due funzionalità che rendono questa operazione molto più semplice e stabile:
- Supporto della memorizzazione nella cache : quando definisci il livello di precaricamento, ora puoi scegliere
PreloadStatus.specifiedRangeCached(0, 5000)come stato di destinazione per gli elementi precaricati. In questo modo, l'intervallo specificato verrà aggiunto alla cache su disco anziché caricare i dati in memoria. In questo modo, puoi fornire una gamma molto più ampia di elementi per il precaricamento, in quanto quelli più lontani dall'elemento corrente non devono più occupare memoria. Tieni presente che questa operazione richiede l'impostazione di unCacheinDefaultPreloadManager.Builder. - Gestione automatica della memoria : abbiamo anche aggiornato l'interfaccia di
LoadControlper gestire meglio il caso del precaricamento, in modo che ora tu possa impostare un limite di memoria superiore esplicito per tutti gli elementi precaricati in memoria. Il valore predefinito è 144 MB e puoi configurare il limite inDefaultLoadControl.Builder. IlDefaultPreloadManagerinterromperà automaticamente il precaricamento una volta raggiunto il limite e rilascerà automaticamente la memoria degli elementi a priorità inferiore, se necessario.
Affidati ai nuovi comportamenti predefiniti semplificati in ExoPlayer
Come sempre, abbiamo aggiunto anche molti miglioramenti incrementali a ExoPlayer. Per citarne solo alcuni:
- Disattivazione e riattivazione dell'audio: avevamo già un metodo
setVolume, ma ora abbiamo aggiunto i metodimuteeunmuteper ripristinare facilmente il volume precedente senza doverlo tenere traccia manualmente. - Rilevamento del player bloccato: in alcuni rari casi, il player può bloccarsi in uno stato di buffering o riproduzione senza fare progressi, ad esempio a causa di problemi di codec o errori di configurazione. I tuoi utenti saranno infastiditi, ma non vedrai mai questi problemi in Analytics. Per rendere la situazione più evidente, ora il player segnala un
StuckPlayerExceptionquando rileva uno stato bloccato. - Wakelock per impostazione predefinita: in precedenza la gestione del wakelock era facoltativa, il che rendeva difficile trovare casi limite in cui l'avanzamento della riproduzione poteva essere ritardato molto durante l'esecuzione in background. Ora questa funzionalità è disattivata per impostazione predefinita, quindi non devi preoccuparti e puoi anche rimuovere tutta la gestione manuale del wakelock durante la riproduzione.
- Impostazione semplificata per la logica del pulsante Sottotitoli codificati: modificare
TrackSelectionParametersper indicare "Attiva/disattiva sottotitoli codificati" è stato sorprendentemente difficile, quindi abbiamo aggiunto una semplice opzione booleanaselectTextByDefaultper questo caso d'uso.
Semplificare le preferenze dei pulsanti multimediali in MediaSession
Finora, la definizione delle preferenze per i pulsanti da visualizzare nel riquadro delle notifiche multimediali su Android Auto o WearOS richiedeva la definizione di comandi e pulsanti personalizzati, anche se volevi semplicemente attivare un metodo di riproduzione standard.
Media3 1.9.0 offre una nuova funzionalità per semplificare notevolmente questa operazione: ora puoi definire le preferenze per i pulsanti multimediali con un comando del player standard, senza richiedere la gestione di comandi personalizzati.
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()
))
Preferenze dei pulsanti multimediali con pulsante di avanzamento rapido
CompositionPlayer per l'anteprima in tempo reale
La release 1.9.0 introduce CompositionPlayer con una nuova annotazione @ExperimentalApi. L'annotazione indica che è disponibile per la sperimentazione, ma è ancora in fase di sviluppo.
CompositionPlayer è un nuovo componente delle API di modifica di Media3 progettato per l'anteprima in tempo reale delle modifiche ai contenuti multimediali. Basato sulla nota interfaccia Media3 Player, CompositionPlayer consente agli utenti di vedere le modifiche in azione prima di eseguire l'esportazione. Utilizza lo stesso oggetto Composition che passeresti a Transformer per l'esportazione, semplificando il flusso di lavoro di modifica unificando il modello di dati per l'anteprima e l'esportazione.
Ti invitiamo a iniziare a utilizzare CompositionPlayer e a condividere il tuo feedback. Tieni d'occhio i prossimi post e aggiornamenti della documentazione per maggiori dettagli.
InAppMuxer come muxer predefinito in Transformer
Transformer ora utilizza InAppMp4Muxer come muxer predefinito per la scrittura di file contenitore multimediali. A livello interno, InAppMp4Muxer dipende dal modulo Muxer di Media3, che garantisce un comportamento coerente in tutte le versioni dell'API.
Tieni presente che, anche se Transformer non utilizza più MediaMuxer della piattaforma Android per impostazione predefinita, puoi comunque fornire FrameworkMuxer.Factory tramite setMuxerFactory se il tuo caso d'uso lo richiede.
Nuove API di regolazione della velocità
La release 1.9.0 semplifica le API di regolazione della velocità per la modifica dei contenuti multimediali. Abbiamo introdotto nuovi metodi direttamente su EditedMediaItem.Builder per controllare la velocità, rendendo l'API più intuitiva. Ora puoi modificare la velocità di un clip chiamando setSpeed(SpeedProvider provider) su EditedMediaItem.Builder:
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()
Questo nuovo approccio sostituisce il metodo precedente di utilizzo di Effects#createExperimentalSpeedChangingEffects(), che abbiamo ritirato e che rimuoveremo in una release futura.
Introduzione dei tipi di traccia per EditedMediaItemSequence
Nella release 1.9.0, EditedMediaItemSequence richiede di specificare i tipi di tracce di output desiderati durante la creazione della sequenza. Questa modifica garantisce una gestione delle tracce più esplicita e solida nell'intera composizione.
Ciò avviene tramite un nuovo costruttore EditedMediaItemSequence.Builder che accetta un insieme di tipi di traccia (ad es. C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
Per semplificare la creazione, abbiamo aggiunto nuovi metodi statici pratici:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
Ti consigliamo di eseguire la migrazione al nuovo costruttore o ai metodi pratici per definizioni di sequenze più chiare e affidabili.
Esempio di creazione di una sequenza solo video:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()
Se riscontri bug o hai domande o richieste di funzionalità, contattaci tramite lo strumento di monitoraggio dei problemi di Media3. Restiamo in attesa della tua risposta.
Continua a leggere
-
Novità sul prodotto
L'ecosistema mobile è in continua evoluzione, il che comporta nuove opportunità e nuove minacce. Con queste modifiche, Android e Google Play continuano a impegnarsi per garantire che miliardi di utenti possano continuare a utilizzare le proprie app in tutta sicurezza e che l'innovazione degli sviluppatori possa prosperare.
Vijaya Kaza • Lettura di 3 minuti
-
Novità sul prodotto
La release di Jetpack Compose di aprile 2026 è stabile. Questa release contiene la versione 1.11 dei moduli principali di Compose (vedi il mapping BOM completo), strumenti di debug degli elementi condivisi, eventi trackpad e altro ancora.
Meghan Mehta • Lettura di 5 minuti
-
Novità sul prodotto
Android Studio Panda 4 è ora stabile e pronto per l'uso in produzione. Questa release introduce la modalità Pianificazione, la previsione della modifica successiva e altro ancora, semplificando la creazione di app per Android di alta qualità.
Matt Dyor • Lettura di 5 minuti
Resta al passo con le novità
Ricevi ogni settimana gli ultimi approfondimenti sullo sviluppo per Android direttamente nella tua casella di posta.