Media3

Librerie di supporto per i casi d'uso dei contenuti multimediali.
Ultimo aggiornamento Release stabile Candidato per la release Release beta Release alpha
21 ottobre 2026 1.11.1 - - 1.12.0-alpha01

Dichiara le dipendenze

Per aggiungere una dipendenza da Media3, devi aggiungere il repository Maven di Google al tuo progetto. Per saperne di più, consulta il repository Maven di Google.

Aggiungi le dipendenze per gli artefatti necessari nel file build.gradle per la tua app o il tuo modulo:

Alla moda

dependencies {
    def media3_version = "1.11.1"

    // For media playback using ExoPlayer
    implementation "androidx.media3:media3-exoplayer:$media3_version"

    // For DASH playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-dash:$media3_version"
    // For HLS playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-hls:$media3_version"
    // For SmoothStreaming playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version"
    // For RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation "androidx.media3:media3-exoplayer-midi:$media3_version"
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-ima:$media3_version"

    // For loading data using the Cronet network stack
    implementation "androidx.media3:media3-datasource-cronet:$media3_version"
    // For loading data using the OkHttp network stack
    implementation "androidx.media3:media3-datasource-okhttp:$media3_version"
    // For loading data using librtmp
    implementation "androidx.media3:media3-datasource-rtmp:$media3_version"

    // For building media playback UIs using Jetpack Compose
    implementation "androidx.media3:media3-ui-compose:$media3_version"
    // For building media playback UIs using Jetpack Compose with Material Design 3
    implementation "androidx.media3:media3-ui-compose-material3:$media3_version"
    // For building media playback UIs using Views
    implementation "androidx.media3:media3-ui:$media3_version"
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation "androidx.media3:media3-ui-leanback:$media3_version"

    // For exposing and controlling media sessions
    implementation "androidx.media3:media3-session:$media3_version"

    // For extracting data from media containers
    implementation "androidx.media3:media3-extractor:$media3_version"

    // For inspecting media files
    implementation "androidx.media3:media3-inspector:$media3_version"
    // For extracting and processing video frames
    implementation "androidx.media3:media3-inspector-frame:$media3_version"

    // For integrating with Cast
    implementation "androidx.media3:media3-cast:$media3_version"

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version"

    // For transforming media files
    implementation "androidx.media3:media3-transformer:$media3_version"

    // For applying effects on video frames
    implementation "androidx.media3:media3-effect:$media3_version"
    // For applying Lottie effects on video frames
    implementation "androidx.media3:media3-effect-lottie:$media3_version"

    // For muxing media files
    implementation "androidx.media3:media3-muxer:$media3_version"

    // Utilities for testing media components (including ExoPlayer components)
    implementation "androidx.media3:media3-test-utils:$media3_version"
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation "androidx.media3:media3-test-utils-robolectric:$media3_version"

    // Common functionality for reading and writing media containers
    implementation "androidx.media3:media3-container:$media3_version"
    // Common functionality for media database components
    implementation "androidx.media3:media3-database:$media3_version"
    // Common functionality for media decoders
    implementation "androidx.media3:media3-decoder:$media3_version"
    // Common functionality for loading data
    implementation "androidx.media3:media3-datasource:$media3_version"
    // Common functionality used across multiple media libraries
    implementation "androidx.media3:media3-common:$media3_version"
    // Common Kotlin-specific functionality
    implementation "androidx.media3:media3-common-ktx:$media3_version"
}

Kotlin

dependencies {
    val media3_version = "1.11.1"

    // For media playback using ExoPlayer
    implementation("androidx.media3:media3-exoplayer:$media3_version")

    // For DASH playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-dash:$media3_version")
    // For HLS playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-hls:$media3_version")
    // For SmoothStreaming playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version")
    // For RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version")
    // For MIDI playback support with ExoPlayer (see additional dependency requirements in
    // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md)
    implementation("androidx.media3:media3-exoplayer-midi:$media3_version")
    // For ad insertion using the Interactive Media Ads SDK with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-ima:$media3_version")

    // For loading data using the Cronet network stack
    implementation("androidx.media3:media3-datasource-cronet:$media3_version")
    // For loading data using the OkHttp network stack
    implementation("androidx.media3:media3-datasource-okhttp:$media3_version")
    // For loading data using librtmp
    implementation("androidx.media3:media3-datasource-rtmp:$media3_version")

    // For building media playback UIs using Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs using Views
    implementation("androidx.media3:media3-ui:$media3_version")
    // For building media playback UIs using Jetpack Compose
    implementation("androidx.media3:media3-ui-compose:$media3_version")
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation("androidx.media3:media3-ui-leanback:$media3_version")

    // For exposing and controlling media sessions
    implementation("androidx.media3:media3-session:$media3_version")

    // For extracting data from media containers
    implementation("androidx.media3:media3-extractor:$media3_version")

    // For inspecting media files
    implementation("androidx.media3:media3-inspector:$media3_version")
    // For extracting and processing video frames
    implementation("androidx.media3:media3-inspector-frame:$media3_version")

    // For integrating with Cast
    implementation("androidx.media3:media3-cast:$media3_version")

    // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version")

    // For transforming media files
    implementation("androidx.media3:media3-transformer:$media3_version")

    // For applying effects on video frames
    implementation("androidx.media3:media3-effect:$media3_version")
    // For applying Lottie effects on video frames
    implementation("androidx.media3:media3-effect-lottie:$media3_version")

    // For muxing media files
    implementation("androidx.media3:media3-muxer:$media3_version")

    // Utilities for testing media components (including ExoPlayer components)
    implementation("androidx.media3:media3-test-utils:$media3_version")
    // Utilities for testing media components (including ExoPlayer components) via Robolectric
    implementation("androidx.media3:media3-test-utils-robolectric:$media3_version")

    // Common functionality for reading and writing media containers
    implementation("androidx.media3:media3-container:$media3_version")
    // Common functionality for media database components
    implementation("androidx.media3:media3-database:$media3_version")
    // Common functionality for media decoders
    implementation("androidx.media3:media3-decoder:$media3_version")
    // Common functionality for loading data
    implementation("androidx.media3:media3-datasource:$media3_version")
    // Common functionality used across multiple media libraries
    implementation("androidx.media3:media3-common:$media3_version")
    // Common Kotlin-specific functionality
    implementation("androidx.media3:media3-common-ktx:$media3_version")
}

Per saperne di più sulle dipendenze, consulta Aggiungi dipendenze di build.

Feedback

Il tuo feedback ci aiuta a migliorare Jetpack. Puoi utilizzare l'Issue Tracker di Media3 per trovare risposte a domande, problemi noti e richieste di funzionalità, nonché per segnalare nuovi problemi.

Versione 1.12.0

Versione 1.12.0-alpha01

21 ottobre 2026

La versione 1.12.0-alpha01 contiene i seguenti commit.

  • Libreria comune:
    • Aggiungi C.COLOR_SPACE_DISPLAY_P3 e supporta lo spazio dei colori Display P3 nelle mappature dei colori ISO MediaFormatUtil e ColorInfo.
    • Aggiunto un registro Flags centrale per gestire i flag di funzionalità sperimentali e il rilascio graduale (Flags.setCanaryModeEnabled). È stata eseguita la migrazione di molti metodi @ExperimentalApi esistenti per utilizzare la nuova API dei flag.
    • Aggiungi MediaMetadata.playlistId, MediaMetadata.Builder.setPlaylistId(String), MediaMetadata.categories e MediaMetadata.Builder.setCategories(List<String>).
    • Sostituisci androidx.media3.common.util.NonNullApi con JSpecify org.jspecify.annotations.NullMarked.
  • ExoPlayer:
    • Risolto un problema per cui la riproduzione multi-periodo DASH si bloccava quando il caricamento del primo chunk del periodo successivo non andava a buon fine (#3396).
    • Segnala wasCanceled = true in AnalyticsListener.onLoadError e MediaSourceEventListener.onLoadError quando i nuovi tentativi di caricamento sono esauriti.
    • Supporto della registrazione di più istanze VideoFrameMetadataListener utilizzando ExoPlayer.addVideoFrameMetadataListener e ExoPlayer.removeVideoFrameMetadataListener, con ritiro di ExoPlayer.setVideoFrameMetadataListener e ExoPlayer.clearVideoFrameMetadataListener.
    • Aggiungi il supporto per gli annunci nei contenuti con più periodi (ad es. DASH) suddividendo e compensando AdPlaybackState per ogni periodo.
    • Risolta la race condition in PreCacheHelper per cui l'annullamento di una richiesta di preparazione in corso poteva comunque avviare i download in background.
    • Limita setLoadOnlySelectedTracks(true) su ProgressiveMediaSource e DefaultMediaSourceFactory per filtrare solo le tracce video e immagine non selezionate. Le tracce audio e di testo vengono sempre caricate per consentire il passaggio da una traccia all'altra senza dover eseguire nuovamente il buffering.
    • Attiva setLoadOnlySelectedTracks(true) per impostazione predefinita su ProgressiveMediaSource e DefaultMediaSourceFactory. In questo modo, si risparmia memoria e i calcoli di allocazione del buffer di DefaultLoadControl funzionano in modo più accurato quando non sono selezionate tutte le tracce. Tieni presente che ciò potrebbe causare un buffering aggiuntivo se le tracce video o immagine non selezionate vengono attivate di recente durante la riproduzione.
    • Risolto un problema per cui Player.getCurrentPosition() poteva restituire valori obsoleti (aggiornati solo poche volte al secondo) quando la pianificazione dinamica è attiva (#3286).
    • Risolto un problema per cui una diminuzione o un ripristino imprevisti della posizione della testina di riproduzione di AudioTrack potevano essere trattati erroneamente come un overflow di numeri interi, causando il blocco della riproduzione durante il buffering (#3407).
    • Rimuovi l'esperimento DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean).
    • Evita riattivazioni non necessarie del renderer e problemi durante il ritorno da interstitial o annunci a contenuti tagliati alla fine (#3371).
    • Risolto un problema per cui un errore del renderer su un elemento della playlist imminente poteva interrompere prematuramente la riproduzione corrente quando Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION è attivo.
    • È stato corretto un NullPointerException che poteva verificarsi se ExoPlayer passava i renderer a un periodo multimediale non preparato quando Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION è abilitato.
    • Risolto un problema per cui i frame video potevano essere saltati o eliminati inaspettatamente durante la pianificazione dinamica quando Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS è attivo.
    • Risolto un ArrayIndexOutOfBoundsException nei listener di analisi quando la riproduzione viene interrotta durante un annuncio in un live streaming (#3423).
    • Risolto un problema per cui PreloadMediaSource poteva pubblicare inaspettatamente un evento precaricato quando preload() non veniva mai chiamato (#3408).
    • Risolto un problema per cui Format.subsampleOffsetUs veniva ignorato per le tracce dei metadati, causando timestamp di riproduzione errati nei comandi di giunzione SCTE-35 decodificati (#3413).
    • Risolto un problema di perdita di memoria in PreloadMediaSource e DefaultPreloadManager quando preload() viene chiamato più volte sulla stessa origine (#3445).
    • Risolto un problema di NullPointerException durante il rilascio di AdsMediaSource mentre è in attesa un aggiornamento della cronologia dei contenuti (#3442).
    • Risolto un problema per cui la riproduzione di contenuti multimediali progressivi poteva passare alla posizione errata quando un caricamento dopo una ricerca (o quando si avviava la riproduzione in una posizione diversa da zero) non andava a buon fine e veniva ripetuto (#3440).
    • Aggiunta una soluzione alternativa per il blocco del decoder H.264 di Xiaomi TV Stick 4K (MiTV-AYFR0) in caso di modifiche della risoluzione senza interruzioni (#3457).
    • Risolto un problema di NullPointerException in SteeringManifestTracker quando il tracker viene interrotto prima dell'esecuzione di un callback di errore o di completamento del caricamento pubblicato (#3443).
    • Supporto della riproduzione dei metadati temporizzati HAGC (ST 2094-50) dalle tracce dei metadati con box mebx nei file MP4.
    • Risolto un problema per cui i periodi multimediali con preparazione lenta in una playlist potevano essere saltati.
  • CompositionPlayer:
    • Supporto della configurazione della frequenza fotogrammi dell'aggregazione dei frame video utilizzando Composition.Builder.setVideoFrameAggregationParameters per i workflow di riproduzione.
    • Risolvi i cali di frame nelle composizioni con più sequenze causati da errori di quantizzazione o arrotondamento dei timestamp selezionando il frame con il timestamp più vicino durante l'aggregazione dei frame. Questa opzione è abilitata solo dall'API 29, in quanto richiede di mantenere un frame aggiuntivo in corso per sequenza video.
  • Transformer:
    • Supporto della configurazione della frequenza fotogrammi dell'aggregazione dei fotogrammi video utilizzando Composition.Builder.setVideoFrameAggregationParameters per i workflow di esportazione.
    • Risolvi i cali di frame nelle composizioni con più sequenze causati da errori di quantizzazione o arrotondamento dei timestamp selezionando il frame con il timestamp più vicino durante l'aggregazione dei frame. Questa opzione è abilitata solo dall'API 29, in quanto richiede di mantenere un frame aggiuntivo in corso per sequenza video.
    • Rispetta Transformer#setAudioMimeType(AUDIO_RAW) quando vengono utilizzati AudioProcessors. Prima di questa correzione, la richiesta di MimeTypes.AUDIO_RAW e l'applicazione di un AudioProcessor generavano un output compresso.
  • Selezione della traccia:
    • Risolto un problema per cui su alcuni dispositivi una traccia SDR veniva preferita erroneamente a una traccia Dolby Vision supportata (#3135).
  • Estrattori:
    • Mp4Extractor: è stato corretto l'errore di analisi della casella dOps per Opus in MP4, in cui PreSkip, InputSampleRate e OutputGain non venivano convertiti da big-endian a little-endian, causando l'eliminazione dei primi ~299 ms di audio quando non è presente un elenco di modifiche (#3431).
    • Rimuovi Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES, Mp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265, FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES e FragmentedMp4Extractor.FLAG_READ_WITHIN_GOP_SAMPLE_DEPENDENCIES_H265 poiché l'analisi della dipendenza dei campioni all'interno del GOP per H.264 e H.265 è attivata per impostazione predefinita.
    • Mp4Extractor: è stato corretto l'analisi dei metadati sulla posizione dalle caselle xyz contenenti coordinate di altitudine per compilare Mp4LocationData.
    • Aggiunta di ExtractorUtil.getFramesPerEncodedSample per calcolare il numero di frame audio per campione per i formati audio codificati (#3367).
    • Aggiungi FLAG_READ_XMP_METADATA a Mp4Extractor per estrarre i metadati XMP dalle caselle UUID di primo livello.
    • Risolto il problema dell'audio AC-3, DTS e LPCM danneggiato durante la riproduzione di contenuti MPEG-PS in stile DVD, rimuovendo l'intestazione del sottostream private_stream_1 da ogni pacchetto PES in PsExtractor prima che il payload venga passato al lettore audio (#3327).
    • Risolto un errore in FragmentedMp4Extractor quando un box tfdt versione 1 codifica un baseMediaDecodeTime negativo (#3412).
    • MPEG-TS: è stato aggiunto il supporto per l'analisi dei messaggi SEI di disposizione del frame packing H.264 e H.265 per compilare Format.stereoMode (#3419).
    • Analizza i dati di configurazione del profilo Dolby Vision 20 e rifiuta i profili Dolby Vision non supportati anziché riprodurli come HEVC standard con colori errati (#3427).
    • MP3: ripristina la regolazione dei metadati di spaziatura interna e ritardo dell'encoder LAME/Xing perché non è compatibile con molti decoder MP3 MediaCodec (#3425).
    • Matroska: correzione di NullPointerException durante l'analisi degli elementi ChapterAtom nidificati (#3438).
    • Ogg: è stato corretto un bug per cui un pacchetto di dimensioni pari a un multiplo di 255 byte e che termina in corrispondenza di un confine di pagina viene unito al pacchetto successivo.
    • MP4: analizza le tracce di metadati temporizzati con box mebx in Mp4Extractor e FragmentedMp4Extractor. Le tracce che contengono una chiave it35 vengono esposte come MimeTypes.APPLICATION_ITUT_T35 (attivando la riproduzione HAGC). Le altre tracce mebx vengono ignorate, a meno che non sia impostato FLAG_EMIT_RAW_MEBX_DATA, nel qual caso tutte le tracce mebx vengono emesse come MimeTypes.APPLICATION_MEBX non elaborate.
    • Ogg: è stato aggiunto il supporto per l'estrazione del padding finale di Opus per la riproduzione senza interruzioni (#2576) e sono stati corretti i timestamp dei sample dopo la ricerca di una pagina che inizia con un pacchetto continuato.
    • Ogg: correzione degli errori di decodifica e dei salti di timestamp di circa 1 secondo negli stream Ogg Opus concatenati ignorando i pacchetti di intestazione dei commenti e dell'ID Opus a metà stream.
  • Inspector:
    • Supporto del recupero dei metadati XMP dai file MP4 utilizzando MetadataRetriever.
    • Supporto dell'estrazione di tracce di metadati temporizzati con box mebx in MediaExtractorCompat come MimeTypes.APPLICATION_MEBX.
  • Frame di ispezione:
    • Correzione del clipping dei colori BT.2020 ad ampia gamma nell'immagine di base SDR durante l'estrazione di frame Ultra HDR con FrameExtractor. I colori fuori gamma ora vengono compressi leggermente nella gamma sRGB anziché essere bloccati.
  • Audio:
    • Aggiunta di una soluzione alternativa per i dispositivi che richiamano android.media.AudioDeviceCallback sul thread sbagliato (#3386).
    • Risolvi i potenziali blocchi della riproduzione dopo le transizioni delle tracce con l'offload compresso.
    • Risolto un problema relativo alle chiavette Amazon Fire TV per cui l'audio AC-3 poteva bloccarsi durante le transizioni dei periodi (#3448).
    • Supporto del trimming del padding dell'encoder di fine stream per la riproduzione senza pause di Ogg e WebM/Matroska Opus (#2576).
    • Correzione degli aggiornamenti di padding e ritardo senza interruzioni dell'offload dinamico durante le transizioni delle tracce, in modo che vengano applicati alla traccia in arrivo anziché a quella in riproduzione.
    • Taglia il padding finale dell'encoder su singoli stream e sullo stream finale di una playlist, oltre alle transizioni senza interruzioni a metà playlist (#2576).
    • Evita copie di buffer audio non necessarie in TrimmingAudioProcessor dopo il completamento del ritaglio del ritardo del codificatore di inizio stream e non è necessario ritagliare il padding di fine stream.
  • Video:
    • Correzione della segnalazione di frame video in ritardo con timestamp di rilascio identici in modo che vengano segnalati come ignorati anziché saltati.
  • Testo:
    • Aggiungi MediaItem.SubtitleConfiguration.timeOffsetUs per spostare i timestamp dei sottotitoli caricati lateralmente rispetto ai contenuti multimediali. L'offset può essere modificato durante la riproduzione con Player.replaceMediaItem(int, MediaItem) senza interrompere la riproduzione (#1976).
    • SubRip: è stato aggiunto il supporto per l'inserimento di un CharsetDetector in DefaultSubtitleParserFactory per rilevare la codifica dei caratteri dei sottotitoli SubRip autonomi senza un indicatore dell'ordine dei byte (#2247).
  • Effetto:
    • Implementa SoundSeparationAudioProcessor per la separazione delle sorgenti audio utilizzando il modulo GMSCore StudioSound.
  • Muxer:
    • Correzione della scrittura della casella dOps per Opus in Mp4Muxer e FragmentedMp4Muxer, dove PreSkip, InputSampleRate e OutputGain erano scritti in little-endian anziché in big-endian (#3431).
    • Supporto per la scrittura dell'altitudine GPS in Mp4LocationData utilizzando Mp4Muxer.
    • Aggiungi Muxer.Factory.create(ParcelFileDescriptor) per consentire il muxing direttamente in un ParcelFileDescriptor.
    • Scrivi la casella tfdt (Track Fragment Base Media Decode Time) per impostazione predefinita nelle caselle traf dei file MP4 frammentati per fornire i timestamp di decodifica dei contenuti multimediali.
    • Supporto della scrittura di box container E-AC-3 ed E-AC-3 JOC (Dolby Atmos) dec3 in Mp4Muxer.
    • Aggiungi il supporto del formato WebM a MediaMuxerCompat.
    • Scrivi la casella mfra (Movie Fragment Random Access) alla fine dei file MP4 frammentati per consentire la ricerca in FragmentedMp4Extractor utilizzando FLAG_READ_MFRA_FOR_SEEK_MAP.
    • Correzione di un arresto anomalo in Mp4Writer e FragmentedMp4Writer durante la scrittura di un campione EOS prima della scrittura di altri campioni.
    • Risolto il problema di conformità del container durante il muxing di contenuti Dolby in file MP4 o MP4 frammentati pubblicizzando il brand compatibile con dby1 nell'intestazione del container (#3369).
    • Supporto delle tracce audio PCM con rappresentazione in virgola mobile a 32 bit in Mp4Muxer e FragmentedMp4Muxer (#3389).
    • Rifiuta i profili Dolby Vision non supportati in Mp4Muxer e FragmentedMp4Muxer quando aggiungi tracce.
    • Supporto delle tracce audio PCM con numeri interi a 24 e 32 bit in Mp4Muxer e FragmentedMp4Muxer.
  • Estensione IMA:
    • Inoltra gli eventi di pausa e ripresa del player all'SDK IMA in ImaServerSideAdInsertionMediaSource.
  • Sessione:
    • Aggiungi MediaConstants.EXTRAS_KEY_PLAYLIST_ID, MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE, MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI e MediaConstants.EXTRAS_KEY_CATEGORIES per compilare i metadati della playlist e degli elementi dai metadati e dalle descrizioni legacy, nonché MediaConstants.EXTRAS_KEY_SUGGESTED_TYPE e MediaConstants.EXTRAS_KEY_TTL_SECONDS per i suggerimenti LibraryParams.extras.
    • Risolto l'arresto anomalo di SecurityException durante la creazione o il rilascio di un MediaSession sui dispositivi che applicano limiti PendingIntent rigorosi.
    • Risolto il problema per cui MediaSession.getControllerForCurrentRequest() restituiva null durante le richieste di riproduzione su Android 12 (API 31 e 32) quando MediaSessionService non era ancora in primo piano.
    • Risolto un arresto anomalo di IllegalArgumentException quando un MediaController si connette a una sessione legacy che segnala un volume massimo negativo.
    • Risolto un problema per cui la chiamata di MediaController.setMediaItem o setMediaItems seguita da play() su un MediaSessionCompat legacy in pausa poteva inviare un callback onPrepareFrom* non supportato anziché onPlayFrom* o inviare onPlay() senza reinizializzare l'elemento multimediale richiesto.
    • Risolto il problema di NullPointerException nella versione precedente di MediaBrowser quando si riceve una risposta a un comando personalizzato (#3432).
    • Correzione dell'arresto anomalo di IllegalArgumentException durante la ricezione di metadati legacy con chiavi duplicate nel Bundle sottostante.
    • Unifica le chiamate MediaControllerCompat.TransportControls in uscita effettuate all'interno della stessa iterazione Looper quando controlli un MediaSessionCompat legacy (ad esempio, la chiamata di setMediaItem, prepare e play insieme ora invia un singolo callback onPlayFrom*).
  • UI:
    • Risolto il problema relativo alla posizione della punteggiatura dei sottotitoli RTL e alla conservazione dell'intervallo di span quando è attivato il testo a capo bidirezionale (#3454, #3455).
    • Aggiungi le classi TrackSelectionState e TrackSelectionParametersState e le relative funzioni di memorizzazione dello stato componibile al modulo media3-ui-compose.
    • Introduci PresentationState.videoAspectRatio e fai in modo che Modifier.resizeWithContentScale accetti aspectRatio: Float? anziché sourceSizeDp: Size?.
    • Aggiungi la classe CuesState e il componibile rememberCuesState al modulo media3-ui-compose per ascoltare i cue correnti del player.
    • Aggiungi il supporto della modalità di scrubbing a ProgressSlider se si basa su ExoPlayer o CompositionPlayer.
    • Aggiungi il supporto di showArtwork a PresentationState e utilizzalo per misurare il tempo di rendering del artwork componibile facoltativo fornito in ContentFrame e Player. Aggiungi il componibile Artwork da utilizzare come valore predefinito per lo slot artwork.
    • Aggiungi nuovi campi a PlayPauseButtonState (showBuffering, showRetry, showReplay) e utilizzali in PlayPauseButton per visualizzare più icone e un indicatore di buffering.
    • Aggiungi la classe PlaybackState per consentire l'osservazione dello stato di riproduzione personalizzato e introduci BufferingIndicator come componente indipendente dal pulsante.
    • Risolto un problema per cui PlayerView e PlayerControlView mostravano indicatori di annunci ai confini dei periodi per i segnaposto post-roll in tempo reale nei live streaming multi-periodo.
    • Gli slot componibili di Player, ContentFrame, PlayerDefaults e MiniController non ricevono più il player o la visibilità dei controlli come parametri. Acquisiscili invece dall'ambito di chiamata (ad esempio, topControls ora è @Composable BoxScope.() -> Unit). Si tratta di una modifica che provoca un errore su un'API instabile.
    • Aggiungi il parametro alignment a ContentFrame, Player e Modifier.resizeWithContentScale per posizionare i contenuti scalati all'interno del relativo contenitore e ritaglia i contenuti di ContentFrame in base ai relativi limiti, in modo che il video scalato con ContentScale.Crop non venga più disegnato al di fuori.
    • Aggiungi il supporto della UI del live streaming a ProgressSlider, ProgressStateWithTickCount e ProgressStateWithTickInterval esponendo isLive e liveOffsetMs. Aggiungi il componibile LiveButton a media3-ui-compose-material3 (#2213).
  • Estensione Ktor:
    • Risolto un problema per cui KtorDataSource poteva trattare gli errori di connessione a metà stream come fine dell'input anziché generare un HttpDataSourceException (#3460).
  • Estensione HLS:
    • Analizza VIDEO-RANGE (PQ e HLG) su EXT-X-STREAM-INF e EXT-X-I-FRAME-STREAM-INF in Format.colorInfo (#3441).
    • Risolto il problema relativo a NullPointerException durante l'analisi dei segmenti di inizializzazione EXT-X-MAP MPEG-TS che contengono campioni multimediali PES (#3456).
    • Risolto un problema di regressione per cui Format.id e Format.metadata erano null per le tracce HLS esposte (#3402).
    • Ritaglia gli annunci dell'elenco di asset in base a X-PLAYOUT-LIMIT e salta quelli che superano completamente il limite. Inoltre, imposta l'offset di ripresa dei contenuti su 0 quando un interstitial omette X-RESUME-OFFSET e la sua durata è sconosciuta anche se X-PLAYOUT-LIMIT è impostato.
    • Risolto un problema per cui la risoluzione di un interstitial X-ASSET-LIST sovrascriveva i contributi di offset di ripresa dei contenuti di altri interstitial nello stesso gruppo di annunci.
  • Estensione DASH:
    • Supporto dell'analisi degli eventi di inserimento (urn:mpeg:dash:event:alternativeMPD:insert:2025) e sostituzione (urn:mpeg:dash:event:alternativeMPD:replace:2025) di MPD alternativi in DashManifestParser e della loro esposizione come istanze AlternativeMpdEvent in Period.alternativeMpdEvents. Si tratta di una modifica che provoca un errore per le app che utilizzano la sottoclasse DashManifestParser: DashManifestParser.buildPeriod ora accetta un parametro List<AlternativeMpdEvent> aggiuntivo e l'overload precedente è stato rimosso. Le app che eseguono l'override di DashManifestParser.parseEventStream(XmlPullParser) devono eseguire l'override di DashManifestParser.parseEventStream(XmlPullParser, String), poiché il primo è deprecato e verrà reso privato in una release futura.
    • Analizza le informazioni sul colore CICP (ColourPrimaries, TransferCharacteristics, MatrixCoefficients e VideoFullRangeFlag) dai descrittori EssentialProperty e SupplementalProperty in Format.colorInfo (#3426).
    • Supporto di elenchi separati da spazi vuoti di valori @id negli attributi @value del descrittore della modalità di riproduzione (http://dashif.org/guidelines/trickmode) (#3315).
    • Supporto dell'analisi di <ProducerReferenceTime> in DashManifestParser, esposizione in AdaptationSet.producerReferenceTimes e utilizzo per compilare Timeline.Window.presentationStartTimeMs e Timeline.Window.windowStartTimeMs per gli stream VOD.
    • Aggiunto il supporto per DASH Content Steering (#1689).
    • Risolto un problema di NullPointerException che poteva verificarsi durante l'analisi di un manifest DASH con un attributo mancante nell'elemento <UTCTiming> (#3436).
  • Estensione RTSP:
    • Risolto un arresto anomalo di IllegalStateException che si verificava durante l'elaborazione di risposte di rete ritardate dopo la chiusura del client RTSP.
    • Risolto un problema per cui lo scrubbing rapido poteva attivare in modo errato il meccanismo di fallback del protocollo TCP.
    • È stato corretto un arresto anomalo di IllegalStateException che può verificarsi durante l'elaborazione di risposte di rete ritardate dopo che il client RTSP reimposta lo stato durante la riselezione della traccia, l'interruzione della sessione o il reindirizzamento dell'URI.
    • Risolto il problema per cui la ricerca di nuovo prima del riavvio della riproduzione poteva causare un arresto anomalo di IllegalStateException.
    • Risolto il problema per cui la ricerca indietro mentre una ricerca è già in attesa poteva causare l'interruzione dell'audio e il blocco della riproduzione video.
    • Risolto un problema per cui le unità di accesso ai keyframe H.264 e H.265 che terminavano con un pacchetto di aggregazione o non IDR non venivano contrassegnate come keyframe, causando il blocco della riproduzione in buffering (#3434).
  • Estensioni del decoder (FFmpeg, VP9, AV1 e così via):
    • Estensione Opus: è stato corretto l'arresto anomalo di JNI durante la decodifica di dati Opus non validi.
    • Estensione Opus: è stato corretto l'errore per cui il padding di scarto veniva ignorato quando il pre-skip e il padding di scarto si trovavano nello stesso pacchetto (#2576).
  • Estensione Cast:
    • Introduci SessionAvailabilityListener.SessionUnavailableReason per rappresentare il motivo della non disponibilità della sessione e fornisci un metodo sovraccaricato per SessionAvailabilityListener.onCastSessionUnavailable per esporlo.
    • Risolto un problema per cui la riproduzione riprendeva inaspettatamente in locale dopo l'interruzione di una sessione di trasmissione.
    • Registra un errore quando le operazioni di RemoteMediaClient (come riproduzione, pausa, modifica della velocità, modalità repeat, volume, disattivazione dell'audio o selezione della traccia) non vanno a buon fine in RemoteCastPlayer (#3373).
    • Correzione di ArrayIndexOutOfBoundsException in RemoteCastPlayer quando la coda del ricevitore Cast cambia o si riduce mentre è in attesa un'operazione di ricerca (#3372).
    • Risolto un problema relativo al ricevitore Cast predefinito per cui la sequenza temporale compilava solo gli elementi multimediali immediatamente adiacenti all'elemento attivo anziché l'intera playlist (#3129).
    • Aggiorna immediatamente la cronologia e la posizione di riproduzione quando modifichi la playlist (setMediaItems, addMediaItems, moveMediaItems, removeMediaItems) o quando cerchi in RemoteCastPlayer e metti in coda le operazioni successive della playlist in modo che vengano eseguite in modo affidabile in ordine (#2639, #3272).
    • Risolto un problema per cui la chiamata di addMediaItems su una coda vuota in RemoteCastPlayer non riusciva a caricare gli elementi multimediali sul ricevitore Cast (#2402).
    • Risolto un problema in RemoteCastPlayer per cui, quando si raggiungeva la fine della coda del ricevitore Cast, la cronologia veniva cancellata anziché conservare la playlist.
    • È stato risolto un problema per cui playWhenReady, repeatMode e playbackParameters non venivano trasferiti o applicati se impostati su RemoteCastPlayer prima di caricare gli elementi multimediali (ad esempio, durante il trasferimento della riproduzione da locale a remoto in CastPlayer) (#889).
  • App demo:
    • Aggiungi il supporto per gli elementi multimediali protetti da DRM e uno stream di esempio HLS aggiuntivo al catalogo dell'app demo della sessione.
    • Configura RemoteCastPlayer con un CastTrackSelector nell'app demo della sessione per attivare la selezione dei sottotitoli e della traccia audio durante la trasmissione.
  • Rimuovi i simboli deprecati:
    • Rimuovi DashUtil.buildDataSpec(Representation, RangedUri, int) e DashUtil.buildDataSpec(Representation, String, RangedUri, int). Usa invece DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>).
  • Build:
    • Aumenta Gradle minSdk a 24.

Versione 1.11.0

1.11.1

10 settembre 2026

  • ExoPlayer:
    • Sposta il flag per attivare/disattivare i metadati HAGC per i contenuti multimediali progressivi da MediaSource.Factory a ExtractorsFactory. Il metodo setExperimentalEnableHagcPlayback precedente viene rimosso e sostituito da ExtractorsFactory.setParseHagcMetadata. In questo modo viene risolto anche un problema per cui la disattivazione non funzionava per i container Matroska/WebM.
    • È stato corretto un blocco della riproduzione causato dal pre-riscaldamento di un renderer secondario non in transizione.
    • Risolto il problema di pre-riscaldamento per cui Surface deve essere restituito al renderer principale quando una ricerca reimposta e disattiva entrambi i renderer.
    • Risolto il problema ArrayIndexOutOfBoundsException per cui l'aggiornamento della cronologia live sposta la posizione predefinita oltre un annuncio inserito lato server attualmente in riproduzione (#3348).
    • Risolto un problema della modalità di scorrimento per cui i frame video obsoleti potevano essere visualizzati brevemente durante la ricerca con ScrubbingModeParameters.allowSkippingMediaCodecFlush attivato.
  • Estrattori:
    • Matroska: è stato risolto il problema per cui le tracce posizionate dopo i cluster non generavano una sequenza temporale ricercabile (#3377).
  • Audio:
    • È stato corretto il calcolo della dimensione del buffer in SilenceSkippingAudioProcessor in modo che la durata minima del silenzio non venga ridotta in modo errato dalla dimensione del frame (#3271).
    • Risolto il problema di gestione del PCM a 8 bit in PcmAudioUtil per trattare i campioni come non firmati, come definito da Android (#3271).
    • Risolto il problema di offload per cui la riproduzione poteva bloccarsi durante il pre-roll o le transizioni senza interruzioni a causa delle dimensioni limitate del buffer hardware.
    • È stato corretto un bug in DefaultAudioSink per cui il conteggio delle release non diminuisce quando il thread di riproduzione non è più attivo (#3338).
  • Sessione:
    • Risolto il problema relativo a NullPointerException quando un MediaController in corso viene rilasciato da un callback Player.Listener (#3375).
    • È stato corretto il deadlock sul thread principale quando un MediaBrowser legacy si connette a un servizio che restituisce un risultato asincrono da onGetLibraryRoot() o onConnectAsync() (#3393).
  • Estensione HLS:
    • Correzione del calcolo dell'offset di ripresa dei contenuti quando il segmento di destinazione per lo snapping non è ancora nella playlist (#3322).
    • Risolto un problema per cui un HlsMediaChunk completamente utilizzato riprova a caricare quando riceve EOFException dall'estrattore (#3350).
  • Estensione DASH:
    • Correzione del calcolo errato del timestamp di esempio per le tracce di immagini con un presentationTimeOffset (#3334).
  • Estensioni del decoder (FFmpeg, VP9, AV1 e così via):
    • Opus: è stato corretto un problema di danneggiamento della memoria quando più istanze OpusDecoder vengono inizializzate contemporaneamente.
    • MPEG-H: correzione della perdita di memoria, del troncamento dei caratteri non ASCII e del potenziale arresto anomalo nativo in condizioni di memoria insufficiente durante l'invio di comandi a MpeghUiManager (#3365).

Versione 1.11.0

5 agosto 2026

  • Libreria comune:
    • Aggiungi Format.channelMask per rappresentare esplicitamente la maschera del canale audio e un nuovo sovraccarico Util.getAudioTrackChannelConfig(Format) per risolverlo in sicurezza.
    • Esegui l'upgrade di Kotlin dalla versione 2.0.20 alla versione 2.2.0.
  • ExoPlayer:
    • Risolto un bug di concorrenza dipendente dalla tempistica che poteva causare un errore IllegalStateException o IndexOutOfBoundsException in ExoPlayer.
    • Allenta i controlli del numero di gruppi di annunci in AdsMediaSource per consentire la diminuzione del numero di gruppi di annunci quando un gruppo di annunci viene elaborato completamente (hasUnplayedAds() è false), adattando il ridimensionamento dei gruppi di annunci dinamici durante i workflow di reimpostazione.
    • Aggiungi getFlags() e FLAG_STRICT_DURATION a SampleStream per consentire agli stream di segnalare i flag e aggiorna i renderer per controllare questi flag in modo dinamico.
    • Utilizza lo strumento di stima della frequenza fotogrammi in MediaCodecVideoRenderer e il formato di output del codec in MediaCodecAudioRenderer per calcolare la frequenza operativa del codec quando i formati dello stream non forniscono un valore valido ed evita reimpostazioni del codec non necessarie.
    • Rimuovi il ritaglio dei contenuti per gli annunci inseriti lato client nel player principale. Invece, AdsMediaSource si occupa della logica di ritaglio. Le origini annuncio personalizzate inserite lato client devono essere aggiornate per implementare il ritaglio dei contenuti internamente.
    • Contrassegna le tracce con un profilo o un livello di codec ben formato, ma non riconosciuto, come supported=NO_EXCEEDS_CAPABILITIES anziché supported=YES (che è il modo in cui vengono contrassegnate le tracce con informazioni sul profilo o sul livello mancanti o non valide). In questo modo, queste tracce (che difficilmente saranno supportate dal dispositivo) non vengono selezionate quando sono disponibili alternative meglio supportate.
    • Aggiungi DefaultPreloadManager.SimpleRankingDataComparator, che è un RankingDataComparator che confronta i ranking degli elementi multimediali in base alle loro distanze dall'indice dell'elemento multimediale attualmente in riproduzione. Le app possono eseguire l'override del metodo compare(Integer, Integer) se è necessaria una logica di confronto più precisa. L'oggetto SimpleRankingDataComparator personalizzato può essere inserito tramite un nuovo costruttore di DefaultPreloadManager.Builder.
    • Riduci il rischio di OOM di DefaultLoadControl.prioritizeTimeOverSizeThresholds ricorrendo ai limiti di dimensione dei byte del buffer se la memoria heap disponibile sembra limitata.
    • Allinea la gestione delle immagini fisse quando MediaItem.imageDurationUs non è impostato: le immagini fisse JPEG e HEIC ora vengono "riprodotte" con una durata predefinita molto breve (lo stesso comportamento che avevano in precedenza le immagini PNG e altre immagini).
    • Aggiungi MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter) per collegare BandwidthMeter a MediaSource. Tuttavia, il metodo deprecato con l'implementazione personalizzata verrà comunque chiamato per impostazione predefinita. Ti consigliamo di implementare il nuovo metodo e di utilizzare BandwidthMeter.getTransferListener() per ottenere la parità con il metodo precedente.
    • In DefaultBandwidthMeter, aggiungi il supporto per un InitialBitrateSupplier personalizzato. In questo modo, le app possono fornire la propria logica per determinare la stima iniziale della velocità in bit, che verrà utilizzata al momento della creazione di DefaultBandwidthMeter e in caso di modifiche al tipo di rete. Il fornitore può essere impostato tramite DefaultBandwidthMeter.Builder.setInitialBitrateSupplier().
    • Attiva la pianificazione dinamica per impostazione predefinita. Il loop di lavoro della riproduzione di ExoPlayer verrà eseguito in modo dinamico anziché a intervalli statici.
    • Rimosso un reset non necessario che può verificarsi quando si uniscono tracce con campioni di pre-roll alla riproduzione attiva.
    • In DefaultBandwidthMeter, ottimizza getInitialBitrateCountryGroupAssignment per restituire le assegnazioni dei gruppi di paesi raggruppate in un numero intero a 32 bit anziché in un array, riducendo le dimensioni del codice ed evitando le allocazioni.
    • Risolti gli errori di inizializzazione di AudioTrack su alcuni dispositivi assicurando che la logica di nuovo tentativo provi sempre una dimensione del buffer di almeno 1 secondo se altri nuovi tentativi (dimezzando la dimensione del buffer) non vanno a buon fine (#3207).
    • È stato risolto il problema del codec su alcuni dispositivi in cui il codec assorbiva tutti i campioni se era stato precedentemente svuotato prima di ricevere i buffer di input.
    • Aggiungi ExoPlayer.Builder.enablePerStreamMediaProgression() sperimentale per consentire l'avanzamento dell'elaborazione dei contenuti multimediali in base allo stream. In questo modo, si riduce la latenza di avvio tra gli elementi della playlist e si evita che la riproduzione si "blocchi" con contenuti molto brevi (#3122).
    • Risolto un problema di race condition relativo all'utilizzo dell'ID sessione audio, in cui veniva utilizzato l'ID sessione audio iniziale generato automaticamente da ExoPlayer anziché il valore impostato da setAudioSessionId (#3241).
    • Aggiunto il supporto sperimentale per la riproduzione di metadati temporizzati HAGC (ST 2094-50) per i contenuti multimediali progressivi (ad es. MP4, Matroska). Il player unisce automaticamente le tracce dei metadati HAGC con la traccia video associata e fornisce i metadati fuori banda al decoder sui dispositivi con API 37 e versioni successive. Questo comportamento può essere disattivato tramite DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false).
    • Aggiunta di Format.selectionPriority che rappresenta la preferenza relativa di Format nella selezione della traccia (#3236).
    • Risolto un potenziale problema della modalità di scrubbing per cui lo scrubbing poteva bloccarsi quando si cercava la "fine dello stream".
  • CompositionPlayer:
    • Risolto un problema per cui le istanze TrackSelector non venivano rilasciate.
  • Transformer:
    • Risolto un problema per cui ExportResult.fileSizeBytes potrebbe essere registrato in eccesso.
  • Selezione della traccia:
    • Esponi BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR e aggiungi AdaptiveTrackSelection.Factory.setTrackFormatComparator per consentire l'ordinamento dei formati personalizzati e la priorità di selezione ABR oltre all'ordinamento solo per bitrate.
    • Risolto un problema di concorrenza dipendente dalla tempistica per cui gli aggiornamenti sequenziali rapidi ai parametri di selezione delle tracce potevano comportare la perdita o la sovrascrittura di alcuni aggiornamenti.
  • Estrattori:
    • MP4, MP3 e FLAC: aggiunta di FLAG_DISABLE_ARTWORK_METADATA per consentire lo scarto delle immagini allegate e dei metadati della copertina durante l'analisi del container per ridurre il consumo di memoria di runtime (#2077). Questa opzione può anche essere attivata centralmente tramite DefaultExtractorsFactory.setDisableArtworkMetadata.
    • MP4: è stato aggiunto il supporto per l'estrazione delle tracce di metadati temporizzati ITU-T T.35 (it35).
    • MP4: aggiunta del supporto per l'estrazione dei metadati dei capitoli (formati Nero e QuickTime). Se sono presenti entrambi, i capitoli QuickTime hanno la priorità. Le informazioni sui capitoli estratte vengono esposte come voci Chapter all'interno di Metadata della traccia, consentendo la navigazione nativa dei capitoli nei file MP4, M4A e M4B (come audiolibri e podcast) (#2803).
    • WAV, Matroska e MP4: è stato aggiunto il supporto per l'audio PCM in virgola mobile a 64 bit (#3090).
    • Matroska: utilizza i metadati del bitstream del codec per compilare un ColorInfo accurato.
    • MP4: aggiunto il supporto per la ricerca nei file MP4 frammentati utilizzando la casella mfra quando non è presente una casella sidx. Per attivare questa funzionalità, fornisci FLAG_READ_MFRA_FOR_SEEK_MAP a FragmentedMp4Extractor, operazione che ora viene eseguita per impostazione predefinita in DefaultExtractorsFactory (#3088).
    • Ignora i dati av1C con versione non supportata.
    • MP4: aggiunto il supporto per PCM in rappresentazione in virgola mobile big-endian nelle caselle fpcm.
    • Matroska: analizza le informazioni sui capitoli in Chapter voci nel Metadata di una traccia.
    • MPEG-TS: miglioramento dell'estrazione degli stream DTS-HD e DTS Express combinando il flusso secondario Core ed Extension in un unico campione, risolvendo i problemi di riproduzione in cui i due venivano precedentemente generati come campioni separati (#3147).
    • MP4: impedisci loop infiniti e letture fuori dai limiti durante l'analisi di elementi di tag dei metadati ilst vuoti (#3191).
    • MPEG-TS: assicurati che l'ultimo frame venga visualizzato per gli stream in cui l'ultimo pacchetto PES ha una lunghezza nota (#3206).
    • MP3: correzione del reporting della velocità in bit per i file con intestazione Xing e VBRI.
    • Matroska: gestisci le tracce definite nell'ultimo cluster (#3250).
    • Matroska: aggiunto il supporto di ALAC (#3268).
    • MP4: consenti box sgpd di lunghezza variabile nei file MP4 frammentati (#3243).
    • AVI: è stato risolto un problema per cui la riproduzione di file senza flag di keyframe sulle tracce audio causava la perdita dell'audio e OutOfMemoryError.
    • MP3: utilizza le durate senza pause dalle intestazioni Xing/Info (#3183).
    • MP3: modifica i metadati di spaziatura interna e ritardo del codificatore LAME/Xing in modo che corrispondano al trimming PCM decodificato (#3200).
  • Audio:
    • Aggiunto un periodo di tolleranza di 100 ms nei renderer audio di ExoPlayer durante la transizione dallo stato pronto a quello non pronto, per eliminare i rimbalzi dei sottolivelli transitori ed evitare stati di buffering imprevisti durante la riproduzione attiva (#3210).
    • Modifica la logica predefinita della dimensione del buffer PCM in DefaultAudioTrackBufferSizeProvider per utilizzare un buffer fisso di 500 ms per renderlo meno dipendente dal dispositivo.
    • Aggiorna MediaCodecAudioRenderer per estrarre la maschera di canale spaziale dal decoder della piattaforma, consentendo a DefaultAudioSink di utilizzare questa maschera esplicita anziché dedurne una dal conteggio dei canali.
    • Converti i parametri di AudioSink.configure in classe di dati. Gli override personalizzati di ForwardingAudioSink.configure devono essere migrati alla nuova firma del metodo.
    • Aggiungi il supporto per mantenere l'intonazione durante l'estensione temporale di uno stream audio con EditedMediaItem.Builder#setSpeed(SpeedParameters).
    • Migliora ToFloatPcmAudioProcessor per supportare la conversione di PCM a 8 bit, PCM big-endian a 16 bit e PCM con rappresentazione in virgola mobile a 64 bit in PCM con rappresentazione in virgola mobile a 32 bit (#3090).
    • Modifica il valore restituito di DecoderAudioRenderer.getChannelMapping in ImmutableIntArray.
    • Risolto un bug per cui la riproduzione si blocca durante la riproduzione di una playlist di audio senza pause in modalità di offload compresso.
    • Inoltra Timeline e l'UID del periodo a AudioSink.configure e AudioProcessor.StreamMetadata per fornire il contesto della playlist ai processori audio (#418).
    • Imposta il valore corretto di AudioProcessor.StreamMetadata.positionOffsetUs per consentire l'elaborazione audio basata sul tempo (#418).
    • Aggiungi il supporto per PCM in virgola mobile big endian a 32 e 64 bit.
    • Rimosso il percorso di fallback da EAC3-JOC a EAC3 per la riproduzione su dispositivi Google Pixel, poiché i loro decoder EAC3 standard non possono decodificare gli stream EAC3-JOC (#3257).
  • Video:
    • Correggi la logica di unione dei video per conteggiare i buffer eliminati durante l'unione come saltati anziché eliminati.
    • Correzione della decisione di rendering immediato durante l'impostazione di una nuova superficie per evitare cali di frame sui dispositivi che non supportano le superfici segnaposto.
    • Correggi la stima della frequenza fotogrammi in MediaCodecVideoRenderer per renderla più accurata tenendo conto dei fotogrammi ignorati o saltati.
    • Consenti la configurazione della soglia utilizzata per pianificare i frame in anticipo. Il valore predefinito è 50 ms, ma puoi personalizzarlo tramite MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold().
    • Risolto un bug in VideoFrameReleaseHelper per cui le modifiche alla visualizzazione potevano attivare callback Choreographer ridondanti e attivazioni eccessive della CPU sul thread principale.
  • Testo:
    • TTML: fallback a displayAlign da style per le regioni (#2559).
    • TTML: eredita l'ora di inizio del cue dall'elemento principale degli elementi <p> (#3246).
  • Metadati:
    • Aggiungi il campo MediaMetadata.discSubtitle e analizzalo dai dati ID3v2.4 TSST e Vorbis DISCSUBTITLE.
    • Analizza il numero e il conteggio dei dischi dal frame ID3 TPOS.
  • Effetto:
    • Cancella lo stato di ridisegno in FinalShaderProgramWrapper durante lo svuotamento per evitare che il player si blocchi durante la ricerca.
  • Muxer:
    • Aggiungi il supporto per i riferimenti alle tracce (la casella tref) in Mp4Muxer tramite una nuova API addTrackReference. In questo modo è possibile stabilire relazioni tra le tracce, ad esempio collegare una traccia di metadati alla traccia video che descrive.
    • Aggiungi OggMuxer per consentire il muxing degli stream multimediali OPUS o VORBIS nel formato file ogg.
    • Aggiungi WavMuxer per la generazione di file WAV (supporta PCM con rappresentazione in virgola mobile e numeri interi).
    • Aggiungi setAttemptStreamableOutputEnabled a InAppMp4Muxer.Factory per consentire la scrittura di file più piccoli non riproducibili in streaming senza spazio riservato.
    • Aggiungi il supporto per l'audio IAMF in Mp4Muxer e FragmentedMp4Muxer.
  • Estensione IMA:
    • Aggiungi ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot per consentire di fornire un'area annuncio da utilizzare per gli annunci durante la pausa.
    • Risolto il bug per cui gli annunci VAST ignorabili consecutivi mostrano il pulsante Salta immediatamente sul secondo annuncio (#3165).
  • Sessione:
    • Risolvi i potenziali deadlock e gli arresti anomali di IllegalStateException all'interno di MediaNotificationManager quando utilizzi una sessione con un looper del player del thread in background.
    • Applica requisiti di threading più rigorosi per i metodi MediaSession. I metodi void ora pubblicano automaticamente l'esecuzione nel thread del looper dell'applicazione e gli accessor di stato (getter) generano esplicitamente un'eccezione IllegalStateException se vengono chiamati da un thread diverso dal looper dell'applicazione.
    • Risolto un arresto anomalo dell'unione della cronologia fuori dai limiti (IllegalStateException in MediaUtils.mergePlayerInfo) monitorando la coerenza dello stato per controller sul lato della sessione.
    • Aggiungi androidx.media3.session.MediaSessionManager per fornire il supporto per l'esecuzione di query sulle sessioni multimediali attive e la restituzione di istanze Media3 SessionToken.
    • Modifica il comportamento predefinito di MediaSession.Callback.onConnect se il metodo non viene sottoposto a override per fornire l'accesso in sola lettura ai controller non attendibili.
    • Aggiungi il supporto per eseguire l'override del nome del pacchetto durante la creazione di MediaSession tramite una nuova API MediaSession.Builder#setPackageNameOverride. Il chiamante deve disporre dell'autorizzazione android.permission.OVERRIDE_MEDIA_SESSION_OWNER per eseguire l'override del nome del pacchetto della sessione.
    • Aggiungi MediaSession.Callback.onConnectAsync(). Il nuovo metodo consente di elaborare in modo asincrono il tentativo di connessione di un controller. Le app possono restituire un Future immediato con Futures.immediateFuture(ConnectionResult) per ottenere il comportamento precedente. Ti consigliamo di eseguire la migrazione al nuovo metodo perché Callback.onConnect è un candidato per il ritiro.
    • Risolto il problema per cui la navigazione Bluetooth AVRCP non riconosceva MediaLibraryService sulle API 36 e 37.
    • Risolto il problema del doppio downscaling delle immagini in MediaSession quando le dimensioni dell'immagine sono vicine al limite della piattaforma, risolvendo la sfocatura nelle notifiche (#3134).
    • Risolto l'arresto anomalo di ForegroundServiceStartNotAllowedException in MediaNotificationManager quando un callback di caricamento bitmap asincrono dell'artwork tenta di avviare il servizio in primo piano mentre l'app è in background (#3270).
    • Risolto un problema per cui gli oggetti PositionInfo ricevuti da un MediaController non avevano gli UID Timeline originali. La sessione ora traduce e propaga in modo affidabile questi UID durante gli aggiornamenti dello stato.
    • Risolto l'arresto anomalo rilevando ForegroundServiceStartNotAllowedException in MediaSessionService.stopSelfSafely() (#3310).
    • Risolto il problema del callback onMediaItemTransition() imprevisto su MediaController durante la ricerca all'interno dello stesso elemento multimediale (#3248).
  • UI:
    • Correzione del rendering del primo frame con dimensioni errate quando ContentFrame viene ricomposto a metà riproduzione (#3238).
    • Aggiungi la classe CurrentMediaItemState e il composable rememberCurrentMediaItemState corrispondente al modulo media3-ui-compose. Questo contenitore di stato viene utilizzato in demo-compose per visualizzare varie informazioni sui metadati relative a MediaItem attualmente in riproduzione.
    • Aggiungi la classe PlaylistState e il composable rememberPlaylistState corrispondente al modulo media3-ui-compose. Questo contenitore di stato viene utilizzato in demo-compose per visualizzare varie informazioni sui metadati relative al MediaItems impostato sul Player.
    • Aggiungi l'API per l'avanzamento rapido/lo slow motion a PlaybackSpeedState. Utilizza questa funzionalità in demo-compose per mostrare l'avanzamento veloce con una pressione prolungata.
    • Aggiungi il componibile MiniController al modulo media3-ui-compose-material3. Fornisce un affordance compatto per controllare Player, visualizzando al contempo il titolo, l'artista, l'artwork e l'avanzamento dell'elemento multimediale corrente.
    • Aggiungi la classe ErrorState e il composable rememberErrorState corrispondente al modulo media3-ui-compose. Aggiungi il componibile ErrorText a media3-ui-compose-material3 e impostalo come overlay predefinito su Player.
    • Pubblica l'oggetto PlayerDefaults con i componibili per TopControls, CenterControls, BottomControls e ErrorOverlay.
    • Aggiungi FocusRequester al componibile Player e ai relativi slot di contenuti.
    • Pubblica PlayerPool (common-ktx) e rememberPooledPlayer (ui-compose) per supportare il precaricamento di MediaItems in ambienti UI con finestra scorrevole. Mostra questa funzionalità in demo-compose con un nuovo ShortFormPlayerScreen.
    • Corretto il bug di soppressione dell'otturatore in PlayerView e Compose PresentationState che causava arresti anomali nelle cronologie che non supportano la ricerca dell'UID del periodo (#3264).
  • Download:
    • Risolvi le variabili HLS nella playlist multimediale quando vengono recuperate per il download (#3258).
  • Estensione Ktor:
    • Aggiungi un nuovo modulo di estensione media3-datasource-ktor che fornisce un KtorDataSource supportato dallo stack HTTP Ktor.
    • Risolto il problema di KtorDataSource che caricava l'intero corpo della risposta HTTP in memoria all'apertura di una connessione (#3305).
  • Estensione HLS:
    • Aggiunto il supporto per HLS Content Steering e Pathway Cloning (#1689).
    • Aggiungi setWithAssetListReset a HlsInterstitialsAdsLoader per consentire alle app di reimpostare gli interstitial degli elenchi di asset completamente elaborati su uno stato non disponibile per la nuova risoluzione on demand.
    • Analizza l'attributo SCORE di EXT-X-STREAM-INF e EXT-X-I-FRAME-STREAM-INF e inseriscilo in Format.selectionPriority (#3236).
    • Risolto un bug per cui gli aggiornamenti pianificati della playlist HLS continuavano anche se la playlist non era più principale o attiva (#3254).
    • È stato corretto il calcolo dell'offset di ripresa dei contenuti durante la risoluzione degli elenchi di asset interstitial (#3322).
    • Risolto il problema della discontinuità imprevista del timestamp della traccia audio quando si riprende la riproduzione live a bassa latenza dopo un errore di richiesta della playlist (#3311).
    • Correzione del bug in HlsMediaPeriod.getStreamKeys() per cui la traccia ID3 nelle versioni audio viene considerata come sottotitoli (#3333).
  • Estensione DASH:
    • Separa i sottotitoli codificati CEA in diversi TrackGroup in base alla lingua (#3113).
    • Aggiungi il supporto per l'analisi di più elementi Location dal manifest (MPD) e l'esecuzione del fallback della posizione in DashMediaSource quando i caricamenti del manifest non vanno a buon fine.
    • Risolto un arresto anomalo (IndexOutOfBoundsException) che si verificava quando venivano aperti manifest con un elemento <SegmentTimeline/> vuoto (#3326).
  • Estensione RTSP:
    • Risolti i problemi di interruzione o errore temporanei della riproduzione durante la preparazione della riproduzione RTSP causati da errori di associazione delle porte UDP.
  • Estensione Cast:
    • Aggiungi una nuova classe CastParams per consentire la configurazione di Cast chiamando Cast.initialize(CastParams).
    • Aggiungi la nuova opzione CastParams.getShowSystemOutputSwitcherOnCastIconClick(), che attiva l'utilizzo del selettore di output SystemUI anziché del selettore di dispositivi di trasmissione in-app, se disponibile.
    • Aggiungi MediaRouteButtonState e rememberMediaRouteButtonState per supportare l'osservazione dello stato di visibilità del selettore di route multimediali e aggiungi il parametro state a MediaRouteButton (#3172).
    • Risolto un bug per cui RemoteCastPlayer poteva rimanere bloccato in modo permanente in uno stato di mascheramento della traccia dopo una selezione della traccia, ignorando i successivi aggiornamenti della traccia dal ricevitore Cast (#3237).
    • Correzione di un bug per cui DefaultMediaItemConverter genera un NullPointerException quando tenta di partecipare a una sessione di trasmissione avviata da un mittente non Media3.
    • Impedisci a CastPlayer di trasferire MediaItems non riproducibili quando cambi il player attivo (#3199).
    • Risolto il bug per cui i live streaming non configurati (liveConfiguration == UNSET) venivano messi in coda come STREAM_TYPE_BUFFERED (#3318).
  • Utilità di test:
    • Espandi DataSourceContractTest per includere il supporto delle richieste POST con intestazioni e corpi, aggiungi alcune risorse POST a HttpDataSourceTestEnv e aggiungi asserzioni per il metodo, le intestazioni e il corpo HTTP previsti in WebServerDispatcher.
    • Rafforza le asserzioni in DataSourceContractTest per le lunghezze restituite da DataSource.open(). Le risorse che potrebbero generare C.LENGTH_UNSET devono indicarlo utilizzando TestResource.Builder.setMayResolveToUnknownLength(boolean).
    • Aggiungi setPlaybackLooper a TestExoPlayerBuilder.
  • Rimuovi i simboli deprecati:
    • Rimuovi androidx.media3.exoplayer.MetadataRetriever. Usa invece androidx.media3.inspector.MetadataRetriever.
    • Rimuovi androidx.media3.exoplayer.MediaExtractorCompat. Usa invece androidx.media3.inspector.MediaExtractorCompat.
    • Rimuovi Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA. Utilizza HeifExtractor per estrarre i metadati delle foto in movimento dai file HEIC.
    • Rimuovi androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata. Usa invece androidx.media3.extractor.metadata.MotionPhotoMetadata.
    • Rimuovi androidx.media3.extractor.DummyTrackOutput. Usa invece androidx.media3.extractor.DiscardingTrackOutput.
    • Rimuovi androidx.media3.extractor.DummyExtractorOutput. Usa invece androidx.media3.extractor.NoOpExtractorOutput.
    • Rimuovi androidx.media3.common.C.generateAudioSessionIdV21. Usa invece androidx.media3.common.util.Util.generateAudioSessionId.
  • Build
    • Aggiornate le istruzioni di README.md per l'utilizzo locale di Media3 in modo da utilizzare le build composite di Gradle (includeBuild). Lo script core_settings.gradle è stato rimosso e le proprietà androidxMediaModulePrefix e androidxMediaEnableMidiModule non vengono più utilizzate.

1.11.0-rc01

Utilizza la versione stabile 1.11.0.

1.11.0-beta01

7 luglio 2026

Utilizza la versione stabile 1.11.0.

1.11.0-alpha01

24 giugno 2026

Utilizza la versione stabile 1.11.0.

Versione 1.10.0

1.10.1

12 maggio 2026

  • Libreria comune:
    • Correzione della gestione di onAudioSessionIdChanged in SimpleBasePlayer e ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Risolto un problema di race condition relativo alla generazione dell'ID sessione audio che poteva causare un IllegalStateException con la modalità Tunneling. (#3099).
    • Risolti i possibili arresti anomali dell'app durante il recupero da errori del decoder con il preriscaldamento del renderer.
    • Risolto il problema per cui gli artefatti video erano causati dalla fornitura di dati di inizializzazione quando si utilizzava un codec Dolby Vision basato su AV1 (#3153).
  • Selezione della traccia:
    • Modifica la logica di selezione delle tracce in VideoTrackInfo per risolvere i tipi MIME di riserva e sposta le preferenze di punteggio HDR e codec nelle preferenze di qualità (#3135).
  • Estrattori:
    • MP3: ignora la lunghezza dei dati Xing se è maggiore della lunghezza dello stream nota (#3117).
    • Correzione di ArrayIndexOutOfBoundsException in Mp4Extractor quando FLAG_OMIT_TRACK_SAMPLE_TABLE è impostato e la traccia non contiene una casella di esempio di sincronizzazione (stss).
  • Audio:
    • Risolto un bug per cui gli eventi audio potevano essere indirizzati in modo errato se al player venivano aggiunti più renderer audio.
  • Video:
    • Modifica la logica per il riutilizzo del codec in caso di modifiche della frequenza fotogrammi nell'API precedente alla versione 30 per evitare reimpostazioni del codec quando non sono utili (#3120).
    • Disattiva la soluzione alternativa di sincronizzazione forzata in queueSecureInputBuffer per l'API 31 e versioni successive. La soluzione alternativa era un collo di bottiglia artificiale che forzava l'esecuzione della decrittografia in serie, impedendo la distorsione del video a causa di un problema del framework esistente prima dell'API 31.
  • Immagine:
    • Risolto un problema in modalità di scrubbing per cui gli aggiornamenti delle immagini venivano applicati solo quando l'utente "interrompeva lo scrubbing" (#2815).
  • Sessione:
    • È stato corretto il bug per cui ForegroundServiceStartNotAllowedException non veniva propagato oltre i limiti del thread nel caso in cui il thread dell'applicazione non fosse il thread principale (#2499).
    • Correzione di un bug per cui COMMAND_SEEK_TO_MEDIA_ITEM non è disponibile in un MediaController quando ci si connette a una sessione solo per la piattaforma che supporta la ricerca di altri elementi, ma non le modifiche alla playlist.
    • Risolvi il problema per cui MediaController non può impostare elementi multimediali nelle sessioni multimediali della piattaforma che non consentono azioni PREPARE_FROM.
    • È stato corretto il bug per cui il proprio processo non veniva contrassegnato con Controller.isTrusted() su API 27 o versioni precedenti durante la connessione tramite i controller della piattaforma.
  • Estensione HLS:
    • Correzione di un bug per cui viene generata un'eccezione ArrayIndexOutOfBoundsException durante il fallback dello stream se la selezione della traccia è un sottoinsieme delle tracce disponibili (#3161).
    • Risolto un problema per cui il segmento di inizializzazione non veniva trasferito tra gli aggiornamenti della playlist multimediale se il tag #EXT-X-MAP non veniva ripetuto negli aggiornamenti successivi (#3105).
  • Estensione DASH:
    • È stato corretto l'arresto anomalo in SampleQueue durante la ricerca in un chunk che è attualmente in fase di annullamento.

1.10.0

26 marzo 2026

  • Libreria comune:
    • Promuovi Player.mute() e Player.unmute() da UnstableApi a stabile.
    • Promuovi Format.pcmEncoding e C.PcmEncoding da UnstableApi a stabile.
    • Aggiungi Format.primaryTrackGroupId per identificare il gruppo principale di istanze Format incorporate (#294).
  • ExoPlayer:
    • Aggiungi funzionalità di ritaglio a AdsMediaSource.
    • Aggiungi il supporto per la pianificazione dinamica in MediaCodecVideoRenderer per allineare meglio il lavoro di pianificazione e i cicli di attivazione della CPU al momento in cui i frame video possono essere elaborati. Puoi attivare questa opzione utilizzando experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() in DefaultRenderersFactory.
    • Consenti l'impostazione di un DataSource.Factory personalizzato in DefaultPreloadManager.Builder.
    • Consenti il mocking di ExoPlayer senza Robolectric spostando alcune costanti predefinite in ExoPlayer.Builder. In genere, il mocking di questa interfaccia complessa non è consigliato, se non quando l'utilizzo è minimo/semplice/incidentale (#2985).
      • Ciò ha richiesto lo spostamento di DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS da ExoPlayer a ExoPlayer.Builder (senza ritiro).
    • È stato corretto un bug per cui ProgressiveMediaSource propaga informazioni della sequenza temporale obsolete al player e i periodi in coda vengono rimossi inaspettatamente (#3016).
    • Risolto il problema per cui ExoPlayer non richiedeva la priorità audio ritardata quando la riproduzione veniva richiesta durante le chiamate.
    • Risolto un bug per cui le transizioni da contenuti on demand a contenuti live possono causare un nuovo buffering alla fine dei contenuti on demand (#3052).
    • Aggiunto il supporto per Dolby Vision Profile 10 (#2830).
    • Risolto il bug per cui un annuncio pre-roll non inizializzato generava un errore ArrayIndexOutOfBoundsException (#3125).
  • CompositionPlayer:
    • Aggiungi il supporto per EditedMediaItem.removeVideo.
  • Transformer:
    • EditedMediaItem.Builder.setFrameRate() ora può impostare una frequenza fotogrammi di output massima per i video, il che è particolarmente utile quando si aumenta la velocità dei contenuti multimediali con setSpeed().
  • Selezione della traccia:
    • Modifica la firma di DefaultTrackSelector.selectAllTracks per includere l'array di output come parametro, precompilato con gli override della traccia.
    • Risolto il problema per cui le tracce di metadati incorporate venivano selezionate indipendentemente dalla selezione della traccia principale corrispondente (#294).
    • Stabilizza le opzioni TrackSelectionParameters per preferredVideoLanguages, preferredVideoLabels, preferredAudioLabels, preferredTextLabels e selectTextByDefault.
  • Estrattori:
    • MP4: supporto di file con box uuid di grandi dimensioni prima di altri box come moov (#3046).
    • MP4: è stato aggiunto il supporto per le tracce VVC (Versatile Video Coding) nei contenitori MP4.
  • Inspector:
    • Modifica che provoca un errore: rimozione di FrameExtractor. Gli utenti ora devono fare affidamento sul nuovo modulo :media3-inspector-frame e aggiornare le importazioni in androidx.media3.inspector.frame.FrameExtractor.
    • Introduzione di un nuovo modulo per l'estrazione e l'elaborazione dei frame video decodificati.
  • Audio:
    • Modifica della libreria di decodifica sottostante per l'estensione del decoder IAMF da libiamf a iamf_tools.
    • La decodifica IAMF supporta l'output binaurale tramite il decoder (quando utilizzi l'estensione del decoder IAMF) o tramite il sistema di spazializzazione di Android.
    • Rimuovi correttamente il supporto di AC4Profile22 e di altri profili legacy quando valuti il supporto del decoder AC-4 negli scenari di Automotive (#2609).
    • Miglioramento della logica di ripetizione dell'inizializzazione di AudioOutput in DefaultAudioSink (#2905).
    • Tentativo di abbinare il layout di output degli speaker (o dello spazializzatore, se applicabile) durante la decodifica di IAMF, sia con l'estensione IAMF sia con i decoder dei codec multimediali, supportati da nuovi campi e logica in AudioCapabilities e AudioCapabilitiesReceiver.
    • Risolto un bug per cui la riproduzione si bloccava durante la riproduzione di una playlist di audio senza pause in modalità di offload compresso.
  • Testo:
    • VobSub: utilizza i comandi di controllo SPU START e STOP per ricavare la durata del cue anziché utilizzare sempre il valore predefinito di 5 secondi (#2935).
  • Metadati:
    • Aumenta il numero predefinito di renderer dei metadati a quattro per coprire tutte le potenziali tracce di metadati pubblicate dalle varianti e dalle rappresentazioni HLS (#3043).
  • Effetto:
    • Spostamento di LottieOverlay in un nuovo modulo :media3-effect-lottie (che ha comportato anche la ridenominazione da androidx.media3.effect.LottieOverlay a androidx.media3.effect.lottie.LottieOverlay).
  • Effetto Lottie:
    • Introduce un nuovo modulo :media3-effect-lottie che fornisce la funzionalità per applicare gli effetti Lottie ai frame video.
  • Estensione IMA:
    • Aggiorna la versione dell'SDK IMA alla 3.39.0 per accedere all'API Ad Media Info più recente.
    • È stato corretto un bug per cui il tipo MIME dell'annuncio non corrispondeva al tipo MIME fornito nell'evento IMA LOADED. La correzione ora mappa il tipo MIME dell'annuncio utilizzando le informazioni sui contenuti multimediali dell'annuncio fornite da IMA.
    • Aggiungi setEnableCustomTabs a ImaAdsLoader e ImaServerSideAdInsertionMediaSource, consentendo agli utenti di controllare se gli URL di clickthrough degli annunci vengono avviati utilizzando le schede personalizzate.
    • Aggiungi ImaAdTagUriBuilder, una classe che offre un modo alternativo per creare un adTagUri. Contiene l'API setPreferredLinearOrientation. Si tratta di un'API in fase di alpha test che ti consentirà di impostare l'orientamento preferito per gli annunci lineari. Se vuoi unirti al gruppo di alpha test, contatta il tuo partner dell'account.
  • Sessione:
    • Risolvi un bug per cui gli array di grandi dimensioni in MediaMetadata.artworkData possono causare l'arresto anomalo dell'app.
    • Utilizza il tipo int per l'argomento @Player.Command nell'interfaccia ActionFactory (#2933).
    • Rendi MediaSessionService e MediaLibraryService un LifecycleService, consentendo di collegare operazioni sensibili al ciclo di vita al ciclo di vita del servizio (#187).
    • Interrompi il supporto dei comandi di modifica del volume del dispositivo da MediaController e MediaBrowser per le riproduzioni locali. Le app non devono modificare il volume del dispositivo locale e, se necessario, possono utilizzare le API AudioManager a questo scopo.
    • Rileva le istanze Intent inattive che hanno avviato il servizio come servizio in primo piano. In questo modo, il sistema non genera un errore ForegroundServiceDidNotStartInTimeException. Si tratta di una modifica che provoca un errore su un'API instabile per le app che implementano un MediaNotification.Provider personalizzato, poiché è presente un nuovo metodo obbligatorio.
    • Aggiungi builder per le istanze PendingIntent da utilizzare con i widget della schermata Home (#2933).
    • Aggiungi metodi statici per creare istanze Intent per i widget della schermata Home basati su Compose (#2933).
    • Risolto un bug per cui la transizione dell'elemento multimediale non veniva segnalata ai controller quando la riproduzione passava da un determinato indice di elemento multimediale a un altro con lo stesso elemento multimediale per motivi di discontinuità "AUTO" e "SEEK" (#2997).
    • Risolto il problema per cui la soluzione alternativa per il posizionamento dei pulsanti della UI di sistema influisce negativamente su altre superfici della UI, come Android Auto o i produttori che non necessitano della soluzione alternativa (#3041).
    • Risolto il problema per cui l'accesso agli abbonamenti non veniva sincronizzato (#3056).
    • Soluzione alternativa per il bug SysUI nell'API 29 in cui l'artwork della sessione multimediale di una determinata dimensione può causare l'arresto anomalo di SysUI e forzare il riavvio del dispositivo (#3118).
    • Correzione del ridimensionamento dell'icona della copertina delle notifiche su Android Q (#3084).
  • UI:
    • Aggiungi il componibile PlaybackSpeedControl a media3-ui-compose per visualizzare e modificare la velocità di riproduzione.
    • Aggiungi il componibile PlaybackSpeedToggleButton a media3-ui-compose-material3 per controllare la velocità di riproduzione.
    • Aggiungi il componibile ProgressSlider a media3-ui-compose-material3 per visualizzare l'avanzamento del player ed eseguire ricerche utilizzando il trascinamento e il tocco (#2288).
    • Evita un buffer fuori schermo di grandi dimensioni nell'animazione di PlayerControlView.
    • Aggiungi il componibile Player a media3-ui-compose-material3, che combina un ContentFrame con controlli personalizzabili allineati in alto, al centro e in basso.
    • Nascondi la posizione di riproduzione dal servizio di accessibilità per impedire l'aggiornamento continuo degli annunci quando PlayerControlView è visibile.
  • Estensione HLS:
    • Supporto di X-PLAYOUT-LIMIT con interstitial HLS (#2484).
    • Supporto dell'attributo QUERYPARAM con #EXT-X-DEFINE (#1854).
    • Ottimizza l'analisi delle playlist HLS memorizzando nella cache i matcher delle espressioni regolari (#3008).
    • Esposizione della traccia dei metadati ID3 (EMSG) nelle versioni audio (#3043).
    • Consenti il fallback della posizione in caso di errori di caricamento, se sono disponibili stream ridondanti da posizioni diverse (#1988).
    • Correzione del comportamento di X-SNAP per gli interstitial HLS per calcolare correttamente la posizione di inizio e ripresa (#3013).
  • Estensione DASH:
    • Risolto il problema per cui le tracce con ore di inizio dei segmenti non allineate causavano ritardi o campioni mancanti all'inizio della riproduzione (#3057).
    • Risolto il bug per cui i timestamp dei metadati EMSG v0 inband non venivano impostati correttamente (#3024).
  • Estensione RTSP:
    • È stata corretta la regressione nello streaming H.264 e H.265 che analizzava in modo errato i campioni della stessa unità di accesso che si estendeva su più pacchetti RTP. Ciò ha causato artefatti visivi e danneggiamento del video (#3121).
  • Estensioni del decoder (FFmpeg, VP9, AV1 e così via):
    • Aggiunto il supporto del gestore UI MPEG-H all'estensione del decoder MPEG-H (#3066).
  • Estensione Cast:
    • Aggiungi il metodo RemoteCastPlayer.Builder#setTrackSelector che consente l'implementazione della selezione della traccia per le riproduzioni di Cast.
  • Rimuovi i simboli deprecati:
    • Rimuovi ExperimentalFrameExtractor. Usa invece androidx.media3.inspector.frame.FrameExtractor.
    • Rimuovi ChannelMixingMatrix.create(). Usa invece ChannelMixingMatrix.createForConstantGain().
    • Rimuovi androidx.media3.extractor.metadata.flac.VorbisComment. Usa invece androidx.media3.extractor.metadata.vorbis.VorbisComment.
    • Rimuovi MediaSource.prepareSource(MediaSourceCaller, TransferListener). Usa invece il descrittore MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId).

1.10.0-rc03

25 marzo 2026

Utilizza la versione stabile 1.10.0.

1.10.0-rc02

16 marzo 2026

Utilizza la versione stabile 1.10.0.

1.10.0-rc01

10 marzo 2026

Utilizza la versione stabile 1.10.0.

1.10.0-beta01

25 febbraio 2026

Utilizza la versione stabile 1.10.0.

1.10.0-alpha01

6 febbraio 2026

Utilizza la versione stabile 1.10.0.

Versione 1.9.0

1.9.4

16 maggio 2026

La versione 1.9.4 contiene i seguenti commit.

  • Effetto:
    • Imposta esplicitamente GL_DRAW_BUFFER e GL_READ_BUFFER quando esegui la transizione da un contesto senza superficie.

1.9.3

16 marzo 2026

La versione 1.9.3 contiene i seguenti commit.

  • Audio:
    • Risolto un bug per cui la riproduzione si bloccava durante la riproduzione di una playlist di audio senza pause in modalità di offload compresso.

1.9.2

6 febbraio 2026

La versione 1.9.2 contiene i seguenti commit.

  • ExoPlayer:
    • È stato corretto il bug per cui ProgressiveMediaSource propaga informazioni obsolete sulla cronologia al player e i periodi in coda vengono rimossi inaspettatamente (#3016).
  • Sessione:
    • Risolto il problema per cui la soluzione alternativa per il posizionamento dei pulsanti della UI di sistema influisce negativamente su altre superfici della UI, come Android Auto o i produttori che non necessitano della soluzione alternativa (#3041).
  • Estensione Cast:
    • Risolto un bug per cui il trasferimento dalla riproduzione con Cast a quella locale non funzionava.

1.9.1

26 gennaio 2026

La versione 1.9.1 contiene questi commit.

  • Libreria comune:
    • Supporto delle stringhe di data e ora con solo le ore nell'offset del fuso orario (#2929).
  • ExoPlayer:
    • Consenti alla programmazione dinamica di rallentare l'intervallo doSomeWork solo dopo l'avvio dell'audio per supportare una sincronizzazione A/V più fluida all'inizio della riproduzione.
    • Risolto un bug in DefaultLoadErrorHandlingPolicy per cui i tipi di eccezione FileNotFoundException e simili venivano ritentati più volte.
    • Risolto un bug con la pianificazione dinamica in cui il tempo calcolato per la successiva doSomeWork veniva erroneamente ridotto del tempo trascorso dell'iterazione corrente di doSomeWork. La risoluzione di questo problema dovrebbe estendere il tempo di inattività della CPU e risparmiare energia.
    • Risolto un problema per cui alcune riproduzioni di file Dolby Vision non riuscivano quando si tentava di utilizzare un codec AVC o HEVC di riserva.
    • Risolto il bug per cui il caricamento continuava dopo la fine della riproduzione quando l'elemento in riproduzione veniva rimosso da una playlist (#2873).
    • Evita di perdere istanze MediaItem quando utilizzi ripetutamente ExoPlayer.replaceMediaItem sullo stesso elemento (#2993).
    • Evita potenziali ANR causati da rilasci di wakelock di emergenza (#2979).
  • Estrattori:
    • MP3: analizza i dati ReplayGain di LAME (#2840).
  • Audio:
    • Rimuovi correttamente il supporto di AC4Profile22 e di altri profili legacy quando valuti il supporto del decoder AC-4 negli scenari di Automotive (#2609).
  • Video:
    • Elimina i codec video sui dispositivi con API precedente alla 30 quando la frequenza fotogrammi dei contenuti cambia per evitare la riproduzione a scatti (#2941).
  • Testo:
    • VobSub: correzione di alcuni sottotitoli mancanti gestendo correttamente le SPU che contengono una singola sequenza di controllo o che hanno informazioni critiche suddivise in più sequenze di controllo (#2935).
  • Estensione IMA:
    • Correzione di bug: è stato corretto un problema per cui il tipo MIME dell'annuncio non corrispondeva al tipo MIME fornito nell'evento IMA LOADED. La correzione ora mappa il tipo MIME dell'annuncio utilizzando l'indice del pod di annunci e la posizione dell'annuncio.
    • Aggiungi un controllo null prima di accedere al risultato di getAdsManager() e AdEvent.getAd().
  • Sessione:
    • Risolto un bug per cui l'interruzione di un MediaController connesso a una sessione della piattaforma causava l'arresto anomalo dell'app se l'interruzione avveniva durante la riproduzione dell'annuncio (#2948).
    • Aggiungi ulteriori verifiche alle istanze Bundle di extras in varie classi per proteggerti da istanze Bundle con formato non corretto inviate da altri processi.
    • Risolto il problema per cui i comandi mancanti per COMMAND_SEEK_NEXT o COMMAND_SEEK_BACK possono causare lacune nella notifica dei contenuti multimediali di sistema (#2976).
    • Spostamento della scalabilità bitmap per l'icona di notifica fuori dal thread principale (#2829).
    • È stato corretto un bug per cui autore, scrittore e compositore non venivano utilizzati come opzione di riserva durante la conversione dai campi legacy MediaMetadataCompat e MediaDescriptionCompat (#3018).
  • Download:
    • Risolvi i potenziali loop infiniti quando un PriorityTooLowException viene gestito da SegmentDownloader (per DASH, HLS e SmoothStreaming). Gli override personalizzati di SegmentDownloader che utilizzano il metodo execute protetto devono fornire la propria attività racchiusa in un Supplier in modo che possa essere ricreata (#2931).
  • Estensione HLS:
    • Passa il documento JSON dell'elenco di asset non elaborati al callback Listener.onAssetListLoadCompleted. Si tratta di una modifica che provoca un errore in un'API instabile che richiede alle app che implementano questo callback di aggiungere un argomento aggiuntivo di tipo JSONObject (#2950).
  • Estensione RTSP:
    • Gestione corretta dei pacchetti RTP con timestamp che si ripetono (#2930).
  • Estensioni del decoder (FFmpeg, VP9, AV1 e così via):
    • Risolto un potenziale NullPointerException che può verificarsi durante la ricerca prima dell'elaborazione del primo frame video (#2965).
  • Estensione Cast:
    • Risolto il bug che impediva l'aggiornamento corretto della sequenza temporale RemoteCastPlayer durante la sostituzione della playlist.

1.9.0

17 dicembre 2025

  • Libreria comune:
    • Aggiorna minSdk a 23 in linea con le altre librerie AndroidX.
    • Aggiungi PlayerTransferState, che facilita il trasferimento dello stato di riproduzione tra le istanze di Player.
    • Aggiungi i metodi void mute() e void unmute() a Player che conservano e di conseguenza ripristinano il volume di Player prima e dopo averlo impostato su zero.
    • Pubblica le classi di utilità WakeLockManager, WifiLockManager, AudioFocusManager, AudioBecomingNoisyManager e StuckPlayerDetector precedentemente utilizzate da ExoPlayer internamente per consentire il riutilizzo per altri player (#1893).
    • Correzione della gestione del listener ForwardingPlayer quando il player delegato sottostante utilizza l'uguaglianza dei riferimenti per confrontare le istanze del listener (#2675).
    • Aggiungi una funzione di estensione di sospensione Player.listenTo nella libreria media3-common-ktx che specifica il Player.Events su cui intervenire.
    • È stato corretto un arresto anomalo in BasePlayer.getBufferedPercentage causato da un overflow di numeri interi quando la posizione con buffer segnalata è molto più grande della durata segnalata (#2750).
    • Risolto il problema di rilevamento automatico del tipo di traccia TrackGroup non ignorando il tipo MIME di esempio personalizzato e tornando a utilizzare il tipo di traccia potenzialmente errato dal tipo MIME del container (#2860).
  • ExoPlayer:
    • Aggiungi un rilevamento del player bloccato che attiva un errore del player StuckPlayerException se il player sembra bloccato. Questo accade nei seguenti casi, in cui ogni timeout predefinito può essere configurato in ExoPlayer.Builder, se necessario:
      • Dopo 10 minuti di STATE_BUFFERING durante il tentativo di riproduzione e nessun avanzamento del buffering.
      • Dopo 10 secondi di STATE_READY durante il tentativo di riproduzione e nessun avanzamento della riproduzione.
      • Dopo 1 minuto di STATE_READY oltre la durata dichiarata senza raggiungere la fine dell'elemento.
      • Dopo 10 minuti con un motivo di soppressione della riproduzione durante il tentativo di riproduzione.
    • Attiva la gestione del wakelock per impostazione predefinita per risolvere i problemi di buffering durante la riproduzione in background. Equivale a impostare ExoPlayer.Builder.setWakeMode su C.WAKE_MODE_LOCAL.
    • Aggiungi la logica di ascolto per aggiornare automaticamente l'ID dispositivo virtuale quando viene segnalata una modifica al Context originariamente passato a ExoPlayer.Builder.
    • Aggiungi ExoPlayer.setVirtualDeviceId per aggiornare manualmente l'ID dispositivo virtuale ottenuto da Context passato a ExoPlayer.Builder.
    • Assicurati che i renderer non utilizzino i dati dell'elemento successivo della playlist più di 10 secondi prima della fine dell'elemento corrente.
    • Aggiungi setSeekBackIncrementMs, setSeekForwardIncrementMs e setMaxSeekToPreviousPositionMs a ExoPlayer per aggiornare queste impostazioni dopo la costruzione (#2736).
    • Aggiungi la funzionalità di pre-memorizzazione nella cache in DefaultPreloadManager. Ora le app possono restituire DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) o DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs) tramite TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData) per indicare che un elemento multimediale deve essere pre-memorizzato nella cache.
    • Utilizza la funzionalità di pre-memorizzazione nella cache di DefaultPreloadManager nell'app demo per i contenuti nel formato breve.
    • Aggiungi i setter DefaultLoadControl.Builder per la riproduzione locale e regola i valori predefiniti di DefaultLoadControl in modo che funzionino bene con un'ampia gamma di file locali.
    • Risolto il bug per cui l'impostazione di una playlist vuota può lasciare il player in STATE_READY o STATE_BUFFERING.
    • Migliorare le API del gestore del precaricamento:
      • Aggiungi addMediaItems(List<MediaItem>, List<T>) e addMediaSources(List<MediaSource>, List<T>) che aggiungono gli elementi multimediali o le origini multimediali in batch e chiamano automaticamente invalidate() in seguito.
      • Aggiungi removeMediaItems((List<MediaItem>) e removeMediaSources(List<MediaSource>) che rimuovono gli elementi multimediali o le origini multimediali in batch e assicurati che il gestore del precaricamento non inizi o continui a precaricare nessuno di questi elementi dopo la rimozione.
      • Consenti a DefaultPreloadManager.setCurrentPlayingIndex(int) di invalidarsi automaticamente. Le app non devono più chiamare invalidate() esplicitamente dopo aver aggiornato l'indice di riproduzione corrente.
    • Aggiunta della funzionalità per saltare il ripristino dei keyframe per le ricerche in avanti all'interno dello stesso gruppo di immagini in modalità di scrubbing.
    • Aggiungi DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) per consentire alle app di impostare un valore di byte del buffer target per un player con il playerName specificato. DefaultLoadControl ora può prendere decisioni per ogni player separatamente in base ai byte allocati e ai byte del buffer target.
    • Aggiungi SkipInfo a AdPlaybackState.AdGroup per includere le informazioni relative allo skip per ogni annuncio nel gruppo di annunci.
    • Risolto un bug per cui la chiamata a removeMediaItems(List) durante la riproduzione di un post-roll causava un arresto anomalo (#2746).
    • Risolto un problema di stuttering nella riproduzione delle playlist in cui i frame venivano erroneamente impostati sempre come ultimo campione e visualizzati.
    • Attivato il percorso di nuovo tentativo se il player non riesce a generare l'ID sessione audio (#2382, #2678).
    • Aggiungi il supporto per controllare i byte totali del buffer per le origini in DefaultPreloadManager per evitare che i byte totali del buffer per il precaricamento aumentino in modo arbitrario. Per utilizzare la logica di controllo predefinita, le app possono impostare i byte del buffer target per il precaricamento tramite DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) per un playerName di PlayerId.Preload.name ("preload") e inserire l'oggetto DefaultLoadControl creato tramite DefaultPreloadManager.Builder.setLoadControl(LoadControl).
    • Aggiunta di cloneAndSet(int, int) a ShuffleOrder con un'implementazione predefinita (#2834).
    • Aggiunta dell'offset di ripresa dei contenuti quando si salta la riproduzione dell'annuncio dopo la regolazione della ricerca o la transizione automatica (#2484).
    • Aggiunta di un'API per impostare e osservare i parametri dei codec per le tracce audio e video. Questa funzionalità è implementata per i renderer basati su MediaCodec e richiede l'API 29 o versioni successive.
      • Utilizza ExoPlayer.setAudioCodecParameters() e ExoPlayer.setVideoCodecParameters() per applicare i parametri.
      • Utilizza ExoPlayer.addAudioCodecParametersChangeListener() e ExoPlayer.addVideoCodecParametersChangeListener() per ascoltare le modifiche. L'osservazione delle chiavi specifiche del fornitore richiede l'API 31 o versioni successive.
    • Correzione di IllegalStateException causato dall'impostazione di un'origine multimediale vuota dopo la ricerca di una posizione diversa da zero e la preparazione del player con un'origine multimediale non vuota.
    • Risolto un bug per cui la ricerca di altri elementi multimediali in modalità di scrubbing poteva causare IllegalStateException.
    • Correzione di un potenziale NullPointerException in DefaultPlaybackSessionManager (#2885).
    • Attiva i miglioramenti delle prestazioni di ricerca per i video idonei.
    • Riattivato l'utilizzo della decrittografia asincrona in MediaCodec nell'API 36 e versioni successive, in cui i problemi di timeout con questa API della piattaforma sono stati risolti (#1641).
    • Modifica il valore predefinito di MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs in 15 ms e attiva l'eliminazione più efficiente dei frame video prima della decodifica per i video idonei.
    • Aggiungi il limite massimo di memoria al calcolo automatico della memoria in DefaultLoadControl. Questo dovrebbe avere effetto solo se viene selezionato un numero eccessivo di tracce (#2860).
    • Risolto un bug per cui, se la riproduzione avveniva in una playlist o in modalità repeat, la ricerca in modalità di scorrimento verso la fine poteva causare una ricerca dell'elemento multimediale successivo.
  • CompositionPlayer:
    • Pubblica CompositionPlayer con una nuova annotazione @ExperimentalApi per indicare che è disponibile per la sperimentazione, ma è ancora in fase di sviluppo. Alcune API potrebbero cambiare in modo significativo nelle versioni future e sono presenti problemi e limitazioni noti con alcuni casi d'uso (alcuni non documentati).
    • Aggiungi il supporto per COMMAND_SET_AUDIO_ATTRIBUTES e la gestione della priorità audio in CompositionPlayer.
    • Aggiungi il supporto per la modifica della velocità nelle sequenze secondarie in CompositionPlayer.
    • Aggiungi il supporto per EditedMediaItem.removeVideo.
  • Transformer:
    • Utilizza InAppMp4Muxer come muxer predefinito.
    • Aggiungi EditedMediaItem.Builder#setSpeed() e ritira Effects#createExperimentalSpeedChangingEffects().
    • Sostituisci forceAudioTrack e forceVideoTrack con trackTypes in EditedMediaItemSequence.
  • Selezione della traccia:
    • Aggiungi TrackSelectionParameters.selectTextByDefault per preferire la selezione di qualsiasi traccia di testo senza specificare altre preferenze più specifiche.
    • Aggiungi preferredVideoLabels, preferredAudioLabels e preferredTextLabels in TrackSelectionParameters per specificare una preferenza per le tracce con un'etichetta specifica, ad esempio quelle lette dai tag HLS NAME (#1666).
  • Estrattori:
    • FLAC: è stato rafforzato il rilevamento delle intestazioni per ridurre la possibilità di trovare intestazioni spurie nei dati FLAC codificati, con conseguenti errori di decodifica (#558).
    • MP3: sono consentiti spazi tra (e prima) i tag ID3 all'inizio dei file MP3 (#811, #5718).
    • MP3: è stato aumentato il limite di sniffing a 128 kB per corrispondere al limite di ricerca esistente per un byte di sincronizzazione (#2713).
    • MP3: modifica di FLAG_ENABLE_INDEX_SEEKING per preferire la ricerca di informazioni dalle intestazioni dei metadati (come Xing e VBRI), se disponibili, con il ritorno alla ricerca basata su indice se non sono presenti altre informazioni di ricerca. In questo modo, le prestazioni dei file con metadati di ricerca migliorano (#2839).
    • MP3: modifica Mp3Extractor in modo che utilizzi per impostazione predefinita un'ipotesi di velocità in bit costante (CBR) quando non vengono trovati metadati di ricerca (ad es. Xing, VBRI), anche quando FLAG_ENABLE_INDEX_SEEKING è impostato. Questo si basa sulla cronologia delle specifiche MP3, in cui CBR era lo standard e VBR richiede intestazioni esplicite. In questo modo, la ricerca immediata dei file senza metadati viene migliorata a scapito della potenziale accuratezza dei file VBR privi di intestazioni. La ricerca dell'indice viene ora utilizzata come riserva se l'ipotesi CBR non è ricercabile (ad esempio per stream di lunghezza sconosciuta) (#2848).
    • MP4: elimina l'ambiguità tra i tipi MIME audio/mpeg (MP3), audio/mpeg-L1 e audio/mpeg-L2 controllando il valore del livello del primo campione prima di emettere un formato della traccia dall'estrattore (#2683).
    • MP4: miglioramento dell'efficienza di sniffing di file molto grandi supponendo che un box stbl più grande di 1 MB implichi che il file non deve essere frammentato (#2650).
    • MP4: è stato aggiunto il supporto per i metadati ©mvn (nome del movimento) e ©mvi (indice del movimento), che ora vengono emessi come oggetti TextInformationFrame in Format.metadata con ID rispettivamente MVNM e MVIN (#2754).
    • MP4: ignora le tracce con box stsd mancante (anziché non riuscire ad analizzare l'intero file).
    • Matroska: aggiunto il supporto per il rilevamento di DTS-HD (#6225).
    • Risolto un problema in MatroskaExtractor per cui la ricerca poteva essere imprecisa per i file con più tracce. I cue point ora sono associati correttamente alle rispettive tracce, il che consente una ricerca precisa.
    • MPEG-TS: correzione di IllegalArgumentException da ReorderingBufferQueue causato da pacchetti PES senza timestamp (#2764).
    • Aggiunta del supporto per l'estrazione di foto in movimento HEIC. HeifExtractor ora può analizzare i file HEIC contenenti tracce video e audio incorporate.
  • Inspector:
    • È stato introdotto un nuovo modulo :media3-inspector che funge da home page dedicata per le utilità di ispezione dei contenuti multimediali. Questo modulo ora contiene un nuovo androidx.media3.inspector.MetadataRetriever, che fornirà un'API unificata per l'estrazione di metadati e frame. La versione esistente androidx.media3.exoplayer.MetadataRetriever è ora deprecata a favore di questa nuova versione.
    • È stata introdotta androidx.media3.inspector.FrameExtractor, una nuova API pubblica per l'estrazione dei frame. Questa classe AutoCloseable consente di estrarre i frame con supporto per video HDR, effetti video e selezione del decoder personalizzato. Deve essere creata tramite il relativo Builder per un MediaItem specifico.
    • FrameExtractor: aggiungi getThumbnail() per estrarre un frame di miniatura rappresentativo da un file multimediale senza richiedere un timestamp specifico.
    • Aggiungi androidx.media3.inspector.MediaExtractorCompat, un sostituto diretto di android.media.MediaExtractor della piattaforma che fornisce un modo per estrarre campioni multimediali codificati non elaborati da un file multimediale. La classe androidx.media3.exoplayer.MediaExtractorCompat esistente è ora deprecata a favore di questa nuova classe.
  • Audio:
    • Rendi le istanze AudioProcessor consapevoli della ricerca.
    • Consenti l'inserimento della nuova interfaccia AudioOutputProvider in DefaultAudioSink.Builder per supportare i percorsi di output audio personalizzati. Il valore predefinito è AudioTrackAudioOutputProvider.
    • Gestisci le ricerche in GainProcessor.
    • Utilizza le funzionalità di livello e profilo del decoder AC-4 nella valutazione del supporto del formato della traccia (#2580).
    • Evita potenziali ritardi causati dalla gestione dei callback di modifica del routing all'inizio della riproduzione (#2646).
    • Consenti il riutilizzo dei codec per i formati EAC3, EAC3-JOC e AC-4 (#1346).
    • Aggiungi il supporto per i campioni PCM con virgola mobile in Sonic.
    • Aggiungi il supporto per i campioni PCM a 16 bit in ToFloatPcmAudioProcessor.
  • Video:
    • Disattiva il riutilizzo del codec per i contenuti Dolby-Vision con profili diversi.
    • È stata riattivata la soluzione alternativa per i punti di rendimento segnalati in modo errato per i codec sicuri (#2856).
  • Testo:
    • Risolto il problema di analisi dei sottotitoli CEA-6/708 nei contenuti Dolby Vision (#2775).
  • Immagine:
    • Risolto il problema di ScrubbingMode per cui il player si blocca durante lo scrubbing di una traccia di miniature DASH (#2815).
  • DRM:
    • Modifica il tipo restituito dei metodi MediaDrmCallback da byte[] a un nuovo tipo MediaDrmCallback.Response per consentire la restituzione di informazioni facoltative aggiuntive. Si tratta di una modifica che provoca un errore nell'origine, ma gli errori possono essere facilmente risolti eseguendo il wrapping del valore restituito byte[] precedente con new Response prima della restituzione.
    • Aggiungi informazioni chiave sulla richiesta, come URL e latenza, a AnalyticsListener.onDrmKeysLoaded (#1001).
    • Sposta i dati della richiesta di provisioning da un parametro URL al corpo della richiesta POST.
  • Effetto:
    • Aggiungi Presentation.copyWithUnsetSideRoundedTo per arrotondare il lato di output non impostato quando Presentation viene creato con una singola lunghezza del lato.
  • Muxer:
    • Aggiungi MediaMuxerCompat, un sostituto immediato del framework MediaMuxer.
    • Aggiungi MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo() per consentire la creazione di foto in movimento.
    • Aggiungi WebmMuxer per consentire il muxing degli stream multimediali OPUS, VORBIS, VP8 e VP9 in un formato file webm.
  • Estensione IMA:
    • Rimozione delle regole ProGuard personalizzate, in modo che le app possano utilizzare quelle rilasciate nell'archivio Android IMA.
    • Aggiunta di ImaServerSideAdInsertionUriBuilder.setNetworkCode, una nuova API per impostare il codice di rete Google Ad Manager per l'SDK IMA per gestire gli identificatori degli annunci come specificato nelle impostazioni di Google Ad Manager. I codici di rete sono facoltativi, ma consigliati per le richieste di stream Full service. Per trovare il codice di rete, consulta questo articolo.
    • Esegui l'upgrade della dipendenza IMA alla versione 3.37.0, che richiede l'attivazione del desugaring della libreria di base. Anche le app dipendenti devono attivare questa opzione. Consulta le note di configurazione di IMA. * Supporto delle opzioni UI personalizzate di IMA DAI nel generatore di URI SSAI. Le opzioni di UI personalizzata per l'inserimento di annunci lato server includono il supporto per il rendering di "Ignorabile" e "Su questo annuncio". La funzionalità è attualmente disponibile per i publisher selezionati in una lista consentita. Questa modifica esegue anche l'upgrade della versione dell'SDK IMA alla 3.38.0 (note di rilascio) per accedere all'API delle opzioni della UI personalizzata.
    • Risolto il problema per cui l'errore di preparazione dei contenuti dopo un annuncio veniva segnalato erroneamente come errore di riproduzione dell'annuncio (#2656).
  • Sessione:
    • Aggiungi un nuovo parametro a MediaSession.Callback.onPlaybackResumption per indicare se la chiamata avviene solo per raccogliere informazioni o per avviare la riproduzione (#1764).
    • Aggiorna MediaSession.ControllerInfo.isTrusted per dichiarare anche i controller della propria app come attendibili (#2542).
    • Aggiunta di MediaSessionService.triggerNotificationUpdate per attivare manualmente un aggiornamento delle notifiche (#1833).
    • Aggiungi ProgressListener ai metodi dei comandi personalizzati.
    • Modifica il valore predefinito di MediaLibrarySession.Builder.setLibraryErrorReplicationMode in non irreversibile.
    • Aggiunto un parametro Context a MediaButtonReceiver.onForegroundServiceStartNotAllowedException (#2625).
    • Leggi l'ID del controllo del volume dalla piattaforma PlaybackInfo anziché recuperarlo tramite binder. In questo modo, il tipo di riproduzione e l'ID del controllo del volume vengono letti in modo atomico e corrispondono tra loro.
    • È stato corretto un bug per cui gli eventi chiave ACTION_UP venivano esclusi prima di essere passati al callback per la gestione personalizzata. In questo modo, si ottiene la parità con ciò che faceva media1 e ciò che fa la piattaforma (#2637).
    • È stato corretto il bug per cui getCurrentTimeline() veniva chiamato da PlayerWrapper anche quando il comando non era disponibile (#2665).
    • Risolto un bug per cui un messaggio veniva lasciato nella coda dei messaggi del looper principale, causando una perdita di memoria dopo la chiusura del servizio (#2692).
    • Quando è connesso a un'app di sessione legacy con un MediaBrowser, i comandi personalizzati vengono inviati alla sessione solo se l'azione personalizzata viene pubblicizzata come azione personalizzata in PlaybackStateCompat della sessione legacy. Tutte le altre azioni personalizzate vengono inviate al servizio.
    • Implementato onAudioSessionIdChanged per notificare ai controller multimediali quando un ID sessione audio viene impostato dalla sessione (#244).
    • Risolto il bug per cui KEYCODE_HEADSETHOOK non avviava il player e l'evento chiave multimediale Intent arrivava in onStartCommand(). Il problema è stato risolto gestendo "KEYCODE_HEADSETHOOK" esattamente come KEYCODE_MEDIA_PLAY_PAUSE (#2816).
    • Risolto un bug per cui le dimensioni della superficie non venivano comunicate tra la sessione e il controller, causando l'impossibilità di applicare gli effetti video nella sessione demo. Se utilizzi un controller, questa potrebbe essere una modifica che provoca un errore se il tuo player non è in grado di gestire una chiamata setVideoSurfaceHolder.
    • Correzione della propagazione dei valori dei metadati CharSequence non String, come le stringhe con stile span (#2853).
    • Aggiungi CommandButton.executeAction in modo che i controller possano attivare più facilmente l'azione prevista. Consente inoltre di specificare i parametri per alcuni comandi del player e della sessione per definire l'azione da attivare.
    • Aggiungi la compatibilità con le versioni precedenti per le istanze CommandButton utilizzando Player.Command o SessionCommand non personalizzato per definire la loro azione. Ora questi vengono rappresentati correttamente nelle sessioni multimediali della piattaforma, ad esempio per la UI di sistema o Android Auto.
    • Risolto il problema per cui lo stesso Bitmap viene compresso più volte quando si connette un MediaController a una sessione multimediale della piattaforma.
  • UI:
    • Aggiungi la classe ProgressStateWithTickInterval e il composable rememberProgressStateWithTickInterval corrispondente al modulo media3-ui-compose. Questo contenitore di stato viene utilizzato in demo-compose per visualizzare la posizione e la durata correnti in formato di testo.
    • Aggiungi MuteButtonState a ui-compose che gestisce la disattivazione dell'audio del volume Player. Questo contenitore di stato viene utilizzato in demo-compose per visualizzare il pulsante di attivazione/disattivazione dell'audio.
    • Aggiungi le classi ProgressStateWithTickCount e il composable rememberProgressStateWithTickCount corrispondente al modulo media3-ui-compose. Questo contenitore di stato viene utilizzato in demo-compose per visualizzare l'avanzamento come barra di avanzamento orizzontale di sola lettura.
    • Aggiungi il componibile ContentFrame a media3-ui-compose, che combina la gestione di PlayerSurface con il ridimensionamento delle proporzioni e la copertura con un otturatore.
    • Risolto un bug noto della piattaforma API 34 che causava video allungati/ritagliati quando si utilizzava SurfaceView all'interno di un AndroidView di Compose e, di conseguenza, influiva sui composabili ContentFrame e PlayerSurface con SURFACE_TYPE_SURFACE_VIEW (#1237, #2811).
    • Crea un nuovo modulo media3-ui-compose-material3 e aggiungi i componibili con tema Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton).
    • Aggiungi il componibile TimeText a media3-ui-compose-material3 per visualizzare i progressi del player in formato testuale. Può essere configurato per mostrare la posizione corrente, la durata o il tempo rimanente.
    • Aggiungi il supporto per l'inserimento di un pulsante di route multimediale in PlayerView.
    • Utilizza BidiFormatter per visualizzare correttamente la punteggiatura nei sottotitoli di testo RTL (#11214).
  • Estensione HLS:
    • Analizza gli attributi di salto degli interstitial HLS.
    • Mappa gli attributi di controllo per saltare i contenuti dalla playlist HLS e dal documento dell'elenco degli asset in AdPlaybackState per l'accesso pubblico.
    • Risolto il bug per cui l'ora di inizio della playlist veniva eliminata quando il tag EXT-X-PROGRAM-START-DATE che definiva la data di inizio veniva rimosso da una playlist (#2760).
    • Utilizza la ricerca binaria per trovare l'indice del segmento di una determinata posizione nella playlist (#2826).
    • Aggiungi HlsInterstitialsAdsLoader.skipCurrentAd() e skipCurrentAdGroup() e i metodi corrispondenti per saltare gli annunci e i gruppi di annunci per indice.
    • Aggiungi HlsInterstitialsAdsLoader.Listener.onAdStarted per segnalare l'inizio di un periodo dell'annuncio (#2859).
    • Accetta lo spazio come separatore di data/ora nelle stringhe di data/ora ISO 8601.
    • Gestisci correttamente il recupero del chunk successivo per un HlsMediaPlaylist senza segmenti (#2821).
    • Utilizza la posizione iniziale predefinita per i pre-roll con i live streaming.
  • Estensione DASH:
    • Risolto il problema UnsupportedOperationException durante la riproduzione di stream DASH con un URI manifest data: non gerarchico (#2688).
    • Reimposta LiveConfiguration sul valore fornito da MediaItem di DashMediaSource quando viene rilasciato e quando l'elemento multimediale viene aggiornato dall'utente (#2606).
    • Evita gli arresti anomali causati da aggiornamenti del manifest non validi che non sono stati segnalati come errori del player (#2805).
  • Estensione RTSP:
    • Gestione dell'errore di pacchetti RTP mancanti durante l'elaborazione di unità NAL frammentate per H264 e H265 (#2613).
  • Estensioni del decoder (FFmpeg, VP9, AV1 e così via):
    • Estensione AV1: il decodificatore software AV1 ora utilizza la libreria dav1d ad alte prestazioni, sostituendo la precedente implementazione libgav1 per una maggiore velocità di decodifica.
    • Estensione FFmpeg: è stato risolto un problema che impediva la riproduzione di alcuni file FLAC assicurando che il blocco STREAMINFO venga analizzato e passato correttamente al decodificatore (#2887).
  • Estensione Cast:
    • Aggiungi CastPlayer.Builder, che consente a CastPlayer di eseguire la riproduzione sia locale sia tramite Cast. Per mantenere il comportamento precedente di CastPlayer, che supporta solo la riproduzione di Cast, puoi utilizzare RemoteCastPlayer. I costruttori CastPlayer preesistenti mantengono il loro comportamento precedente, ma sono deprecati a favore dell'utilizzo dei builder CastPlayer o RemoteCastPlayer.
    • Interrompi l'applicazione di un tipo MIME non nullo in DefaultMediaItemConverter.
    • Utilizza MediaItem.mediaMetadata.mediaType per dedurre il MEDIA_TYPE di trasmissione da utilizzare in DefaultCastOptionsProvider#toMediaQueueItem, se disponibile.
    • Abilita i trasferimenti da remoto a locale in DefaultCastOptionsProvider.
    • Aggiungi il supporto di Cast nella demo della sessione.
    • Aggiungi il supporto per la visualizzazione di un pulsante di route multimediale su una UI componibile.
    • Aggiungi il supporto per la visualizzazione di un pulsante di route multimediale in un menu della barra delle azioni.
    • Aggiungi il supporto per la visualizzazione di un pulsante di route multimediale come UI di visualizzazione.
  • Utilità di test:
    • Aggiungi la differenza di tempo massima per il comportamento di avanzamento automatico di FakeClock. Il valore predefinito è 1 secondo, ma è configurabile tramite FakeClock.Builder.
    • Aggiungi la differenza di tempo massima tra i messaggi per RobolectricUtil.runMainLooperUntil (e runLooperUntil). Il valore predefinito è 1 secondo, ma è configurabile tramite i nuovi overload di questi metodi.
    • Trasferisci CapturingRenderersFactory da test-utils a test-utils-robolectric.
  • Rimuovi i simboli deprecati:
    • Rimuovi il costruttore DefaultPreloadManager deprecato. Usa invece DefaultPreloadManager.Builder.
    • Rimossi i costruttori EditedMediaItemSequence deprecati. Usa invece EditedMediaItemSequence.Builder.
    • Rimuovi BitmapFactoryImageDecoder.BitmapDecoder. Usa invece ExternallyLoadedImageDecoder.
    • Rimuovi ShadowMediaCodecConfig.forAllSupportedMimeTypes() deprecato. Usa invece il descrittore ShadowMediaCodecConfig.withAllDefaultSupportedCodecs().
    • Rimuovi ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes() deprecato. Usa invece ShadowMediaCodecConfig.withNoDefaultSupportedCodecs().

1.9.0-rc01

1° dicembre 2025

Utilizza la versione stabile 1.9.0.

1.9.0-beta01

20 novembre 2025

Utilizza la versione stabile 1.9.0.

1.9.0-alpha01

22 ottobre 2025

Utilizza la versione stabile 1.9.0.

Versione 1.8.0

1.8.1

21 maggio 2026

La versione 1.8.1 contiene i seguenti commit.

  • Effetto:
    • Imposta esplicitamente GL_DRAW_BUFFER e GL_READ_BUFFER quando esegui la transizione da un contesto senza superficie.

Versione 1.8.0

30 luglio 2025

La versione 1.8.0 contiene questi commit.

  • Libreria comune:
    • Aggiungi il supporto per la sostituzione del player in ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Aggiunto il getter per la modalità shuffle all'interfaccia ExoPlayer (#2522).
    • Genera un'eccezione in modo più chiaro se si accede a DefaultAudioSink da più thread. Se ciò accade a causa di una chiamata a RendererCapabilities.getFormatSupport all'esterno del player, assicurati di chiamare questo metodo sullo stesso thread del thread di riproduzione di ExoPlayer o utilizza un'istanza diversa da quella utilizzata per la riproduzione (#1191).
    • È stato corretto il bug per cui i formati audio non stereo sulle TV potevano essere contrassegnati come non supportati da DefaultTrackSelector.
    • Assicurati che l'ultimo frame venga visualizzato correttamente quando utilizzi il flag DECODE_ONLY di MediaCodec (attivato per impostazione predefinita in modalità di scrubbing).
    • Aggiunto il supporto per l'utilizzo dell'ID dispositivo virtuale da Context passato a ExoPlayer.Builder.
    • Attiva la programmazione dinamica per impostazione predefinita in modalità di scrubbing.
    • Evita il ricaricamento non necessario di un'origine quando cerchi la fine di un elemento.
    • Utilizza MediaCodec.BUFFER_FLAG_DECODE_ONLY per impostazione predefinita in modalità di scrubbing.
    • Genera IllegalStateException quando PreloadMediaSource viene riprodotto da un ExoPlayer con un thread di riproduzione diverso dal thread di precaricamento (#2495).
    • Aggiunta di cloneAndMove a ShuffleMode con un'implementazione predefinita (#2226).
    • Modifica il comportamento predefinito di Renderer.getMinDurationToProgressUs per restituire un valore maggiore se non è richiesta alcuna chiamata a render.
    • Correzione di un bug per cui la pianificazione interna ritardava l'ultimo frame durante la ricerca della fine durante la pausa. Per il momento, la correzione di bug ha effetto solo se ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled è abilitato.
    • Aggiungi il metodo ExoPlayer.setScrubbingModeEnabled(boolean). In questo modo, il player viene ottimizzato per molte ricerche frequenti (ad esempio, un utente che trascina una barra di scorrimento). Il comportamento della modalità di scrubbing può essere personalizzato con setScrubbingModeParameters(..) su ExoPlayer e ExoPlayer.Builder.
    • Consenti la personalizzazione della tolleranza di ricerca frazionaria in modalità di scrubbing.
    • Aumenta la frequenza operativa del codec in modalità di scrubbing.
    • Risolto un bug per cui gli errori di preparazione nei contenuti di AdsMediaSource potrebbero non essere mai segnalati (#2337).
    • Risolto un problema di perdita di memoria in MergingMediaSource, ad esempio quando si caricano i sottotitoli tramite sideload (#2338).
    • Consenti a CmcdConfiguration.Factory di restituire null per disattivare il logging CMCD per elementi multimediali specifici (#2386).
    • Aumentata la dimensione predefinita del buffer delle immagini da 128 kB (errore di copia-incolla dalle tracce di testo) a 26 MB, sufficiente per immagini Ultra HDR da 50 MP (#2417).
    • Aggiungi PreCacheHelper che consente alle app di pre-memorizzare nella cache un singolo contenuto multimediale con posizione di inizio e durata specificate.
    • Aggiungi il supporto del precaricamento da una posizione specificata in DefaultPreloadManager.
  • Transformer:
    • Aggiungi CodecDbLite che consente ottimizzazioni specifiche del chipset delle impostazioni di codifica video.
    • Aggiungi il flag setEnableCodecDbLite a DefaultEncoderFactory per attivare l'ottimizzazione delle impostazioni di CodecDB Lite. Per impostazione predefinita, questo flag è impostato su false.
    • Per riempire un gap iniziale (aggiunto tramite addGap()) con audio silenzioso, ora è necessario impostare esplicitamente experimentalSetForceAudioTrack(true) in EditedMediaItemSequence.Builder. Se l'interruzione si trova al centro della sequenza, questo flag non è obbligatorio.
    • Sposta l'interfaccia Muxer da media3-transformer a media3-muxer.
    • Rendi obbligatoria l'impostazione MediaItem.Builder().setImageDuration(long) per importare un elemento multimediale come immagine.
    • Aggiungi Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean) che include un elenco di modifiche MP4 durante il taglio per indicare ai player di ignorare i campioni tra il keyframe prima del punto di inizio del taglio e il punto di inizio del taglio.
    • Aggiorna l'app Composition Demo per utilizzare Kotlin e Jetpack Compose e aggiungi un VideoCompositorSettings personalizzato per disporre le sequenze in un layout 2x2 o PiP.
  • Estrattori:
    • Analizza i metadati dai file MP4 frammentati (#2084).
    • JPEG: è stato aggiunto il supporto delle foto in movimento che non hanno un segmento Exif all'inizio (#2552).
    • Aggiunto il supporto per la ricerca in MP4 frammentati con più atomi sidx. Questo comportamento può essere attivato utilizzando il flag FLAG_MERGE_FRAGMENTED_SIDX su FragmentedMp4Extractor (#9373).
    • Ignora le tabelle di ricerca vuote nei file FLAC (incluse quelle contenenti solo punti di ricerca segnaposto) e torna alla ricerca binaria se la durata del file è nota (#2327).
    • È stata corretta l'analisi delle unità SEI H.265 per ignorare completamente i tipi SEI non riconosciuti (#2456).
    • Aggiorna WavExtractor per utilizzare i dati SubFormat dell'estensione dell'intestazione per il formato audio durante l'analisi di un file di tipo WAVE_FORMAT_EXTENSIBLE.
    • MP4: aggiunta del supporto per i box ipcm e fpcm che definiscono tracce audio PCM non elaborate (il PCM in virgola mobile a 64 bit non è supportato).
    • MP4: gestisci la parte di rotazione delle matrici di trasformazione tkhd che ruotano e riflettono il video. In questo modo, i video riflessi acquisiti dalla fotocamera anteriore dell'iPhone vengono visualizzati con l'orientamento corretto, ma con un riflesso errato sull'asse Y (#2012).
    • MP3: utilizza la durata e le dimensioni dei dati dei metadati Xing, VBRI e simili con velocità in bit variabile non ricercabili quando si torna alla ricerca con velocità in bit costante a causa di FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194).
  • Audio:
    • È stato corretto il bug per cui AnalyticsListener.onAudioPositionAdvancing non viene chiamato quando la riproduzione audio viene avviata molto vicino alla fine dei contenuti multimediali.
    • Aggiungi il supporto di tutti i formati di campionamento PCM lineare in ChannelMappingAudioProcessor e TrimmingAudioProcessor.
    • Aggiungi il supporto per le interruzioni audio in CompositionPlayer.
    • Rimuovi la chiamata spuria a BaseAudioProcessor#flush() da BaseAudioProcessor#reset().
    • Consenti l'upmixing/downmixing della potenza costante in DefaultAudioMixer.
    • Rendi pubblici ChannelMappingAudioProcessor, TrimmingAudioProcessor e ToFloatPcmAudioProcessor (#2339).
    • Utilizza AudioTrack#getUnderrunCount() in AudioTrackPositionTracker per rilevare gli underrun in DefaultAudioSink anziché la stima best-effort.
    • Miglioramento della fluidità del timestamp audio per la deviazione imprevista della posizione dal dispositivo di output audio.
    • Correzione di un bug per cui la sincronizzazione audio/video non funziona per i primi 10 secondi dopo la ripresa dalla pausa quando il dispositivo è connesso a dispositivi Bluetooth.
    • Correzione di un bug per cui AnalyticsListener.onAudioPositionAdvancing non segnalava l'ora in cui l'audio iniziava ad avanzare, ma l'ora della prima misurazione.
    • Risolto il problema relativo al ripristino dell'audio multicanale dopo il fallback all'audio stereo su alcuni dispositivi (#2258).
  • Video:
    • Estensione della soluzione alternativa per la superficie scollegata ai dispositivi "lenovo" e "motorola" (#2059).
    • Miglioramento del rilascio fluido dei frame video all'avvio quando i sample audio non iniziano esattamente nella posizione richiesta.
    • Estensione della soluzione alternativa per la superficie scollegata ai dispositivi "realme" (#2059).
    • Aggiungi l'API ExoPlayer sperimentale per includere il flag MediaCodec.BUFFER_FLAG_DECODE_ONLY durante l'accodamento dei buffer di input di sola decodifica. Questo flag indica al decoder di saltare i buffer di sola decodifica, velocizzando così la ricerca. Attivalo con DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Migliorare i controlli delle prestazioni dei codec video software. Ciò potrebbe comportare il contrassegno di alcune tracce aggiuntive come EXCEEDS_CAPABILITIES.
    • Risolti gli errori di riproduzione di Widevine VP9 su alcuni dispositivi (#2408).
  • Testo:
    • Aggiunto il supporto delle tracce VobSub nei file MP4 (#2510).
    • Risolto un problema di blocco della riproduzione quando un segmento di sottotitoli inizialmente non viene caricato e poi viene caricato correttamente, seguito da diversi segmenti di sottotitoli vuoti (#2517).
    • Correzione di SSA e SubRip per visualizzare un cue in corso quando si attivano i sottotitoli (#2309).
    • Risolto il problema per cui la riproduzione si bloccava quando si passava da uno stream con un errore dei sottotitoli a un live streaming con una traccia dei sottotitoli vuota (#2328).
    • Risolto il problema dei sottotitoli CEA-608 confusi durante la riproduzione di stream H.262 contenenti frame B (#2372).
    • Aggiungi il supporto per i sottotitoli SSA con CodecId = S_TEXT/SSA nei file Matroska. In precedenza, MatroskaExtractor supportava solo CodecId = S_TEXT/ASS, che rappresenta la variante "avanzata" (v4+) dei sottotitoli SubStation Alpha (ma la logica di analisi di ExoPlayer è la stessa per entrambe le varianti) (#2384).
    • Aggiunta del supporto della proprietà layer nei file di sottotitoli SubStation Alpha (SSA), che viene utilizzata per definire l'ordine di visualizzazione dei cue quando ne vengono mostrati più di uno sullo schermo contemporaneamente (#2124).
  • Metadati:
    • Aggiunto il supporto per il recupero della durata dei contenuti multimediali e di Timeline a MetadataRetriever ed eseguita la migrazione a un'API AutoCloseable basata su istanze. Utilizza il nuovo Builder per creare un'istanza per un MediaItem, quindi chiama retrieveTrackGroups(), retrieveTimeline() e retrieveDurationUs() per ottenere ListenableFuture per i metadati. I metodi statici precedenti sono ora deprecati (#2462).
  • Immagine:
    • Limita le bitmap decodificate alle dimensioni di visualizzazione in BitmapFactoryImageDecoder per evitare l'arresto anomalo di un'app con Canvas: trying to draw too large bitmap. da PlayerView quando provi a visualizzare immagini molto grandi (ad es. 50 MP).
    • Modifica la firma di DefaultRenderersFactory.getImageDecoderFactory() in modo che accetti un parametro Context.
    • Allinea la dimensione massima dell'output bitmap utilizzata in CompositionPlayer con quella già utilizzata in Transformer (ovvero CompositionPlayer non considera le dimensioni del display durante la decodifica delle bitmap, a differenza di ExoPlayer).
  • DRM:
    • Aggiunto un nuovo overload di OfflineLicenseHelper.newWidevineInstance che accetta un MediaItem.DrmConfiguration in modo che le intestazioni delle richieste HTTP possano essere applicate correttamente (#2169).
  • Effetto:
    • Aggiungi Presentation.createForShortSide(int) che crea un Presentation che garantisce che il lato più corto corrisponda sempre al valore specificato, indipendentemente dall'orientamento dell'input.
  • Muxer:
    • È stato corretto un bug per cui non venivano impostati i flag di campionamento corretti per i campioni audio in MP4 frammentato.
    • L'API writeSampleData() ora utilizza la classe BufferInfo specifica del muxer anziché MediaCodec.BufferInfo.
    • Aggiungi Muxer.Factory#supportsWritingNegativeTimestampsInEditList, che per impostazione predefinita è false.
  • Estensione IMA:
    • Risolto un bug per cui un errore di caricamento in un annuncio poteva invalidare accidentalmente un altro gruppo di annunci.
    • Correzione di un bug per cui i gruppi di annunci dopo la fine di una finestra VOD bloccavano la riproduzione. I gruppi di annunci con un'ora di inizio successiva alla finestra non vengono più inseriti nella coda di MediaPeriodQueue (#2215).
  • Sessione:
    • È stato corretto il bug per cui le connessioni da controller Media3 di terze parti non privilegiati venivano ignorate.
    • Rimuovi il controllo dei comandi disponibili quando invii comandi personalizzati a un MediaBrowserServiceCompat legacy. Questo comportamento è analogo a quello dei controller/browser legacy quando sono connessi a un'app legacy.
    • Risolto un bug che causava l'errato trattamento del primo errore di riproduzione di un player come eccezione personalizzata persistente. In questo modo, l'applicazione non può essere ripristinata.
    • È stato corretto il bug per cui alcune modifiche del controller non gestite dalla sessione potevano causare IllegalStateExceptions.
    • Risolto un bug per cui le azioni del controller non gestite dalla sessione potevano lasciare il controller in uno stato non valido.
    • Risolto l'avviso di violazione di avvio non sicuro di StrictMode (#2330).
    • Risolto un bug per cui la chiamata a setSessionExtras dal thread principale quando il player veniva eseguito da un thread dell'applicazione diverso dal thread principale causava un IllegalStateException (#2265).
    • Non mostrare automaticamente una notifica se un player è configurato con elementi multimediali senza prepararli o riprodurli (#2423https://github.com/androidx/media/issues/2423). Questo comportamento è configurabile tramite MediaSessionService.setShowNotificationForIdlePlayer.
    • Aggiungi PlaybackException personalizzati per tutti i controller o per quelli selezionati.
    • Risolto un bug per cui la ricerca in un live streaming su un MediaController può causare un IllegalArgumentException.
    • Per i live streaming, interrompi la pubblicazione di una posizione di riproduzione e la possibilità di cercare nell'elemento corrente per i controller multimediali della piattaforma, per evitare artefatti di posizione nell'interfaccia utente di Android Auto (e in altri controller che utilizzano queste informazioni dalla sessione multimediale della piattaforma) (#1758).
    • Risolto un bug per cui il passaggio di un valore null in getLibraryRoot di un MediaBrowser collegato a un MediaBrowserServiceCompat legacy produceva un NullPointerException.
    • Risolto un bug per cui l'invio di azioni personalizzate, un risultato di ricerca o una richiesta getItem causava l'arresto anomalo dell'app della sessione precedente con un ClassNotFoundException.
    • È stato corretto un bug per cui MediaItem.LocalConfiguration.uri veniva condiviso con MediaMetadata delle sessioni della piattaforma. Per condividere intenzionalmente un URI per consentire ai controller di richiedere nuovamente i contenuti multimediali, imposta MediaItem.RequestMetadata.mediaUri.
  • UI:
    • Risolto il bug per cui PlayerSurface all'interno di componenti riutilizzabili come LazyColumn non funzionava correttamente (#2493).
    • È stato corretto un bug di Compose che causava un intervallo tra l'impostazione degli stati iniziali dei pulsanti e l'osservazione della modifica dello stato (ad esempio, le forme delle icone o l'attivazione). Ora vengono rilevate tutte le modifiche apportate al Player al di fuori del periodo di osservazione (#2313).
    • Aggiungi contenitori di stato e componibili al modulo media3-ui-compose per SeekBackButtonState e SeekForwardButtonState.
    • Aggiungi il supporto per la modalità di scrubbing di ExoPlayer a PlayerControlView. Se attivata, questa opzione attiva la modalità di scrubbing del player quando l'utente inizia a trascinare la barra di scrubbing, invia una chiamata player.seekTo per ogni movimento e poi esce dalla modalità di scrubbing quando il tocco viene sollevato dallo schermo. Questa integrazione può essere attivata con time_bar_scrubbing_enabled = true in XML o con il metodo setTimeBarScrubbingEnabled(boolean) da Java/Kotlin.
    • Fai in modo che PlayerSurface accetti un argomento Player che ammette valori null.
  • Download:
    • Aggiungi il supporto per il download parziale per gli stream progressivi. Le app possono preparare uno stream progressivo con DownloadHelper e richiedere un DownloadRequest all'helper specificando le posizioni di inizio e fine dei contenuti multimediali basati sul tempo che il download deve coprire. L'oggetto DownloadRequest restituito contiene l'intervallo di byte risolto, con cui è possibile creare un oggetto ProgressiveDownloader e scaricare i contenuti di conseguenza.
    • Aggiungi DownloadHelper.Factory con cui vengono sostituiti i metodi DownloadHelper.forMediaItem() statici.
    • Aggiungi Factory per le implementazioni di SegmentDownloader.
    • Aggiungi il supporto del download parziale per gli stream adattivi. Le app possono preparare uno stream adattivo con DownloadHelper e richiedere un DownloadRequest all'helper specificando le posizioni di inizio e fine dei contenuti multimediali basati sul tempo che il download deve coprire. L'oggetto DownloadRequest restituito contiene l'intervallo di tempo risolto, con cui è possibile creare un oggetto SegmentDownloader concreto e scaricare i contenuti di conseguenza.
  • Estensione Cronet:
    • Aggiunta della gestione automatica dei cookie (#5975).
  • Estensione HLS:
    • Risolto il bug per cui HlsSampleStreamWrapper tenta di eseguire la ricerca all'interno del buffer quando non sono disponibili chunk nel buffer #2598.
    • Risolto il bug per cui le modifiche alla selezione della traccia dopo il caricamento di parti a bassa latenza e i suggerimenti di precaricamento possono causare il blocco o l'interruzione della riproduzione (#2299).
    • Evita ricaricamenti eccessivi attendendo metà della durata target quando CAN-BLOCK-RELOAD=YES non viene rispettato dal server (#2317).
    • È stato corretto un bug per cui la riproduzione si bloccava quando veniva avviato uno stream di interstitial prima di un mid-roll e veniva tentata la risoluzione dell'elenco di asset per l'annuncio sbagliato (#2558).
    • Risolto il problema di analisi della playlist per accettare \f (avanzamento modulo) nei valori degli attributi delle stringhe tra virgolette (#2420).
    • Supporto dell'aggiornamento degli interstitial con lo stesso ID (#2427).
    • È stato corretto il bug per cui a volte gli errori di caricamento della playlist non vengono propagati quando un live streaming esaurisce i segmenti da caricare (#2401https://github.com/androidx/media/issues/2401).
    • Raggruppa le rappresentazioni dei sottotitoli per tag NAME, in modo simile a come sono già raggruppate le rappresentazioni audio (#1666).
    • Supporta X-ASSET-LIST e i live streaming con HlsInterstitialsAdsLoader.
  • Estensione DASH:
    • Risolto un problema per cui il set di adattamento per la riproduzione rapida veniva unito al set di adattamento principale per formare un TrackGroup non valido (#2148).
    • Risolto un bug per cui l'abbreviazione della durata di un periodo DASH può generare un'eccezione quando i campioni oltre la nuova durata sono già stati letti dalla pipeline di rendering (#2440).
    • È stato corretto un bug per cui il reindirizzamento non veniva seguito quando venivano utilizzati i parametri di query CMCD (#2475).
  • Estensione RTSP:
    • Aggiunto il supporto per il pacchetto di aggregazione RTP per H265 in conformità con RFC 7798#4.4.2 (#2413).
    • Correzione di RtspClient per utilizzare l'URI della località come fornito durante l'elaborazione di una risposta HTTP 302 (#2398).
    • Aggiunto il supporto per l'analisi di SessionDescriptions contenenti righe con caratteri di spazio vuoto finali (#2357).
  • Estensioni del decoder (FFmpeg, VP9, AV1 e così via):
    • Correzione del bug per cui DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange non ha effetto per le estensioni del decodificatore audio (#2258).
  • Estensione Cast:
    • Aggiunto il supporto di setVolume() e getVolume() (#2279).
    • Impedisci a CastPlayer di attivare lo stato STATE_BUFFERING quando la sequenza temporale è vuota.
    • Aggiunto il supporto di getDeviceVolume(), setDeviceVolume(), getDeviceMuted() e setDeviceMuted() (#2089).
  • Utilità di test:
    • Aggiungi advance(player).untilPositionAtLeast e untilMediaItemIndex a TestPlayerRunHelper per far avanzare il player fino a raggiungere una posizione specificata. Nella maggior parte dei casi, questi metodi sono più affidabili dei metodi untilPosition e untilStartOfMediaItem esistenti.
    • Sposta FakeDownloader nel modulo test-utils-robolectric per riutilizzarlo in altri test.
    • transformer.TestUtil.addAudioDecoders(String...), transformer.TestUtil.addAudioEncoders(String...) e transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...) rimosse. Utilizza invece ShadowMediaCodecConfig per configurare i codificatori e i decodificatori shadow.
    • Sostituito il prefisso "exotest" con "media3" nei nomi dei codec segnalati da ShadowMediaCodecConfig.
  • Rimuovi i simboli deprecati:
    • Rimosso il costruttore SegmentDownloader deprecato SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) e i costruttori corrispondenti nelle relative sottoclassi DashDownloader, HlsDownloader e SsDownloader.
    • Player.hasNext(), Player.hasNextWindow() deprecati rimossi. Usa invece Player.hasNextMediaItem().
    • Player.next() deprecato rimosso. Usa invece Player.seekToNextMediaItem().
    • Player.seekToPreviousWindow() deprecato rimosso. Usa invece Player.seekToPreviousMediaItem().
    • Player.seekToNextWindow() deprecato rimosso. Usa invece Player.seekToNextMediaItem().
    • Rimosso BaseAudioProcessor deprecato nel modulo exoplayer. Utilizza BaseAudioProcessor nel modulo common.
    • Rimuovi il costruttore MediaCodecVideoRenderer deprecato MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider).

Versione 1.8.0-rc02

24 luglio 2025

Utilizza la versione stabile 1.8.0.

Versione 1.8.0-rc01

16 luglio 2025

Utilizza la versione stabile 1.8.0.

Versione 1.8.0-beta01

2 luglio 2025

Utilizza la versione stabile 1.8.0.

Versione 1.8.0-alpha01

19 maggio 2025

Utilizza la versione stabile 1.8.0.

Versione 1.7.0

Versione 1.7.1

16 maggio 2025

Questa release ha lo stesso codice della versione 1.6.1 e viene rilasciata per garantire che venga visualizzata come una release "più recente" rispetto alla versione 1.7.0, che era una release alpha contrassegnata accidentalmente come stabile (vedi di seguito).

Versione 1.7.0

16 maggio 2025

Questa release avrebbe dovuto essere 1.7.0-alpha01, ma è stata accidentalmente taggata come 1.7.0 (ovvero stabile) su maven.google.com. Non utilizzarla. Rimani sulla versione 1.6.1 o esegui l'upgrade alla versione 1.7.1 (che ha lo stesso codice della versione 1.6.1).

Versione 1.6.0

1.6.1

14 aprile 2025

androidx.media3:media3-*:1.6.1 è stato rilasciato. La versione 1.6.1 contiene questi commit.

  • Libreria comune:
    • Aggiunto il metodo PlaybackParameters.withPitch(float) per copiare facilmente un PlaybackParameters con un nuovo valore pitch (#2257).
  • ExoPlayer:
    • Risolto il problema per cui la transizione dell'elemento multimediale non andava a buon fine a causa di un errore del renderer recuperabile durante l'inizializzazione dell'elemento multimediale successivo (#2229).
    • Risolto il problema per cui ProgressiveMediaPeriod genera un IllegalStateException quando PreloadMediaSource tenta di chiamare il relativo getBufferedDurationUs() prima che sia pronto (#2315).
    • Risolto il problema relativo all'invio di CmcdData nelle richieste di manifest per DASH, HLS e SmoothStreaming (#2253).
    • Assicurati che AdPlaybackState.withAdDurationsUs(long[][]) possa essere utilizzato dopo la rimozione dei gruppi di annunci. L'utente deve comunque passare un array di durate per i gruppi di annunci rimossi, che può essere vuoto o nullo (#2267).
  • Estrattori:
    • MP4: analizza alternate_group dalla casella tkhd ed esponilo come voce Mp4AlternateGroupData nella Format.metadata di ogni traccia (#2242).
  • Audio:
    • Risolto il problema di offload per cui la posizione poteva bloccarsi durante la riproduzione di una playlist di contenuti brevi (#1920).
  • Sessione:
    • Riduci il timeout di aggregazione per i callback della piattaforma MediaSession da 500 a 100 millisecondi e aggiungi un setter sperimentale per consentire alle app di configurare questo valore.
    • Risolto il problema per cui le notifiche riapparivano dopo essere state ignorate dall'utente (#2302).
    • Risolto un bug per cui la sessione restituiva una cronologia con un singolo elemento quando il player con wrapping era effettivamente vuoto. Questo accadeva quando il player con wrapping non aveva COMMAND_GET_TIMELINE disponibile, mentre COMMAND_GET_CURRENT_MEDIA_ITEM era disponibile e il player con wrapping era vuoto (#2320).
    • È stato corretto un bug per cui la chiamata di MediaSessionService.setMediaNotificationProvider veniva ignorata senza avvisi dopo altre interazioni con il servizio, ad esempio setForegroundServiceTimeoutMs (#2305).
  • UI:
    • Abilita PlayerSurface per lavorare con ExoPlayer.setVideoEffects e CompositionPlayer.
    • Risolto il bug per cui PlayerSurface non può essere ricomposto con un nuovo Player.
  • Estensione HLS:
    • Risolto il problema per cui la durata del chunk non veniva impostata in CmcdData per i contenuti multimediali HLS, causando un errore di asserzione durante l'elaborazione di segmenti multimediali criptati (#2312).
  • Estensione RTSP:
    • Aggiunto il supporto per l'URI con schema RTSPT come modo per configurare la sessione RTSP per l'utilizzo di TCP (#1484).
  • Estensione Cast:
    • Aggiunto il supporto per i metadati delle playlist (#2235).

1.6.0

26 marzo 2025

androidx.media3:media3-*:1.6.0 è stato rilasciato. La versione 1.6.0 contiene questi commit.

  • Libreria comune:
    • Aggiungi AudioManagerCompat e AudioFocusRequestCompat per sostituire le classi equivalenti in androidx.media.
    • Esegui l'upgrade di Kotlin dalla versione 1.9.20 alla versione 2.0.20 e utilizza il plug-in Gradle del compilatore Compose. Esegui l'upgrade della libreria KotlinX Coroutines dalla versione 1.8.1 alla versione 1.9.0.
    • Rimuovi il metodo Format.toBundle(boolean excludeMetadata) e utilizza Format.toBundle().
    • Risolto un bug in SimpleBasePlayer per cui l'impostazione di un nuovo currentMediaItemIndex in State dopo setPlaylist con null MediaMetadata non rivaluta i metadati (#1940).
    • Modifica l'accesso a SimpleBasePlayer.State da protetto a pubblico per semplificare la gestione degli aggiornamenti in altre classi (#2128).
  • ExoPlayer:
    • Aggiungi MediaExtractorCompat, una nuova classe che fornisce funzionalità equivalenti alla piattaforma MediaExtractor.
    • Aggiungi il supporto sperimentale per il preriscaldamento di "ExoPlayer" per la riproduzione utilizzando MediaCodecVideoRenderer. Puoi configurare DefaultRenderersFactory tramite experimentalSetEnableMediaCodecVideoRendererPrewarming per fornire un MediaCodecVideoRenderer secondario a ExoPlayer. Se l'opzione è attiva, ExoPlayer pre-elabora il video degli elementi multimediali consecutivi durante la riproduzione per ridurre la latenza di transizione degli elementi multimediali.
    • Riduci i valori predefiniti per bufferForPlaybackMs e bufferForPlaybackAfterRebufferMs in DefaultLoadControl rispettivamente a 1000 e 2000 ms.
    • Inizializza DeviceInfo e il volume del dispositivo in modo asincrono (se attivato utilizzando setDeviceVolumeControlEnabled). Questi valori non sono disponibili immediatamente dopo ExoPlayer.Builder.build() e Player.Listener notifica le modifiche tramite onDeviceInfoChanged e onDeviceVolumeChanged.
    • L'ID sessione audio iniziale non è più immediatamente disponibile dopo la creazione del player. Se necessario, puoi utilizzare AnalyticsListener.onAudioSessionIdChanged per ascoltare l'aggiornamento iniziale.
    • Tieni conto della lingua quando selezioni una traccia video. Per impostazione predefinita, seleziona una traccia video "principale" che corrisponda alla lingua della traccia audio selezionata, se disponibile. Le preferenze esplicite sulla lingua dei video possono essere espresse con TrackSelectionParameters.Builder.setPreferredVideoLanguage(s).
    • Aggiungi il parametro selectedAudioLanguage al metodo DefaultTrackSelector.selectVideoTrack().
    • Aggiungi il parametro retryCount a MediaSourceEventListener.onLoadStarted e ai metodi MediaSourceEventListener.EventDispatcher corrispondenti.
    • Risolto un bug per cui gli elementi o i periodi della playlist negli stream DASH multiperiodo con durate che non corrispondono ai contenuti effettivi potevano causare il blocco dei frame alla fine dell'elemento (#1698).
    • Sposta BasePreloadManager.Listener in un PreloadManagerListener di primo livello.
    • RenderersFactory.createSecondaryRenderer può essere implementato per fornire renderer secondari per il preriscaldamento. Il pre-warming consente transizioni più rapide degli elementi multimediali durante la riproduzione.
    • Attiva l'invio di CmcdData per le richieste di manifest nei formati di streaming adattivo DASH, HLS e SmoothStreaming (#1951).
    • Fornisci MediaCodecInfo del codec che verrà inizializzato in MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • Modifica AdsMediaSource per consentire l'espansione di AdPlaybackStates aggiungendo gruppi di annunci. Le modifiche non valide vengono rilevate e generano un'eccezione.
    • Risolto il problema per cui potrebbero essere visualizzati frame aggiuntivi di sola decodifica in rapida successione durante la transizione ai contenuti multimediali dopo un annuncio mid-roll.
    • Fai in modo che DefaultRenderersFactory aggiunga due istanze MetadataRenderer per consentire alle app di ricevere due schemi diversi di metadati per impostazione predefinita.
    • Rivalutare se il caricamento in corso di un chunk deve essere annullato quando la riproduzione è in pausa (#1785).
    • Aggiunta dell'opzione a ClippingMediaSource per consentire il clipping nei contenuti multimediali non ricercabili.
    • Risolto un bug per cui la ricerca con preriscaldamento poteva bloccare la transizione dell'elemento multimediale successivo.
    • Correzione di un bug per cui ExoPlayer.isLoading() rimane true mentre è passato a STATE_IDLE o STATE_ENDED (#2133).
    • Aggiunta di lastRebufferRealtimeMs a LoadControl.Parameter (#2113).
  • Transformer:
    • Aggiungi il supporto per il transmuxing in formati alternativi compatibili con le versioni precedenti.
    • Aggiungi il supporto per la transcodifica e il transmuxing del formato Dolby Vision (profilo 8).
    • Aggiorna i parametri di VideoFrameProcessor.registerInputStream e VideoFrameProcessor.Listener.onInputStreamRegistered per utilizzare Format.
    • Genera metadati statici HDR quando utilizzi DefaultEncoderFactory.
    • Attiva il supporto per la diagnostica della piattaforma Android utilizzando MediaMetricsManager. Transformer inoltra gli eventi di modifica e i dati sul rendimento alla piattaforma, il che aiuta a fornire informazioni sul rendimento del sistema e informazioni di debug sul dispositivo. Questi dati possono anche essere raccolti da Google se la condivisione dei dati di utilizzo e diagnostica è attivata dall'utente del dispositivo. Le app possono disattivare il contributo alla diagnostica della piattaforma per Transformer con Transformer.Builder.setUsePlatformDiagnostics(false).
    • Suddividi InAppMuxer in InAppMp4Muxer e InAppFragmentedMp4Muxer. Utilizza InAppMp4Muxer per produrre un file MP4 non frammentato, mentre InAppFragmentedMp4Muxer serve per produrre un file MP4 frammentato.
    • Sposta l'interfaccia Muxer da media3-muxer a media3-transformer.
    • Aggiungi MediaProjectionAssetLoader, che fornisce contenuti multimediali da un MediaProjection per la registrazione dello schermo, e aggiungi il supporto per la registrazione dello schermo all'app demo Transformer.
    • Aggiungi #getInputFormat() all'interfaccia Codec.
    • Sposta la responsabilità di rilasciare GlObjectsProvider sul chiamante in DefaultVideoFrameProcessor e DefaultVideoCompositor quando possibile.
  • Estrattori:
    • AVI: corretta la gestione dei file con audio compresso a bitrate costante in cui l'intestazione dello stream memorizza il numero di byte anziché il numero di blocchi.
    • Risolto il problema di gestione delle unità NAL con lunghezze espresse in 1 o 2 byte (anziché 4).
    • Correzione di ArrayIndexOutOfBoundsException negli elenchi di modifica MP4 quando l'elenco di modifica inizia in un frame non sincronizzato senza un frame sincronizzato precedente (#2062).
    • Risolto il problema per cui gli stream TS potevano bloccarsi su alcuni dispositivi (#2069).
    • FLAC: aggiunta del supporto per i file FLAC a 32 bit. In precedenza, la riproduzione di questi contenuti non riusciva con IllegalStateException: Playback stuck buffering and not loading (#2197).
  • Audio:
    • Correggi onAudioPositionAdvancing in modo che venga chiamato quando la riproduzione riprende (in precedenza veniva chiamato quando la riproduzione veniva messa in pausa).
    • Non bypassare SonicAudioProcessor quando SpeedChangingAudioProcessor è configurato con i parametri predefiniti.
    • Correzione dell'underflow in Sonic#getOutputSize() che potrebbe causare il blocco di DefaultAudioSink.
    • Correggi MediaCodecAudioRenderer.getDurationToProgressUs() e DecoderAudioRenderer.getDurationToProgressUs() in modo che le ricerche reimpostino correttamente le durate fornite.
    • Rendi androidx.media3.common.audio.SonicAudioProcessor definitivo.
    • Aggiungi il supporto per il PCM con virgola mobile a ChannelMappingAudioProcessor e TrimmingAudioProcessor.
  • Video:
    • Modifica MediaCodecVideoRenderer.shouldUsePlaceholderSurface in protected in modo che le applicazioni possano eseguire l'override per bloccare l'utilizzo delle superfici segnaposto (#1905).
    • È stata aggiunta l'analisi sperimentale delle dipendenze dei sample AV1 ExoPlayer per velocizzare la ricerca. Attivalo con la nuova API DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies.
    • Aggiunta dell'API ExoPlayer sperimentale per eliminare i buffer di input del decoder MediaCodecVideoRenderer in ritardo che non sono dipendenti. Attivalo con DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * Risolto un problema per cui un player senza una superficie era pronto immediatamente e la decodifica di eventuali frame in attesa era molto lenta (#1973).
    • Escludi i dispositivi Xiaomi e OPPO dalla modalità di superficie scollegata per evitare lo sfarfallio dello schermo (#2059).
  • Testo:
    • Aggiunto il supporto per i sottotitoli VobSub (#8260).
    • Interrompi il caricamento eager di tutti i file dei sottotitoli configurati con MediaItem.Builder.setSubtitleConfigurations e carica solo un file se è selezionato dalla selezione della traccia (#1721).
    • TTML: aggiunto il supporto per fare riferimento a tts:origin e tts:extent utilizzando style (#2953).
    • Limita i timestamp WebVTT e SubRip a esattamente 3 cifre decimali. In precedenza, analizzavamo erroneamente un numero qualsiasi di cifre decimali, ma presupponevamo sempre che il valore fosse in millisecondi, il che generava timestamp errati (#1997).
    • Risolto il problema di blocco della riproduzione quando una playlist contiene elementi tagliati con sottotitoli codificati CEA-608 o CEA-708.
    • Risolto il problema di IllegalStateException quando un file SSA contiene un cue con durata pari a zero (ora di inizio e di fine uguali) (#2052).
    • Elimina (e registra) gli errori di analisi dei sottotitoli quando i sottotitoli vengono sottoposti a muxing nello stesso container di audio e video (#2052).
    • Risolto il problema di gestione dei caratteri UTF-8 multibyte nei file WebVTT che utilizzano i fine riga CR (#2167).
  • DRM:
    • Risolto l'errore MediaCodec$CryptoException: Operation not supported in this configuration durante la riproduzione di contenuti ClearKey su dispositivi con API < 27 (#1732).
  • Effetto:
    • La funzionalità di OverlaySettings è stata spostata in StaticOverlaySettings. OverlaySettings può essere sottoclassato per consentire impostazioni di overlay dinamiche.
  • Muxer:
    • MuxerException è stato spostato fuori dall'interfaccia Muxer per evitare un nome completo molto lungo.
    • Il metodo setSampleCopyEnabled() è stato rinominato in setSampleCopyingEnabled() sia in Mp4Muxer.Builder che in FragmentedMp4Muxer.Builder.
    • Mp4Muxer.addTrack() e FragmentedMp4Muxer.addTrack() ora restituiscono un ID traccia int anziché TrackToken.
    • Mp4Muxer e FragmentedMp4Muxer non implementano più l'interfaccia Muxer.
    • Disattiva la copia e il raggruppamento in batch dei campioni Mp4Muxer per impostazione predefinita.
    • Correggi un bug in FragmentedMp4Muxer che crea molti frammenti quando viene scritta solo la traccia audio.
  • Sessione:
    • Mantieni lo stato del servizio in primo piano per altri 10 minuti quando la riproduzione viene messa in pausa, interrotta o non va a buon fine. In questo modo, gli utenti possono riprendere la riproduzione entro questo timeout senza rischiare restrizioni dei servizi in primo piano su vari dispositivi. Tieni presente che la semplice chiamata a player.pause() non può più essere utilizzata per interrompere il servizio in primo piano prima di stopSelf() quando esegui l'override di onTaskRemoved, utilizza invece MediaSessionService.pauseAllPlayersAndStopSelf().
    • Mantieni la notifica visibile quando la riproduzione entra in uno stato di errore o di interruzione. La notifica viene rimossa solo se la playlist viene cancellata o se il player viene rilasciato.
    • Miglioramento della gestione delle azioni MediaSession della piattaforma Android ACTION_PLAY e ACTION_PAUSE per impostarne solo una in base ai comandi disponibili e accettare anche se ne viene impostata solo una.
    • Aggiunta di Context come parametro a MediaButtonReceiver.shouldStartForegroundService (#1887).
    • Risolto un bug per cui la chiamata di un metodo Player su un MediaController connesso a una sessione precedente eliminava le modifiche di un aggiornamento in attesa.
    • Fai in modo che MediaSession.setSessionActivity(PendingIntent) accetti null (#2109).
    • È stato corretto un bug per cui una notifica obsoleta rimaneva visibile quando la playlist veniva cancellata (#2211).
  • UI:
    • Aggiungi contenitori di stato e componibili al modulo media3-ui-compose per PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState e PlaybackSpeedState.
  • Download:
    • Correzione di un bug in CacheWriter che lascia aperte le origini dati e bloccate le aree della cache nel caso in cui l'origine dati generi un Exception diverso da IOException (#9760).
  • Estensione HLS:
    • Aggiungi una prima versione di HlsInterstitialsAdsLoader. Il caricatore di annunci legge gli interstitial HLS di una playlist multimediale HLS e li mappa al AdPlaybackState passato a AdsMediaSource. Questa versione iniziale supporta solo gli stream VOD HLS con attributi X-ASSET-URI.
    • Aggiungi HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Le app possono utilizzarlo per creare istanze AdsMediaSource che utilizzano un HlsInterstitialsAdsLoader in modo comodo e sicuro.
    • Analizza il tag SUPPLEMENTAL-CODECS dalla playlist HLS per rilevare i formati Dolby Vision (#1785).
    • Allentata la condizione per la ricerca delle posizioni di sincronizzazione in uno stream HLS (#2209).
  • Estensione DASH:
    • Aggiunto il supporto del formato AC-4 Level-4 per DASH (#1898).
    • Risolto il problema relativo al calcolo dell'intervallo di aggiornamento per l'inserimento di annunci nei live streaming multi-periodo (#1698).
    • Analizza l'attributo scte214:supplementalCodecs dal manifest DASH per rilevare i formati Dolby Vision (#1785).
    • Miglioramento della gestione delle transizioni dei periodi nei live streaming in cui il periodo contiene sample multimediali oltre la durata del periodo dichiarata (#1698).
    • Risolto il problema per cui i set di adattamento contrassegnati con adaptation-set-switching, ma con lingue o flag di ruolo diversi, venivano uniti (#2222).
  • Estensioni del decoder (FFmpeg, VP9, AV1 e così via):
    • Aggiunto il modulo del decodificatore MPEG-H che utilizza il decodificatore MPEG-H integrato per decodificare l'audio MPEG-H (#1826).
  • Estensione MIDI:
    • Collega le istanze AudioSink e AudioRendererEventListener personalizzate a MidiRenderer.
  • Estensione Cast:
    • Esegui l'upgrade della dipendenza play-services-cast-framework alla versione 21.5.0 per correggere un arresto anomalo di FLAG_MUTABLE nelle app che hanno come target l'API 34 e versioni successive sui dispositivi con Google Play Services installato, ma disattivato (#2178).
  • App demo:
    • Estendi demo-compose con pulsanti aggiuntivi e migliora l'integrazione di PlayerSurface con il supporto per la scalabilità e l'otturatore.
  • Rimuovi i simboli deprecati:
    • Rimuovi il metodo AudioMixer.create() deprecato. Usa invece DefaultAudioMixer.Factory().create().
    • Rimuovi i seguenti metodi Transformer.Builder deprecati:
      • setTransformationRequest(), utilizza invece setAudioMimeType(), setVideoMimeType() e setHdrMode().
      • setAudioProcessors(), imposta il processore audio in un EditedMediaItem.Builder.setEffects() e passalo a Transformer.start().
      • setVideoEffects(), imposta l'effetto video in un EditedMediaItem.Builder.setEffects() e passalo a Transformer.start().
      • setRemoveAudio(), utilizza EditedMediaItem.Builder.setRemoveAudio() per rimuovere l'audio da EditedMediaItem passato a Transformer.start().
      • setRemoveVideo(), utilizza EditedMediaItem.Builder.setRemoveVideo() per rimuovere il video da EditedMediaItem passato a Transformer.start().
      • setFlattenForSlowMotion(), utilizza EditedMediaItem.Builder.setFlattenForSlowMotion() per appiattire EditedMediaItem passato a Transformer.start().
      • setListener(), utilizza invece addListener(), removeListener() o removeAllListeners().
    • Rimuovi i seguenti metodi Transformer.Listener deprecati:
      • onTransformationCompleted(MediaItem), utilizza invece onCompleted(Composition, ExportResult).
      • onTransformationCompleted(MediaItem, TransformationResult), utilizza invece onCompleted(Composition, ExportResult).
      • onTransformationError(MediaItem, Exception), utilizza invece onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationException), utilizza invece onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationResult, TransformationException), utilizza invece onError(Composition, ExportResult, ExportException).
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), utilizza invece onFallbackApplied(Composition, TransformationRequest, TransformationRequest).
    • Rimuovi la classe TransformationResult deprecata. Usa invece ExportResult.
    • Rimuovi la classe TransformationException deprecata. Usa invece ExportException.
    • Rimuovi Transformer.PROGRESS_STATE_NO_TRANSFORMATION deprecato. Usa invece Transformer.PROGRESS_STATE_NOT_STARTED.
    • Rimuovi Transformer.setListener() deprecato. Utilizza invece Transformer.addListener(), Transformer.removeListener() o Transformer.removeAllListeners().
    • Rimuovi Transformer.startTransformation() deprecato. Usa invece Transformer.start(MediaItem, String).
    • Rimuovi SingleFrameGlShaderProgram deprecato. Usa invece BaseGlShaderProgram.
    • Rimuovi Transformer.flattenForSlowMotion. Usa invece EditedMediaItem.flattenForSlowMotion.
    • ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent e ExoPlayer.DeviceComponent rimosse.
    • Contatto rimosso: androidx.media3.exoplayer.audio.SonicAudioProcessor.
    • Sono stati rimossi i seguenti metodi DownloadHelper deprecati:
      • Costruttore DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), utilizza invece DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList).
      • getRendererCapabilities(RenderersFactory), è possibile ottenere una funzionalità equivalente creando un DefaultRendererCapabilitiesList con un RenderersFactory e chiamando DefaultRendererCapabilitiesList.getRendererCapabilities().
      • Metodo PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat) rimosso. Utilizza PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) e passa (MediaSession.Token) compatToken.getToken().

1.6.0-rc02

19 marzo 2025

Utilizza la versione stabile 1.6.0.

1.6.0-rc01

12 marzo 2025

Utilizza la versione stabile 1.6.0.

1.6.0-beta01

26 febbraio 2025

Utilizza la versione stabile 1.6.0.

Versione 1.6.0-alpha03

6 febbraio 2025

Utilizza la versione stabile 1.6.0.

Versione 1.6.0-alpha02

30 gennaio 2025

Utilizza la versione stabile 1.6.0.

Versione 1.6.0-alpha01

20 dicembre 2024

Utilizza la versione stabile 1.6.0.

Versione 1.5

Versione 1.5.1

19 dicembre 2024

androidx.media3:media3-*:1.5.1 è stato rilasciato. La versione 1.5.1 contiene questi commit.

  • ExoPlayer:
    • Disattiva l'utilizzo della decrittografia asincrona in MediaCodec per evitare problemi di timeout del codec segnalati con questa API della piattaforma (#1641).
  • Estrattori:
    • MP3: non interrompere la riproduzione in anticipo quando il sommario di un frame VBRI non copre tutti i dati MP3 di un file (#1904).
  • Video:
    • Rollback dell'utilizzo dei valori delle proporzioni dei pixel forniti da MediaCodecAdapter quando forniti durante l'elaborazione di onOutputFormatChanged (#1371).
  • Testo:
    • È stato corretto il bug in ReplacingCuesResolver.discardCuesBeforeTimeUs per cui il cue attivo in timeUs (iniziato prima, ma non ancora terminato) veniva ignorato erroneamente (#1939).
  • Metadati:
    • Estrai la numerazione dei dischi/delle tracce e il genere dai commenti Vorbis in MediaMetadata (#1958).

Versione 1.5.0

27 novembre 2024

androidx.media3:media3-*:1.5.0 è stato rilasciato. La versione 1.5.0 contiene questi commit.

  • Libreria comune:
    • Aggiunta di ForwardingSimpleBasePlayer che consente l'inoltro a un altro player con piccole modifiche, garantendo al contempo la piena coerenza e la gestione degli ascoltatori (#1183).
    • Sostituisci il metodo SimpleBasePlayer.State.playlist con il metodo getPlaylist().
    • Aggiungi l'override per SimpleBasePlayer.State.Builder.setPlaylist() per specificare direttamente un Timeline e i Tracks e Metadata attuali anziché creare una struttura di playlist.
    • Aumenta minSdk a 21 (Android Lollipop). Questo è in linea con tutte le altre librerie AndroidX.
    • Aggiungi l'artefatto androidx.media3:media3-common-ktx che fornisce funzionalità specifiche di Kotlin basate sulla libreria comune
    • Aggiungi la funzione di estensione di sospensione Player.listen per avviare una coroutine per ascoltare Player.Events nella libreria media3-common-ktx.
    • Rimuovi le annotazioni @DoNotInline dalle classi interne non in linea manualmente progettate per evitare errori di verifica delle classi di runtime. Le versioni recenti di R8 ora eseguono automaticamente l'out-of-lining di chiamate come queste per evitare errori di runtime (quindi l'out-of-lining manuale non è più necessario). Tutti gli utenti Gradle della libreria devono già utilizzare una versione del plug-in Android Gradle che utilizza una versione di R8 che esegue questa operazione, a causa di compileSdk = 35. Gli utenti della libreria con sistemi di build non Gradle dovranno assicurarsi che il passaggio di riduzione/offuscamento equivalente a R8 esegua un processo di out-of-lining automatico simile per evitare errori di verifica della classe di runtime. Questa modifica è già stata apportata in altre librerie AndroidX.
  • ExoPlayer:
    • Ora MediaCodecRenderer.onProcessedStreamChange() può essere chiamato per ogni elemento multimediale. In precedenza, non veniva chiamato per il primo. Utilizza MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart() per attivare questa opzione.
    • Aggiungi PreloadMediaSource.PreloadControl.onPreloadError per consentire alle implementazioni di PreloadMediaSource.PreloadControl di intraprendere azioni quando si verifica un errore.
    • Aggiungi BasePreloadManager.Listener per propagare gli eventi precaricati alle app.
    • Consenti la modifica del timeout del client SNTP e riprova con indirizzi alternativi in caso di timeout (#1540).
    • Rimuovi MediaCodecAdapter.Configuration.flags perché il campo era sempre pari a zero.
    • Consenti all'utente di selezionare l'altoparlante integrato per la riproduzione su Wear OS API 35 e versioni successive (se il dispositivo dichiara di supportare questa funzionalità).
    • Rimanda la chiamata di blocco a Context.getSystemService(Context.AUDIO_SERVICE) finché non viene attivata la gestione della priorità audio. In questo modo, la chiamata di blocco non viene eseguita se la gestione della priorità audio non è attiva (#1616).
    • Consenti la riproduzione indipendentemente dalla durata del buffering quando il caricamento non va a buon fine (#1571).
    • Aggiungi AnalyticsListener.onRendererReadyChanged() per segnalare quando i singoli renderer consentono la riproduzione.
    • È stato corretto l'errore MediaCodec.CryptoException che a volte veniva segnalato come "errore di runtime imprevisto" quando MediaCodec veniva utilizzato in modalità asincrona (comportamento predefinito nell'API 31 e versioni successive).
    • Passa bufferedDurationUs anziché bufferedPositionUs con PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Inoltre, modifica DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS in DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS, le app devono quindi passare un valore che rappresenta una durata specifica dalla posizione di inizio predefinita per la quale l'origine multimediale corrispondente deve essere precaricata con questo IntDef, anziché una posizione.
    • Aggiunta l'implementazione di ForwardingRenderer che inoltra tutte le chiamate al metodo a un altro renderer (1703).
    • Aggiungi il precaricamento della playlist per l'elemento successivo nella playlist. Le app possono attivare il precaricamento chiamando ExoPlayer.setPreloadConfiguration(PreloadConfiguration) di conseguenza. Per impostazione predefinita, il precaricamento è disattivato. Se l'utente ha attivato questa opzione, per non interferire con la riproduzione, DefaultLoadControl limita il precaricamento in modo che inizi e continui solo quando il player non sta caricando per la riproduzione. Le app possono modificare questo comportamento implementando LoadControl.shouldContinuePreloading() di conseguenza (ad esempio quando viene eseguito l'override di questo metodo in DefaultLoadControl). L'implementazione predefinita di LoadControl disattiva il precaricamento nel caso in cui un'app utilizzi un'implementazione personalizzata di LoadControl.
    • Aggiunto il metodo MediaSourceEventListener.EventDispatcher.dispatchEvent() per consentire l'attivazione di eventi dei listener di sottoclassi (1736).
    • Aggiungi DefaultPreloadManager.Builder che crea le istanze DefaultPreloadManager e ExoPlayer con configurazioni condivise in modo coerente.
    • Rimuovi il parametro Renderer[] da LoadControl.onTracksSelected(), poiché l'implementazione di DefaultLoadControl può recuperare i tipi di stream da ExoTrackSelection[].
    • DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) è stato ritirato e il metodo è stato contrassegnato come finale per impedire gli override. Utilizza invece il nuovo DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • Segnala MediaSourceEventListener eventi da origini secondarie in MergingMediaSource. In questo modo, verranno segnalati gli eventi di avvio/errore/annullamento/completamento del caricamento per i sottotitoli caricati lateralmente (quelli aggiunti con MediaItem.LocalConfiguration.subtitleConfigurations), che potrebbero apparire come eventi di caricamento duplicati emessi da AnalyticsListener.
    • Evita che gli errori relativi ai sottotitoli e ai metadati interrompano completamente la riproduzione. Invece, la traccia problematica viene disattivata e la riproduzione delle tracce rimanenti continua (#1722).
      • Nella nuova gestione dei sottotitoli (durante l'estrazione), gli errori di analisi associati (ad es. dati dei sottotitoli non validi) e di caricamento (ad es. HTTP 404) vengono emessi tramite i callback onLoadError.
      • Nella gestione dei sottotitoli legacy (durante il rendering), vengono emessi solo gli errori di caricamento associati tramite i callback onLoadError, mentre gli errori di analisi vengono ignorati senza avvisi (questo è il comportamento preesistente).
    • Risolto un bug per cui gli elementi o i periodi della playlist negli stream DASH multiperiodo con durate che non corrispondono ai contenuti effettivi potevano causare il blocco dei frame alla fine dell'elemento (#1698).
    • Aggiungi un setter a SntpClient per impostare il tempo massimo trascorso dall'ultimo aggiornamento dopo il quale il client viene reinizializzato (#1794).
  • Transformer:
    • Aggiungi SurfaceAssetLoader, che supporta l'accodamento dei dati video a Transformer tramite un Surface.
    • ImageAssetLoader segnala un input non supportato tramite AssetLoader.onError anziché generare un IllegalStateException.
    • Rendi obbligatoria l'impostazione della durata dell'immagine utilizzando MediaItem.Builder.setImageDurationMs per l'esportazione delle immagini.
    • Aggiunto il supporto per l'esportazione di lacune nelle sequenze di EditedMediaItem audio.
  • Selezione della traccia:
    • DefaultTrackSelector: preferisci l'audio basato su oggetti rispetto all'audio basato su canali quando altri fattori sono uguali.
  • Estrattori:
    • Consenti a Mp4Extractor e FragmentedMp4Extractor di identificare i campioni H264 che non vengono utilizzati come riferimento dai campioni successivi.
    • Aggiungi l'opzione per attivare la ricerca basata su indice in AmrExtractor.
    • Tratta i file MP3 con più di 128 kB tra frame validi come troncati (anziché non validi). Ciò significa che i file con dati non MP3 alla fine, senza altri metadati che indicano la lunghezza dei byte MP3, ora interrompono la riproduzione alla fine dei dati MP3 anziché non riuscire con ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • Risolto il problema relativo alla gestione dei sample di preroll per le posizioni di inizio dei contenuti multimediali non keyframe durante l'elaborazione degli elenchi di modifica nei file MP4 (#1659).
    • Miglioramento del calcolo della frequenza fotogrammi utilizzando la durata dei contenuti multimediali dalla casella mdhd in Mp4Extractor e FragmentedMp4Extractor (#1531).
    • Risolto il problema di scalabilità errata di media_time negli elenchi di modifica MP4. Mentre segment_duration era già scalato correttamente utilizzando la scala temporale del filmato, media_time ora è scalato correttamente utilizzando la scala temporale della traccia, come specificato dallo standard del formato MP4 (#1792).
    • Gestisci i frame non in ordine nel calcolo di endIndices per MP4 con elenco di modifica (#1797).
    • Correzione dell'analisi della durata dei contenuti multimediali nella casella mdhd dei file MP4 per gestire i valori -1 (#1819).
    • Aggiunto il supporto per l'identificazione della casella h263 nei file MP4 per i video H.263 (#1821).
    • Aggiunto il supporto del formato file multimediale di base ISO AC-4 Level-4 (#1265).
  • DataSource:
    • Aggiorna HttpEngineDataSource per consentire l'utilizzo a partire dalla versione S estensione 7 anziché dal livello API 34 (#1262).
    • DataSourceContractTest: verifica che DataSource.getUri() restituisca l'URI risolto (come documentato). Se questo è diverso dall'URI della richiesta, i test possono indicarlo utilizzando il nuovo metodo DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: verifica che DataSource.getUri() e getResponseHeaders() restituiscano il valore "open" dopo una chiamata non riuscita a open() (a causa di una risorsa "non trovata") e prima di una chiamata close() successiva.
      • L'override di DataSourceContractTest.getNotFoundResources() consente alle sottoclassi di test di fornire più risorse "non trovate" e di fornire anche eventuali intestazioni previste. In questo modo è possibile distinguere tra HTTP 404 (con intestazioni) e "server non trovato" (senza intestazioni).
  • Audio:
    • Configura automaticamente i metadati di volume CTA-2075 sul codec se presenti nei contenuti multimediali.
    • Assicurati che il volume si abbassi gradualmente durante la ricerca.
    • Risoluzione dei problemi relativi ai suoni di scoppio che potrebbero verificarsi durante le ricerche.
    • Risolto l'accumulo di errori di troncamento per l'algoritmo di estensione del tempo/variazione del tono di Sonic.
    • Correzione di un bug in SpeedChangingAudioProcessor che causa l'interruzione dei frame di output.
  • Video:
    • MediaCodecVideoRenderer evita di decodificare i campioni che non vengono visualizzati né utilizzati come riferimento da altri campioni.
    • Nell'API 35 e versioni successive, MediaCodecAdapter ora potrebbe ricevere un null Surface in configure e chiamate a un nuovo metodo detachOutputSurface per rimuovere un Surface impostato in precedenza se il codec lo supporta (MediaCodecInfo.detachedSurfaceSupported).
    • Utilizza i valori delle proporzioni pixel forniti da MediaCodecAdapter, se presenti, durante l'elaborazione di onOutputFormatChanged (#1371).
    • Aggiunta una soluzione alternativa per un problema del dispositivo su Galaxy Tab S7 FE che causa la marcatura degli stream H264 sicuri a 60 fps come non supportati (#1619).
    • Aggiunta di una soluzione alternativa per i codec che si bloccano dopo l'ultimo campione senza restituire un segnale di fine stream.
  • Testo:
    • Aggiungi un VoiceSpan personalizzato e compilalo per gli intervalli vocali WebVTT (#1632).
    • Assicurati che i file WebVTT in HLS con timestamp dei sottotitoli molto grandi (che superano un long a 64 bit se rappresentati come microsecondi e moltiplicati per la base temporale MPEG 90,000) vengano visualizzati (#1763).
    • Supporto dei sottotitoli CEA-608 nei contenuti Dolby Vision (#1820).
    • Risolto il problema di blocco della riproduzione negli stream DASH multi-periodo quando i sottotitoli CEA-608 sono attivi (#1863).
  • Metadati:
    • Assegna il tipo C.TRACK_TYPE_METADATA alle tracce contenenti contenuti icy o vnd.dvb.ait.
  • Immagine:
    • Aggiungi ExternallyLoadedImageDecoder per un'integrazione semplificata con librerie di caricamento delle immagini esterne come Glide o Coil.
  • DataSource:
    • Aggiunta di FileDescriptorDataSource, un nuovo DataSource che può essere utilizzato per leggere da un FileDescriptor (#3757).
  • Effetto:
    • Aggiungi una soluzione alternativa DefaultVideoFrameProcessor per la scalabilità SurfaceTexture minore. SurfaceTexture potrebbe includere un piccolo ridimensionamento che taglia un bordo di 1 texel attorno al bordo di un buffer ritagliato. Ora questo problema è stato risolto in modo che l'output sia più vicino al previsto.
    • Velocizza DefaultVideoFrameProcessor.queueInputBitmap(). Di conseguenza, l'esportazione di immagini in video con Transformer è più veloce.
  • Estensione IMA:
    • Risolto un bug per cui la cancellazione della playlist poteva causare un ArrayIndexOutOfBoundsException in ImaServerSideAdInsertionMediaSource.
    • È stato corretto un bug per cui gli stream DAI inseriti lato server senza un preroll possono generare un ArrayIndexOutOfBoundsException quando la riproduzione supera l'ultimo midroll (#1741).
  • Sessione:
    • Aggiungi MediaButtonReceiver.shouldStartForegroundService(Intent) per consentire alle app di eliminare un comando di riproduzione in arrivo per la ripresa della riproduzione eseguendo l'override di questo metodo. Per impostazione predefinita, il servizio viene sempre avviato e la riproduzione non può essere soppressa senza che il sistema arresti in modo anomalo il servizio con un ForegroundServiceDidNotStartInTimeException (#1528).
    • Risolto un bug che causava l'invio di comandi personalizzati da un MediaBrowser a MediaSessionCompat.Callback anziché alla variante MediaBrowserServiceCompat del metodo quando era connesso a un servizio legacy. Ciò ha impedito a MediaBrowser di ricevere il valore restituito effettivo inviato dal servizio legacy (#1474).
    • Gestisci l'eccezione IllegalArgumentException generata dai dispositivi di alcuni produttori quando imposti il broadcast receiver per gli intent dei pulsanti multimediali (#1730).
    • Aggiungi pulsanti di comando per gli elementi multimediali. In questo modo, viene aggiunta l'API Media3 per quello che era noto come Custom browse actions con la libreria precedente con MediaBrowserCompat. Tieni presente che con Media3 i pulsanti di comando per gli elementi multimediali sono disponibili sia per MediaBrowser che per MediaController. Consulta Implementa azioni di navigazione personalizzate. * Risolto un bug per cui a volte un controller Media3 non era in grado di consentire a un'app di sessione di avviare un servizio in primo piano dopo aver richiesto play().
    • Limita CommandButton.Builder.setIconUri in modo che accetti solo URI dei contenuti.
    • Passa i suggerimenti di connessione di un browser Media3 al MediaBrowserCompat iniziale quando ti connetti a un MediaBrowserCompat precedente. Il servizio può ricevere i suggerimenti di connessione passati come suggerimenti principali con la prima chiamata a onGetRoot().
    • Risolto un bug per cui un MediaBrowser connesso a un servizio browser legacy non riceveva un errore inviato dal servizio dopo che il browser si era iscritto a un parentid.
    • Migliorare il comportamento di interoperabilità, in modo che un browser Media3 connesso a un MediaBrowserService precedente non richieda due volte gli elementi secondari di un parentId quando si iscrive a un elemento principale.
  • UI:
    • Rendi facoltativo l'uso della soluzione alternativa per i video allungati/ritagliati in PlayerView-in-Compose-AndroidView, a causa di problemi con le transizioni condivise basate su XML. Le app che utilizzano PlayerView all'interno di AndroidView devono chiamare PlayerView.setEnableComposeSurfaceSyncWorkaround per l'attivazione (#1237, #1594).
    • Aggiungi setFullscreenButtonState a PlayerView per consentire gli aggiornamenti dell'icona del pulsante a schermo intero on demand, ovvero fuori banda e non in modo reattivo a un'interazione con un clic (#1590, #184).
    • Risolto il bug per cui l'opzione "Nessuna" nella selezione del testo non funziona se sono presenti preferenze di selezione delle tracce di testo definite dall'app.
  • Estensione DASH:
    • Aggiunto il supporto per i periodi che iniziano nel mezzo di un segmento (#1440).
  • Estensione Smooth Streaming:
    • È stato corretto un errore Bad magic number for Bundle durante la riproduzione di stream SmoothStreaming con tracce di testo (#1779).
  • Estensione RTSP:
    • Correzione della rimozione delle informazioni utente per gli URL che contengono caratteri @ codificati (#1138).
    • È stato corretto l'arresto anomalo durante l'analisi dei pacchetti RTP con estensioni di intestazione (#1225).
  • Estensioni del decoder (FFmpeg, VP9, AV1 e così via):
    • Aggiungi il modulo del decoder IAMF, che fornisce il supporto per la riproduzione di file MP4 contenenti tracce IAMF utilizzando la libreria nativa libiamf per sintetizzare l'audio.
      • La riproduzione è abilitata con un layout stereo e 5.1 con spazializzazione, oltre al tracciamento della testa facoltativo, ma il supporto della riproduzione binaurale non è attualmente disponibile.
    • Aggiunto il supporto delle pagine da 16 kB per le estensioni del decoder su Android 15 (#1685).
  • Estensione Cast:
    • Interrompi la pulizia della cronologia dopo la disconnessione di CastSession, in modo che l'app mittente possa riprendere la riproduzione localmente dopo una disconnessione.
    • Compila DeviceInfo di CastPlayer quando viene fornito un Context. In questo modo è possibile collegare MediaSession a RoutingSession, operazione necessaria per l'integrazione del Selettore di output (#1056).
  • Utilità di test:
    • DataSourceContractTest ora include test per verificare:
      • Lo stream di input read position è stato aggiornato.
      • Il buffer di output offset è stato applicato correttamente.
  • App demo
    • Risolvi le perdite di memoria nell'app demo per i contenuti nel formato breve (#1839).
  • Rimuovi i simboli deprecati:
    • Rimuovi Player.hasPrevious, Player.hasPreviousWindow() deprecati. Usa invece il descrittore Player.hasPreviousMediaItem().
    • Rimuovi il metodo Player.previous() deprecato. Usa invece Player.seekToPreviousMediaItem().
    • Rimuovi il metodo DrmSessionEventListener.onDrmSessionAcquired deprecato.
    • Rimuovi i costruttori DefaultEncoderFactory deprecati. Usa invece DefaultEncoderFactory.Builder.

Versione 1.5.0-rc02

19 novembre 2024

Utilizza la versione stabile 1.5.0.

Versione 1.5.0-rc01

13 novembre 2024

Utilizza la versione stabile 1.5.0.

Versione 1.5.0-beta01

30 ottobre 2024

Utilizza la versione stabile 1.5.0.

Versione 1.5.0-alpha01

10 settembre 2024

Utilizza la versione stabile 1.5.0.

Versione 1.4.0

Versione 1.4.1

27 agosto 2024

androidx.media3:media3-*:1.4.1 è stato rilasciato. La versione 1.4.1 contiene questi commit.

  • ExoPlayer:
    • Gestisci i callback di precaricamento in modo asincrono in PreloadMediaSource (#1568).
    • Consenti la riproduzione indipendentemente dalla durata del buffering quando il caricamento non va a buon fine (#1571).
  • Estrattori:
    • MP3: è stato corretto l'errore Searched too many bytes ignorando correttamente i dati non MP3 finali in base al campo della lunghezza in un frame Info (#1480).
  • Testo:
    • TTML: è stata corretta la gestione dei valori percentuali di tts:fontSize per garantire che vengano ereditati correttamente dai nodi principali con valori percentuali di tts:fontSize.
    • Correzione di IndexOutOfBoundsException in LegacySubtitleUtil a causa di una gestione errata del caso in cui l'ora di inizio dell'output richiesto è maggiore o uguale all'ora dell'evento finale in Subtitle (#1516).
  • DRM:
    • Correggi l'errore android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE sui dispositivi con API 31 e versioni successive che riproducono contenuti Widevine L1. Questo errore è causato da un'implementazione incompleta del metodo MediaDrm.requiresSecureDecoder del framework (#1603).
  • Effetto:
    • Aggiungi un metodo release() a GlObjectsProvider.
  • Sessione:
    • Trasforma un doppio tocco di KEYCODE_HEADSETHOOK in un'azione "vai al successivo", come documentato (#1493).
    • Gestisci KEYCODE_HEADSETHOOK come comando "play" in MediaButtonReceiver quando decidi se ignorarlo per evitare un ForegroundServiceDidNotStartInTimeException (#1581).
  • Estensione RTSP:
    • Salta le descrizioni dei contenuti multimediali non valide nell'analisi SDP (#1087).

Versione 1.4.0

25 luglio 2024

androidx.media3:media3-*:1.4.0 è stato rilasciato. La versione 1.4.0 contiene questi commit.

  • Libreria comune:
    • Inoltra le chiamate di ricerca presunte no-op ai metodi protetti BasePlayer.seekTo() e SimpleBasePlayer.handleSeek() anziché ignorarle. Se implementi questi metodi in un player personalizzato, potresti dover gestire queste chiamate aggiuntive con mediaItemIndex == C.INDEX_UNSET.
    • Rimuovi la dipendenza di compilazione dal desugaring Java 8 avanzato (#1312).
    • Assicurati che la durata passata a MediaItem.Builder.setImageDurationMs() venga ignorata per un MediaItem non immagine (come documentato).
    • Aggiungi Format.customData per archiviare le informazioni personalizzate fornite dall'app sulle istanze Format.
  • ExoPlayer:
    • Aggiungi BasePreloadManager, che coordina il precaricamento per più origini in base alle priorità definite dai relativi rankingData. La personalizzazione è possibile estendendo questa classe. Aggiungi DefaultPreloadManager, che utilizza PreloadMediaSource per precaricare in memoria i sample multimediali delle origini, e un numero intero rankingData che indica l'indice di un elemento nell'interfaccia utente.
    • Aggiungi PlayerId alla maggior parte dei metodi di LoadControl per consentire alle implementazioni di LoadControl di supportare più giocatori.
    • Rimuovi Buffer.isDecodeOnly() e C.BUFFER_FLAG_DECODE_ONLY. Non è necessario impostare questo flag, poiché i renderer e i decoder decideranno di saltare i buffer in base al timestamp. Le implementazioni personalizzate di Renderer devono verificare se l'intervallo è almeno pari a BaseRenderer.getLastResetPositionUs() per decidere se mostrare un campione. Le implementazioni personalizzate di SimpleDecoder possono controllare isAtLeastOutputStartTimeUs() se necessario o contrassegnare altri buffer con DecoderOutputBuffer.shouldBeSkipped per saltarli.
    • Consenti la restituzione di un valore null da parte di TargetPreloadStatusControl.getTargetPreloadStatus(T) per indicare di non precaricare un MediaSource con il rankingData specificato.
    • Aggiungi remove(MediaSource) a BasePreloadManager.
    • Aggiungi reset() a BasePreloadManager per rilasciare tutte le fonti di conservazione, mantenendo l'istanza del gestore del precaricamento.
    • Aggiungi ExoPlayer.setPriority() (e Builder.setPriority()) per definire il valore di priorità utilizzato in PriorityTaskManager e per l'importanza di MediaCodec dall'API 35.
    • Risolto il problema relativo all'aggiornamento dell'ultimo tempo di rebuffering che causava una chiave bs (esaurimento del buffer) errata in CMCD (#1124).
    • Aggiungi PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) per indicare che la fonte è stata caricata fino alla fine. In questo modo, le implementazioni di DefaultPreloadManager e PreloadMediaSource.PreloadControl personalizzate possono precaricare la sorgente successiva o eseguire altre azioni.
    • Risolto un bug per cui il salto dei silenzi alla fine degli elementi poteva attivare un'eccezione di riproduzione.
    • Aggiungi clear a PreloadMediaSource per ignorare il periodo di precaricamento.
    • Aggiungi un nuovo codice di errore PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED che viene utilizzato quando le risorse del codec vengono recuperate per attività con priorità più alta.
    • Consenti a AdsMediaSource di caricare gli annunci pre-roll prima del completamento della preparazione iniziale dei contenuti multimediali (#1358).
    • Risolto un bug per cui la riproduzione si spostava su STATE_ENDED durante la preparazione di un live streaming DASH multi-periodo dopo che il periodo originale era già stato rimosso dal manifest.
    • Rinomina onTimelineRefreshed() in onSourcePrepared() e onPrepared() in onTracksSelected() in PreloadMediaSource.PreloadControl. Rinomina anche gli IntDef in DefaultPreloadManager.Stage di conseguenza.
    • Aggiungi il supporto sperimentale per la pianificazione dinamica per allineare meglio il lavoro ai cicli di attivazione della CPU e ritardare l'attivazione fino a quando i renderer non possono procedere. Puoi attivare questa opzione utilizzando experimentalSetDynamicSchedulingEnabled() quando configuri l'istanza ExoPlayer.
    • Aggiungi Renderer.getDurationToProgressUs(). Un Renderer può implementare questo metodo per restituire a ExoPlayer la durata di avanzamento della riproduzione necessaria per consentire al renderer di procedere. Se ExoPlayer è impostato con experimentalSetDynamicSchedulingEnabled(), ExoPlayer chiamerà questo metodo quando calcola il tempo per pianificare la sua attività di lavoro.
    • Aggiungi MediaCodecAdapter#OnBufferAvailableListener per ricevere un avviso quando i buffer di input e output sono disponibili per l'utilizzo da parte di MediaCodecRenderer. MediaCodecRenderer segnalerà ExoPlayer quando riceve questi callback e, se ExoPlayer è impostato con experimentalSetDynamicSchedulingEnabled(), ExoPlayer pianificherà il suo loop di lavoro man mano che i renderer avanzano.
    • Utilizza la classe di dati per i metodi LoadControl anziché i singoli parametri.
    • Aggiungi ExoPlayer.isReleased() per verificare se Exoplayer.release() è stato chiamato.
    • Aggiunta di ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() per configurare la posizione massima per cui seekToPrevious() cerca l'elemento precedente (#1425).
    • Correzione di alcune incoerenze del focus audio, ad esempio la mancata segnalazione della perdita di focus completa o temporanea mentre il player è in pausa (#1436).
    • Risolto un potenziale IndexOutOfBoundsException causato dagli estrattori che segnalavano tracce aggiuntive dopo il passaggio di preparazione iniziale (#1476).
    • Effects in ExoPlayer.setVideoEffect() riceverà i timestamp con l'offset del renderer rimosso (#1098).
    • Risolto un potenziale IllegalArgumentException durante la gestione dell'errore del player che si verificava durante la lettura anticipata di un altro elemento della playlist (#1483).
  • Transformer:
    • Aggiungi audioConversionProcess e videoConversionProcess a ExportResult per indicare come è stata creata la rispettiva traccia nel file di output.
    • Allenta i controlli del livello H.264 per l'ottimizzazione del taglio.
    • Aggiungi il supporto per il passaggio tra contenuti multimediali di input SDR e HDR in una sequenza.
    • Aggiungi il supporto per gli effetti audio a livello di composizione.
    • Aggiungi il supporto per la transcodifica delle immagini Ultra HDR in video HDR.
    • Risolvi il problema per cui DefaultAudioMixer non genera la quantità corretta di byte dopo essere stato reimpostato e riutilizzato.
    • Risolto un bug del decoder per cui il numero di canali audio era limitato allo stereo durante la gestione dell'input PCM.
    • Quando selezioni le tracce in ExoPlayerAssetLoader, ignora i vincoli relativi al numero di canali audio, poiché si applicano solo alla riproduzione.
    • Sostituisci l'interfaccia androidx.media3.transformer.Muxer con androidx.media3.muxer.Muxer e rimuovi androidx.media3.transformer.Muxer.
    • Risolto il problema di caricamento delle immagini HEIC dagli schemi URI dei contenuti. (#1373).
    • Regola la durata della traccia audio in AudioGraphInput per migliorare la sincronizzazione AV.
    • Rimuovi il campo ExportResult.processedInputs. Se utilizzi questo campo per i dettagli del codec, utilizza invece DefaultDecoderFactory.listener. In caso di eccezione del codec, i dettagli del codec saranno disponibili in ExportException.codecInfo.
  • Estrattori:
    • MPEG-TS: esegui il roll forward della modifica assicurandoti che l'ultimo frame venga visualizzato passando l'ultima unità di accesso di uno stream alla coda di campioni (#7909). Incorporazione di correzioni per risolvere i problemi emersi negli stream HLS solo con I-frame(#1150) e negli stream HLS H.262 (#1126).
    • MP3: preferisci le dimensioni dei dati di un frame Info rispetto alle dimensioni segnalate dallo stream sottostante (ad es. dimensioni del file o intestazione HTTP Content-Length). In questo modo, i dati dei trailer non riproducibili (ad es. la copertina dell'album) vengono esclusi dai calcoli di ricerca del bitrate costante, rendendo le ricerche più accurate (#1376).
    • MP3: utilizza il conteggio dei frame e altri dati in un frame Info (se presente) per calcolare un bitrate medio per la ricerca di bitrate costante, anziché estrapolare dal bitrate del frame dopo il frame Info, che potrebbe essere artificialmente piccolo, ad esempio il frame PCUT (#1376).
    • Risolto il problema di estrazione del formato audio PCM nei container AVI.
  • Audio:
    • Correzione degli attributi di codifica DTS:X Profile 2 per la riproduzione passthrough (#1299).
    • Per la riproduzione offloaded, reimposta il campo di monitoraggio per il completamento dello stream in DefaultAudioSink prima di chiamare AudioTrack.stop() in modo che AudioTrack.StreamEventCallback#onPresentationEnded identifichi correttamente quando sono stati riprodotti tutti i dati in attesa.
    • Correzione di un bug in SilenceSkippingAudioProcessor per cui le transizioni tra diversi formati audio (ad esempio da stereo a mono) possono causare la generazione di un'eccezione da parte del processore (#1352).
    • Implementa MediaCodecAudioRenderer.getDurationToProgressUs() in modo che ExoPlayer pianifichi dinamicamente il suo ciclo di lavoro principale in base a quando MediaCodecAudioRenderer può avanzare.
  • Video:
    • Risolto il problema per cui Listener.onRenderedFirstFrame() arrivava troppo presto quando si cambiava superficie durante la riproduzione.
    • Correzione della logica di fallback del decodificatore per Dolby Vision per utilizzare un decodificatore AV1 compatibile, se necessario (#1389).
    • Risolto un problema relativo all'eccezione del codec che potrebbe essere causato dall'attivazione di un renderer video durante la riproduzione.
  • Testo:
    • Risolto il problema per cui i sottotitoli che iniziano prima di una posizione di ricerca vengono saltati. Questo problema è stato introdotto solo in Media3 1.4.0-alpha01.
    • Modifica il comportamento di analisi dei sottotitoli predefinito in modo che avvenga durante l'estrazione anziché durante il rendering (consulta il diagramma dell'architettura di ExoPlayer per la differenza tra estrazione e rendering).
      • Questa modifica può essere sostituita chiamando sia MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) che TextRenderer.experimentalSetLegacyDecodingEnabled(true). Consulta la documentazione sulla personalizzazione per scoprire come collegare questi componenti a un'istanza ExoPlayer. Questi metodi (e tutto il supporto per la decodifica dei sottotitoli legacy) verranno rimossi in una release futura.
      • Le app con implementazioni SubtitleDecoder personalizzate devono essere aggiornate per implementare SubtitleParser (e SubtitleParser.Factory anziché SubtitleDecoderFactory).
    • PGS: correzione della decodifica run-length per risolvere 0 come indice di colore, anziché come valore di colore letterale (#1367).
    • CEA-708: ignora il valore rowLock. La specifica CEA-708-E S-2023 stabilisce che rowLock e columnLock devono essere considerati entrambi true, indipendentemente dai valori presenti nello stream (il supporto di columnLock non è implementato, quindi si presume che sia sempre false).
      • Questa modifica era stata originariamente inclusa nelle note di rilascio di 1.3.0-alpha01, ma è stata accidentalmente annullata prima della release 1.3.0-rc01. Il problema è stato risolto, quindi la modifica è di nuovo presente.
    • CEA-708: evita l'aggiunta di nuove righe duplicate da parte della gestione ingenua del comando "set pen location" di ExoPlayer (#1315).
    • Correzione di un'eccezione IllegalArgumentException da LegacySubtitleUtil quando un esempio di sottotitoli WebVTT non contiene cue, ad esempio come parte di uno stream DASH (#1516).
  • Metadati:
    • Correzione della mappatura dei tag di ordinamento da MP4 a ID3. In precedenza, i tag MP4 "album sort" (soal), "artist sort" (soar) e "album artist sort" (soaa) venivano mappati erroneamente ai tag ID3 TSO2, TSOA e TSOP (#1302).
    • Correzione della lettura dei tag numerici MP4 (/iTunes) gnre (genere) e tmpo (tempo) quando il valore è più lungo di un byte.
    • Propagazione del frame ID3 TCON in MediaMetadata.genre (#1305).
  • Immagine:
    • Aggiunto il supporto per le griglie di miniature DASH non quadrate (#1300).
    • Aggiungi il supporto per AVIF per l'API 34 e versioni successive.
    • Consenti null come parametro per ExoPlayer.setImageOutput() per cancellare un ImageOutput impostato in precedenza.
  • DataSource:
    • Implementa il supporto per gli URI delle risorse non elaborate android.resource://package/id, dove package è diverso dal pacchetto dell'applicazione corrente. In precedenza non era stato documentato che funzionasse, ma è un modo più efficiente per accedere alle risorse in un altro pacchetto rispetto al nome.
    • Controlla con attenzione che url non sia null nei costruttori DataSpec. Questo parametro è già stato annotato come non null.
    • Consenti a ByteArrayDataSource di risolvere un URI in un array di byte durante open(), anziché essere hardcoded durante la creazione (#1405).
  • DRM:
    • Consenti l'impostazione di un LoadErrorHandlingPolicy su DefaultDrmSessionManagerProvider (#1271).
  • Effetto:
    • Supporta più modifiche della velocità all'interno dello stesso EditedMediaItem o Composition in SpeedChangeEffect.
    • Supporto per l'output HLG e PQ dall'input bitmap Ultra HDR.
    • Aggiunto il supporto di EGL_GL_COLORSPACE_BT2020_HLG_EXT, che migliora l'output della superficie HLG in ExoPlayer.setVideoEffect e in SurfaceView di debug di Transformer.
    • Aggiorna l'implementazione della matrice di overlay per renderla coerente con la documentazione invertendo i valori x e y applicati in setOverlayFrameAnchor(). Se utilizzi OverlaySettings.Builder.setOverlayFrameAnchor(), inverti i valori x e y moltiplicandoli per -1.
    • È stato corretto un bug per cui TimestampWrapper si arrestava in modo anomalo se utilizzato con ExoPlayer#setVideoEffects (#821).
    • Cambia lo spazio di lavoro dei colori SDR predefinito da colori lineari a video BT 709 SDR elettrico. Fornisce anche una terza opzione per mantenere lo spazio colore originale.
    • Consenti la definizione di un ordine z indeterminato di EditedMediaItemSequences (#1055).
    • Mantenere un intervallo di luminanza coerente tra i diversi contenuti HDR (utilizza l'intervallo HLG).
    • Aggiungi il supporto per gli overlay Ultra HDR (bitmap) sui contenuti HDR.
    • Consenti l'utilizzo degli effetti SeparableConvolution prima dell'API 26.
    • Rimuovi OverlaySettings.useHdr non utilizzato, poiché l'intervallo dinamico dell'overlay e del frame deve corrispondere.
    • Aggiungi il supporto HDR per TextOverlay. La luminanza dell'overlay di testo può essere regolata con OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Estensione IMA:
    • Promuovere l'API richiesta per la riproduzione degli stream di annunci DAI da parte delle app alla versione stabile.
    • Aggiungi replaceAdTagParameters(Map <String, String>) a ImaServerSideAdInsertionMediaSource.AdLoader per consentire la sostituzione dei parametri dei tag annuncio in fase di runtime.
    • È stato corretto il bug per cui VideoAdPlayer.VideoAdPlayerCallback.onError() non veniva chiamato quando si verificava un errore del player durante la riproduzione dell'annuncio (#1334).
    • Aggiorna la versione dell'SDK IMA alla 3.33.0 per correggere un NullPointerException quando utilizzi gli URI dei tag annuncio data:// (#700).
  • Sessione:
    • Modifica il valore predefinito di CommandButton.enabled in true e assicurati che il valore possa rimanere false per i controller anche se il comando associato è disponibile.
    • Aggiungi costanti di icone per CommandButton da utilizzare al posto delle risorse di icone personalizzate.
    • Aggiunta di MediaSessionService.isPlaybackOngoing() per consentire alle app di verificare se il servizio deve essere interrotto in onTaskRemoved() (#1219).
    • Aggiungi MediaSessionService.pauseAllPlayersAndStopSelf(), che consente comodamente di mettere in pausa la riproduzione di tutte le sessioni, e chiama stopSelf() per terminare il ciclo di vita di MediaSessionService.
    • Esegui l'override di MediaSessionService.onTaskRemoved(Intent) per fornire un'implementazione predefinita sicura che mantenga il servizio in esecuzione in primo piano se la riproduzione è in corso o interrompa il servizio in caso contrario.
    • Nascondi la barra di ricerca nella notifica multimediale per i live streaming non impostando la durata nei metadati della sessione della piattaforma (#1256).
    • Allinea la conversione di MediaMetadata a MediaDescriptionCompat per utilizzare lo stesso ordine e la stessa logica preferiti durante la selezione delle proprietà dei metadati come in media1.
    • Aggiungi MediaSession.sendError() che consente di inviare errori non irreversibili al controller Media3. Quando utilizzi il controller di notifica (vedi MediaSession.getMediaNotificationControllerInfo()), l'errore personalizzato viene utilizzato per aggiornare PlaybackState della sessione della piattaforma in uno stato di errore con le informazioni sull'errore fornite (#543).
    • Aggiungi MediaSession.Callback.onPlayerInteractionFinished() per informare le sessioni quando una serie di interazioni del player da un controller specifico è terminata.
    • Aggiungi SessionError e utilizzalo in SessionResult e LibraryResult anziché il codice di errore per fornire ulteriori informazioni sull'errore e su come risolverlo, se possibile.
    • Pubblica il codice per l'app di test del controller media3 che può essere utilizzata per testare le interazioni con le app che pubblicano una sessione multimediale.
    • Propaga gli extra passati a MediaSession[Builder].setSessionExtras() di media3 a PlaybackStateCompat.getExtras() di un controller media1.
    • Mappa gli errori irreversibili e non irreversibili da e verso la sessione della piattaforma. Un PlaybackException viene mappato a uno stato di errore irreversibile di PlaybackStateCompat. Un SessionError inviato al controller delle notifiche multimediali con MediaSession.sendError(ControllerInfo, SessionError) viene mappato a un errore non irreversibile in PlaybackStateCompat, il che significa che il codice di errore e il messaggio sono impostati, ma lo stato della sessione della piattaforma rimane diverso da STATE_ERROR.
    • Consenti l'impostazione dell'attività della sessione per controller per eseguire l'override dell'attività della sessione globale. L'attività della sessione può essere definita per un controller al momento della connessione creando un ConnectionResult con AcceptedResultBuilder.setSessionActivivty(PendingIntent). Una volta stabilita la connessione, l'attività della sessione può essere aggiornata con MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • Migliora la replica degli errori delle chiamate a MediaLibrarySession.Callback. La replica degli errori ora può essere configurata utilizzando MediaLibrarySession.Builder.setLibraryErrorReplicationMode() per scegliere il tipo di errore o disattivare la replica degli errori, che è attiva per impostazione predefinita.
  • UI:
    • Aggiunto il supporto per la visualizzazione delle immagini a PlayerView quando è connesso a un ExoPlayer (#1144).
    • Aggiunta la personalizzazione di varie icone in PlayerControlView tramite attributi XML per consentire diversi elementi drawable per istanza PlayerView, anziché override globali (#1200).
    • È stato risolto un bug della piattaforma che causava l'allungamento/il ritaglio del video quando si utilizzava SurfaceView all'interno di un AndroidView di Compose nell'API 34 (#1237).
  • Download:
    • Assicurati che DownloadHelper non perda istanze Renderer non rilasciate, il che potrebbe causare l'arresto anomalo di un'app con IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Estensione Cronet:
    • Correggi SocketTimeoutException in CronetDataSource. In alcune versioni di Cronet, la richiesta fornita dal callback non è sempre la stessa. Ciò comporta il mancato completamento del callback e il timeout della richiesta (https://issuetracker.google.com/328442628).
  • Estensione HLS:
    • Risolto un bug per cui i sample EMSG in attesa di una discontinuità venivano delegati in HlsSampleStreamWrapper con un offset errato che causava un IndexOutOfBoundsException o un IllegalArgumentException (#1002).
    • È stato corretto il bug per cui le playlist non principali continuavano a ricaricarsi per gli stream LL-HLS (#1240).
    • È stato corretto un bug per cui l'attivazione di CMCD per HLS con segmenti di inizializzazione generava Source Error e IllegalArgumentException.
    • È stato corretto il bug per cui le playlist in riproduzione non principali non venivano aggiornate durante la riproduzione in diretta (#1240).
    • Risolto il bug per cui l'attivazione di CMCD per i live streaming HLS causava ArrayIndexOutOfBoundsException (#1395).
  • Estensione DASH:
    • Risolto un bug per cui la nuova preparazione di un live streaming multi-periodo può generare un'eccezione IndexOutOfBoundsException (#1329).
    • Aggiunto il supporto per gli URL di licenza dashif:Laurl (#1345).
  • Estensione Cast:
    • Correzione di un bug che convertiva il titolo dell'album di MediaQueueItem nell'artista nell'elemento multimediale Media3 (#1255).
  • Utilità di test:
    • Implementa onInit() e onRelease() in FakeRenderer.
    • Modifica i metodi TestPlayerRunHelper.runUntil()/playUntil() in modo che non vadano a buon fine in caso di errori non irreversibili (ad es. quelli segnalati a AnalyticsListener.onVideoCodecError()). Utilizza la nuova catena di metodi TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() per disattivare questo comportamento.
  • App demo:
    • Utilizza DefaultPreloadManager nell'app demo per i contenuti nel formato breve.
    • Consenti l'impostazione della modalità repeat con gli argomenti Intent dalla riga di comando (#1266).
    • Utilizza HttpEngineDataSource come HttpDataSource se supportato dal dispositivo.
  • Rimuovi i simboli deprecati:
    • Rimuovi CronetDataSourceFactory. Usa invece CronetDataSource.Factory.
    • Rimuovi alcuni costruttori DataSpec. Usa invece il descrittore DataSpec.Builder.
    • Rimuovi il metodo setContentTypePredicate(Predicate) da DefaultHttpDataSource, OkHttpDataSource e CronetDataSource. Utilizza invece il metodo equivalente su ogni XXXDataSource.Factory.
    • Rimuovi i costruttori OkHttpDataSource e OkHttpDataSourceFactory. Usa invece il descrittore OkHttpDataSource.Factory.
    • Rimuovi PlayerMessage.setHandler(Handler). Usa invece setLooper(Looper).
    • Rimuovi il campo Timeline.Window.isLive. Utilizza invece il metodo isLive().
    • Rimuovi DefaultHttpDataSource costruttori. Usa invece DefaultHttpDataSource.Factory.
    • Rimuovi DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS. Usa invece DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS.
    • Rimuovi MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean). Usa invece il descrittore MediaCodecInfo.canReuseCodec(Format, Format).
    • Rimuovi il metodo DrmSessionManager.DUMMY e getDummyDrmSessionManager(). Usa invece il descrittore DrmSessionManager.DRM_UNSUPPORTED.
    • Rimuovi AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). Utilizza invece gli overload che accettano un DecoderReuseEvaluation.
    • Rimuovi RendererSupport.FormatSupport IntDef e le costanti FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE, FORMAT_UNSUPPORTED_TYPE. Utilizza invece l'IntDef e le costanti equivalenti in androidx.media3.common.C (ad es. C.FORMAT_HANDLED).
    • Rimuovi l'interfaccia Bundleable. Ciò include la rimozione di tutti i campi costanti Bundleable.Creator<Foo> CREATOR. I chiamanti devono invece utilizzare i metodi Bundle toBundle() e static Foo fromBundle(Bundle) su ogni tipo.

Versione 1.4.0-rc01

10 luglio 2024

Utilizza la versione stabile 1.4.0.

Versione 1.4.0-beta01

26 giugno 2024

Utilizza la versione stabile 1.4.0.

Versione 1.4.0-alpha02

7 giugno 2024

Utilizza la versione stabile 1.4.0.

Versione 1.4.0-alpha01

17 aprile 2024

Utilizza la versione stabile 1.4.0.

Versione 1.3.0

Versione 1.3.1

11 aprile 2024

androidx.media3:media3-*:1.3.1 è stato rilasciato. La versione 1.3.1 contiene questi commit.

  • Libreria comune:
    • Aggiungi Format.labels per consentire etichette localizzate o altre etichette alternative.
  • ExoPlayer:
    • Risolvi il problema per cui PreloadMediaPeriod non riesce a conservare gli stream quando viene precaricato di nuovo.
    • Applica il TrackSelectionResult corrispondente corretto al periodo di riproduzione nella riselezione della traccia.
    • Avvia i renderer abilitati in anticipo solo dopo aver fatto avanzare il periodo di riproduzione durante la transizione tra elementi multimediali (#1017).
    • Aggiungi il tipo restituito mancante alla regola proguard -keepclasseswithmembers per DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformer:
    • Aggiunta una soluzione alternativa per l'eccezione generata perché MediaMuxer non supporta i timestamp di presentazione negativi prima dell'API 30.
  • Selezione della traccia:
    • DefaultTrackSelector: preferisci le tracce video con una frequenza fotogrammi "ragionevole" (>=10 fps) rispetto a quelle con una frequenza fotogrammi inferiore o non impostata. In questo modo, il player seleziona la traccia video "reale" negli MP4 estratti dalle foto in movimento che possono contenere due tracce HEVC, una con una risoluzione più elevata, ma un numero molto ridotto di frame (#1051).
  • Estrattori:
    • Risolto il problema per cui il padding non veniva saltato durante la lettura di blocchi di dimensioni dispari dai file WAV (#1117).
    • MP3: compila Format.averageBitrate dai frame dei metadati, ad esempio XING e VBRI.
    • MPEG-TS: è stata annullata una modifica volta a garantire il rendering dell'ultimo frame passando l'ultima unità di accesso di uno stream alla coda di campioni (#7909). Questo è dovuto alla modifica che causa nuovi problemi con gli stream HLS solo I-frame (#1150) e gli stream HLS H.262 (#1126).
  • Audio:
    • Consenti il ripristino del renderer disattivando l'offload se la traccia audio non viene inizializzata in modalità di offload.
  • Video:
    • Aggiunta di una soluzione alternativa per un problema del dispositivo su Galaxy Tab S7 FE, Chromecast con Google TV e Lenovo M10 FHD Plus che causa la marcatura degli stream H265 a 60 f/s come non supportati
    • Aggiunta una soluzione alternativa che garantisce che il primo frame venga sempre visualizzato durante il tunneling, anche se il dispositivo non lo fa automaticamente come richiesto dall'API (#1169). (#966).
    • Risolto il problema per cui la gestione delle informazioni sui colori HDR causava un comportamento anomalo del codec e impediva i cambi di formato adattivo per le tracce video SDR (#1158).
  • Testo:
    • WebVTT: impedisci ai cue consecutivi di creare istanze CuesWithTiming aggiuntive spurie da WebvttParser.parse (#1177).
  • DRM:
    • È stato aggirato un problema relativo a NoSuchMethodError che può essere generato dal framework MediaDrm anziché da ResourceBusyException o NotProvisionedException su alcuni dispositivi Android 14 (#1145).
  • Effetto:
    • Migliorata la mappatura tonale da PQ a SDR tramite la conversione degli spazi dei colori.
  • Sessione:
    • Risolto il problema per cui la posizione corrente torna indietro quando il controller sostituisce l'elemento corrente (#951).
    • Risolto il problema per cui MediaMetadata con solo extras non null non viene trasmesso tra i controller e le sessioni multimediali (#1176).
  • UI:
    • Fallback per includere il nome della lingua della traccia audio se Locale non riesce a identificare un nome visualizzato (#988).
  • Estensione DASH:
    • Compila tutti gli elementi Label del manifest in Format.labels (#1054).
  • Estensione RTSP:
    • Ignora i valori vuoti delle informazioni sulla sessione (tag i) nell'analisi SDP (#1087).
  • Estensioni del decoder (FFmpeg, VP9, AV1, MIDI e così via):
    • Disattiva l'estensione MIDI come dipendenza locale per impostazione predefinita perché richiede la configurazione di un repository Maven aggiuntivo. Gli utenti che hanno bisogno di questo modulo da una dipendenza locale possono riattivarlo.

Versione 1.3.0

6 marzo 2024

androidx.media3:media3-*:1.3.0 è stato rilasciato. La versione 1.3.0 contiene questi commit.

  • Libreria comune:
    • Implementa il supporto per gli URI delle risorse non elaborate android.resource://package/[type/]name, dove package è diverso dal pacchetto dell'applicazione corrente. È sempre stato documentato che questa funzionalità funzionava, ma non era stata implementata correttamente fino ad ora.
    • Normalizza i tipi MIME impostati dal codice dell'app o letti dai contenuti multimediali in modo che siano completamente in minuscolo.
    • Definisci gli annunci con un MediaItem completo anziché con un singolo Uri in AdPlaybackState.
    • Aumenta minSdk a 19 (Android KitKat). Questo è in linea con tutte le altre librerie AndroidX ed è necessario per eseguire l'upgrade alle ultime versioni delle nostre dipendenze AndroidX.
    • Compila sia artworkUri che artworkData in MediaMetadata.Builder.populate(MediaMetadata) quando almeno uno dei due non è null (#964).
  • ExoPlayer:
    • Aggiungi PreloadMediaSource e PreloadMediaPeriod per consentire alle app di precaricare un'origine multimediale di contenuti in una posizione di inizio specifica prima della riproduzione. PreloadMediaSource si occupa di preparare l'origine dei contenuti multimediali per ricevere Timeline, preparare e memorizzare nella cache il periodo nella posizione iniziale specificata, selezionare le tracce e caricare i dati multimediali per il periodo. Le app controllano l'avanzamento del precaricamento implementando PreloadMediaSource.PreloadControl e impostano l'origine precaricata sul player per la riproduzione.
    • Aggiungi ExoPlayer.setImageOutput che consente alle app di impostare ImageRenderer.ImageOutput.
    • DefaultRenderersFactory ora fornisce un ImageRenderer al player per impostazione predefinita con ImageOutput e ImageDecoder.Factory.DEFAULT null.
    • Attiva l'evento Player.Listener.onPositionDiscontinuity quando il silenzio viene saltato (#765).
    • Aggiunto il supporto sperimentale per l'analisi dei sottotitoli durante l'estrazione. Puoi attivare questa funzionalità utilizzando MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Supporta origini multimediali adattive con PreloadMediaSource.
    • Implementa HttpEngineDataSource, un HttpDataSource che utilizza l'API HttpEngine.
    • Impedisci la sottoclassificazione di CompositeSequenceableLoader. Questo componente è stato precedentemente reso estensibile, ma non è mai stata creata una sottoclasse all'interno della libreria. Le personalizzazioni possono essere eseguite eseguendo il wrapping di un'istanza utilizzando il pattern decorator e implementando un CompositeSequenceableLoaderFactory personalizzato.
    • Risolto il problema per cui la ripetizione della stessa ora causava la cancellazione dei metadati di questo elemento (#1007).
    • Rinomina i metodi experimentalSetSubtitleParserFactory su BundledChunkExtractor.Factory e DefaultHlsExtractorFactory in setSubtitleParserFactory e non consentire il passaggio di null. Utilizza i nuovi metodi experimentalParseSubtitlesDuringExtraction(boolean) per controllare il comportamento di analisi.
    • Aggiungi il supporto per la personalizzazione del SubtitleParser.Factory utilizzato durante l'estrazione. Questo obiettivo può essere raggiunto con MediaSource.Factory.setSubtitleParserFactory().
    • Aggiungi il prefisso dell'origine a tutti i campi Format.id generati da MergingMediaSource. In questo modo è più facile identificare la fonte che ha generato un Format (#883).
    • È stata corretta l'espressione regolare utilizzata per convalidare i nomi delle chiavi CMCD (Common Media Client Data) personalizzate modificandola in modo che controlli solo il trattino (#1028).
    • Interruzione della doppia codifica dei parametri di query CMCD (#1075).
  • Transformer:
    • Aggiunto il supporto per l'appiattimento dei video in slow motion SEF H.265/HEVC.
    • Aumenta la velocità di transmuxing, in particolare per le modifiche di "rimozione del video".
    • Aggiungi l'API per assicurarti che il file di output inizi su un frame video. In questo modo, l'output delle operazioni di ritaglio può essere più compatibile con le implementazioni del player che non mostrano il primo frame del video fino al timestamp di presentazione (#829).
    • Aggiunto il supporto per l'ottimizzazione delle operazioni di taglio di singoli asset MP4.
    • Aggiungi il supporto per assicurarti che un frame video abbia il primo timestamp nel file di output. Corregge i file di output che iniziano con un frame nero sui player basati su iOS (#829).
  • Selezione della traccia:
    • Aggiungi DefaultTrackSelector.selectImageTrack per attivare la selezione della traccia immagine.
    • Aggiungi TrackSelectionParameters.isPrioritizeImageOverVideoEnabled per determinare se selezionare una traccia immagine se sono disponibili sia una traccia immagine che una traccia video. Il valore predefinito è false, il che significa che la selezione di una traccia video ha la priorità.
  • Estrattori:
    • Aggiunta di un'ulteriore analisi AV1C all'estrattore MP4 per recuperare i valori ColorInfo.colorSpace, ColorInfo.colorTransfer e ColorInfo.colorRange (#692).
    • MP3: utilizza la ricerca con velocità in bit costante (CBR) per i file con un'intestazione Info (l'equivalente CBR dell'intestazione Xing). In precedenza utilizzavamo la tabella di ricerca dall'intestazione Info, ma questo comporta una ricerca meno precisa rispetto a quando la ignoriamo e supponiamo che il file sia CBR.
    • MPEG2-TS: aggiunto il supporto di DTS, DTS-LBR e DTS:X Profile2 (#275).
    • Estrai i tipi di audio dai descrittori TS e mappali ai flag dei ruoli, consentendo agli utenti di effettuare selezioni delle tracce audio più consapevoli (#973).
  • Audio:
    • Miglioramento dell'algoritmo di salto del silenzio con rampa di volume graduale; mantenimento del silenzio minimo e durate del silenzio più naturali (#7423).
    • Segnala il silenzio saltato in modo più deterministico (#1035).
  • Video:
    • Modifica il costruttore MediaCodecVideoRenderer che accetta un argomento VideoFrameProcessor.Factory e sostituiscilo con un costruttore che accetta un argomento VideoSinkProvider. Le app che vogliono inserire un VideoFrameProcessor.Factory personalizzato possono creare un'istanza di un CompositingVideoSinkProvider che utilizza il VideoFrameProcessor.Factory personalizzato e passare il provider del sink video a MediaCodecVideoRenderer.
  • Testo:
    • È stata corretta la serializzazione dei cue bitmap per risolvere l'errore Tried to marshall a Parcel that contained Binder objects quando si utilizza DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • CEA-708: ignora il valore rowLock. La specifica CEA-708-E S-2023 stabilisce che rowLock e columnLock devono essere considerati entrambi true, indipendentemente dai valori presenti nello stream (il supporto di columnLock non è implementato, quindi si presume che sia sempre false).
  • Immagine:
    • Aggiungi il supporto per le miniature DASH. Le immagini della griglia vengono ritagliate e le singole miniature vengono fornite a ImageOutput in prossimità degli orari di presentazione.
  • DRM:
    • Riproduci immediatamente i sample non criptati "clear lead" nei contenuti DRM per impostazione predefinita, anche se le chiavi per i sample criptati successivi non sono ancora pronte. Ciò potrebbe causare blocchi durante la riproduzione se le chiavi non sono ancora pronte quando la posizione di riproduzione raggiunge i sample criptati (ma in precedenza la riproduzione non sarebbe stata avviata affatto a questo punto). Questo comportamento può essere disattivato con MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey o DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
      • Estensione IMA:
    • Risolto il problema per cui gli annunci DASH e HLS senza l'estensione del file appropriata non possono essere riprodotti.
  • Sessione:
    • Disattivato il rilevamento del doppio clic per le app TV (#962).
    • Risolto il problema per cui MediaItem.RequestMetadata con solo extra non nulli non viene trasmesso tra i controller multimediali e le sessioni.
    • Aggiungi il costruttore a MediaLibrarySession.Builder che accetta solo un Context anziché un MediaLibraryService.
  • Estensione HLS:
    • Riduci HlsMediaPeriod alla visibilità privata del pacchetto. Questo tipo non deve essere utilizzato direttamente dall'esterno del pacchetto HLS.
    • Risolve le ricerche all'inizio di un segmento in modo più efficiente (#1031).
  • Estensioni del decoder (FFmpeg, VP9, AV1, MIDI e così via):
    • Decoder MIDI: ignora i messaggi di evento SysEx (#710).
  • Utilità di test:
    • Non mettere in pausa la riproduzione in TestPlayerRunHelper.playUntilPosition. Il test mantiene la riproduzione in stato di riproduzione, ma sospende l'avanzamento finché non è in grado di aggiungere asserzioni e altre azioni.
  • App demo:
    • Aggiungi un modulo demo di formato breve per mostrare l'utilizzo di PreloadMediaSource con il caso d'uso dei contenuti nel formato breve.

Versione 1.3.0-rc01

22 febbraio 2024

Utilizza la versione stabile 1.3.0.

Versione 1.3.0-beta01

7 febbraio 2024

Utilizza la versione stabile 1.3.0.

Versione 1.3.0-alpha01

15 gennaio 2024

Utilizza la versione stabile 1.3.0.

Versione 1.2.0

Versione 1.2.1

9 gennaio 2024

  • ExoPlayer:
    • Risolto il problema per cui le ricerche manuali al di fuori dell'intervallo LiveConfiguration.min/maxOffset continuano a regolare l'offset riportandolo a min/maxOffset.
    • Risolto il problema per cui i layout dei canali OPUS e VORBIS erano errati per 3, 5, 6, 7 e 8 canali (#8396).
    • Risolto il problema per cui le selezioni delle tracce dopo la ricerca di zero in un live streaming consentivano erroneamente l'avvio dello stream nella posizione predefinita (#9347).
    • Risolto il problema per cui le nuove istanze di CmcdData.Factory ricevevano valori negativi per bufferedDurationUs dalle origini dei chunk, generando un IllegalArgumentException (#888).
  • Transformer:
    • Risolto un problema per cui l'encoder generava un errore in fase di configurazione a causa dell'impostazione di una frequenza di funzionamento elevata.
  • Estrattori:
    • Contrassegna le tracce HEVC secondarie (non riproducibili) nelle foto in movimento JPEG come ROLE_FLAG_ALTERNATE per evitare che vengano selezionate automaticamente per la riproduzione a causa della loro risoluzione più elevata.
    • Risolto il problema di rilevamento errato dei fotogrammi chiave per gli stream TS H264 (#864).
    • Risolto il problema relativo alla stima della durata degli stream TS più lunghi di 47.721 secondi (#855).
  • Audio:
    • Correzione della gestione di EOS per SilenceSkippingAudioProcessor quando viene chiamato più volte (#712).
  • Video:
    • Aggiunta una soluzione alternativa per un problema del dispositivo su Galaxy Tab S7 FE, Chromecast con Google TV e Lenovo M10 FHD Plus che causa l'indicazione degli stream AVC a 60 fps come non supportati (#693).
  • Metadati:
    • Risolto il bug per cui MediaMetadata veniva compilato solo dai commenti Vorbis con chiavi in maiuscolo (#876).
    • Rileva OutOfMemoryError durante l'analisi di frame ID3 molto grandi, il che significa che la riproduzione può continuare senza le informazioni dei tag anziché non riuscire completamente.
  • DRM:
    • Estensione della soluzione alternativa per l'URL della licenza ClearKey https://default.url spurio all'API 33 e versioni successive (in precedenza la soluzione alternativa si applicava solo all'API 33) (#837).
    • Correzione di ERROR_DRM_SESSION_NOT_OPENED durante il passaggio da contenuti criptati a contenuti non criptati senza una superficie collegata al player. L'errore è stato causato dall'utilizzo errato di un decoder sicuro per riprodurre i contenuti non criptati.
  • Sessione:
    • Inserisci le chiavi e i valori personalizzati in MediaMetadataCompat in MediaMetadata.extras e MediaMetadata.extras in MediaMetadataCompat (#756, #802).
    • Correzione della trasmissione notifyChildrenChanged per i controller legacy (#644).
    • È stato corretto un bug per cui l'impostazione di un tempo negativo per un timer setWhen disattivato della notifica causava un arresto anomalo su alcuni dispositivi (#903).
    • Risolto il problema relativo a IllegalStateException quando il controller delle notifiche multimediali non ha completato la connessione quando viene richiesto il primo aggiornamento delle notifiche (#917).
  • UI:
    • Risolto il problema per cui i pulsanti Avanti e Indietro non erano visibili se utilizzati con Material Design in un BottomSheetDialogFragment (#511).
    • Risolto il problema per cui i numeri nel pulsante di avanzamento rapido di PlayerControlView non erano allineati (#547).
  • Estensione DASH:
    • Analizza "f800" come numero di canali pari a 5 per Dolby nel manifest DASH (#688).
  • Estensioni del decoder (FFmpeg, VP9, AV1, MIDI e così via):
    • MIDI: è stato risolto un problema per cui l'avanzamento rapido saltava gli eventi di modifica del programma (#704).
    • Eseguita la migrazione a FFmpeg 6.0 e aggiornato l'NDK supportato a r26b (#707, #867).
  • Estensione Cast:
    • Sanitizza la creazione di un Timeline per evitare l'arresto anomalo dell'app quando il caricamento dei contenuti multimediali non va a buon fine sul dispositivo di trasmissione (#708).

Versione 1.2.0

15 novembre 2023

  • Libreria comune:
    • Aggiungi un parametro @Nullable Throwable ai metodi nell'interfaccia Log.Logger. Il parametro message di questi metodi non contiene più informazioni sul Throwable passato ai metodi Log.{d,i,w,e}(), pertanto le implementazioni dovranno aggiungere manualmente queste informazioni, se necessario (possibilmente utilizzando Logger.appendThrowableString(String, Throwable)).
    • Risolto il problema di compatibilità di Kotlin per cui i parametri di tipo generico nullable e i tipi di elementi di array nullable non vengono rilevati come nullable. Esempi sono i parametri dei metodi TrackSelectorResult e SimpleDecoder (#6792).
    • Modifica il comportamento predefinito della UI e delle notifiche in Util.shouldShowPlayButton per mostrare un pulsante "Riproduci" mentre la riproduzione è temporaneamente soppressa (ad esempio a causa della perdita temporanea del focus audio). Il comportamento precedente può essere mantenuto utilizzando PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) o MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Esegui l'upgrade di androidx.annotation:annotation-experimental a 1.3.1 per risolvere il problema https://issuetracker.google.com/251172715.
    • Sposta ExoPlayer.setAudioAttributes nell'interfaccia Player.
  • ExoPlayer:
    • Risolti i problemi di ricerca negli stream AC4 causati dalla mancata identificazione corretta dei campioni di sola decodifica (#11000).
    • Aggiungi la soppressione della riproduzione su dispositivi di output audio non adatti (ad es. l'altoparlante integrato sui dispositivi Wear OS) quando questa funzionalità è attivata tramite ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. Il motivo della soppressione della riproduzione verrà aggiornato come Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT se viene tentata la riproduzione quando non sono disponibili uscite audio adatte o se tutte le uscite adatte vengono disconnesse durante la riproduzione. Il motivo della soppressione verrà rimosso quando verrà collegata un'uscita adatta.
    • Aggiungi MediaSource.canUpdateMediaItem e MediaSource.updateMediaItem per accettare gli aggiornamenti di MediaItem dopo la creazione tramite Player.replaceMediaItem(s).
    • Consenti gli aggiornamenti di MediaItem per tutte le classi MediaSource fornite dalla libreria tramite Player.replaceMediaItem(s) (#33, #9978).
    • Rinomina MimeTypes.TEXT_EXOPLAYER_CUES in MimeTypes.APPLICATION_MEDIA3_CUES.
    • Aggiungi PngExtractor che invia e legge un intero file PNG in TrackOutput come un singolo campione.
    • Migliora il metodo SequenceableLoader.continueLoading(long) nell'interfaccia SequenceableLoader in SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo contiene parametri aggiuntivi, tra cui playbackSpeed e lastRebufferRealtimeMs, oltre all'esistente playbackPositionUs.
    • Migliora il metodo ChunkSource.getNextChunk(long, long, List, ChunkHolder) nell'interfaccia ChunkSource per ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Aggiungi campi aggiuntivi al logging dei dati del client multimediale comune (CMCD): buffer starvation (bs), scadenza (dl), velocità di riproduzione (pr) e avvio (su) (#8699).
    • Aggiunta della profondità di bit di luma e croma a ColorInfo (#491).
    • Aggiunta di campi aggiuntivi al logging dei dati CMCD (Common Media Client Data): richiesta dell'oggetto successivo (nor) e richiesta dell'intervallo successivo (nrr) (#8699).
    • Aggiunta della funzionalità per trasmettere i dati CMCD (Common Media Client Data) utilizzando i parametri di query (#553).
    • È stato corretto ConcurrentModificationException in ExperimentalBandwidthMeter (#612).
    • Aggiungi il parametro MediaPeriodId a CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Supporto di ClippingMediaSource (e altre origini con offset temporali di periodo/finestra) in ConcatenatingMediaSource2 (#11226).
    • Modifica BaseRenderer.onStreamChanged() in modo che riceva anche un argomento MediaPeriodId.
  • Transformer:
    • Analizza i dati di rotazione EXIF per gli input di immagini.
    • Rimuovi il tipo di annotazione TransformationRequest.HdrMode e le relative costanti associate. Utilizza invece Composition.HdrMode e le costanti associate.
    • Semplifica il OverlaySettings per risolvere i problemi di rotazione.
    • I parametri frameRate e durationUs di SampleConsumer.queueInputBitmap sono stati modificati in TimestampIterator.
  • Selezione della traccia:
    • Aggiungi DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness per consentire o non consentire esplicitamente l'adattamento non continuo. L'impostazione predefinita rimane il comportamento attuale di true.
  • Estrattori:
    • MPEG-TS: assicurati che l'ultimo frame venga visualizzato passando l'ultima unità di accesso di uno stream alla coda di campioni (#7909).
    • Correzione di un errore di battitura durante la determinazione di rotationDegrees. Modificato projectionPosePitch in projectionPoseRoll (#461).
    • Rimuovi l'ipotesi che le istanze Extractor possano essere ispezionate direttamente con instanceof. Se vuoi accedere in fase di runtime ai dettagli di implementazione di un Extractor, devi prima chiamare Extractor.getUnderlyingInstance.
    • Aggiungi BmpExtractor.
    • Aggiungi WebpExtractor.
    • Aggiungi HeifExtractor.
    • Aggiungi il supporto di QuickTime classico a Mp4Extractor.
  • Audio:
    • Aggiunta del supporto per PCM big-endian a 24/32 bit in MP4 e Matroska e analisi della codifica PCM per lpcm in MP4.
    • Aggiunto il supporto per l'estrazione dell'audio Vorbis in MP4.
    • Aggiungi AudioSink.getFormatOffloadSupport(Format) che recupera il livello di supporto dell'offload che il sink può fornire per il formato tramite un DefaultAudioOffloadSupportProvider. Restituisce il nuovo AudioOffloadSupport che contiene isFormatSupported, isGaplessSupported e isSpeedChangeSupported.
    • Aggiungi AudioSink.setOffloadMode() tramite cui viene configurata la configurazione di offload sul sink audio. Il valore predefinito è AudioSink.OFFLOAD_MODE_DISABLED.
    • L'offload può essere attivato tramite setAudioOffloadPreference in TrackSelectionParameters. Se la preferenza impostata è l'attivazione, il dispositivo supporta l'offload per il formato e la selezione della traccia è una singola traccia audio, l'offload audio verrà attivato.
    • Se audioOffloadModePreference è impostato su AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, DefaultTrackSelector selezionerà solo una traccia audio e solo se il formato della traccia è supportato nell'offload. Se nessuna traccia audio è supportata in offload, non verrà selezionata alcuna traccia.
    • Disattivazione del supporto per l'offload senza interruzioni per i livelli API precedenti alla versione 33 a causa di un problema di posizione di riproduzione dopo la transizione della traccia.
    • Rimuovi il parametro enableOffload dalla firma del metodo DefaultRenderersFactory.buildAudioSink.
    • Rimuovi il metodo DefaultAudioSink.Builder.setOffloadMode.
    • Rimuovi il valore intdef DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Aggiunta del supporto per i metadati gapless di Opus durante la riproduzione in offload.
    • Consenti il ripristino del renderer disattivando l'offload se non è riuscito alla prima scrittura (#627).
    • Attiva la pianificazione dell'offload per impostazione predefinita per la riproduzione con offload solo audio.
    • Elimina ExoPlayer.experimentalSetOffloadSchedulingEnabled e AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • onExperimentalSleepingForOffloadChanged è stato rinominato in onSleepingForOffloadChanged e onExperimentalOffloadedPlayback in onOffloadedPlayback.
    • Sposta le interfacce e le definizioni TrackSelectionParameters relative alla modalità di offload audio in una classe AudioOffloadPreferences interna.
    • Aggiungi i callback onAudioTrackInitialized e onAudioTrackReleased a AnalyticsListener, AudioRendererEventListener e AudioSink.Listener.
    • Risolto il problema di underflow del buffer audio DTS Express (#650).
    • È stato corretto un bug per cui il controllo delle funzionalità per E-AC3-JOC genera un'eccezione IllegalArgumentException (#677).
  • Video:
    • Consenti a MediaCodecVideoRenderer di utilizzare un VideoFrameProcessor.Factory personalizzato.
    • È stato corretto un bug per cui non era possibile eseguire il rendering del primo frame se lo stream audio iniziava con timestamp negativi (#291).
  • Testo:
    • Rimuovi ExoplayerCuesDecoder. Le tracce di testo con sampleMimeType = application/x-media3-cues ora vengono gestite direttamente da TextRenderer senza bisogno di un'istanza SubtitleDecoder.
  • Metadati:
    • MetadataDecoder.decode non verrà più chiamato per i sample "solo decodifica", poiché l'implementazione deve comunque restituire null.
  • Effetto:
    • Aggiungi VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) per mettere in coda l'input bitmap in base al timestamp.
    • Modifica VideoFrameProcessor.registerInputStream() in modo che non sia bloccante. Le app devono implementare VideoFrameProcessor.Listener#onInputStreamRegistered().
    • I parametri frameRate e durationUs di VideoFrameProcessor.queueInputBitmap sono stati modificati in TimestampIterator.
  • Estensione IMA:
    • Risolto un bug per cui un live streaming DASH multi-periodo che non è il primo elemento di una playlist può generare un'eccezione (#571).
    • Rilascia StreamManager prima di chiamare AdsLoader.destroy()
    • Aggiorna la versione dell'SDK IMA alla 3.31.0.
  • Sessione:
    • Imposta il comportamento del servizio in primo piano delle notifiche su FOREGROUND_SERVICE_IMMEDIATE in DefaultMediaNotificationProvider (#167).
    • Utilizza solo android.media.session.MediaSession.setMediaButtonBroadcastReceiver() sopra l'API 31 per evitare problemi con l'API deprecata sui dispositivi Samsung (#167).
    • Utilizza il controller delle notifiche multimediali come proxy per impostare i comandi disponibili e il layout personalizzato utilizzato per compilare la notifica e la sessione della piattaforma.
    • Converti gli eventi dei pulsanti multimediali ricevuti da MediaSessionService.onStartCommand() all'interno di Media3 anziché indirizzarli alla sessione della piattaforma e di nuovo a Media3. In questo modo, il controller della chiamata è sempre il controller delle notifiche dei contenuti multimediali e le app possono riconoscere facilmente le chiamate provenienti dalla notifica nello stesso modo su tutti i livelli API supportati.
    • È stato corretto il bug per cui MediaController.getCurrentPosition() non avanza quando è connesso a un MediaSessionCompat legacy.
    • Aggiungi MediaLibrarySession.getSubscribedControllers(mediaId) per comodità.
    • Esegui l'override di MediaLibrarySession.Callback.onSubscribe() per confermare la disponibilità dell'ID principale per cui il controller si iscrive. Se l'operazione va a buon fine, l'abbonamento viene accettato e notifyChildrenChanged() viene chiamato immediatamente per informare il browser (#561).
    • Aggiungi il modulo della sessione demo per Automotive OS e attiva la sessione demo per Android Auto.
    • Non impostare la coda della sessione del framework quando COMMAND_GET_TIMELINE non è disponibile per il controller delle notifiche multimediali. Con Android Auto come controller client che legge dalla sessione del framework, il pulsante queue nell'interfaccia utente di Android Auto non viene visualizzato (#339).
    • Utilizza DataSourceBitmapLoader per impostazione predefinita anziché SimpleBitmapLoader (#271, #327).
    • Aggiunta di MediaSession.Callback.onMediaButtonEvent(Intent) per consentire alle app di eseguire l'override della gestione predefinita degli eventi dei pulsanti multimediali.
  • UI:
    • Aggiungi un'implementazione di Player.Listener per i dispositivi Wear OS che gestisce la soppressione della riproduzione dovuta a Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT avviando una finestra di dialogo di sistema per consentire a un utente di connettere un'uscita audio adatta (ad es. cuffie Bluetooth). L'ascoltatore riprenderà automaticamente la riproduzione se un dispositivo adatto viene connesso entro un timeout configurabile (il valore predefinito è 5 minuti).
  • Download:
    • Dichiara il tipo di servizio in primo piano "Sincronizzazione dati" per DownloadService per la compatibilità con Android 14. Quando utilizza questo servizio, l'app deve anche aggiungere dataSync come foregroundServiceType nel manifest e aggiungere l'autorizzazione FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • Estensione HLS:
    • Aggiorna la playlist live HLS con un intervallo calcolato dall'ora di inizio dell'ultimo caricamento anziché dall'ora di completamento dell'ultimo caricamento (#663).
  • Estensione DASH:
    • Consenti più identificatori DASH uguali nell'URL del modello di segmento.
    • Aggiunto il supporto sperimentale per l'analisi dei sottotitoli durante l'estrazione. In questo modo, l'unione dei sottotitoli sovrapposti è supportata meglio, inclusa la risoluzione dello sfarfallio durante la transizione tra i segmenti dei sottotitoli. Puoi attivare questa opzione utilizzando DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Estensione RTSP:
    • Correzione di una race condition che poteva causare IndexOutOfBoundsException durante il fallback a TCP o il blocco della riproduzione in alcune situazioni.
    • Controlla lo stato nella configurazione RTSP quando viene restituito lo stato di caricamento di RtspMediaPeriod (#577).
    • Ignora i metodi di richiesta RTSP personalizzati nell'intestazione pubblica della risposta Options (#613).
    • Utilizza il valore di timeout della risposta di configurazione RTSP nell'intervallo di tempo di invio delle richieste di opzioni RTSP keep-alive (#662).
  • Estensioni del decoder (FFmpeg, VP9, AV1, MIDI e così via):
    • Rilascia il modulo del decoder MIDI, che fornisce il supporto per la riproduzione di file MIDI standard utilizzando la libreria Jsyn per sintetizzare l'audio.
    • Aggiungi DecoderOutputBuffer.shouldBeSkipped per contrassegnare direttamente i buffer di output che non devono essere presentati. Questa opzione è preferibile a C.BUFFER_FLAG_DECODE_ONLY, che verrà ritirata.
    • Aggiungi Decoder.setOutputStartTimeUs e SimpleDecoder.isAtLeastOutputStartTimeUs per consentire ai decoder di eliminare i sample di sola decodifica prima dell'ora di inizio. Questa opzione è preferibile a Buffer.isDecodeOnly, che verrà ritirata.
    • Risolto il bug relativo alla pubblicazione dell'artefatto del decoder MIDI nel repository Maven. L'artefatto è stato rinominato in media3-exoplayer-midi (#734).
  • Estensione Leanback:
    • Risolto un bug per cui la disattivazione di una superficie può causare un ArithmeticException nel codice Leanback (#617).
  • Utilità di test:
    • Rendi TestExoPlayerBuilder e FakeClock compatibili con i test della UI di Espresso e i test della UI di Compose. In questo modo viene corretto un bug per cui la riproduzione avanza in modo non deterministico durante le interazioni con le visualizzazioni Espresso o Compose.
  • Rimuovi i simboli deprecati:
    • Rimuovi TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) e TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Utilizza Composition.Builder.setHdrMode(int) e passa Composition a Transformer.start(Composition, String).
    • Rimuovi il metodo DownloadNotificationHelper.buildProgressNotification deprecato e utilizza un metodo non deprecato che accetta un parametro notMetRequirements.

Versione 1.2.0-rc01

1° novembre 2023

Utilizza la versione stabile 1.2.0.

Versione 1.2.0-beta01

19 ottobre 2023

Utilizza la versione stabile 1.2.0.

Versione 1.2.0-alpha02

29 settembre 2023

Utilizza la versione stabile 1.2.0.

Versione 1.2.0-alpha01

17 agosto 2023

Utilizza la versione stabile 1.2.0.

Versione 1.1.0

Versione 1.1.1

16 agosto 2023

  • Libreria comune:
    • È stata rimossa la dipendenza multidex aggiunta accidentalmente da tutti i moduli (#499).
  • ExoPlayer:
    • Risolvi il problema in PlaybackStatsListener per cui vengono creati PlaybackStats spuri dopo la cancellazione della playlist.
    • Aggiunta di campi aggiuntivi al logging dei dati CMCD (Common Media Client Data): formato di streaming (sf), tipo di stream (st), versione (v), birate superiore (tb), durata dell'oggetto (d), velocità effettiva misurata (mtp) e tipo di oggetto (ot) (#8699).
  • Audio:
    • È stato corretto un bug per cui Player.getState() non passava mai a STATE_ENDED durante la riproduzione di file molto brevi (#538).
  • Offload audio:
    • Anteponi le pagine di intestazione ID Ogg e intestazione commento al bitstream per la riproduzione di Opus con offload in conformità con RFC 7845.
  • Video:
    • H.265/HEVC: è stata corretta l'analisi delle informazioni sulle immagini di riferimento a breve e lungo termine SPS.
  • Testo:
    • CEA-608: modifica della logica di troncamento dei cue per considerare solo il testo visibile. In precedenza, l'offset di rientro e tabulazione era incluso quando la lunghezza del cue era limitata a 32 caratteri (il che era tecnicamente corretto in base alla specifica) (#11019).
  • Estensione IMA:
    • Esegui l'upgrade alla versione 3.30.3 dell'SDK IMA.
  • Sessione:
    • Aggiungi il layout personalizzato allo stato del controller e fornisci un getter per accedervi. Quando il layout personalizzato cambia, viene chiamato MediaController.Listener.onCustomLayoutChanged. Le app che vogliono inviare layout personalizzati diversi a controller Media3 diversi possono farlo in MediaSession.Callback.onConnect utilizzando un AcceptedResultBuilder per assicurarsi che il layout personalizzato sia disponibile per il controller al termine della connessione.
    • Risolti i casi in cui MediaLibraryServiceLegacyStub inviava un errore a un Result che non lo supportava, generando un UnsupportedOperationException (#78).
    • Correzione del modo in cui PlayerWrapper crea un VolumeProviderCompat determinando volumeControlType tramite i comandi legacy (COMMAND_ADJUST_DEVICE_VOLUME e COMMAND_SET_DEVICE_VOLUME) e i nuovi comandi (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS e COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

Versione 1.1.0

5 luglio 2023

  • Libreria comune:
    • Aggiungi il motivo della soppressione per il percorso audio non adatto e riproduci quando è pronto Modifica il motivo della soppressione troppo lunga. (#15).
    • Aggiungi comandi al Player:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Aggiungi metodi sovraccarichi a Player che consentono agli utenti di specificare i flag del volume:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Aggiungi Builder per DeviceInfo e ritira il costruttore esistente.
    • Aggiungi DeviceInfo.routingControllerId per specificare l'ID del controller di routing per le riproduzioni remote.
    • Aggiunta di Player.replaceMediaItem(s) come scorciatoia per aggiungere e rimuovere elementi nella stessa posizione (#8046).
  • ExoPlayer:
    • Consenti a ExoPlayer di controllare i metodi di regolazione del volume del dispositivo solo se l'utente ha dato il consenso esplicito. Usa ExoPlayer.Builder.setDeviceVolumeControlEnabled per accedere a:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) e setDeviceVolume(int, int)
      • increaseDeviceVolume(int) e increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) e decreaseDeviceVolume(int, int)
    • Aggiungi FilteringMediaSource che consente di filtrare i tipi di tracce disponibili da un MediaSource.
    • Aggiungi il supporto per l'inclusione dei dati CMCD (Common Media Client Data) nelle richieste in uscita dei formati di streaming adattivo DASH, HLS e SmoothStreaming. Sono stati incorporati i seguenti campi: br, bl, cid, rtp e sid (#8699). Struttura dell'API e metodi dell'API:
      • Il logging CMCD è disattivato per impostazione predefinita. Utilizza MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) per attivarlo.
      • Tutte le chiavi sono abilitate per impostazione predefinita, esegui l'override di CmcdConfiguration.RequestConfig.isKeyAllowed(String key) per filtrare le chiavi di cui viene eseguito il logging.
      • Esegui l'override di CmcdConfiguration.RequestConfig.getCustomData() per attivare il logging delle chiavi personalizzate.
    • Aggiunta un'azione aggiuntiva al manifest della demo principale per semplificare l'avvio dell'app demo con un file *.exolist.json personalizzato (#439).
    • Aggiungi ExoPlayer.setVideoEffects() per l'utilizzo di Effect durante la riproduzione di video.
    • Aggiorna SampleQueue per archiviare sourceId come long anziché come int. In questo modo, le firme dei metodi pubblici SampleQueue.sourceId e SampleQueue.peekSourceId vengono modificate.
    • Aggiungi parametri ai metodi LoadControl shouldStartPlayback e onTracksSelected che consentono di associare questi metodi al MediaPeriod pertinente.
    • Modifica la firma di ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) aggiungendo un parametro della cronologia che contiene i periodi con gli UID utilizzati come chiavi nella mappa. Questo è necessario per evitare problemi di contemporaneità con i live streaming multi-periodo.
    • Depreca EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) e BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). In alternativa, è possibile chiamare la variante dei metodi senza mediaTimeOffsetUs. Tieni presente che, anche per le varianti ritirate, l'offset non viene più aggiunto a startTimeUs e endTimeUs degli oggetti MediaLoadData inviati dal dispatcher.
    • Rinomina ExoTrackSelection.blacklist in excludeTrack e isBlacklisted in isTrackExcluded.
    • Risolto il comportamento incoerente tra ExoPlayer.setMediaItem(s) e addMediaItem(s) quando vengono chiamati su una playlist vuota.
  • Transformer:
    • Rimuovi Transformer.Builder.setMediaSourceFactory(MediaSource.Factory). Utilizza invece ExoPlayerAssetLoader.Factory(MediaSource.Factory) e Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • Rimuovi Transformer.startTransformation(MediaItem, ParcelFileDescriptor).
    • Risolto un bug per cui la trasformazione poteva bloccarsi (causando il timeout del muxer) se la fine dello stream video veniva segnalata nel momento in cui un frame di input era in attesa di elaborazione.
    • Esegui query sui codec tramite MediaCodecList anziché utilizzare le utilità findDecoder/EncoderForFormat per espandere il supporto.
    • Rimuovi la configurazione dei frame B in DefaultEncoderFactory perché non funziona su alcuni dispositivi.
  • Selezione della traccia:
    • Aggiungi DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange, che è disattivato per impostazione predefinita. Se abilitato, DefaultTrackSelector attiverà una nuova selezione della traccia quando le funzionalità del renderer cambiano.
  • Estrattori:
    • Ogg: è stato corretto un bug durante la ricerca di file con una durata lunga (#391).
    • FMP4: è stato risolto il problema per cui TimestampAdjuster inizializza un offset del timestamp errato con il tempo di campionamento dei metadati dall'atomo emsg (#356).
  • Audio:
    • È stato corretto il bug per cui alcune riproduzioni non andavano a buon fine quando il tunneling era abilitato e AudioProcessors erano attivi, ad esempio per il trimming senza interruzioni (#10847).
    • Incapsula i frame Opus in pacchetti Ogg nelle riproduzioni dirette (offload).
    • Estrapola la posizione corrente durante la sospensione con la pianificazione dell'offload.
    • Aggiungi Renderer.release() e AudioSink.release() per rilasciare le risorse alla fine del ciclo di vita del player.
    • Ascolta le modifiche alle funzionalità audio in DefaultAudioSink. Aggiungi un parametro obbligatorio context nel costruttore di DefaultAudioSink, con cui DefaultAudioSink si registrerà come listener di AudioCapabilitiesReceiver e aggiornerà la sua proprietà audioCapabilities quando riceverà una notifica di modifica delle funzionalità.
    • Propaga le modifiche alle funzionalità audio tramite un nuovo evento onAudioCapabilitiesChanged nell'interfaccia AudioSink.Listener e una nuova interfaccia RendererCapabilities.Listener che attiva gli eventi onRendererCapabilitiesChanged.
    • Aggiungi ChannelMixingAudioProcessor per applicare la scalabilità/il mixaggio ai canali audio.
    • Aggiungi un nuovo valore int DISCARD_REASON_AUDIO_BYPASS_POSSIBLE a DecoderDiscardReasons per ignorare il decodificatore audio quando la modalità di bypass è possibile dopo la modifica delle funzionalità audio.
    • Aggiunto il supporto della riproduzione diretta per DTS Express e DTS:X (#335).
  • Video:
    • Fai in modo che MediaCodecVideoRenderer restituisca un VideoSize con larghezza e altezza pari a 0 quando il renderer è disattivato. Player.Listener.onVideoSizeChanged viene chiamato di conseguenza quando Player.getVideoSize() cambia. Con questa modifica, le dimensioni del video di ExoPlayer con MediaCodecVideoRenderer hanno una larghezza e un'altezza pari a 0 quando Player.getCurrentTracks non supporta i video o le dimensioni della traccia video supportata non sono ancora state determinate.
  • DRM:
    • Riduci la visibilità di diversi metodi solo interni su DefaultDrmSession che non dovrebbero essere chiamati dall'esterno del pacchetto DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Aggiungi una nuova libreria di muxer che può essere utilizzata per creare un file contenitore MP4.
  • Estensione IMA:
    • Attiva i live streaming DASH multiperiodo per DAI. Tieni presente che l'implementazione attuale non supporta ancora la ricerca nei live streaming (#10912).
    • Correzione di un bug per cui un nuovo gruppo di annunci viene inserito nei live streaming perché la posizione dei contenuti calcolata nelle sequenze temporali consecutive varia leggermente.
  • Sessione:
    • Aggiungi il metodo helper MediaSession.getControllerForCurrentRequest per ottenere informazioni sul controller che sta chiamando un metodo Player.
    • Aggiungi androidx.media3.session.MediaButtonReceiver per consentire alle app di implementare la ripresa della riproduzione con eventi dei pulsanti multimediali inviati, ad esempio, da cuffie Bluetooth (#167).
    • Aggiunta dell'implementazione predefinita a MediaSession.Callback.onAddMediaItems per consentire il passaggio di MediaItems richiesti a Player se hanno LocalConfiguration (ad es. URI) (#282).
    • Aggiungi i pulsanti di comando "vai al precedente" e "vai al successivo" nella visualizzazione compatta delle notifiche dei contenuti multimediali per impostazione predefinita per Android 12 e versioni precedenti (#410).
    • Aggiunta dell'implementazione predefinita a MediaSession.Callback.onAddMediaItems per consentire il passaggio di MediaItems richiesti a Player se hanno LocalConfiguration (ad es. URI) (#282).
    • Aggiungi i pulsanti di comando "vai al precedente" e "vai al successivo" nella visualizzazione compatta delle notifiche dei contenuti multimediali per impostazione predefinita per Android 12 e versioni precedenti (#410).
  • UI:
    • Aggiungi i metodi di utilità shouldShowPlayButton e handlePlayPauseButtonAction per scrivere elementi UI personalizzati con un pulsante di riproduzione/pausa.
  • Estensione RTSP:
    • Per MPEG4-LATM, utilizza il valore predefinito di profile-level-id se non è presente nel messaggio SDP della risposta Describe (#302).
    • Utilizza l'URI di base per la risoluzione del percorso relativo dalla sessione RTSP se presente nell'intestazione della risposta DESCRIBE (#11160).
  • Estensione DASH:
    • Rimuovi l'offset temporale dei contenuti multimediali da MediaLoadData.startTimeMs e MediaLoadData.endTimeMs per gli stream DASH multi-periodo.
    • È stato corretto un bug per cui la nuova preparazione di un'origine multimediale Dash live multiperiodo produceva un IndexOutOfBoundsException (#10838).
  • Estensione HLS:
    • Aggiungi HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) per impostare un timeout per il thread di caricamento in attesa dell'inizializzazione di TimestampAdjuster. Se l'inizializzazione non viene completata prima del timeout, viene generato un PlaybackException per evitare l'arresto anomalo della riproduzione. Il timeout è impostato su zero per impostazione predefinita (#323).
  • Utilità di test:
    • Verifica la mancata distinzione tra maiuscole e minuscole nello schema URI in DataSourceContractTest.
  • Rimuovi i simboli deprecati:
    • Rimuovi i costruttori DefaultAudioSink e utilizza invece DefaultAudioSink.Builder.
    • Rimuovi HlsMasterPlaylist e utilizza HlsMultivariantPlaylist.
    • Rimuovi Player.stop(boolean). Utilizza invece Player.stop() e Player.clearMediaItems() (se reset è true).
    • Rimuovi due costruttori SimpleCache deprecati e utilizza un costruttore non deprecato che accetta un DatabaseProvider per migliorare le prestazioni.
    • Rimuovi il costruttore DefaultBandwidthMeter, utilizza DefaultBandwidthMeter.Builder.
    • Rimuovi i costruttori DefaultDrmSessionManager, utilizza DefaultDrmSessionManager.Builder.
    • Rimuovi due costruttori HttpDataSource.InvalidResponseCodeException deprecati, utilizza un costruttore non deprecato che accetta campi aggiuntivi(cause, responseBody) per migliorare il logging degli errori.
    • Rimuovi DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash e DownloadHelper.forSmoothStreaming e utilizza DownloadHelper.forMediaItem.
    • Rimuovi il costruttore DownloadService deprecato e utilizza un costruttore non deprecato che includa l'opzione per fornire un parametro channelDescriptionResourceId.
    • Rimuovi le costanti String deprecate per i set di caratteri (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME e UTF16LE_NAME), utilizza i set di caratteri Kotlin del pacchetto kotlin.text, java.nio.charset.StandardCharsets o com.google.common.base.Charsets.
    • Rimuovi il costruttore WorkManagerScheduler deprecato e utilizza un costruttore non deprecato che includa l'opzione per fornire un parametro Context.
    • Rimuovi i metodi deprecati createVideoSampleFormat, createAudioSampleFormat, createContainerFormat e createSampleFormat, che venivano utilizzati per creare un'istanza della classe Format. Utilizza invece Format.Builder per creare istanze di Format.
    • Rimuovi i metodi deprecati copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate e copyWithVideoSize, utilizza invece Format.buildUpon() e i metodi setter.
    • Rimuovi il criterio deprecato ExoPlayer.retry() e utilizza prepare().
    • Rimuovi il costruttore DefaultTrackSelector deprecato con zero argomenti e utilizza DefaultTrackSelector(Context).
    • Rimuovi il costruttore OfflineLicenseHelper deprecato e utilizza OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Rimuovi il costruttore DownloadManager deprecato e utilizza il costruttore che accetta un Executor.
    • Rimuovi i costruttori Cue deprecati e utilizza Cue.Builder.
    • Rimuovi il costruttore OfflineLicenseHelper deprecato e utilizza OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Rimuovi quattro metodi AnalyticsListener deprecati:
      • onDecoderEnabled, utilizza onAudioEnabled e/o onVideoEnabled.
      • onDecoderInitialized, utilizza onAudioDecoderInitialized e/o onVideoDecoderInitialized.
      • onDecoderInputFormatChanged, utilizza invece onAudioInputFormatChanged e/o onVideoInputFormatChanged.
      • onDecoderDisabled, utilizza onAudioDisabled e/o onVideoDisabled.
    • Rimuovi i campi deprecati Player.Listener.onSeekProcessed e AnalyticsListener.onSeekProcessed e utilizza invece onPositionDiscontinuity con DISCONTINUITY_REASON_SEEK.
    • Rimuovi ExoPlayer.setHandleWakeLock(boolean) e utilizza invece setWakeMode(int).
    • Rimuovi il criterio deprecato DefaultLoadControl.Builder.createDefaultLoadControl() e utilizza invece build().
    • Rimuovi MediaItem.PlaybackProperties deprecato e utilizza MediaItem.LocalConfiguration. Il campo deprecato MediaItem.playbackProperties è ora di tipo MediaItem.LocalConfiguration.

Versione 1.1.0-rc01

21 giu 2023

Utilizza la versione stabile 1.1.0.

Versione 1.1.0-beta01

7 giugno 2023

Utilizza la versione stabile 1.1.0.

Versione 1.1.0-alpha01

10 maggio 2023

Utilizza la versione stabile 1.1.0.

Versione 1.0.0

Versione 1.0.2

18 maggio 2023

androidx.media3:media3-*:1.0.2 è stato rilasciato. La versione 1.0.2 contiene questi commit.

Questa release corrisponde alla release 2.18.7 di ExoPlayer.

Questa release contiene le seguenti modifiche rispetto alla versione 1.0.1:

  • Libreria principale:
    • Aggiungi Buffer.isLastSample() che indica se Buffer contiene il flag C.BUFFER_FLAG_LAST_SAMPLE.
    • Risolto un problema per cui l'ultimo frame potrebbe non essere visualizzato se l'ultimo campione con frame viene rimosso dalla coda senza leggere il campione "fine dello stream". (#11079).
  • Estrattori:
    • Correzione dell'analisi di H.265 SPS nei file MPEG-TS riutilizzando la logica di analisi già utilizzata dagli estrattori RTSP e MP4 (#303).
  • Testo:
    • SSA: aggiunto il supporto per i file UTF-16 se iniziano con un indicatore dell'ordine dei byte (#319).
  • Sessione:
    • Risolto il problema per cui MediaController non aggiorna i comandi disponibili quando è connesso a un MediaSessionCompat legacy che aggiorna le sue azioni.
    • Risolto il bug che impediva a MediaLibraryService di restituire null per una chiamata dalla UI di sistema a Callback.onGetLibraryRoot con params.isRecent == true nell'API 30 (#355).
    • Risolto il problema di perdita di memoria di MediaSessionService o MediaLibraryService (#346).
    • Risolto un bug per cui un aggiornamento combinato di Timeline e posizione in un MediaSession poteva causare la generazione di un IllegalStateException da parte di un MediaController.

Versione 1.0.1

18 aprile 2023

androidx.media3:media3-*:1.0.1 è stato rilasciato. La versione 1.0.1 contiene questi commit.

Questa release corrisponde alla release 2.18.6 di ExoPlayer.

  • Libreria principale:
    • Ripristina l'override del live streaming di destinazione quando si cerca la posizione predefinita (#11051).
    • Correzione di un bug per cui gli stream di esempio vuoti nei contenuti multimediali potevano causare il blocco della riproduzione.
  • Sessione:
    • Risolto un bug per cui più elementi della coda identici pubblicati da un MediaSessionCompat legacy generavano un'eccezione in MediaController (#290).
    • Aggiunta del forwarding mancante di MediaSession.broadcastCustomCommand alla versione precedente di MediaControllerCompat.Callback.onSessionEvent (#293).
    • È stato corretto il bug per cui la chiamata a MediaSession.setPlayer non aggiorna i comandi disponibili.
    • Risolto il problema per cui le istanze TrackSelectionOverride inviate da un MediaController venivano ignorate se facevano riferimento a un gruppo con Format.metadata (#296).
    • Risolvi il problema per cui Player.COMMAND_GET_CURRENT_MEDIA_ITEM deve essere disponibile per accedere ai metadati tramite la versione precedente di MediaSessionCompat.
    • È stato risolto un problema per cui le istanze MediaSession su un thread in background causavano arresti anomali se utilizzate in MediaSessionService (#318).
    • Risolto un problema per cui un ricevitore di pulsanti multimediali veniva dichiarato dalla libreria senza che l'app lo avesse previsto (#314).
  • DASH:
    • Risolto il problema relativo alla gestione delle sequenze temporali dei segmenti vuoti (#11014).
  • RTSP:
    • Riprova con TCP se la configurazione RTSP con UDP non va a buon fine con l'errore RTSP 461 UnsupportedTransport (#11069).

Versione 1.0.0

22 marzo 2023

androidx.media3:media3-*:1.0.0 è stato rilasciato. La versione 1.0.0 contiene questi commit.

Questa release corrisponde alla release 2.18.5 di ExoPlayer.

Non sono state apportate modifiche dalla versione 1.0.0-rc02.

Versione 1.0.0-rc02

2 marzo 2023

androidx.media3:media3-*:1.0.0-rc02 è stato rilasciato. La versione 1.0.0-rc02 contiene questi commit.

Questa release corrisponde alla release 2.18.4 di ExoPlayer.

  • Libreria principale:
    • Risolto il problema di rilevamento del tipo di rete nell'API 33 (#10970).
    • Correzione di NullPointerException durante la chiamata di ExoPlayer.isTunnelingEnabled (#10977).
  • Download:
    • Rendi configurabile la differenza massima dell'ora di inizio di due segmenti da unire in SegmentDownloader e nelle sottoclassi (#248).
  • Audio:
    • Risolto il problema di riproduzione MP3 senza pause sui dispositivi Samsung (#8594).
    • Risolto un bug per cui le velocità di riproduzione impostate immediatamente dopo la disattivazione dell'audio potevano essere sostituite da una modifica della velocità precedente (#10882).
  • Video:
    • Mappa il formato HEVC HDR10 a HEVCProfileMain10HDR10 anziché a HEVCProfileMain10.
    • Aggiunta una soluzione alternativa per un problema del dispositivo su Chromecast con Google TV e Lenovo M10 FHD Plus che causa l'indicazione degli stream AVC a 60 f/s come non supportati (#10898).
    • Risolti i problemi di prestazioni di rilascio dei frame durante la riproduzione di contenuti multimediali con una frequenza fotogrammi molto superiore alla frequenza di aggiornamento dello schermo.
  • Cast:
    • Risolto il problema relativo alla transizione temporanea di STATE_IDLE durante il passaggio da un elemento multimediale all'altro (#245).
  • RTSP:
    • Rileva l'eccezione IllegalArgumentException generata nell'analisi dei messaggi di risposta Describe RTSP non validi (#10971).
  • Sessione:
    • Risolto un bug per cui il pulsante di riproduzione/pausa della notifica non si aggiornava con lo stato del player (#192).
  • Estensione IMA:
    • È stato corretto un bug che impediva l'avvio degli stream DAI senza annunci perché il primo evento LOADED (e l'unico nel caso senza annunci) non veniva ricevuto.

Versione 1.0.0-rc01

16 febbraio 2023

androidx.media3:media3-*:1.0.0-rc01 è stato rilasciato. La versione 1.0.0-rc01 contiene questi commit.

Questa release corrisponde alla release di ExoPlayer 2.18.3.

  • Libreria principale:
    • Modifica la logica di ordinamento del decoder del renderer per rispettare le preferenze di MediaCodecSelector, anche se un decoder segnala che potrebbe non essere in grado di riprodurre i contenuti multimediali in modo efficiente. Ad esempio, con il selettore predefinito, il decoder hardware con solo supporto funzionale verrà preferito al decoder software che supporta completamente il formato (#10604).
    • Aggiungi ExoPlayer.Builder.setPlaybackLooper che imposta un thread di riproduzione preesistente per una nuova istanza di ExoPlayer.
    • Consenti la cancellazione degli helper di Gestione dei download (#10776).
    • Aggiungi il parametro a BasePlayer.seekTo per indicare anche il comando utilizzato per la ricerca.
    • Utilizza il tema durante il caricamento di elementi drawable nell'API 21 e versioni successive (#220).
    • Aggiunta di ConcatenatingMediaSource2 che consente di combinare più elementi multimediali in un'unica finestra (#247).
  • Estrattori:
    • Genera un ParserException anziché un NullPointerException se nella tabella di esempio (stbl) manca una descrizione di esempio (stsd) obbligatoria durante l'analisi degli atomi trak.
    • Salta correttamente i sample quando si cerca direttamente un frame di sincronizzazione in fMP4 (#10941).
  • Audio:
    • Utilizza il bitrate del formato audio compresso per calcolare la dimensione minima del buffer per AudioTrack nelle riproduzioni dirette (passthrough).
  • Testo:
    • Correzione di TextRenderer che passa un indice non valido (negativo) a Subtitle.getEventTime se un file di sottotitoli non contiene cue.
    • SubRip: aggiunta del supporto per i file UTF-16 se iniziano con un indicatore dell'ordine dei byte.
  • Metadati:
    • Analizza più valori separati da null dai frame ID3, come consentito da ID3 v2.4.
    • Aggiungi MediaMetadata.mediaType per indicare il tipo di contenuti o il tipo di cartella descritto dai metadati.
    • Aggiungi MediaMetadata.isBrowsable in sostituzione di MediaMetadata.folderType. Il tipo di cartella verrà ritirato nella prossima release.
  • DASH:
    • Aggiunta dell'analisi completa per i set di adattamento delle immagini, inclusi i conteggi dei riquadri (#3752).
  • UI:
    • Correzione del metodo deprecato PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) per garantire che le modifiche alla visibilità vengano trasmesse al listener registrato (#229).
    • Correzione dell'ordine dei controlli del player centrale in PlayerView quando si utilizza un layout da destra a sinistra (RTL) (#227).
  • Sessione:
    • Aggiungi l'abstract SimpleBasePlayer per facilitare l'implementazione dell'interfaccia Player per i player personalizzati.
    • Aggiungi un metodo helper per convertire il token di sessione della piattaforma in Media3 SessionToken (#171).
    • Utilizza onMediaMetadataChanged per attivare gli aggiornamenti della sessione multimediale della piattaforma (#219).
    • Aggiungi la sessione multimediale come argomento di getMediaButtons() di DefaultMediaNotificationProvider e utilizza elenchi immutabili per maggiore chiarezza (#216).
    • Aggiungi il listener di callback onSetMediaItems per fornire i mezzi per modificare/impostare l'elenco MediaItem, l'indice iniziale e la posizione per sessione prima di impostarli su Player (#156).
    • Evita il rilevamento del doppio tocco per gli eventi dei pulsanti multimediali non Bluetooth (#233).
    • Rendi QueueTimeline più solido in caso di stato della sessione legacy sospetto (#241).
  • Metadati:
    • Analizza più valori separati da null dai frame ID3, come consentito da ID3 v2.4.
    • Aggiungi MediaMetadata.mediaType per indicare il tipo di contenuti o il tipo di cartella descritto dai metadati.
    • Aggiungi MediaMetadata.isBrowsable in sostituzione di MediaMetadata.folderType. Il tipo di cartella verrà ritirato nella prossima release.
  • Estensione Cast:
    • Aggiorna la versione dell'SDK Cast alla 21.2.0.
  • Estensione IMA:
    • Rimuovi il listener del player di ImaServerSideAdInsertionMediaSource nel thread dell'applicazione per evitare problemi di threading.
    • Aggiungi una proprietà focusSkipButtonWhenAvailable a ImaServerSideAdInsertionMediaSource.AdsLoader.Builder per richiedere lo stato attivo del pulsante Salta sui dispositivi TV e impostalo su true per impostazione predefinita.
    • Aggiungi un metodo focusSkipButton() a ImaServerSideAdInsertionMediaSource.AdsLoader per richiedere in modo programmatico lo stato attivo sul pulsante Salta.
    • Aggiorna la versione dell'SDK IMA alla 3.29.0.
  • App demo:
    • Richiedi l'autorizzazione alle notifiche per le notifiche di download in fase di runtime (#10884).

Versione 1.0.0-beta03

22 novembre 2022

androidx.media3:media3-*:1.0.0-beta03 è stato rilasciato. La versione 1.0.0-beta03 contiene questi commit.

Questa release corrisponde alla release 2.18.2 di ExoPlayer.

  • Libreria principale:
    • Aggiunta di ExoPlayer.isTunnelingEnabled per verificare se il tunneling è abilitato per le tracce attualmente selezionate (#2518).
    • Aggiunta di WrappingMediaSource per semplificare il wrapping di un singolo MediaSource (#7279).
    • Elimina il buffer posteriore prima che la riproduzione si blocchi a causa di memoria disponibile insufficiente.
    • Chiudi il blocco di tracciamento "doSomeWork" quando l'offload è abilitato.
    • Risolto il problema di monitoraggio della sessione con ricerche rapide in PlaybackStatsListener (#180).
    • Invia il callback onMediaItemTransition mancante quando chiami seekToNext o seekToPrevious in una playlist con un singolo elemento (#10667).
    • Aggiungi Player.getSurfaceSize che restituisce le dimensioni della superficie su cui viene eseguito il rendering del video.
    • Risolto un bug per cui la rimozione dei listener durante il rilascio del player può causare un'eccezione IllegalStateException (#10758).
  • Build:
    • Applica la versione minima di compileSdkVersion per evitare errori di compilazione (#10684).
    • Evita di pubblicare il blocco quando è incluso in un'altra build Gradle.
  • Selezione della traccia:
    • Preferisci altre tracce a Dolby Vision se il display non lo supporta. (#8944).
  • Download:
    • Correzione di un potenziale loop infinito in ProgressiveDownloader causato dal download e dalla riproduzione simultanei con lo stesso PriorityTaskManager (#10570).
    • Fare in modo che la notifica di download venga visualizzata immediatamente (#183).
    • Limitazione delle rimozioni di download paralleli a 1 per evitare la creazione eccessiva di thread (#10458).
  • Video:
    • Prova un decoder alternativo per Dolby Vision se il display non lo supporta. (#9794).
  • Audio:
    • Utilizza SingleThreadExecutor per rilasciare le istanze AudioTrack per evitare errori OutOfMemory quando rilasci più player contemporaneamente (#10057).
    • Aggiunge AudioOffloadListener.onExperimentalOffloadedPlayback per lo stato di offload di AudioTrack. (#134).
    • Rendi AudioTrackBufferSizeProvider un'interfaccia pubblica.
    • Aggiungi ExoPlayer.setPreferredAudioDevice per impostare il dispositivo di output audio preferito (#135).
    • Rinomina androidx.media3.exoplayer.audio.AudioProcessor in androidx.media3.common.audio.AudioProcessor.
    • Mappatura dell'audio a 8 e 12 canali rispettivamente alle maschere dei canali 7.1 e 7.1.4 su tutte le versioni di Android (#10701).
  • Metadati:
    • Ora MetadataRenderer può essere configurato per eseguire il rendering dei metadati non appena sono disponibili. Crea un'istanza con MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean) per specificare se il renderer restituirà i metadati in anticipo o in sincronia con la posizione del player.
  • DRM:
    • Aggira un bug nell'implementazione di ClearKey di Android 13 che restituisce un URL di licenza non vuoto, ma non valido.
    • Risolto l'errore setMediaDrmSession failed: session not opened durante il passaggio tra schemi DRM in una playlist (ad es. Widevine a ClearKey).
  • Testo:
    • CEA-608: assicurati che i comandi di cambio servizio nel campo 2 vengano gestiti correttamente (#10666).
  • DASH:
    • Analizza EventStream.presentationTimeOffset dai manifest (#10460).
  • UI:
    • Utilizza gli override correnti del player come preimpostati in TrackSelectionDialogBuilder (#10429).
  • Sessione:
    • Assicurati che i comandi vengano sempre eseguiti nell'ordine corretto, anche se alcuni richiedono una risoluzione asincrona (#85).
    • Aggiungi DefaultMediaNotificationProvider.Builder per creare DefaultMediaNotificationProvider istanze. Il builder può configurare l'ID notifica, l'ID canale di notifica e il nome del canale di notifica utilizzati dal provider. Inoltre, aggiungi il metodo DefaultMediaNotificationProvider.setSmallIcon(int) per impostare l'icona piccola delle notifiche. (#104).
    • Assicurati che i comandi inviati prima di MediaController.release() non vengano ignorati (#99).
    • SimpleBitmapLoader può caricare bitmap da URI file:// (#108).
    • Risolto l'errore di asserzione che impedisce a MediaController di cercare un annuncio in un periodo (#122).
    • Al termine della riproduzione, l'elemento MediaSessionService viene interrotto in primo piano e viene visualizzata una notifica per riavviare la riproduzione dell'ultimo elemento multimediale riprodotto (#112).
    • Non avviare un servizio in primo piano con un pending intent per la pausa (#167).
    • Nascondi manualmente il "badge" associato alla notifica creata da DefaultNotificationProvider nell'API 26 e nell'API 27 (il badge viene nascosto automaticamente nell'API 28 e versioni successive) (#131).
    • Risolto un bug per cui una seconda connessione del binder da una MediaSession precedente a un MediaController Media3 causava IllegalStateExceptions (#49).
  • RTSP:
    • Aggiunta della gestione dei pacchetti frammentati H263 (#119).
    • Aggiunta del supporto di MP4A-LATM (#162).
  • IMA:
    • Aggiunta del timeout per il caricamento delle informazioni sugli annunci per gestire i casi in cui l'SDK IMA si blocca durante il caricamento di un annuncio (#10510).
    • Impedisci di saltare gli annunci mid-roll quando si passa alla fine dei contenuti (#10685).
    • Calcola correttamente la durata della finestra per i live streaming con annunci inseriti lato server, ad esempio IMA DAI (#10764).
  • Estensione FFmpeg:
    • Aggiunti i flag appena richiesti per collegare le librerie FFmpeg con NDK 23.1.7779620 e versioni successive (#9933).
  • Estensione AV1:
    • Aggiorna la versione di CMake per evitare incompatibilità con le ultime release di Android Studio (#9933).
  • Estensione Cast:
    • Implementa getDeviceInfo() per poter identificare CastPlayer quando controlli la riproduzione con un MediaController (#142).
  • Transformer:
    • Aggiungi il timer watchdog del muxer per rilevare quando la generazione di un campione di output è troppo lenta.
  • Rimuovi i simboli deprecati:
    • Rimuovi Transformer.Builder.setOutputMimeType(String). Questa funzionalità è stata rimossa. Il tipo MIME sarà sempre MP4 quando viene utilizzato il muxer predefinito.

Versione 1.0.0-beta02

21 luglio 2022

androidx.media3:media3-*:1.0.0-beta02 è stato rilasciato. La versione 1.0.0-beta02 contiene questi commit.

Questa release corrisponde alla release 2.18.1 di ExoPlayer.

  • Libreria principale:
    • Assicurati che la modifica di ShuffleOrder con ExoPlayer.setShuffleOrder comporti una chiamata a Player.Listener#onTimelineChanged con reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • Per i contenuti multimediali progressivi, includi solo le tracce selezionate nella posizione con buffer (#10361).
    • Consenti il logger personalizzato per tutti gli output dei log di ExoPlayer (#9752).
    • Correzione dell'implementazione di setDataSourceFactory in DefaultMediaSourceFactory, che in alcuni casi non funzionava (#116).
  • Estrattori:
    • Correzione dell'analisi dei set di immagini di riferimento a breve termine H265 (#10316).
    • Correzione dell'analisi dei bitrate dalle caselle esds (#10381).
  • DASH:
    • Analizza l'URL della licenza ClearKey dai manifest (#10246).
  • UI:
    • Assicurati che TalkBack annunci l'opzione di velocità attualmente attiva nel menu dei controlli di riproduzione (#10298).
  • RTSP:
    • Aggiunta della gestione dei pacchetti frammentati VP8 (#110).
  • Estensione Leanback:
    • Ascolta le modifiche di playWhenReady in LeanbackAdapter (10420).
  • Cast:
    • Utilizza il MediaItem che è stato passato ai metodi della playlist come Window.mediaItem in CastTimeline (#25, #8212).
    • Supporto di Player.getMetadata() e Listener.onMediaMetadataChanged() con CastPlayer (#25).

Versione 1.0.0-beta01

16 giugno 2022

androidx.media3:media3-*:1.0.0-beta01 è stato rilasciato. La versione 1.0.0-beta01 contiene questi commit.

Questo corrisponde alla release di ExoPlayer 2.18.0.

  • Libreria principale:
    • Attiva il supporto per la diagnostica della piattaforma Android tramite MediaMetricsManager. ExoPlayer inoltrerà gli eventi di riproduzione e i dati sul rendimento alla piattaforma, il che aiuta a fornire informazioni sul rendimento del sistema e di debug sul dispositivo. Questi dati possono anche essere raccolti da Google se la condivisione dei dati di utilizzo e diagnostica è attivata dall'utente del dispositivo. Le app possono disattivare il contributo alla diagnostica della piattaforma per ExoPlayer con ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Risolto il bug per cui le tracce venivano reimpostate troppo spesso quando si utilizzava MergingMediaSource, ad esempio quando si caricavano i sottotitoli in modalità sideload e si modificava il sottotitolo selezionato durante la riproduzione (#10248).
    • Interrompi il rilevamento del tipo di rete 5G-NSA sulle API 29 e 30. Queste riproduzioni presuppongono una rete 4G.
    • Non consentire il passaggio di null a MediaSource.Factory.setDrmSessionManagerProvider e MediaSource.Factory.setLoadErrorHandlingPolicy. Se necessario, le istanze di DefaultDrmSessionManagerProvider e DefaultLoadErrorHandlingPolicy possono essere passate esplicitamente.
    • Aggiungi MediaItem.RequestMetadata per rappresentare i metadati necessari per riprodurre i contenuti multimediali quando non è noto l'esatto LocalConfiguration. Rimuovi anche MediaMetadata.mediaUrl, poiché ora è incluso in RequestMetadata.
    • Aggiungi Player.Command.COMMAND_SET_MEDIA_ITEM per consentire ai giocatori di impostare un singolo elemento.
  • Selezione della traccia:
    • Appiattisci la classe TrackSelectionOverrides in TrackSelectionParameters e promuovi TrackSelectionOverride a classe di primo livello.
    • Rinomina TracksInfo in Tracks e TracksInfo.TrackGroupInfo in Tracks.Group. Anche Player.getCurrentTracksInfo e Player.Listener.onTracksInfoChanged sono stati rinominati in Player.getCurrentTracks e Player.Listener.onTracksChanged. Ciò include la "riattivazione" del nome del metodo Player.Listener.onTracksChanged, ma con tipi di parametri diversi.
    • Modifica DefaultTrackSelector.buildUponParameters e DefaultTrackSelector.Parameters.buildUpon in modo che restituiscano DefaultTrackSelector.Parameters.Builder anziché DefaultTrackSelector.ParametersBuilder, che è stato ritirato.
    • Aggiungi DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities, che è abilitato per impostazione predefinita. Se l'opzione è attiva, DefaultTrackSelector preferirà le tracce audio il cui numero di canali non supera le funzionalità di output del dispositivo. Sui dispositivi palmari, DefaultTrackSelector preferirà i formati audio stereo/mono rispetto a quelli multicanale, a meno che il formato multicanale non possa essere spazializzato (Android 12L e versioni successive) o non sia un formato audio surround Dolby. Inoltre, sui dispositivi che supportano la spazializzazione dell'audio, DefaultTrackSelector monitorerà le modifiche alle proprietà dello spazializzatore e attiverà una nuova selezione della traccia in base a queste. I dispositivi con una television modalità UI sono esclusi da questi vincoli e verrà preferito il formato con il numero di canali più alto. Per attivare questa funzionalità, l'istanza DefaultTrackSelector deve essere creata con un Context.
  • Video:
    • Rinomina DummySurface in PlaceholderSurface.
    • Aggiungi il supporto di AV1 a MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Audio:
    • Utilizza il decoder audio LG AC3 che pubblicizza un tipo MIME non standard.
    • Modifica il tipo restituito di AudioAttributes.getAudioAttributesV21() da android.media.AudioAttributes a una nuova classe wrapper AudioAttributesV21, per evitare una verifica ART lenta sull'API < 21.
    • Esegui una query sulla piattaforma (API 29 e versioni successive) o assumi il numero di canali di codifica audio per il passthrough audio quando il numero di canali audio del formato non è impostato, il che si verifica con la preparazione senza chunk di HLS (10204).
    • Configura AudioTrack con la maschera di canale AudioFormat.CHANNEL_OUT_7POINT1POINT4 se il decoder genera audio PCM a 12 canali (#10322.
  • DRM
    • Assicurati che la sessione DRM venga sempre aggiornata correttamente durante la ricerca immediatamente dopo una modifica del formato (10274).
  • Testo:
    • Modifica Player.getCurrentCues() in modo che restituisca CueGroup anziché List<Cue>.
    • SSA: è stata aggiunta l'impostazione dello stile OutlineColour quando è presente BorderStyle == 3 (ovvero OutlineColour imposta lo sfondo del cue) (#8435).
    • CEA-708: analizza i dati in più blocchi di servizi e ignora i blocchi non associati al numero di servizio attualmente selezionato.
    • Rimuovi RawCcExtractor, che è stato utilizzato solo per gestire un formato di sottotitoli interno di Google.
  • Estrattori:
    • Aggiunta del supporto per AVI (#2092).
    • Matroska: analizza DiscardPadding per le tracce Opus.
    • MP4: analizza i bitrate dalle caselle esds.
    • Ogg: consenti intestazioni di commenti e ID Opus duplicati (#10038).
  • UI:
    • Correzione della distribuzione degli eventi ai OnClickListener impostati su PlayerView nel caso in cui useController=false (#9605). Inoltre, correggi l'invio di eventi a OnLongClickListener per tutte le configurazioni di visualizzazione.
    • Risolto il problema per cui una sequenza di eventi touch che uscivano dai limiti di PlayerView prima di ACTION_UP veniva trattata erroneamente come un clic (#9861).
    • Risolto il problema di accessibilità PlayerView per cui il tocco poteva attivare/disattivare la riproduzione anziché nascondere i controlli (#8627).
    • Riscrivi TrackSelectionView e TrackSelectionDialogBuilder per lavorare con l'interfaccia Player anziché con ExoPlayer. In questo modo, le visualizzazioni possono essere utilizzate con altre implementazioni di Player e viene rimossa la dipendenza dal modulo UI al modulo ExoPlayer. Si tratta di una modifica che provoca un errore.
    • Non mostrare le tracce di testo forzato nel selettore delle tracce PlayerView e mantieni selezionata una traccia di testo forzato adatta se è selezionato "Nessuna" (#9432).
  • DASH:
    • Analizza il numero di canali dagli elementi DTS AudioChannelConfiguration. In questo modo, viene riattivato il passthrough audio per gli stream DTS (#10159).
    • Non consentire il passaggio di null a DashMediaSource.Factory.setCompositeSequenceableLoaderFactory. Le istanze di DefaultCompositeSequenceableLoaderFactory possono essere passate esplicitamente, se necessario.
  • HLS:
    • Fallback alla preparazione con chunk se l'attributo CODECS della playlist non contiene il codec audio (#10065).
    • Non consentire il passaggio di null a HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory e HlsMediaSource.Factory.setPlaylistTrackerFactory. Se necessario, è possibile passare esplicitamente istanze di DefaultCompositeSequenceableLoaderFactory, DefaultHlsPlaylistParserFactory o un riferimento a DefaultHlsPlaylistTracker.FACTORY.
  • Smooth Streaming:
    • Non consentire il passaggio di null a SsMediaSource.Factory.setCompositeSequenceableLoaderFactory. Le istanze di DefaultCompositeSequenceableLoaderFactory possono essere passate esplicitamente, se necessario.
  • RTSP:
    • Aggiunta del lettore RTP per H263 (#63).
    • Aggiunta del lettore RTP per MPEG4 (#35).
    • Aggiunta del lettore RTP per HEVC (#36).
    • Aggiungi il lettore RTP per AMR. Al momento sono supportati solo stream AMR monocanale non interleaved. Il payload RTP AMR composto non è supportato. (#46)
    • Aggiunta del lettore RTP per VP8 (#47).
    • Aggiunta del lettore RTP per WAV (#56).
    • Correggi l'intestazione di autorizzazione di base RTSP. (#9544).
    • Interruzione del controllo dei campi SDP obbligatori, poiché ExoPlayer non ne ha bisogno (#10049).
    • Genera un'eccezione controllata durante l'analisi della sincronizzazione RTSP (#10165).
    • Aggiunta del lettore RTP per VP9 (#47).
    • Aggiunta del lettore RTP per OPUS (#53).
  • Origini dati:
    • Rinomina DummyDataSource in PlaceholderDataSource.
    • Soluzione alternativa per la gestione delle interruzioni di OkHttp.
  • Sessione:
    • Sostituisci MediaSession.MediaItemFiller con MediaSession.Callback.onAddMediaItems per consentire la risoluzione asincrona delle richieste.
    • Supporta i metodi setMediaItems(s) quando MediaController si connette a una sessione multimediale legacy.
    • Rimuovi MediaController.setMediaUri e MediaSession.Callback.onSetMediaUri. La stessa funzionalità può essere ottenuta utilizzando MediaController.setMediaItem e MediaSession.Callback.onAddMediaItems.
    • Inoltra le chiamate legacy MediaController per riprodurre contenuti multimediali su MediaSession.Callback.onAddMediaItems anziché su onSetMediaUri.
    • Aggiungi MediaNotification.Provider e DefaultMediaNotificationProvider per personalizzare la notifica.
    • Aggiungi BitmapLoader e SimpleBitmapLoader per scaricare le immagini degli artwork.
    • Aggiungi MediaSession.setCustomLayout() per fornire la compatibilità con le versioni precedenti della sessione legacy.
    • Aggiungi MediaSession.setSessionExtras() per fornire la parità delle funzionalità con la sessione precedente.
    • Rinomina MediaSession.MediaSessionCallback in MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback in MediaLibrarySession.Callback e MediaSession.Builder.setSessionCallback in setCallback.
    • È stato corretto l'errore NPE in MediaControllerImplLegacy (#59).
    • Aggiorna le informazioni sulla posizione della sessione nella modifica della sequenza temporale(#51).
    • Correzione dell'NPE in MediaControllerImplBase dopo il rilascio del controller (#74).
  • Riproduzione degli annunci / IMA:
    • Diminuisci la frequenza di polling degli annunci da ogni 100 ms a ogni 200 ms per allinearti ai consigli del Media Rating Council (MRC).
  • Estensione FFmpeg:
    • Aggiorna la versione di CMake alla 3.21.0+ per evitare un bug di CMake che causa l'errore di sincronizzazione di Gradle di Android Studio (#9933).
  • Rimuovi i simboli deprecati:
    • Rimuovi Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Usa invece Player.Listener.onTracksChanged(Tracks).
    • Rimuovi Player.getCurrentTrackGroups e Player.getCurrentTrackSelections. Usa invece Player.getCurrentTracks. Puoi anche continuare a utilizzare ExoPlayer.getCurrentTrackGroups e ExoPlayer.getCurrentTrackSelections, anche se questi metodi rimangono deprecati.
    • Rimuovi le costanti DownloadHelper, DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT e DEFAULT_TRACK_SELECTOR_PARAMETERS. Utilizza invece getDefaultTrackSelectorParameters(Context) quando possibile e DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT in caso contrario.
    • Rimuovi il costruttore DefaultTrackSelector(ExoTrackSelection.Factory). Usa invece il descrittore DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Rimuovi Transformer.Builder.setContext. Il Context deve essere passato al costruttore Transformer.Builder.

Versione 1.0.0-alpha03

14 marzo 2022

androidx.media3:media3-*:1.0.0-alpha03 è stato rilasciato. La versione 1.0.0-alpha03 contiene questi commit.

Corrisponde alla release di ExoPlayer 2.17.1.

  • Audio:
    • Risolto l'errore di controllo delle funzionalità audio per Dolby Atmos (E-AC3-JOC) in HLS.
  • Estrattori:
    • FMP4: è stato risolto il problema per cui i metadati di esempio emsg potevano essere generati nell'ordine errato per gli stream contenenti atomi emsg v0 e v1 (#9996).
  • Testo:
    • È stata corretta l'interazione di SingleSampleMediaSource.Factory.setTrackId e MediaItem.SubtitleConfiguration.Builder.setId per dare la priorità al campo SubtitleConfiguration e tornare al valore Factory se non è impostato (#10016).
  • Riproduzione degli annunci:
    • Risolvi i problemi di underrun audio tra i periodi degli annunci negli stream SSAI HLS in diretta.

Versione 1.0.0-alpha02

2 marzo 2022

androidx.media3:media3-*:1.0.0-alpha02 è stato rilasciato. La versione 1.0.0-alpha02 contiene questi commit.

Corrisponde alla release di ExoPlayer 2.17.0.

  • Libreria principale:
    • Aggiungi il metodo protetto DefaultRenderersFactory.getCodecAdapterFactory() in modo che le sottoclassi di DefaultRenderersFactory che eseguono l'override di buildVideoRenderers() o buildAudioRenderers() possano accedere alla factory dell'adattatore del codec e passarla alle istanze MediaCodecRenderer che creano.
    • Propaga i campi di intestazione ICY name e genre rispettivamente a MediaMetadata.station e MediaMetadata.genre in modo che raggiungano l'app tramite Player.Listener.onMediaMetadataChanged() (#9677).
    • Rimuovi le chiavi null da DefaultHttpDataSource#getResponseHeaders.
    • Sospendi e riprova quando la creazione di un'istanza MediaCodec non va a buon fine. In questo modo, viene risolto un problema che si verifica su alcuni dispositivi quando si passa da un codec sicuro a un altro codec (#8696).
    • Aggiungi MediaCodecAdapter.getMetrics() per consentire agli utenti di ottenere i dati delle metriche da MediaCodec. (#9766).
    • Risoluzione dei problemi di dipendenza di Maven (#8353).
    • Disattivazione della regolazione automatica della velocità per i live streaming che non dispongono di funzionalità a bassa latenza né di un'impostazione della velocità richiesta dall'utente (#9329).
    • Rinomina DecoderCounters#inputBufferCount in queuedInputBufferCount.
    • Rendi privato SimpleExoPlayer.renderers. Puoi accedere ai renderer tramite ExoPlayer.getRenderer.
    • Aggiornati alcuni valori costanti AnalyticsListener.EventFlags in modo che corrispondano ai valori in Player.EventFlags.
    • Suddividi AnalyticsCollector in un'interfaccia e un'implementazione predefinita per consentire a R8 di rimuoverla se un'app non ne ha bisogno.
  • Selezione della traccia:
    • Supporto dei flag dei ruoli video preferiti nella selezione delle tracce (#9402).
    • Aggiorna la logica di selezione delle tracce video per tenere conto dei tipi MIME e dei flag di ruolo preferiti quando selezioni più tracce video per l'adattamento (#9519).
    • Aggiorna la logica di selezione delle tracce video e audio per scegliere solo i formati per le selezioni adattive che hanno lo stesso livello di supporto del decoder e dell'hardware (#9565).
    • Aggiorna la logica di selezione della traccia video per preferire codec più efficienti se più codec sono supportati dai decodificatori principali con accelerazione hardware (#4835).
    • Dai la priorità alle preferenze relative ai contenuti audio (ad esempio, la traccia audio "predefinita" o una traccia corrispondente alla lingua delle impostazioni internazionali del sistema) rispetto ai vincoli di selezione delle tracce tecniche (ad esempio, il tipo MIME preferito o il numero massimo di canali).
    • Risolto il problema di selezione delle tracce per cui l'override di un gruppo di tracce non disattivava altri gruppi di tracce dello stesso tipo (#9675).
    • Risolto il problema di selezione della traccia per cui una combinazione di override di tracce non vuote e vuote non veniva applicata correttamente (#9649).
    • Vieta TrackGroup duplicati in un TrackGroupArray. Gli TrackGroup possono sempre essere resi distinguibili impostando un id nel costruttore TrackGroup. In questo modo viene risolto un arresto anomalo durante la ripresa della riproduzione dopo aver messo l'app in background con un override della traccia attivo (#9718).
    • Modifica la logica in AdaptiveTrackSelection per consentire un aumento della qualità con una larghezza di banda di rete sufficiente anche se la riproduzione è molto vicina al margine live (#9784).
  • Video:
    • Correzione della logica di fallback del decodificatore per Dolby Vision per utilizzare un decodificatore H264/H265 compatibile, se necessario.
  • Audio:
    • È stata corretta la logica di fallback del decoder per Dolby Atmos (E-AC3-JOC) in modo da utilizzare un decoder E-AC3 compatibile, se necessario.
    • Modifica le API AudioCapabilities in modo che richiedano il passaggio esplicito di AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES anziché di null.
    • Consenti la personalizzazione del calcolo della dimensione del buffer AudioTrack inserendo un AudioTrackBufferSizeProvider in DefaultAudioSink. (#8891).
    • Riprova a creare AudioTrack se la dimensione del buffer richiesta era > 1 MB. (#9712).
  • Estrattori:
    • WAV: è stato aggiunto il supporto per gli stream RF64 (#9543).
    • Correzione dell'analisi errata delle unità NAL SPS H.265 (#9719).
    • Analizza i commenti Vorbis (incluso METADATA_BLOCK_PICTURE) nei file Ogg Opus e Ogg Vorbis.
  • Testo:
    • Aggiungi un campo MediaItem.SubtitleConfiguration.id che viene propagato al campo Format.id della traccia dei sottotitoli creata dalla configurazione (#9673).
    • Aggiunto il supporto di base per i sottotitoli WebVTT nei container Matroska (#9886).
    • Impedisci a Cea708Decoder di leggere più della dimensione dichiarata di un blocco di servizio.
  • DRM:
    • Vuoi rimuovere playbackLooper da DrmSessionManager.(pre)acquireSession? Quando un DrmSessionManager viene utilizzato da un'app in un MediaSource personalizzato, è necessario passare playbackLooper a DrmSessionManager.setPlayer.
  • Riproduzione degli annunci / IMA:
    • Aggiunta del supporto per l'inserimento di annunci dinamici (DAI) IMA (#8213).
    • Aggiungi un metodo a AdPlaybackState per consentire la reimpostazione di un gruppo di annunci in modo che possa essere riprodotto di nuovo (#9615).
    • Forza la velocità di riproduzione di 1.0 durante la riproduzione degli annunci (#9018).
    • Risolto il problema per cui un gruppo di annunci che non veniva caricato causava un reset immediato della riproduzione (#9929).
  • UI:
    • Correzione del colore dei numeri nei pulsanti di riavvolgimento e avanzamento rapido di StyledPlayerView quando si utilizzano determinati temi (#9765).
    • Traduzione corretta delle stringhe relative alla velocità di riproduzione (#9811).
  • DASH:
    • Aggiungi le proprietà essenziali e supplementari analizzate a Representation (#9579).
    • Supporto del ruolo della traccia forced-subtitle (#9727).
    • Interrompi l'interpretazione del ruolo della traccia main come C.SELECTION_FLAG_DEFAULT.
    • Correzione della logica di esclusione dell'URL di base per i manifest che non dichiarano lo spazio dei nomi DVB (#9856).
    • Supporto degli URL MPD.Location relativi (#9939).
  • HLS:
    • Compila correttamente Format.label per gli stream HLS solo audio (#9608).
    • Utilizza la preparazione senza blocchi per impostazione predefinita per migliorare il tempo di avvio. Se le tue rappresentazioni contengono tracce di sottotitoli codificati multiplexate che non sono dichiarate nella playlist principale, devi aggiungerle alla playlist principale per renderle disponibili per la riproduzione o disattivare la preparazione senza blocchi con HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • Supporto della ricerca accurata dei keyframe in HLS (#2882).
  • RTSP:
    • Fornire un'API client per eseguire l'override di SocketFactory utilizzato per qualsiasi connessione al server (#9606).
    • Preferisci il metodo di autenticazione DIGEST rispetto a BASIC se sono presenti entrambi (#9800).
    • Gestione dei casi in cui la sincronizzazione della traccia RTSP non è disponibile (#9775).
    • Ignora i valori di intestazione RTP-Info non validi (#9619).
  • Transformer:
    • Aumenta la versione API minima richiesta a 21.
    • TransformationException viene ora utilizzato per descrivere gli errori che si verificano durante una trasformazione.
    • Aggiungi TransformationRequest per specificare le opzioni di trasformazione.
    • Consenti la registrazione di più listener.
    • Risolto il problema per cui Transformer si bloccava quando l'output del codec veniva letto parzialmente.
    • Risolto un potenziale NPE in Transformer.getProgress durante il rilascio delle eccezioni del muxer.
    • Aggiungi un'app demo per applicare le trasformazioni.
  • Estensione MediaSession:
    • Per impostazione predefinita, MediaSessionConnector ora cancella la playlist quando viene interrotta. Le app che vogliono conservare la playlist possono chiamare setClearMediaItemsOnStop(false) sul connettore.
  • Estensione Cast:
    • Corretto un bug che impediva a CastPlayer di chiamare onIsPlayingChanged correttamente (#9792).
    • Supporto dei metadati audio, inclusa la copertina con DefaultMediaItemConverter (#9663).
  • Estensione FFmpeg:
    • Fai in modo che build_ffmpeg.sh dipenda dalle utilità bin di LLVM anziché da quelle di GNU (#9933).
  • Compatibilità con Android 12:
    • Esegui l'upgrade dell'estensione Cast in modo che dipenda da com.google.android.gms:play-services-cast-framework:20.1.0. Le versioni precedenti di play-services-cast-framework non sono compatibili con le app che hanno come target Android 12 e si arrestano in modo anomalo con un IllegalArgumentException durante la creazione di PendingIntent (#9528).
  • Rimuovi i simboli deprecati:
    • Rimuovi Player.EventListener. Usa invece il descrittore Player.Listener.
    • Rimuovi MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory e MediaSourceFactory#setDrmUserAgent. Usa invece MediaSourceFactory#setDrmSessionManagerProvider.
    • Rimuovi MediaSourceFactory#setStreamKeys. Usa invece MediaItem.Builder#setStreamKeys.
    • Rimuovi MediaSourceFactory#createMediaSource(Uri). Usa invece MediaSourceFactory#createMediaSource(MediaItem).
    • Rimuovi setTag da DashMediaSource, HlsMediaSource e SsMediaSource. Usa invece il descrittore MediaItem.Builder#setTag.
    • Rimuovi DashMediaSource#setLivePresentationDelayMs(long, boolean). Utilizza MediaItem.Builder#setLiveConfiguration e MediaItem.LiveConfiguration.Builder#setTargetOffsetMs per eseguire l'override del manifest o DashMediaSource#setFallbackTargetLiveOffsetMs per fornire un valore di riserva.
    • Rimuovi (Simple)ExoPlayer.setThrowsWhenUsingWrongThread. La disattivazione dell'applicazione dei thread non è più possibile.
    • Rimuovi ActionFile e ActionFileUpgradeUtil. Utilizza ExoPlayer 2.16.1 o versioni precedenti per utilizzare ActionFileUpgradeUtil per unire i file di azioni legacy in DefaultDownloadIndex.
    • Rimuovi ProgressiveMediaSource#setExtractorsFactory. Utilizza invece il costruttore ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • Rimuovi ProgressiveMediaSource.Factory#setTag e ProgressiveMediaSource.Factory#setCustomCacheKey. Usa invece MediaItem.Builder#setTag e MediaItem.Builder#setCustomCacheKey.
    • Rimuovi i costruttori DefaultRenderersFactory(Context, @ExtensionRendererMode int) e DefaultRenderersFactory(Context, @ExtensionRendererMode int, long). Utilizza invece il costruttore DefaultRenderersFactory(Context), DefaultRenderersFactory#setExtensionRendererMode e DefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Rimuovi tutti i costruttori CronetDataSource pubblici. Usa invece CronetDataSource.Factory.
  • Modifica il seguente IntDefs solo in @Target(TYPE_USE). Ciò potrebbe interrompere la compilazione degli utilizzi in Kotlin, che può essere corretta spostando l'annotazione per annotare il tipo (Int).
    • @AacAudioObjectType
    • @Ac3Util.SyncFrameInfo.StreamType
    • @AdLoadException.Type
    • @AdtsExtractor.Flags
    • @AmrExtractor.Flags
    • @AspectRatioFrameLayout.ResizeMode
    • @AudioFocusManager.PlayerCommand
    • @AudioSink.SinkFormatSupport
    • @BinarySearchSeeker.TimestampSearchResult.Type
    • @BufferReplacementMode
    • @C.BufferFlags
    • @C.ColorRange
    • @C.ColorSpace
    • @C.ColorTransfer
    • @C.CryptoMode
    • @C.Encoding
    • @C.PcmEncoding
    • @C.Projection
    • @C.SelectionReason
    • @C.StereoMode
    • @C.VideoOutputMode
    • @CacheDataSource.Flags
    • @CaptionStyleCompat.EdgeType
    • @DataSpec.Flags
    • @DataSpec.HttpMethods
    • @DecoderDiscardReasons
    • @DecoderReuseResult
    • @DefaultAudioSink.OutputMode
    • @DefaultDrmSessionManager.Mode
    • @DefaultTrackSelector.SelectionEligibility
    • @DefaultTsPayloadReaderFactory.Flags
    • @EGLSurfaceTexture.SecureMode
    • @EbmlProcessor.ElementType
    • @ExoMediaDrm.KeyRequest.RequestType
    • @ExtensionRendererMode
    • @Extractor.ReadResult
    • @FileTypes.Type
    • @FlacExtractor.Flags (nel pacchetto com.google.android.exoplayer2.ext.flac)
    • @FlacExtractor.Flags (nel pacchetto com.google.android.exoplayer2.extractor.flac)
    • @FragmentedMp4Extractor.Flags
    • @HlsMediaPlaylist.PlaylistType
    • @HttpDataSourceException.Type
    • @IllegalClippingException.Reason
    • @IllegalMergeException.Reason
    • @LoadErrorHandlingPolicy.FallbackType
    • @MatroskaExtractor.Flags
    • @Mp3Extractor.Flags
    • @Mp4Extractor.Flags
    • @NotificationUtil.Importance
    • @PlaybackException.FieldNumber
    • @PlayerNotificationManager.Priority
    • @PlayerNotificationManager.Visibility
    • @PlayerView.ShowBuffering
    • @Renderer.State
    • @RendererCapabilities.AdaptiveSupport
    • @RendererCapabilities.Capabilities
    • @RendererCapabilities.DecoderSupport
    • @RendererCapabilities.FormatSupport
    • @RendererCapabilities.HardwareAccelerationSupport
    • @RendererCapabilities.TunnelingSupport
    • @SampleStream.ReadDataResult
    • @SampleStream.ReadFlags
    • @StyledPlayerView.ShowBuffering
    • @SubtitleView.ViewType
    • @TextAnnotation.Position
    • @TextEmphasisSpan.MarkFill
    • @TextEmphasisSpan.MarkShape
    • @Track.Transformation
    • @TrackOutput.SampleDataPart
    • @Transformer.ProgressState
    • @TsExtractor.Mode
    • @TsPayloadReader.Flags
    • @WebvttCssStyle.FontSizeUnit

Versione 1.0.0-alpha01

27 ottobre 2021

androidx.media3:media3-*:1.0.0-alpha01 è stato rilasciato. La versione 1.0.0-alpha01 contiene questi commit.

Nuove funzionalità

Media3 è la nuova sede delle librerie di supporto per i contenuti multimediali, tra cui ExoPlayer. La prima versione alpha contiene implementazioni funzionali iniziali di librerie per l'implementazione di casi d'uso multimediali, tra cui:

  • ExoPlayer, un media player a livello di applicazione per Android facile da personalizzare ed estendere.
  • Funzionalità della sessione multimediale per l'esposizione e il controllo delle riproduzioni. Questo nuovo modulo di sessione utilizza la stessa interfaccia Player di ExoPlayer.
  • Componenti UI per la creazione di interfacce utente per la riproduzione di contenuti multimediali.
  • Moduli che racchiudono funzionalità in altre librerie per l'utilizzo con ExoPlayer, ad esempio l'inserimento di annunci tramite l'SDK IMA.

Per saperne di più, consulta il progetto GitHub Media3.

In precedenza, ExoPlayer era ospitato in un progetto GitHub ExoPlayer separato. In Media3 il nome del pacchetto è androidx.media3.exoplayer. Abbiamo intenzione di continuare a gestire e rilasciare il progetto GitHub ExoPlayer per un po' di tempo, in modo da dare alle app il tempo di eseguire la migrazione a Media3. Media3 include sostituzioni per tutti i moduli ExoPlayer, ad eccezione delle estensioni legacy media2 e mediasession, che vengono sostituite dal nuovo modulo media3-session. In questo modo, viene fornita un'integrazione diretta tra i player e le sessioni multimediali senza dover utilizzare una classe di adattatore/connettore.