Media3

Bibliotecas de suporte para casos de uso de mídia.
Atualização mais recente Versão estável Versão candidata a lançamento Versão Beta Versão Alfa
21 de outubro de 2026 1.11.1 - - 1.12.0-alpha01

Declarar dependências

Para adicionar uma dependência da Media3, adicione o repositório Maven do Google ao seu projeto. Leia Repositório Maven do Google para ver mais informações.

Adicione as dependências dos artefatos necessários no arquivo build.gradle para seu app ou módulo:

Groovy

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")
}

Para ver mais informações sobre dependências, consulte Adicionar dependências de build.

Feedback

Seu feedback ajuda a melhorar o Jetpack. Você pode usar o Issue Tracker da Media3 (link em inglês) para ver respostas a perguntas, problemas conhecidos e solicitações de recursos e relatar novos problemas.

Version 1.12.0

Versão 1.12.0-alpha01

21 de outubro de 2026

A versão 1.12.0-alpha01 contém as seguintes confirmações.

  • Biblioteca comum:
    • Adição de C.COLOR_SPACE_DISPLAY_P3 e suporte ao espaço de cores Display P3 nos mapeamentos de cores ISO MediaFormatUtil e ColorInfo.
    • Adicionamos um registro central de Flags para gerenciar flags de recursos experimentais e lançamento gradual (Flags.setCanaryModeEnabled). Migramos muitos métodos @ExperimentalApi para usar a nova API de flags.
    • Adicione MediaMetadata.playlistId, MediaMetadata.Builder.setPlaylistId(String), MediaMetadata.categories e MediaMetadata.Builder.setCategories(List<String>).
    • Substitua androidx.media3.common.util.NonNullApi por org.jspecify.annotations.NullMarked do JSpecify.
  • ExoPlayer:
    • Correção de um problema em que a reprodução de vários períodos do DASH ficava travada quando o primeiro bloco do próximo período não era carregado (#3396).
    • Informa wasCanceled = true em AnalyticsListener.onLoadError e MediaSourceEventListener.onLoadError quando as novas tentativas de carregamento se esgotam.
    • Suporte ao registro de várias instâncias de VideoFrameMetadataListener usando ExoPlayer.addVideoFrameMetadataListener e ExoPlayer.removeVideoFrameMetadataListener, descontinuando ExoPlayer.setVideoFrameMetadataListener e ExoPlayer.clearVideoFrameMetadataListener.
    • Adicione suporte a anúncios em conteúdo de vários períodos (por exemplo, DASH) dividindo e compensando o AdPlaybackState para cada período.
    • Correção de uma disputa em PreCacheHelper em que o cancelamento de uma solicitação de preparação em andamento ainda podia iniciar downloads em segundo plano.
    • Limite setLoadOnlySelectedTracks(true) em ProgressiveMediaSource e DefaultMediaSourceFactory para filtrar apenas faixas de vídeo e imagem não selecionadas. As faixas de áudio e texto são sempre carregadas para permitir a troca de faixas sem interrupções e sem novo armazenamento em buffer.
    • Ative setLoadOnlySelectedTracks(true) por padrão em ProgressiveMediaSource e DefaultMediaSourceFactory. Isso economiza memória e permite que os cálculos de alocação de buffer do DefaultLoadControl funcionem com mais precisão quando nem todas as faixas são selecionadas. Isso pode causar mais armazenamento em buffer se as faixas de vídeo ou imagem não selecionadas forem ativadas no meio da reprodução.
    • Correção de um problema em que Player.getCurrentPosition() podia retornar valores desatualizados (atualizando apenas algumas vezes por segundo) quando a programação dinâmica estava ativada (#3286).
    • Correção de um problema em que uma diminuição ou redefinição inesperada na posição do cabeçote de reprodução AudioTrack poderia ser tratada incorretamente como um estouro de número inteiro, fazendo com que a reprodução ficasse travada no armazenamento em buffer (#3407).
    • Remova o experimental DefaultMediaCodecAdapterFactory.setAsyncCryptoSynchronizationEnabled(boolean).
    • Evitamos reativações desnecessárias do renderizador e falhas ao retornar de intersticiais ou anúncios para conteúdo cortado no final (#3371).
    • Correção de um problema em que um erro de renderização em um item de playlist futuro podia interromper prematuramente a reprodução atual quando Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION estava ativado.
    • Correção de um NullPointerException que poderia ocorrer se ExoPlayer fizesse a transição de renderizadores para um período de mídia não preparado quando Flags.FLAG_PER_STREAM_MEDIA_PROGRESSION estivesse ativado.
    • Correção de um problema em que os frames de vídeo podiam ser pulados ou descartados inesperadamente durante a programação dinâmica quando Flags.FLAG_VIDEO_RENDERER_DURATION_TO_PROGRESS está ativado.
    • Correção de uma ArrayIndexOutOfBoundsException em listeners de análise ao interromper a reprodução durante um anúncio em uma transmissão ao vivo (#3423).
    • Correção de um problema em que PreloadMediaSource podia postar inesperadamente um evento de pré-carregamento quando preload() nunca era chamado (#3408).
    • Correção de um problema em que Format.subsampleOffsetUs era ignorado para faixas de metadados, causando carimbos de data/hora de reprodução incorretos em comandos de emenda SCTE-35 decodificados (#3413).
    • Correção de um vazamento de memória em PreloadMediaSource e DefaultPreloadManager quando preload() é chamado várias vezes na mesma origem (link em inglês).
    • Correção de uma NullPointerException ao liberar AdsMediaSource enquanto uma atualização da linha do tempo do conteúdo está pendente (#3442).
    • Correção de um problema em que a reprodução de mídia progressiva podia pular para a posição errada quando um carregamento após uma busca (ou ao iniciar a reprodução em uma posição diferente de zero) falhava e era repetido (#3440).
    • Adicionamos uma solução alternativa para o congelamento do decodificador H.264 do Xiaomi TV Stick 4K (MiTV-AYFR0) em mudanças de resolução sem interrupções (#3457).
    • Correção de um NullPointerException em SteeringManifestTracker quando o rastreador é interrompido antes que uma conclusão de carregamento postada ou um callback de erro seja executado (#3443).
    • Suporte à reprodução de metadados programados HAGC (ST 2094-50) de faixas de metadados em caixas mebx em arquivos MP4.
    • Correção de um problema em que períodos de mídia de preparação lenta em uma playlist podiam ser pulados.
  • CompositionPlayer:
    • Suporte à configuração da taxa de frames da agregação de frames de vídeo usando Composition.Builder.setVideoFrameAggregationParameters para fluxos de trabalho de reprodução.
    • Correção de quedas de frames em composições de várias sequências causadas por incompatibilidades de quantização ou arredondamento de carimbo de data/hora, selecionando o frame com o carimbo de data/hora mais próximo durante a agregação de frames. Isso é ativado apenas na API 29, porque requer um frame adicional em andamento por sequência de vídeo.
  • Transformador:
    • Suporte à configuração do frame rate da agregação de frames de vídeo usando Composition.Builder.setVideoFrameAggregationParameters para fluxos de trabalho de exportação.
    • Correção de quedas de frames em composições de várias sequências causadas por incompatibilidades de quantização ou arredondamento de carimbo de data/hora, selecionando o frame com o carimbo de data/hora mais próximo durante a agregação de frames. Isso é ativado apenas na API 29, porque requer um frame adicional em andamento por sequência de vídeo.
    • Respeite Transformer#setAudioMimeType(AUDIO_RAW) quando AudioProcessors for usado. Antes dessa correção, solicitar MimeTypes.AUDIO_RAW e aplicar um AudioProcessor resultava em uma saída compactada.
  • Seleção de faixas:
    • Correção de um problema em que uma faixa SDR era incorretamente preferida em relação a uma faixa Dolby Vision compatível em alguns dispositivos (#3135).
  • Extratores:
    • Mp4Extractor: correção da análise da caixa dOps para Opus em MP4, em que PreSkip, InputSampleRate e OutputGain não eram convertidos de big-endian para little-endian, fazendo com que os primeiros ~299 ms de áudio fossem descartados quando nenhuma lista de edição estava presente (#3431).
    • Remova 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, já que a análise de dependência de amostra dentro do GOP para H.264 e H.265 está ativada por padrão.
    • Mp4Extractor: foi corrigida a análise de metadados de local de caixas xyz que contêm coordenadas de altitude para preencher Mp4LocationData.
    • Adição de ExtractorUtil.getFramesPerEncodedSample para calcular o número de frames de áudio por amostra para formatos de áudio codificados (#3367).
    • Adição de FLAG_READ_XMP_METADATA a Mp4Extractor para extrair metadados XMP de caixas UUID de nível superior.
    • Correção de áudio AC-3, DTS e LPCM corrompido ao reproduzir conteúdo MPEG-PS no estilo DVD, removendo o cabeçalho do subfluxo private_stream_1 de cada pacote PES em PsExtractor antes que o payload seja transmitido ao leitor de áudio (#3327).
    • Correção de falha em FragmentedMp4Extractor quando uma caixa tfdt da versão 1 codifica um baseMediaDecodeTime negativo (#3412).
    • MPEG-TS: suporte à análise de mensagens SEI de arranjo de empacotamento de frames H.264 e H.265 para preencher Format.stereoMode (#3419).
    • Analisar os dados de configuração do perfil 20 do Dolby Vision e rejeitar perfis não compatíveis em vez de reproduzir como HEVC padrão com cores incorretas (#3427).
    • MP3: o ajuste de metadados de atraso e preenchimento do codificador LAME/Xing foi revertido porque é incompatível com muitos decodificadores MP3 MediaCodec (#3425).
    • Matroska: correção de NullPointerException ao analisar elementos ChapterAtom aninhados (#3438).
    • Ogg: correção de um bug em que um pacote com tamanho múltiplo de 255 bytes e que termina em um limite de página é mesclado com o pacote seguinte.
    • MP4: analise as faixas de metadados com marcação de tempo em caixas mebx em Mp4Extractor e FragmentedMp4Extractor. As faixas que têm uma chave it35 são expostas como MimeTypes.APPLICATION_ITUT_T35 (ativando a reprodução de HAGC). Outras faixas mebx são ignoradas, a menos que FLAG_EMIT_RAW_MEBX_DATA esteja definido. Nesse caso, todas as faixas mebx são emitidas como MimeTypes.APPLICATION_MEBX brutos.
    • Ogg: suporte à extração de preenchimento final do Opus para reprodução sem interrupções (#2576) e correção de carimbos de data/hora de amostra após buscar uma página que começa com um pacote contínuo.
    • Ogg: correção de erros de decodificação e saltos de carimbo de data/hora de aproximadamente 1s em streams encadeados do Ogg Opus, ignorando os pacotes de cabeçalho de comentário e ID do Opus no meio do stream.
  • Inspetor:
    • Suporte à recuperação de metadados XMP de arquivos MP4 usando MetadataRetriever.
    • Suporte à extração de faixas de metadados temporizados em caixas mebx em MediaExtractorCompat como MimeTypes.APPLICATION_MEBX.
  • Frame do inspetor:
    • Correção do corte de cores BT.2020 de ampla gama na imagem de base SDR ao extrair frames Ultra HDR com FrameExtractor. As cores fora da gama agora são levemente compactadas na gama sRGB em vez de serem fixadas.
  • Áudio:
    • Adição de uma solução alternativa para dispositivos que invocam android.media.AudioDeviceCallback na linha de execução errada (#3386).
    • Correção de possíveis travamentos de reprodução após transições de faixa com descarregamento compactado.
    • Contornamos um problema nos dispositivos Amazon Fire TV em que o áudio AC-3 podia congelar durante as transições de período (#3448).
    • Foi adicionado suporte para cortar o padding do codificador de fim de stream para reprodução contínua do Opus Ogg e WebM/Matroska (#2576, link em inglês).
    • Correção de atualizações de atraso e preenchimento sem interrupções de descarregamento dinâmico durante transições de faixa para que sejam aplicadas à faixa de entrada, e não à que está sendo reproduzida.
    • O preenchimento final do codificador foi cortado em streams únicos e no stream final de uma playlist, além de transições sem interrupções no meio da playlist (#2576).
    • Evite cópias desnecessárias de buffer de áudio em TrimmingAudioProcessor depois que o corte de atraso do codificador de início de stream for concluído e nenhum preenchimento de fim de stream precisar ser cortado.
  • Vídeo:
    • Corrigimos o relatório de frames de vídeo atrasados com carimbos de data/hora de lançamento idênticos para que sejam informados como descartados em vez de ignorados.
  • Texto:
    • Adicione MediaItem.SubtitleConfiguration.timeOffsetUs para mudar os carimbos de data/hora das legendas transferidas por sideload em relação à mídia. O deslocamento pode ser alterado durante a reprodução com Player.replaceMediaItem(int, MediaItem) sem interromper a reprodução (#1976).
    • SubRip: foi adicionado suporte para injetar um CharsetDetector em DefaultSubtitleParserFactory para detectar a codificação de caracteres de legendas SubRip independentes sem uma marca de ordem de byte (#2247).
  • Efeito:
    • Implemente SoundSeparationAudioProcessor para separação de fontes de áudio usando o módulo GMSCore do StudioSound.
  • Muxers:
    • Correção da gravação da caixa dOps para Opus em Mp4Muxer e FragmentedMp4Muxer, em que PreSkip, InputSampleRate e OutputGain eram gravados em little-endian em vez de big-endian (#3431).
    • Suporte para gravar a altitude do GPS em Mp4LocationData usando Mp4Muxer.
    • Adição de Muxer.Factory.create(ParcelFileDescriptor) para permitir a multiplexação diretamente em um ParcelFileDescriptor.
    • Grava a caixa tfdt (Track Fragment Base Media Decode Time) por padrão em caixas traf de arquivos MP4 fragmentados para fornecer carimbos de data/hora de decodificação de mídia.
    • Suporte à gravação de caixas de contêiner dec3 E-AC-3 e E-AC-3 JOC (Dolby Atmos) em Mp4Muxer.
    • Adicionamos suporte ao formato WebM ao MediaMuxerCompat.
    • Grave a caixa mfra (Movie Fragment Random Access) no final de arquivos MP4 fragmentados para permitir a busca em FragmentedMp4Extractor usando FLAG_READ_MFRA_FOR_SEEK_MAP.
    • Correção de uma falha em Mp4Writer e FragmentedMp4Writer ao gravar uma amostra de EOS antes de qualquer outra amostra.
    • Correção da conformidade do contêiner ao multiplexar conteúdo Dolby em arquivos MP4 ou MP4 fragmentados, anunciando a marca compatível com dby1 no cabeçalho do contêiner (#3369).
    • Suporte a faixas de áudio PCM flutuantes de 32 bits em Mp4Muxer e FragmentedMp4Muxer (#3389).
    • Rejeitar perfis Dolby Vision incompatíveis em Mp4Muxer e FragmentedMp4Muxer ao adicionar faixas.
    • Suporte a faixas de áudio PCM de números inteiros de 24 e 32 bits em Mp4Muxer e FragmentedMp4Muxer.
  • Extensão de IMA:
    • Encaminhe os eventos de pausa e retomada do player para o SDK do IMA em ImaServerSideAdInsertionMediaSource.
  • Sessão:
    • Adicione MediaConstants.EXTRAS_KEY_PLAYLIST_ID, MediaConstants.EXTRAS_KEY_PLAYLIST_TITLE, MediaConstants.EXTRAS_KEY_PLAYLIST_ARTWORK_URI e MediaConstants.EXTRAS_KEY_CATEGORIES para preencher os metadados da playlist e do item com base em metadados e descrições legados, e MediaConstants.EXTRAS_KEY_SUGGESTED_TYPE e MediaConstants.EXTRAS_KEY_TTL_SECONDS para sugestões LibraryParams.extras.
    • Correção da falha de SecurityException ao criar ou liberar um MediaSession em dispositivos que aplicam limites estritos de PendingIntent.
    • Correção de um problema em que MediaSession.getControllerForCurrentRequest() retornava null durante solicitações de reprodução no Android 12 (APIs 31 e 32) quando MediaSessionService ainda não estava em primeiro plano.
    • Correção de uma falha de IllegalArgumentException quando um MediaController se conecta a uma sessão legada que informa um volume máximo negativo.
    • Correção de um problema em que chamar MediaController.setMediaItem ou setMediaItems seguido por play() em um MediaSessionCompat legado pausado podia enviar um callback onPrepareFrom* não compatível em vez de onPlayFrom* ou enviar onPlay() sem reinicializar o item de mídia solicitado.
    • Correção de NullPointerException no MediaBrowser legado ao receber uma resposta de comando personalizado (#3432).
    • Correção de uma falha de IllegalArgumentException ao receber metadados legados com chaves duplicadas no Bundle subjacente.
    • Unir chamadas MediaControllerCompat.TransportControls de saída feitas na mesma iteração Looper ao controlar um MediaSessionCompat legado. Por exemplo, chamar setMediaItem, prepare e play juntos agora envia um único callback onPlayFrom*.
  • Interface:
    • Correção do posicionamento da pontuação de legendas RTL e da preservação do intervalo de span quando o ajuste de texto bidirecional está ativado (#3454, #3455).
    • Adicione as classes TrackSelectionState e TrackSelectionParametersState e as funções de estado de lembrança combináveis correspondentes ao módulo media3-ui-compose.
    • Introdução de PresentationState.videoAspectRatio e alteração de Modifier.resizeWithContentScale para usar aspectRatio: Float? em vez de sourceSizeDp: Size?.
    • Adicione a classe CuesState e o elemento combinável rememberCuesState ao módulo media3-ui-compose para detectar as indicações atuais do player.
    • Adicione suporte ao modo de limpeza ao ProgressSlider se ele for baseado em ExoPlayer ou CompositionPlayer.
    • Adição de suporte a showArtwork em PresentationState e uso para cronometrar a renderização do elemento combinável opcional artwork fornecido em ContentFrame e Player. Adicione o elemento combinável Artwork para ser usado como o valor padrão do slot artwork.
    • Adicione novos campos a PlayPauseButtonState (showBuffering, showRetry, showReplay) e use-os em PlayPauseButton para renderizar mais ícones e um indicador de buffer.
    • Adicionamos a classe PlaybackState para permitir a observação personalizada do estado de reprodução e introduzimos BufferingIndicator como um componente independente de botão.
    • Correção de um problema em que PlayerView e PlayerControlView mostravam marcadores de anúncio nos limites de período para marcadores de posição de pós-roll ao vivo em transmissões ao vivo de vários períodos.
    • Os slots combináveis de Player, ContentFrame, PlayerDefaults e MiniController não recebem mais o player ou a visibilidade dos controles como parâmetros. Em vez disso, capture-os do escopo de chamada (por exemplo, topControls agora é @Composable BoxScope.() -> Unit). Essa é uma alteração interruptiva em uma API instável.
    • Adicione o parâmetro alignment a ContentFrame, Player e Modifier.resizeWithContentScale para posicionar o conteúdo dimensionado no contêiner e corte o conteúdo de ContentFrame nos limites para que o vídeo dimensionado com ContentScale.Crop não seja mais desenhado fora dele.
    • Adicionamos suporte à interface de transmissão ao vivo para ProgressSlider, ProgressStateWithTickCount e ProgressStateWithTickInterval expondo isLive e liveOffsetMs. Adição do elemento combinável LiveButton a media3-ui-compose-material3 (#2213).
  • Extensão do Ktor:
    • Correção de um problema em que o KtorDataSource podia tratar falhas de conexão no meio do stream como fim da entrada em vez de gerar uma HttpDataSourceException (#3460).
  • Extensão HLS:
    • Análise de VIDEO-RANGE (PQ e HLG) em EXT-X-STREAM-INF e EXT-X-I-FRAME-STREAM-INF em Format.colorInfo (#3441).
    • Correção de NullPointerException ao analisar segmentos de inicialização EXT-X-MAP MPEG-TS que contêm amostras de mídia PES (#3456).
    • Correção de regressão em que Format.id e Format.metadata eram null para faixas HLS expostas (#3402).
    • Corte os anúncios de lista de recursos para X-PLAYOUT-LIMIT e pule aqueles que ultrapassam totalmente o limite. Além disso, defina o deslocamento de retomada de conteúdo como 0 quando um intersticial omitir X-RESUME-OFFSET e a duração dele for desconhecida, mesmo que X-PLAYOUT-LIMIT esteja definido.
    • Correção de um problema em que a resolução de um intersticial X-ASSET-LIST substituía as contribuições de deslocamento de retomada de conteúdo de outros intersticiais no mesmo grupo de anúncios.
  • Extensão DASH:
    • Suporte à análise de eventos de inserção de MPD alternativo (urn:mpeg:dash:event:alternativeMPD:insert:2025) e substituição (urn:mpeg:dash:event:alternativeMPD:replace:2025) em DashManifestParser e exposição deles como instâncias AlternativeMpdEvent em Period.alternativeMpdEvents. Essa é uma alteração interruptiva para apps que usam subclasses de DashManifestParser: DashManifestParser.buildPeriod agora usa um parâmetro List<AlternativeMpdEvent> adicional, e a sobrecarga anterior foi removida. Os apps que substituem DashManifestParser.parseEventStream(XmlPullParser) precisam substituir DashManifestParser.parseEventStream(XmlPullParser, String), já que o primeiro foi descontinuado e será tornado particular em uma versão futura.
    • Análise de informações de cor do CICP (ColourPrimaries, TransferCharacteristics, MatrixCoefficients e VideoFullRangeFlag) de descritores EssentialProperty e SupplementalProperty em Format.colorInfo (#3426).
    • Suporte a listas separadas por espaços em branco de valores @id em atributos @value do descritor do modo de truque (http://dashif.org/guidelines/trickmode) (#3315).
    • Suporte à análise de <ProducerReferenceTime> em DashManifestParser, expondo-o em AdaptationSet.producerReferenceTimes e usando-o para preencher Timeline.Window.presentationStartTimeMs e Timeline.Window.windowStartTimeMs para streams de VOD.
    • Adição de suporte à distribuição de conteúdo DASH (#1689).
    • Correção de uma NullPointerException que poderia ocorrer ao analisar um manifesto DASH com um atributo ausente no elemento <UTCTiming> (#3436).
  • Extensão RTSP:
    • Correção de uma falha de IllegalStateException que ocorria ao processar respostas de rede atrasadas após o fechamento do cliente RTSP.
    • Correção de um problema em que a limpeza rápida podia acionar incorretamente o mecanismo de fallback do protocolo TCP.
    • Correção de uma falha do IllegalStateException que pode ocorrer ao processar respostas de rede atrasadas depois que o cliente RTSP redefine o estado durante a nova seleção de faixa, a remoção da sessão ou o redirecionamento de URI.
    • Correção de um problema em que buscar novamente antes de reiniciar a reprodução podia causar uma falha do IllegalStateException.
    • Correção de um problema em que retroceder enquanto uma busca já estava pendente podia causar queda de áudio e congelamento da reprodução de vídeo.
    • Correção de um problema em que as unidades de acesso de frames-chave H.264 e H.265 que terminavam com um pacote de agregação ou não IDR não eram sinalizadas como frames-chave, fazendo com que a reprodução ficasse travada no armazenamento em buffer (#3434).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Extensão Opus: correção de falha de JNI ao decodificar dados Opus inválidos.
    • Extensão Opus: correção do preenchimento de descarte que era ignorado quando o pré-pulo e o preenchimento de descarte caíam no mesmo pacote (#2576).
  • Extensão do Google Cast:
    • Introdução de SessionAvailabilityListener.SessionUnavailableReason para representar o motivo da indisponibilidade da sessão e fornecimento de um método sobrecarregado para SessionAvailabilityListener.onCastSessionUnavailable para expor isso.
    • Correção de um problema em que a reprodução era retomada inesperadamente no dispositivo local após interromper uma sessão do Cast.
    • Registrar um erro quando as operações de RemoteMediaClient (como reproduzir, pausar, mudar a velocidade, modo de repetição, volume, silenciar ou seleção de faixa) falharem em RemoteCastPlayer (#3373).
    • Correção de ArrayIndexOutOfBoundsException em RemoteCastPlayer quando a fila do receptor do Cast muda ou diminui enquanto uma operação de busca está pendente (#3372).
    • Foi corrigido um problema com o receptor padrão do Cast em que a linha do tempo só preenchia os itens de mídia imediatamente ao redor do item ativo, em vez de toda a playlist (#3129).
    • Atualize a linha do tempo e a posição de reprodução imediatamente ao modificar a playlist (setMediaItems, addMediaItems, moveMediaItems, removeMediaItems) ou ao buscar em RemoteCastPlayer, e coloque em fila as operações sucessivas da playlist para que sejam executadas de forma confiável em ordem (#2639, #3272).
    • Correção de um problema em que a chamada de addMediaItems em uma fila vazia em RemoteCastPlayer não carregava os itens de mídia no receptor do Cast (#2402).
    • Correção de um problema no RemoteCastPlayer em que chegar ao fim da fila do receptor do Cast limpava a linha do tempo em vez de manter a playlist.
    • Correção de um problema em que playWhenReady, repeatMode e playbackParameters não eram transferidos ou aplicados quando definidos em RemoteCastPlayer antes de carregar itens de mídia (por exemplo, durante a transferência de reprodução local para remota em CastPlayer) (#889).
  • App de demonstração:
    • Adicionamos suporte a itens de mídia protegidos por DRM e um stream de amostra HLS adicional ao catálogo do app de demonstração da sessão.
    • Configure RemoteCastPlayer com um CastTrackSelector no app de demonstração da sessão para ativar a seleção de legendas e faixas de áudio durante a transmissão.
  • Símbolos descontinuados foram removidos:
    • DashUtil.buildDataSpec(Representation, RangedUri, int) e DashUtil.buildDataSpec(Representation, String, RangedUri, int) foram removidos. Use DashUtil.buildDataSpec(Representation, BaseUrl, RangedUri, int, Map<String, String>).
  • Build:
    • Aumente o minSdk do Gradle para 24.

Versão 1.11.0

1.11.1

10 de setembro de 2026

  • ExoPlayer:
    • Mova a flag para ativar/desativar os metadados do HAGC para mídia progressiva de MediaSource.Factory para ExtractorsFactory. O método setExperimentalEnableHagcPlayback anterior foi removido e substituído por ExtractorsFactory.setParseHagcMetadata. Isso também resolve um problema em que a desativação não funcionava para contêineres Matroska/WebM.
    • Correção de uma interrupção na reprodução causada pelo pré-aquecimento de um renderizador secundário que não está em transição.
    • Correção de um problema de pré-aquecimento em que o Surface precisa ser retornado ao renderizador principal quando uma busca redefine e desativa os dois renderizadores.
    • Correção de ArrayIndexOutOfBoundsException quando uma atualização da linha do tempo ao vivo move a posição padrão para além de um anúncio inserido do lado do servidor que está sendo reproduzido (#3348).
    • Correção de um problema no modo de ajuste em que frames de vídeo desatualizados podiam ser exibidos brevemente ao buscar com o ScrubbingModeParameters.allowSkippingMediaCodecFlush ativado.
  • Extratores:
    • Matroska: correção do problema em que as faixas colocadas após os clusters não resultavam em uma linha do tempo pesquisável (#3377).
  • Áudio:
    • Correção do cálculo do tamanho do buffer em SilenceSkippingAudioProcessor para que a duração mínima do silêncio não seja reduzida incorretamente pelo tamanho do frame (#3271).
    • Correção do processamento de PCM de 8 bits em PcmAudioUtil para tratar amostras como não assinadas, conforme definido pelo Android (#3271).
    • Correção de um problema de descarregamento em que a reprodução podia travar durante transições contínuas ou de anúncios precedentes devido a tamanhos limitados de buffer de hardware.
    • Correção de um bug em DefaultAudioSink em que a contagem de versões não diminui quando a linha de execução de reprodução não está mais ativa (#3338).
  • Sessão:
    • Correção de NullPointerException quando um MediaController em processo é liberado de um callback Player.Listener (#3375).
    • Correção de um deadlock na linha de execução principal quando um MediaBrowser legado se conecta a um serviço que retorna um resultado assíncrono de onGetLibraryRoot() ou onConnectAsync() (#3393).
  • Extensão HLS:
    • Correção do cálculo do deslocamento de retomada de conteúdo quando o segmento de destino para ajuste ainda não está na playlist (#3322).
    • Correção de um problema em que um HlsMediaChunk totalmente consumido tentava carregar novamente ao receber EOFException do extrator (#3350).
  • Extensão DASH:
    • Correção do cálculo incorreto do carimbo de data/hora de amostra para faixas de imagem com um presentationTimeOffset (#3334).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Opus: correção da corrupção de memória quando várias instâncias de OpusDecoder são inicializadas simultaneamente.
    • MPEG-H: correção de vazamento de memória, truncamento de caracteres não ASCII e possível falha nativa em condições de pouca memória ao enviar comandos para o MpeghUiManager (#3365).

Versão 1.11.0

5 de agosto de 2026

  • Biblioteca comum:
    • Adição de Format.channelMask para representar explicitamente a máscara do canal de áudio e uma nova sobrecarga de Util.getAudioTrackChannelConfig(Format) para resolvê-la com segurança.
    • O Kotlin foi atualizado da versão 2.0.20 para a 2.2.0.
  • ExoPlayer:
    • Correção de um bug de simultaneidade dependente de tempo que poderia causar um IllegalStateException ou IndexOutOfBoundsException no ExoPlayer.
    • Flexibilize as verificações de contagem de grupos de anúncios em AdsMediaSource para permitir que a contagem diminua quando um grupo de anúncios for totalmente processado (hasUnplayedAds() é false), acomodando o redimensionamento de grupos de anúncios dinâmicos durante os fluxos de trabalho de redefinição.
    • Adição de getFlags() e FLAG_STRICT_DURATION a SampleStream para permitir que os streams informem sinalizações de relatórios e atualização dos renderizadores para verificar essas sinalizações dinamicamente.
    • Volte para o estimador de frame rate em MediaCodecVideoRenderer e para o formato de saída do codec em MediaCodecAudioRenderer para calcular a taxa de operação do codec quando os formatos de stream não fornecerem um valor válido e evitar redefinições desnecessárias do codec.
    • Remova o corte de conteúdo para anúncios inseridos do lado do cliente no player principal. Em vez disso, o AdsMediaSource cuida da lógica de corte. As origens de anúncios personalizados inseridos do lado do cliente precisam ser atualizadas para implementar o corte de conteúdo internamente.
    • Marque as faixas com um perfil ou nível de codec bem formado, mas não reconhecido, como supported=NO_EXCEEDS_CAPABILITIES em vez de supported=YES (que é como as faixas com informações de perfil ou nível ausentes ou corrompidas são marcadas). Isso garante que essas faixas (que provavelmente não são compatíveis com o dispositivo) não sejam selecionadas quando houver alternativas com melhor suporte.
    • Adicione DefaultPreloadManager.SimpleRankingDataComparator, que é um RankingDataComparator que compara as classificações dos itens de mídia com base nas distâncias deles até o índice do item de mídia em reprodução. Os apps podem modificar o método compare(Integer, Integer) se uma lógica de comparação mais ajustada for necessária. O SimpleRankingDataComparator personalizado pode ser injetado por um novo construtor de DefaultPreloadManager.Builder.
    • Reduza o risco de falta de memória de DefaultLoadControl.prioritizeTimeOverSizeThresholds voltando aos limites de tamanho de byte do buffer se a memória heap disponível parecer insuficiente.
    • Alinhamento do processamento de imagens estáticas quando MediaItem.imageDurationUs não está definido: as imagens estáticas JPEG e HEIC agora são "reproduzidas" com uma duração padrão muito curta (da mesma forma que as imagens PNG e outras se comportavam anteriormente).
    • Adicione MediaSource.prepareSource(MediaSourceCaller, PlayerId, BandwidthMeter) para conectar BandwidthMeter a MediaSource. No entanto, o método descontinuado com implementação personalizada ainda será chamado por padrão. Recomendamos implementar o novo método e usar BandwidthMeter.getTransferListener() para ter paridade com o método antigo.
    • Em DefaultBandwidthMeter, foi adicionado suporte a um InitialBitrateSupplier personalizado. Isso permite que os apps forneçam a própria lógica para determinar a estimativa inicial de taxa de bits, que será usada na criação de DefaultBandwidthMeter e em mudanças no tipo de rede. O fornecedor pode ser definido usando DefaultBandwidthMeter.Builder.setInitialBitrateSupplier().
    • Ativar a programação dinâmica por padrão. O loop de trabalho de reprodução do ExoPlayer será executado dinamicamente, em vez de em um intervalo estático.
    • Remoção de uma redefinição desnecessária que pode ocorrer ao mesclar faixas com amostras de anúncio precedente à reprodução ativa.
    • Em DefaultBandwidthMeter, otimize getInitialBitrateCountryGroupAssignment para retornar as atribuições de grupo de países empacotadas em um número inteiro de 32 bits em vez de uma matriz, reduzindo o tamanho do código e evitando alocações.
    • Correção de falhas de inicialização de AudioTrack em alguns dispositivos, garantindo que a lógica de nova tentativa sempre tente um tamanho de buffer mínimo de 1 segundo se outras novas tentativas (reduzindo o tamanho do buffer pela metade) não forem bem-sucedidas (#3207).
    • Correção de um problema de codec em alguns dispositivos em que o codec engolia todas as amostras se fosse limpo antes de receber buffers de entrada.
    • Adição do ExoPlayer.Builder.enablePerStreamMediaProgression() experimental para permitir o avanço do processamento de mídia por stream. Isso reduz a latência de inicialização entre os itens da playlist e evita que a reprodução fique "travada" com conteúdo muito curto (#3122).
    • Correção de uma disputa relacionada ao uso do ID da sessão de áudio em que o ID inicial gerado automaticamente pelo ExoPlayer era usado em vez do valor definido pelo setAudioSessionId (#3241).
    • Adição de suporte experimental à reprodução de metadados programados do HAGC (ST 2094-50) para mídia progressiva (por exemplo, MP4, Matroska). O player mescla automaticamente as faixas de metadados do HAGC com a faixa de vídeo associada e envia os metadados fora de banda para o decodificador em dispositivos com a API 37+. Esse comportamento pode ser desativado por meio de DefaultMediaSourceFactory.setExperimentalEnableHagcPlayback(false).
    • Adição de Format.selectionPriority, que representa a preferência relativa do Format na seleção de faixas (#3236).
    • Correção de um possível problema no modo de limpeza em que a limpeza poderia ser interrompida ao buscar o "fim do stream".
  • CompositionPlayer:
    • Correção de um problema em que as instâncias de TrackSelector não eram liberadas.
  • Transformador:
    • Correção de um problema em que ExportResult.fileSizeBytes pode ser informado em excesso.
  • Seleção de faixas:
    • Exponha BaseTrackSelection.DEFAULT_FORMAT_COMPARATOR e adicione AdaptiveTrackSelection.Factory.setTrackFormatComparator para permitir a ordenação de formatos personalizados e a prioridade de seleção de ABR além da ordenação somente por taxa de bits.
    • Correção de um problema de simultaneidade dependente de tempo em que atualizações sequenciais rápidas para rastrear parâmetros de seleção poderiam resultar na perda ou substituição de algumas atualizações.
  • Extratores:
    • MP4, MP3 e FLAC: adicionamos FLAG_DISABLE_ARTWORK_METADATA para permitir o descarte de imagens anexadas e metadados de arte da capa durante a análise do contêiner para reduzir o consumo de memória do ambiente de execução (#2077). Isso também pode ser ativado de forma centralizada usando DefaultExtractorsFactory.setDisableArtworkMetadata.
    • MP4: foi adicionado suporte à extração de faixas de metadados com marcação de tempo ITU-T T.35 (it35).
    • MP4: foi adicionado suporte para extrair metadados de capítulos (formatos Nero e QuickTime). Os capítulos do QuickTime são preferidos se ambos estiverem presentes. As informações de capítulo extraídas são expostas como entradas Chapter no Metadata da faixa, permitindo a navegação nativa de capítulos em arquivos MP4, M4A e M4B (como audiolivros e podcasts) (#2803).
    • WAV, Matroska e MP4: foi adicionado suporte ao áudio PCM de ponto flutuante de 64 bits (#3090).
    • Matroska: use metadados de bitstream do codec para preencher ColorInfo com precisão.
    • MP4: foi adicionado suporte à busca em arquivos MP4 fragmentados usando a caixa mfra quando uma caixa sidx não está presente. Para ativar essa opção, forneça FLAG_READ_MFRA_FOR_SEEK_MAP para o FragmentedMp4Extractor, que agora é feito por padrão em DefaultExtractorsFactory (#3088).
    • Ignorar dados de av1C com versão não compatível.
    • MP4: adicionamos suporte para PCM de ponto flutuante big-endian em caixas fpcm.
    • Matroska: analisa as informações do capítulo para entradas Chapter no Metadata de uma faixa.
    • MPEG-TS: melhoramos a extração de streams DTS-HD e DTS Express combinando o sub-stream principal e de extensão em uma única amostra, corrigindo problemas de reprodução em que os dois eram mostrados como amostras separadas (#3147).
    • MP4: evitamos loops infinitos e leituras fora dos limites ao analisar itens de tag de metadados ilst vazios (link em inglês).
    • MPEG-TS: o último frame é renderizado para streams em que o último pacote PES tem uma duração conhecida (#3206).
    • MP3: correção do relatório de taxa de bits para arquivos com cabeçalho Xing e VBRI.
    • Matroska: processa faixas definidas no último cluster (#3250).
    • Matroska: adição de suporte ao ALAC (#3268).
    • MP4: permite caixas sgpd de tamanho variável em arquivos MP4 fragmentados (#3243).
    • AVI: correção de um problema em que a reprodução de arquivos sem flags de frame-chave em faixas de áudio causava perda de áudio e OutOfMemoryError.
    • MP3: use durações sem intervalos dos cabeçalhos Xing/Info (#3183).
    • MP3: ajuste o atraso do codificador LAME/Xing e os metadados de preenchimento para corresponder ao corte de PCM decodificado (#3200).
  • Áudio:
    • Adição de um período de carência de 100 ms nos renderizadores de áudio do ExoPlayer ao fazer a transição do estado pronto para o estado não pronto, para eliminar o debounce de underruns transitórios e evitar estados de buffer inesperados durante a reprodução ativa (#3210).
    • Mudança da lógica de tamanho do buffer PCM padrão em DefaultAudioTrackBufferSizeProvider para usar um buffer fixo de 500 ms para torná-lo menos dependente do dispositivo.
    • Atualize MediaCodecAudioRenderer para extrair a channelMask espacial do decodificador da plataforma, permitindo que DefaultAudioSink use essa máscara explícita em vez de inferir uma com base na contagem de canais.
    • Converter os parâmetros de AudioSink.configure em uma classe de dados. As substituições personalizadas de ForwardingAudioSink.configure precisam ser migradas para a nova assinatura do método.
    • Adição de suporte para manter o tom ao estender o tempo de um stream de áudio com EditedMediaItem.Builder#setSpeed(SpeedParameters).
    • Melhoramos o ToFloatPcmAudioProcessor para oferecer suporte à conversão de PCM de 8 bits, PCM big-endian de 16 bits e PCM de ponto flutuante de 64 bits para PCM de ponto flutuante de 32 bits (#3090).
    • Mude o valor de retorno de DecoderAudioRenderer.getChannelMapping para ImmutableIntArray.
    • Correção de um bug em que a reprodução travava ao tocar uma playlist de áudio sem interrupções no modo de descarregamento compactado.
    • Encaminhe Timeline e o UID do período para AudioSink.configure e AudioProcessor.StreamMetadata para fornecer o contexto da playlist aos processadores de áudio (#418).
    • Definição do AudioProcessor.StreamMetadata.positionOffsetUs correto para permitir o processamento de áudio com base no tempo (#418).
    • Adição de suporte para PCM de ponto flutuante de 32 e 64 bits big-endian.
    • Remoção do caminho de fallback de EAC3-JOC para EAC3 para reprodução em dispositivos Google Pixel, já que os decodificadores EAC3 padrão não podem decodificar streams EAC3-JOC (#3257).
  • Vídeo:
    • Corrigimos a lógica de mesclagem de vídeos para contar os buffers descartados durante a mesclagem como pulados, em vez de descartados.
    • Correção da decisão de renderização imediata ao definir uma nova superfície para evitar quedas de frames em dispositivos que não são compatíveis com superfícies de marcador de posição.
    • Correção da estimativa de frame rate em MediaCodecVideoRenderer para ser mais precisa, considerando frames descartados ou ignorados.
    • Permite a configuração do limite usado para programar frames com antecedência. O padrão é 50 ms, mas é possível personalizar o valor usando MediaCodecVideoRenderer.Builder.setMaxEarlyUsThreshold().
    • Correção de um bug em VideoFrameReleaseHelper em que as mudanças na tela podiam acionar callbacks Choreographer redundantes e ativações excessivas da CPU na linha de execução principal.
  • Texto:
    • TTML: fallback para displayAlign de style para regiões (#2559).
    • TTML: herdar o horário de início da sugestão do elemento pai de <p> (link em inglês).
  • Metadados:
    • Adição do campo MediaMetadata.discSubtitle e análise dele com base nos dados ID3v2.4 TSST e Vorbis DISCSUBTITLE.
    • Analise o número e a contagem de discos do frame ID3 TPOS.
  • Efeito:
    • Limpar o estado de redesenho em FinalShaderProgramWrapper ao limpar para evitar que o player congele ao buscar.
  • Muxers:
    • Adição de suporte a referências de faixa (a caixa tref) em Mp4Muxer usando uma nova API addTrackReference. Isso permite estabelecer relações entre faixas, como vincular uma faixa de metadados à faixa de vídeo que ela descreve.
    • Adicione OggMuxer para permitir a multiplexação de streams de mídia OPUS ou VORBIS no formato do arquivo ogg.
    • Adição de WavMuxer para geração de arquivos WAV (com suporte a PCM de números inteiros e pontos flutuantes).
    • Adicione setAttemptStreamableOutputEnabled a InAppMp4Muxer.Factory para permitir a gravação de arquivos menores não transmissíveis sem espaço reservado.
    • Adição de suporte ao áudio IAMF em Mp4Muxer e FragmentedMp4Muxer.
  • Extensão de IMA:
    • Adicione ImaServerSideAdInsertionMediaSource.AdsLoader.Builder.setPauseAdSlot para permitir que um espaço do anúncio seja usado para anúncios de pausa.
    • Correção de um bug em que anúncios VAST puláveis consecutivos mostravam o botão de pular imediatamente no segundo anúncio (#3165).
  • Sessão:
    • Correção de possíveis impasses e falhas de IllegalStateException dentro de MediaNotificationManager ao usar uma sessão com um looper de player de linha de execução em segundo plano.
    • Aplique requisitos de linha de execução mais rígidos para métodos MediaSession. Os métodos void agora postam automaticamente a execução na linha de execução do looper do aplicativo, e os acessadores de estado (getters) geram explicitamente uma IllegalStateException se forem chamados de uma linha de execução diferente do looper do aplicativo.
    • Correção de uma falha de mesclagem de linha do tempo fora dos limites (IllegalStateException em MediaUtils.mergePlayerInfo) rastreando a consistência do estado por controlador no lado da sessão.
    • Adicionamos androidx.media3.session.MediaSessionManager para oferecer suporte à consulta de sessões de mídia ativas e retornar instâncias SessionToken do Media3.
    • Mude o comportamento padrão de MediaSession.Callback.onConnect se o método não for substituído para fornecer apenas acesso de leitura a controladores não confiáveis.
    • Adição de suporte para substituir o nome do pacote ao criar MediaSession usando uma nova API MediaSession.Builder#setPackageNameOverride. O autor da chamada precisa ter a permissão android.permission.OVERRIDE_MEDIA_SESSION_OWNER para substituir o nome do pacote da sessão.
    • Adição do MediaSession.Callback.onConnectAsync(). O novo método permite processar de forma assíncrona a tentativa de conexão de um controlador. Os apps podem retornar um Future imediato com Futures.immediateFuture(ConnectionResult) para alcançar o comportamento anterior. É recomendável migrar para o novo método porque Callback.onConnect é um candidato à descontinuação.
    • Correção de um problema em que a navegação AVRCP do Bluetooth não reconhecia MediaLibraryService nas APIs 36 e 37.
    • Foi corrigido o problema de redução dupla de escala de arte em MediaSession quando o tamanho da imagem está próximo do limite da plataforma, resolvendo o desfoque nas notificações (#3134).
    • Correção da falha de ForegroundServiceStartNotAllowedException em MediaNotificationManager quando um callback de carregamento de bitmap de arte assíncrono tenta iniciar o serviço em primeiro plano enquanto o app está em segundo plano (#3270).
    • Correção de um problema em que os objetos PositionInfo recebidos por um MediaController não tinham os UIDs originais de Timeline. A sessão agora traduz e propaga esses UIDs de maneira confiável durante as atualizações de estado.
    • Correção de falha ao capturar ForegroundServiceStartNotAllowedException em MediaSessionService.stopSelfSafely() (#3310).
    • Correção do callback onMediaItemTransition() inesperado em MediaController ao buscar no mesmo item de mídia (#3248).
  • Interface:
    • Correção da renderização do primeiro frame no tamanho errado quando ContentFrame é recomposto no meio da reprodução (#3238).
    • Adicione a classe CurrentMediaItemState e o elemento que pode ser composto rememberCurrentMediaItemState correspondente ao módulo media3-ui-compose. Esse detentor de estado é usado em demo-compose para mostrar várias informações de metadados sobre o MediaItem em reprodução.
    • Adicione a classe PlaylistState e o elemento combinável rememberPlaylistState correspondente ao módulo media3-ui-compose. Esse detentor de estado é usado em demo-compose para mostrar várias informações de metadados sobre o MediaItems definido no player.
    • Adicionamos a API de avanço rápido/câmera lenta a PlaybackSpeedState. Use essa funcionalidade em demo-compose para mostrar o avanço rápido com um toque longo.
    • Adicione o elemento combinável MiniController ao módulo media3-ui-compose-material3. Ele oferece uma affordance compacta para controlar o Player enquanto mostra o título, o artista, a arte e o progresso do item de mídia atual.
    • Adicione a classe ErrorState e o elemento combinável rememberErrorState correspondente ao módulo media3-ui-compose. Adicione o elemento combinável ErrorText a media3-ui-compose-material3 e o defina como uma sobreposição padrão no Player.
    • Publicar o objeto PlayerDefaults com elementos combináveis para TopControls, CenterControls, BottomControls e ErrorOverlay.
    • Adicione FocusRequester ao elemento combinável Player e aos slots de conteúdo dele.
    • Publicação de PlayerPool (common-ktx) e rememberPooledPlayer (ui-compose) para oferecer suporte ao pré-carregamento de MediaItems em ambientes de interface de janela deslizante. Mostre essa funcionalidade em demo-compose com um novo ShortFormPlayerScreen.
    • Correção de um bug de supressão de obturador em PlayerView e no Compose PresentationState que causava falhas em linhas do tempo que não oferecem suporte à pesquisa de UID de período (#3264).
  • Downloads:
    • Resolva as variáveis HLS na playlist de mídia quando buscadas para download (#3258).
  • Extensão do Ktor:
    • Adição de um novo módulo de extensão media3-datasource-ktor que fornece um KtorDataSource com suporte da pilha HTTP do Ktor.
    • Correção de KtorDataSource que carregava todo o corpo da resposta HTTP na memória ao abrir uma conexão (#3305).
  • Extensão HLS:
    • Adição de suporte para direcionamento de conteúdo HLS e clonagem de caminho (#1689).
    • Adição de setWithAssetListReset a HlsInterstitialsAdsLoader para permitir que os apps redefinam os intersticiais de lista de recursos totalmente processados para um estado indisponível para nova resolução sob demanda.
    • Análise do atributo SCORE de EXT-X-STREAM-INF e EXT-X-I-FRAME-STREAM-INF e preenchimento dele em Format.selectionPriority (#3236).
    • Correção de um bug em que as atualizações programadas da playlist de HLS continuavam mesmo que ela não fosse mais principal ou ativa (#3254).
    • Foi corrigido o cálculo do deslocamento de retomada de conteúdo ao resolver listas de recursos intersticiais (#3322).
    • Correção da descontinuidade inesperada do carimbo de data/hora da faixa de áudio ao retomar a reprodução ao vivo de baixa latência após uma falha na solicitação de playlist (#3311).
    • Correção de bug em HlsMediaPeriod.getStreamKeys() em que a faixa ID3 em representações de áudio é considerada como legendas (#3333).
  • Extensão DASH:
    • As legendas descritivas da CEA foram separadas em diferentes TrackGroups com base no idioma (#3113).
    • Adição de suporte para analisar vários elementos Location do manifesto (MPD) e realizar o substituto de local em DashMediaSource quando as cargas do manifesto falharem.
    • Correção de uma falha (IndexOutOfBoundsException) ao abrir manifestos com um elemento <SegmentTimeline/> vazio (#3326).
  • Extensão RTSP:
    • Correção de travamentos ou falhas temporárias durante a preparação da reprodução RTSP causadas por erros de vinculação de porta UDP.
  • Extensão do Google Cast:
    • Adição da nova classe CastParams para permitir a configuração do Cast chamando Cast.initialize(CastParams).
    • Adição da nova opção CastParams.getShowSystemOutputSwitcherOnCastIconClick(), que aciona o uso do seletor de saída da SystemUI em vez do seletor de dispositivos de transmissão no app, quando disponível.
    • Adição de MediaRouteButtonState e rememberMediaRouteButtonState para oferecer suporte à observação do estado de visibilidade do seletor de rota de mídia e adição do parâmetro state a MediaRouteButton (#3172).
    • Correção de um bug em que RemoteCastPlayer poderia ficar permanentemente travado em um estado de mascaramento de faixa após uma seleção de faixa, fazendo com que ele ignorasse as atualizações de faixa subsequentes do receptor do Cast (#3237).
    • Correção de um bug em que DefaultMediaItemConverter gera uma NullPointerException ao tentar participar de uma sessão de transmissão iniciada por um remetente que não é do Media3.
    • Impedimento de que CastPlayer transfira MediaItems que não podem ser reproduzidos ao mudar o player ativo (#3199).
    • Correção de um bug em que transmissões ao vivo não configuradas (liveConfiguration == UNSET) eram colocadas na fila como STREAM_TYPE_BUFFERED (#3318).
  • Utilitários de teste:
    • Expanda DataSourceContractTest para incluir suporte a solicitações POST com cabeçalhos e corpos, adicione alguns recursos POST a HttpDataSourceTestEnv e adicione declarações para o método HTTP, cabeçalhos e corpo esperados em WebServerDispatcher.
    • Restringir as declarações em DataSourceContractTest para comprimentos retornados de DataSource.open(). Os recursos que podem resultar em C.LENGTH_UNSET precisam indicar isso usando TestResource.Builder.setMayResolveToUnknownLength(boolean).
    • setPlaybackLooper foi adicionada a TestExoPlayerBuilder.
  • Símbolos descontinuados foram removidos:
    • androidx.media3.exoplayer.MetadataRetriever foi removido. Use androidx.media3.inspector.MetadataRetriever
    • O androidx.media3.exoplayer.MediaExtractorCompat foi removido. Use androidx.media3.inspector.MediaExtractorCompat
    • O Mp4Extractor.FLAG_READ_MOTION_PHOTO_METADATA foi removido. Use HeifExtractor para extrair metadados de fotos com movimento de arquivos HEIC.
    • O androidx.media3.extractor.metadata.mp4.MotionPhotoMetadata foi removido. Use androidx.media3.extractor.metadata.MotionPhotoMetadata
    • O androidx.media3.extractor.DummyTrackOutput foi removido. Use androidx.media3.extractor.DiscardingTrackOutput
    • O androidx.media3.extractor.DummyExtractorOutput foi removido. Use androidx.media3.extractor.NoOpExtractorOutput
    • O androidx.media3.common.C.generateAudioSessionIdV21 foi removido. Use androidx.media3.common.util.Util.generateAudioSessionId
  • Criar
    • Atualizamos as instruções de README.md para depender do Media3 localmente para usar builds compostos do Gradle (includeBuild). O script core_settings.gradle foi removido, e as propriedades androidxMediaModulePrefix e androidxMediaEnableMidiModule não são mais usadas.

1.11.0-rc01

Use a versão estável 1.11.0.

1.11.0-beta01

7 de julho de 2026

Use a versão estável 1.11.0.

1.11.0-alpha01

24 de junho de 2026

Use a versão estável 1.11.0.

Versão 1.10.0

1.10.1

12 de maio de 2026

  • Biblioteca comum:
    • Correção do processamento de onAudioSessionIdChanged em SimpleBasePlayer e ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Correção de uma disputa relacionada à geração de IDs de sessão de áudio que poderia levar a um IllegalStateException com o modo de túnel. (#3099).
    • Correção de possíveis falhas do app ao se recuperar de erros do decodificador com o pré-aquecimento do renderizador.
    • Correção de um problema em que artefatos de vídeo eram causados pelo fornecimento de dados de inicialização ao usar um codec Dolby Vision baseado em AV1 (#3153).
  • Seleção de faixas:
    • Ajustamos a lógica de seleção de faixas em VideoTrackInfo para resolver tipos MIME de substituição e mover as preferências de HDR e pontuação de codec para as preferências de qualidade (#3135).
  • Extratores:
    • MP3: o tamanho dos dados do Xing será ignorado se for maior que o tamanho conhecido do stream (#3117).
    • Correção de ArrayIndexOutOfBoundsException em Mp4Extractor quando FLAG_OMIT_TRACK_SAMPLE_TABLE está definido e a faixa não tem uma caixa de amostra de sincronização (stss).
  • Áudio:
    • Correção de um bug em que os eventos de áudio podiam ser roteados incorretamente se vários renderizadores de áudio fossem adicionados ao player.
  • Vídeo:
    • A lógica de reutilização de codec em mudanças de frame rate na API abaixo de 30 foi ajustada para evitar redefinições de codec quando elas não são benéficas (#3120).
    • Desativamos a solução alternativa de sincronização forçada em queueSecureInputBuffer para a API 31+. A solução alternativa era um gargalo artificial que forçava a execução em série da descriptografia, o que impedia vídeos distorcidos devido a um problema de framework que existia antes da API 31.
  • Imagem:
    • Correção de um problema no modo de limpeza em que as atualizações de imagem só entravam em vigor quando o usuário "parava a limpeza" (#2815).
  • Sessão:
    • Correção de um bug em que ForegroundServiceStartNotAllowedException não era propagado entre os limites da linha de execução caso a linha de execução do aplicativo não fosse a principal (#2499).
    • Correção do bug em que COMMAND_SEEK_TO_MEDIA_ITEM não está disponível em um MediaController ao se conectar a uma sessão somente de plataforma que permite buscar outros itens, mas não modificar playlists.
    • Correção do problema em que o MediaController não pode definir itens de mídia em sessões de mídia da plataforma que não permitem ações de PREPARE_FROM.
    • Correção de um bug em que o próprio processo não era marcado com Controller.isTrusted() na API 27 ou anterior ao se conectar por controladores de plataforma.
  • Extensão HLS:
    • Correção de um bug em que uma ArrayIndexOutOfBoundsException era gerada durante o fallback de stream se a seleção de faixa fosse um subconjunto das faixas disponíveis (#3161).
    • Correção de um problema em que o segmento de inicialização não era transferido entre as atualizações da playlist de mídia se a tag #EXT-X-MAP não fosse repetida nas atualizações seguintes (#3105).
  • Extensão DASH:
    • Correção de uma falha em SampleQueue ao buscar um bloco que está sendo cancelado.

1.10.0

26 de março de 2026

  • Biblioteca comum:
    • O Player.mute() e o Player.unmute() foram promovidos de UnstableApi para estável.
    • O Format.pcmEncoding e o C.PcmEncoding foram promovidos de UnstableApi para estável.
    • Adição de Format.primaryTrackGroupId para identificar o grupo principal de instâncias Format incorporadas (link em inglês).
  • ExoPlayer:
    • Adicionamos recursos de corte ao AdsMediaSource.
    • Adicionamos suporte à programação dinâmica em MediaCodecVideoRenderer para alinhar melhor o trabalho de programação e os ciclos de ativação da CPU com o momento em que os frames de vídeo podem ser processados. Para ativar esse recurso, use experimentalSetEnableMediaCodecVideoRendererDurationToProgressUs() no DefaultRenderersFactory.
    • Permitir a definição de um DataSource.Factory personalizado em DefaultPreloadManager.Builder.
    • Permitir que ExoPlayer seja simulado sem o Robolectric movendo algumas constantes padrão para ExoPlayer.Builder. A simulação dessa interface complexa geralmente não é recomendada, apenas quando o uso é mínimo/simples/incidental (#2985).
      • Isso exigiu a mudança de DEFAULT_STUCK_PLAYING_DETECTION_TIMEOUT_MS de ExoPlayer para ExoPlayer.Builder (sem descontinuação).
    • Correção de um bug em que o ProgressiveMediaSource propagava informações desatualizadas da linha do tempo para o player, e os períodos na fila eram removidos inesperadamente (#3016).
    • Correção de um problema em que o ExoPlayer não solicitava o foco de áudio atrasado quando a reprodução era solicitada durante ligações.
    • Correção de um bug em que as transições de conteúdo on demand para conteúdo ao vivo podiam causar novos armazenamentos em buffer no final do conteúdo on demand (#3052).
    • Adição de suporte ao Dolby Vision Profile 10 (#2830).
    • Correção de um bug em que um anúncio precedente não inicializado produzia um ArrayIndexOutOfBoundsException (#3125).
  • CompositionPlayer:
    • Adição de suporte para EditedMediaItem.removeVideo.
  • Transformador:
    • O EditedMediaItem.Builder.setFrameRate() agora pode definir uma taxa de frames de saída máxima para vídeo, o que é particularmente útil ao aumentar a velocidade de mídia com setSpeed().
  • Seleção de faixas:
    • Mude a assinatura de DefaultTrackSelector.selectAllTracks para incluir a matriz de saída como um parâmetro, pré-preenchida com substituições de faixa.
    • Correção de um problema em que as faixas de metadados incorporadas eram selecionadas, independentemente de a faixa principal correspondente estar selecionada (#294).
    • Estabilização das opções de TrackSelectionParameters para preferredVideoLanguages, preferredVideoLabels, preferredAudioLabels, preferredTextLabels e selectTextByDefault.
  • Extratores:
    • MP4: suporte a arquivos com caixas uuid grandes antes de outras caixas, como moov (#3046).
    • MP4: adicionamos suporte a faixas de codificação de vídeo versátil (VVC, na sigla em inglês) em contêineres MP4.
  • Inspetor:
    • Alteração interruptiva: remoção de FrameExtractor. Os usuários agora precisam depender do novo módulo :media3-inspector-frame e atualizar as importações para androidx.media3.inspector.frame.FrameExtractor.
    • Introduzir um novo módulo para extrair e processar frames de vídeo decodificados.
  • Áudio:
    • Mudança da biblioteca de decodificação subjacente para a extensão do decodificador IAMF de libiamf para iamf_tools.
    • A decodificação IAMF oferece suporte à saída binaural pelo decodificador (ao usar a extensão do decodificador IAMF) ou pelo Spatializer do Android.
    • Remoção correta do suporte a AC4Profile22 e outros perfis legados ao avaliar o suporte ao decodificador AC-4 em cenários automotivos (#2609).
    • Melhoria na lógica de repetição da inicialização de AudioOutput em DefaultAudioSink (#2905).
    • Tentar corresponder ao layout de saída dos alto-falantes (ou do espacializador, se aplicável) ao decodificar o IAMF, tanto com a extensão IAMF quanto com os decodificadores de codec de mídia, com suporte de novos campos e lógica em AudioCapabilities e AudioCapabilitiesReceiver.
    • Correção de um bug em que a reprodução travava ao tocar uma playlist de áudio sem interrupções no modo de descarregamento compactado.
  • Texto:
    • VobSub: use os comandos de controle SPU START e STOP para derivar a duração da sugestão, em vez de usar sempre o padrão de 5 segundos (#2935).
  • Metadados:
    • Aumentamos a contagem padrão de renderizadores de metadados para quatro para cobrir todas as possíveis faixas de metadados publicadas por variantes e representações de HLS (#3043).
  • Efeito:
    • Mover LottieOverlay para um novo módulo :media3-effect-lottie, o que também envolveu renomeá-lo de androidx.media3.effect.LottieOverlay para androidx.media3.effect.lottie.LottieOverlay.
  • Efeito Lottie:
    • Introdução de um novo módulo :media3-effect-lottie que oferece funcionalidades para aplicar efeitos do Lottie a frames de vídeo.
  • Extensão de IMA:
    • Atualize o SDK do IMA para a versão 3.39.0 para ter acesso à API de informações de mídia de anúncio mais recente.
    • Correção de um bug em que o tipo MIME do anúncio não correspondia ao tipo MIME fornecido no evento IMA LOADED. A correção agora mapeia o tipo MIME do anúncio usando as informações de mídia do anúncio fornecidas pelo IMA.
    • Adição de setEnableCustomTabs a ImaAdsLoader e ImaServerSideAdInsertionMediaSource, permitindo que os usuários controlem se os URLs de clique no anúncio são iniciados usando guias personalizadas.
    • Adicione a ImaAdTagUriBuilder, uma classe que oferece uma maneira alternativa de construir um adTagUri. Ele contém a API setPreferredLinearOrientation. Essa é uma API em teste Alfa que permite definir a orientação preferencial para anúncios lineares. Se quiser participar do grupo de testes Alfa, entre em contato com o parceiro da sua conta.
  • Sessão:
    • Correção de um bug em que matrizes grandes em MediaMetadata.artworkData podiam causar falhas no app.
    • Use o tipo int para o argumento @Player.Command na interface ActionFactory (#2933).
    • Transforme MediaSessionService e MediaLibraryService em um LifecycleService, permitindo anexar operações com reconhecimento de ciclo de vida ao ciclo de vida do serviço (#187).
    • Parar de oferecer suporte a comandos de mudança de volume do dispositivo de MediaController e MediaBrowser para reproduções locais. Os apps não podem mudar o volume do dispositivo local e, se necessário, podem usar as APIs AudioManager para essa finalidade.
    • Detectar instâncias Intent desatualizadas que iniciaram o serviço em primeiro plano. Isso evita que uma ForegroundServiceDidNotStartInTimeException seja gerada pelo sistema. Essa é uma alteração interruptiva em uma API instável para apps que implementam um MediaNotification.Provider personalizado, já que há um novo método obrigatório.
    • Adição de builders para instâncias PendingIntent a serem usadas com widgets da tela inicial (#2933).
    • Adição de métodos estáticos para criar instâncias de Intent para widgets da tela inicial baseados no Compose (#2933).
    • Correção de um bug em que a transição do item de mídia não era informada aos controladores quando a reprodução passava de um determinado índice de item de mídia para outro com o mesmo item de mídia por motivo de descontinuidade "AUTO" e "SEEK" (#2997).
    • Correção de um problema em que a solução alternativa de posicionamento do botão da interface do sistema afeta negativamente outras superfícies de interface, como o Android Auto ou fabricantes que não precisam da solução alternativa (#3041).
    • Correção do problema em que o acesso às assinaturas não era sincronizado (#3056).
    • Solução alternativa para o bug da SysUI na API 29, em que a arte da sessão de mídia em um tamanho específico pode causar falhas na SysUI e forçar a reinicialização do dispositivo (#3118).
    • Foi corrigido o dimensionamento do ícone de arte da notificação no Android Q (#3084).
  • Interface:
    • Adicione o elemento combinável PlaybackSpeedControl a media3-ui-compose para mostrar e modificar a velocidade do vídeo.
    • Adicione o elemento combinável PlaybackSpeedToggleButton a media3-ui-compose-material3 para controlar a velocidade do vídeo.
    • Adição do elemento combinável ProgressSlider a media3-ui-compose-material3 para mostrar o progresso do player e realizar buscas usando ações de arrastar e tocar (#2288).
    • Evite um buffer grande fora da tela ao animar PlayerControlView.
    • Adicione o elemento combinável Player a media3-ui-compose-material3, que combina um ContentFrame com controles personalizáveis alinhados à parte de cima, ao centro e à parte de baixo.
    • Oculta a posição de reprodução do serviço de acessibilidade para evitar a atualização contínua do anúncio quando PlayerControlView estiver visível.
  • Extensão HLS:
    • Adição de suporte a X-PLAYOUT-LIMIT com intersticiais HLS (#2484).
    • Suporte ao atributo QUERYPARAM com #EXT-X-DEFINE (#1854).
    • Otimização da análise de playlists HLS com o armazenamento em cache de correspondências de expressões regulares (#3008).
    • Exposição da faixa de metadados ID3 (EMSG) em renderizações de áudio (#3043).
    • Permitir o fallback de local ao encontrar erros de carregamento, se streams redundantes de locais diferentes estiverem disponíveis (#1988).
    • Correção do comportamento de X-SNAP para anúncios intersticiais HLS para calcular corretamente as posições de início e retomada (#3013).
  • Extensão DASH:
    • Foi corrigido o problema em que faixas com horários de início de segmento desalinhados causavam atrasos ou amostras ausentes no início da reprodução (#3057).
    • Correção de um bug em que os carimbos de data/hora dos metadados EMSG v0 em banda não são definidos corretamente (#3024).
  • Extensão RTSP:
    • Correção de regressão no streaming H.264 e H.265 que analisava incorretamente amostras da mesma unidade de acesso que abrangia vários pacotes RTP. Isso resultava em artefatos visuais e corrupção no vídeo (#3121).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Adição de suporte ao gerenciador de interface MPEG-H à extensão do decodificador MPEG-H (#3066).
  • Extensão do Google Cast:
    • Adição do método RemoteCastPlayer.Builder#setTrackSelector, que permite a implementação da seleção de faixas para reproduções do Cast.
  • Símbolos descontinuados foram removidos:
    • ExperimentalFrameExtractor foi removido. Use androidx.media3.inspector.frame.FrameExtractor
    • O ChannelMixingMatrix.create() foi removido. Use ChannelMixingMatrix.createForConstantGain()
    • O androidx.media3.extractor.metadata.flac.VorbisComment foi removido. Use androidx.media3.extractor.metadata.vorbis.VorbisComment
    • O MediaSource.prepareSource(MediaSourceCaller, TransferListener) foi removido. Use MediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId).

1.10.0-rc03

25 de março de 2026

Use a versão estável 1.10.0.

1.10.0-rc02

16 de março de 2026

Use a versão estável 1.10.0.

1.10.0-rc01

10 de março de 2026

Use a versão estável 1.10.0.

1.10.0-beta01

25 de fevereiro de 2026

Use a versão estável 1.10.0.

1.10.0-alpha01

6 de fevereiro de 2026

Use a versão estável 1.10.0.

Versão 1.9.0

1.9.4

16 de maio de 2026

A versão 1.9.4 contém os seguintes commits.

  • Efeito:
    • Defina explicitamente GL_DRAW_BUFFER e GL_READ_BUFFER ao fazer a transição do contexto sem superfície.

1.9.3

16 de março de 2026

A versão 1.9.3 contém os seguintes commits.

  • Áudio:
    • Correção de um bug em que a reprodução travava ao tocar uma playlist de áudio sem interrupções no modo de descarregamento compactado.

1.9.2

6 de fevereiro de 2026

A versão 1.9.2 contém os seguintes commits.

  • ExoPlayer:
    • Correção do bug em que o ProgressiveMediaSource propagava informações desatualizadas da linha do tempo para o player e os períodos na fila eram removidos inesperadamente (#3016).
  • Sessão:
    • Correção de um problema em que a solução alternativa de posicionamento do botão da interface do sistema afeta negativamente outras superfícies de interface, como o Android Auto ou fabricantes que não precisam da solução alternativa (#3041).
  • Extensão do Google Cast:
    • Correção de um bug em que a transferência do Cast para a reprodução local não funcionava.

1.9.1

26 de janeiro de 2026

A versão 1.9.1 contém estes commits.

  • Biblioteca comum:
    • Suporte a strings de data e hora com apenas horas no deslocamento de fuso horário (#2929).
  • ExoPlayer:
    • Permitir que a programação dinâmica desacelere o intervalo de doSomeWork somente depois que o áudio começar a oferecer suporte a uma sincronização de áudio e vídeo mais suave no início da reprodução.
    • Correção de um bug em DefaultLoadErrorHandlingPolicy em que FileNotFoundException e tipos de exceção semelhantes eram repetidos várias vezes.
    • Correção de um bug com programação dinâmica em que o tempo calculado para o próximo doSomeWork era reduzido por engano pelo tempo decorrido da iteração atual de doSomeWork. Isso aumenta o tempo de inatividade da CPU e economiza energia.
    • Correção de um problema em que algumas reproduções de arquivos Dolby Vision falhavam ao tentar usar um codec AVC ou HEVC de substituição.
    • Correção do bug em que o carregamento continuava após o fim da reprodução ao remover o item em reprodução de uma playlist (#2873).
    • Evitamos o vazamento de instâncias de MediaItem ao usar repetidamente ExoPlayer.replaceMediaItem no mesmo item (#2993).
    • Evitamos possíveis ANRs causados por liberações de wake lock de emergência (#2979).
  • Extratores:
    • MP3: análise de dados do ReplayGain do LAME (#2840).
  • Áudio:
    • Remoção correta do suporte para AC4Profile22 e outros perfis legados ao avaliar o suporte ao decodificador AC-4 em cenários automotivos (#2609).
  • Vídeo:
    • Descarte codecs de vídeo em dispositivos abaixo da API 30 quando a taxa de frames do conteúdo mudar para evitar travamentos na reprodução (#2941).
  • Texto:
    • VobSub: correção de algumas legendas ausentes ao processar corretamente SPUs que contêm apenas uma única sequência de controle ou têm informações críticas divididas em várias sequências de controle (#2935).
  • Extensão de IMA:
    • Correção de bug: corrigimos um problema em que o tipo MIME do anúncio não correspondia ao tipo MIME fornecido no evento IMA LOADED. A correção agora mapeia o tipo MIME do anúncio usando o índice do pod de anúncios e a posição do anúncio.
    • Adicione uma verificação de nulo antes de acessar o resultado de getAdsManager() e AdEvent.getAd().
  • Sessão:
    • Correção de um bug em que a interrupção de um MediaController conectado a uma sessão de plataforma causava uma falha no app se a interrupção ocorresse durante a reprodução do anúncio (#2948).
    • Adicionamos outras verificações em instâncias extras Bundle em várias classes para proteção contra instâncias Bundle malformadas enviadas de outros processos.
    • Correção de um problema em que comandos ausentes para COMMAND_SEEK_NEXT ou COMMAND_SEEK_BACK podiam causar lacunas na notificação de mídia do sistema (#2976).
    • O escalonamento de bitmap para o ícone de notificação foi removido da linha de execução principal (#2829).
    • Correção do bug em que o autor, o escritor e o compositor não eram usados como substitutos ao converter de MediaMetadataCompat e MediaDescriptionCompat legados (#3018).
  • Downloads:
    • Correção de possíveis loops infinitos quando um PriorityTooLowException é processado por SegmentDownloader (para DASH, HLS e SmoothStreaming). As substituições personalizadas de SegmentDownloader que usam o método protegido execute precisam fornecer a tarefa encapsulada em um Supplier para que ela possa ser recriada (#2931).
  • Extensão HLS:
    • Transmita o documento JSON da lista de recursos brutos para o callback Listener.onAssetListLoadCompleted. Essa é uma alteração interruptiva em uma API instável que exige que os apps que implementam esse callback adicionem um argumento extra do tipo JSONObject (#2950).
  • Extensão RTSP:
    • Os pacotes RTP com carimbos de data/hora que se repetem agora são processados corretamente (#2930).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Correção de um possível NullPointerException que pode ocorrer ao buscar antes de processar o primeiro frame de vídeo (#2965).
  • Extensão do Google Cast:
    • Correção de um bug que impedia a atualização correta da linha do tempo do RemoteCastPlayer ao substituir a playlist.

1.9.0

17 de dezembro de 2025

  • Biblioteca comum:
    • Atualização de minSdk para 23 de acordo com outras bibliotecas do AndroidX.
    • Adição de PlayerTransferState, que facilita a transferência do estado de reprodução entre instâncias de Player.
    • Adicione os métodos void mute() e void unmute() ao Player que preservam e, consequentemente, restauram o volume do Player antes e depois de defini-lo como zero.
    • Publicação das classes de utilitário WakeLockManager, WifiLockManager, AudioFocusManager, AudioBecomingNoisyManager e StuckPlayerDetector, usadas anteriormente pelo ExoPlayer internamente para permitir a reutilização em outros players (#1893).
    • Correção do processamento do listener ForwardingPlayer quando o player delegado subjacente usa a igualdade de referência para comparar instâncias de listener (#2675).
    • Adicione uma função de extensão de suspensão Player.listenTo na biblioteca media3-common-ktx que especifica o Player.Events em que a ação será realizada.
    • Correção de uma falha em BasePlayer.getBufferedPercentage resultante de um estouro de números inteiros quando a posição em buffer informada é muito maior do que a duração informada (#2750).
    • Correção da detecção automática do tipo de faixa TrackGroup ao não ignorar o tipo MIME de amostra personalizado e voltar a usar o tipo de faixa potencialmente errado do tipo MIME do contêiner (#2860).
  • ExoPlayer:
    • Adicionamos uma detecção de player travado que aciona um erro de player StuckPlayerException se o player parecer travado. Isso acontece nos seguintes casos, em que cada tempo limite padrão pode ser configurado em ExoPlayer.Builder, se necessário:
      • Após 10 minutos de STATE_BUFFERING ao tentar reproduzir e sem progresso de armazenamento em buffer.
      • Após 10 segundos de STATE_READY ao tentar reproduzir e nenhum progresso de reprodução.
      • Após 1 minuto de STATE_READY além da duração declarada sem chegar ao fim do item.
      • Após 10 minutos com um motivo de supressão de reprodução ao tentar reproduzir.
    • Ativação do processamento de wake lock por padrão para corrigir problemas de armazenamento em buffer durante a reprodução em segundo plano. Isso equivale a definir ExoPlayer.Builder.setWakeMode como C.WAKE_MODE_LOCAL.
    • Adicione uma lógica de detecção para atualizar automaticamente o ID do dispositivo virtual quando uma mudança for informada ao Context originalmente transmitido para ExoPlayer.Builder.
    • Adicione ExoPlayer.setVirtualDeviceId para atualizar manualmente o ID do dispositivo virtual recebido do Context transmitido para ExoPlayer.Builder.
    • Garantir que os renderizadores não consumam dados do próximo item da playlist mais de 10 segundos antes do fim do item atual.
    • Adição de setSeekBackIncrementMs, setSeekForwardIncrementMs e setMaxSeekToPreviousPositionMs a ExoPlayer para atualizar essas configurações após a construção (#2736).
    • Adicione a funcionalidade de pré-armazenamento em cache em DefaultPreloadManager. Agora os apps podem retornar DefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs) ou DefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs) via TargetPreloadStatusControl.getTargetPreloadStatus(T rankingData) para indicar que um item de mídia precisa ser pré-armazenado em cache.
    • Use a funcionalidade de pré-armazenamento em cache de DefaultPreloadManager no app de demonstração de formato curto.
    • Adição de setters de DefaultLoadControl.Builder para reprodução local e ajuste dos valores padrão de DefaultLoadControl para funcionar bem com uma ampla variedade de arquivos locais.
    • Correção de um bug em que a definição de uma playlist vazia pode deixar o player em STATE_READY ou STATE_BUFFERING.
    • Melhoria das APIs do gerenciador de pré-carregamento:
      • Adicione addMediaItems(List<MediaItem>, List<T>) e addMediaSources(List<MediaSource>, List<T>), que adicionam os itens ou as fontes de mídia em lote e chamam invalidate() automaticamente depois.
      • Adicione removeMediaItems((List<MediaItem>) e removeMediaSources(List<MediaSource>) que removem os itens ou as fontes de mídia em lote e verifique se o gerenciador de pré-carregamento não começa a pré-carregar ou continua pré-carregando nenhum deles após a remoção.
      • Permita que DefaultPreloadManager.setCurrentPlayingIndex(int) se invalide automaticamente. Os apps não precisam mais chamar invalidate() explicitamente depois de atualizar o índice de reprodução atual.
    • Adicionamos a capacidade de pular a redefinição de frame-chave para buscas para frente no mesmo grupo de imagens no modo de limpeza.
    • Adição de DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) para que os apps definam um valor de bytes de buffer de destino para um player com o playerName especificado. O DefaultLoadControl agora pode tomar decisões para cada player separadamente com base nos próprios bytes alocados e nos bytes de buffer de destino.
    • Adicione SkipInfo ao AdPlaybackState.AdGroup para transmitir informações de pulo de cada anúncio no grupo.
    • Correção do bug em que chamar removeMediaItems(List) durante a reprodução de um anúncio final causava uma falha (#2746).
    • Correção de algumas interrupções na reprodução de playlists em que os frames eram sempre definidos como a última amostra e renderizados por engano.
    • Ative o caminho de nova tentativa se o player não conseguir gerar o ID da sessão de áudio (#2382, #2678).
    • Adição de suporte para controlar o total de bytes de buffer para as origens em DefaultPreloadManager para evitar que o total de bytes de buffer para pré-carregamento cresça arbitrariamente. Para usar a lógica de controle padrão, os apps podem definir os bytes de buffer de destino para pré-carregamento usando DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int) para um playerName de PlayerId.Preload.name ("preload") e injetar o DefaultLoadControl criado usando DefaultPreloadManager.Builder.setLoadControl(LoadControl).
    • Adição de cloneAndSet(int, int) a ShuffleOrder com uma implementação padrão (#2834).
    • Adição do deslocamento de retomada de conteúdo ao pular a reprodução de anúncios após o ajuste de busca ou a transição automática (#2484).
    • Adição de uma API para definir e observar parâmetros de codec para faixas de áudio e vídeo. Esse recurso é implementado para renderizadores baseados em MediaCodec e requer a API 29 ou mais recente.
      • Use ExoPlayer.setAudioCodecParameters() e ExoPlayer.setVideoCodecParameters() para aplicar parâmetros.
      • Use ExoPlayer.addAudioCodecParametersChangeListener() e ExoPlayer.addVideoCodecParametersChangeListener() para detectar mudanças. A observação de chaves específicas do fornecedor requer a API 31 ou mais recente.
    • Correção de IllegalStateException causado pela definição de uma fonte de mídia vazia depois de buscar uma posição diferente de zero e preparar o player com uma fonte de mídia não vazia.
    • Correção do bug em que a busca em outros itens de mídia no modo de limpeza podia causar IllegalStateException.
    • Correção de um possível NullPointerException em DefaultPlaybackSessionManager (#2885).
    • Ative as melhorias no desempenho de busca para vídeos qualificados.
    • Reativamos o uso da descriptografia assíncrona no MediaCodec na API 36+, em que os problemas de tempo limite com essa API de plataforma foram corrigidos (#1641).
    • Mude o valor padrão de MediaCodecVideoRenderer.experimentalSetLateThresholdToDropDecoderInputUs para 15 ms e ative a remoção mais eficiente de frames de vídeo antes da decodificação para vídeos qualificados.
    • Adicione o limite máximo de memória ao cálculo automático de memória em DefaultLoadControl. Isso só vai acontecer se um número excessivo de faixas for selecionado (#2860).
    • Correção de um bug em que, ao reproduzir em uma playlist ou no modo de repetição, a busca no modo de arraste perto do final podia causar uma busca pelo próximo item de mídia.
  • CompositionPlayer:
    • Publique CompositionPlayer em uma nova anotação @ExperimentalApi para indicar que ele está disponível para testes, mas ainda está em desenvolvimento. É provável que algumas APIs mudem significativamente em versões futuras, e há problemas e limitações conhecidos em alguns casos de uso (alguns não documentados).
    • Adição de suporte para COMMAND_SET_AUDIO_ATTRIBUTES e processamento de foco de áudio em CompositionPlayer.
    • Adição de suporte para mudança de velocidade em sequências secundárias em CompositionPlayer.
    • Adição de suporte para EditedMediaItem.removeVideo.
  • Transformador:
    • Use InAppMp4Muxer como o muxer padrão.
    • Adição de EditedMediaItem.Builder#setSpeed() e descontinuação de Effects#createExperimentalSpeedChangingEffects().
    • Substitua forceAudioTrack e forceVideoTrack por trackTypes em EditedMediaItemSequence.
  • Seleção de faixas:
    • Adicione TrackSelectionParameters.selectTextByDefault para priorizar a seleção de qualquer faixa de texto sem especificar outras preferências mais específicas.
    • Adição de preferredVideoLabels, preferredAudioLabels e preferredTextLabels em TrackSelectionParameters para especificar uma preferência por faixas com um rótulo específico, por exemplo, aquelas lidas de tags de nome HLS (#1666).
  • Extratores:
    • FLAC: a detecção de cabeçalho foi reforçada para reduzir a chance de encontrar cabeçalhos falsos nos dados FLAC codificados, o que resulta em erros de decodificação (link em inglês#558).
    • MP3: permite lacunas entre (e antes de) tags ID3 no início de arquivos MP3 (#811, #5718).
    • MP3: aumento do limite de detecção para 128 kB para corresponder ao limite de pesquisa atual de um byte de sincronização (link em inglês).
    • MP3: mudamos FLAG_ENABLE_INDEX_SEEKING para priorizar a busca de informações em cabeçalhos de metadados (como Xing e VBRI), quando disponíveis, voltando para a busca baseada em índice se não houver outras informações de busca. Isso melhora o desempenho de arquivos com metadados de busca (#2839).
    • MP3: mudamos Mp3Extractor para usar como padrão uma suposição de taxa de bits constante (CBR, na sigla em inglês) quando nenhum metadado de busca (por exemplo, Xing, VBRI) é encontrado, mesmo quando FLAG_ENABLE_INDEX_SEEKING está definido. Isso se baseia no histórico de especificações do MP3, em que a CBR era padrão e a VBR exige cabeçalhos explícitos. Isso melhora a capacidade de busca imediata de arquivos sem metadados, mas pode afetar a precisão de arquivos VBR sem cabeçalhos. A busca de índice agora é usada como substituto se a suposição de CBR não for pesquisável (por exemplo, para streams de tamanho desconhecido) (#2848).
    • MP4: elimine a ambiguidade entre os tipos MIME audio/mpeg (MP3), audio/mpeg-L1 e audio/mpeg-L2 ao analisar o valor da camada da primeira amostra antes de emitir um formato de faixa do extrator (#2683).
    • MP4: melhoria na eficiência de detecção de arquivos muito grandes, presumindo que uma caixa stbl maior que 1 MB implica que o arquivo não pode ser fragmentado (#2650).
    • MP4: adicionamos suporte aos metadados ©mvn (nome do movimento) e ©mvi (índice do movimento), que agora são emitidos como objetos TextInformationFrame em Format.metadata com IDs de MVNM e MVIN, respectivamente (#2754).
    • MP4: ignora faixas com caixa stsd ausente (em vez de falhar ao analisar o arquivo inteiro).
    • Matroska: adição de suporte à detecção de DTS-HD (#6225).
    • Correção de um problema no MatroskaExtractor em que a busca podia ser imprecisa para arquivos com várias faixas. Os pontos de inserção agora estão associados corretamente às respectivas faixas, o que resulta em uma busca mais precisa.
    • MPEG-TS: correção de IllegalArgumentException de ReorderingBufferQueue causado por pacotes PES sem carimbo de data/hora (#2764).
    • Adição de suporte para extrair fotos com movimento HEIC. O HeifExtractor agora pode analisar arquivos HEIC que contêm faixas de vídeo e áudio incorporadas.
  • Inspetor:
    • Introduzimos um novo módulo :media3-inspector para servir como o local dedicado para utilitários de inspeção de mídia. Esse módulo agora abriga um novo androidx.media3.inspector.MetadataRetriever, que vai fornecer uma API unificada para extração de metadados e frames. O androidx.media3.exoplayer.MetadataRetriever atual foi descontinuado em favor da nova versão.
    • Introdução da androidx.media3.inspector.FrameExtractor, uma nova API pública para extração de frames. Essa classe AutoCloseable oferece uma maneira de extrair frames com suporte a vídeo HDR, efeitos de vídeo e seleção de decodificador personalizado. Ele precisa ser criado usando o Builder para um MediaItem específico.
    • FrameExtractor: adicionamos getThumbnail() para extrair um frame de miniatura representativo de um arquivo de mídia sem exigir um carimbo de data/hora específico.
    • Adição de androidx.media3.inspector.MediaExtractorCompat, um substituto para o android.media.MediaExtractor da plataforma que oferece uma maneira de extrair amostras de mídia codificadas e brutas de um arquivo de mídia. A androidx.media3.exoplayer.MediaExtractorCompat atual foi descontinuada em favor dessa nova classe.
  • Áudio:
    • Faça com que as instâncias de AudioProcessor fiquem cientes da busca.
    • Permitir a injeção da nova interface AudioOutputProvider em DefaultAudioSink.Builder para oferecer suporte a caminhos de saída de áudio personalizados. O padrão é AudioTrackAudioOutputProvider.
    • Processar buscas em GainProcessor.
    • Utilização dos recursos de perfil e nível do decodificador AC-4 na avaliação de suporte ao formato de faixa (#2580).
    • Evitamos possíveis atrasos causados pelo processamento de callbacks de mudança de roteamento no início da reprodução (#2646).
    • Permitir a reutilização de codec para os formatos EAC3, EAC3-JOC e AC-4 (#1346).
    • Adição de suporte para amostras de PCM flutuantes em Sonic.
    • Adição de suporte a amostras de PCM de 16 bits em ToFloatPcmAudioProcessor.
  • Vídeo:
    • Desativar a reutilização de codec para conteúdo Dolby-Vision com perfis diferentes.
    • Reativamos a solução alternativa para pontos de desempenho informados incorretamente para codecs seguros (#2856).
  • Texto:
    • Correção da análise de legendas CEA-6/708 em conteúdo Dolby Vision (#2775).
  • Imagem:
    • Correção do problema do ScrubbingMode em que o player fica travado ao arrastar uma faixa de miniatura DASH (#2815).
  • DRM:
    • Mude o tipo de retorno dos métodos MediaDrmCallback de byte[] para um novo tipo MediaDrmCallback.Response, para permitir o retorno de outras informações opcionais. Essa é uma alteração interruptiva de origem, mas as falhas podem ser facilmente resolvidas ao unir o valor de retorno byte[] anterior com new Response antes de retornar.
    • Adição de informações importantes sobre solicitações, como URL e latência, a AnalyticsListener.onDrmKeysLoaded (#1001).
    • Mova os dados da solicitação de provisionamento de um parâmetro de URL para o corpo do POST.
  • Efeito:
    • Adição de Presentation.copyWithUnsetSideRoundedTo para arredondar o lado de saída não definido quando Presentation é criado com um único comprimento lateral.
  • Muxers:
    • Adição de MediaMuxerCompat, uma substituição direta para o framework MediaMuxer.
    • MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo() foi adicionado para permitir a criação de fotos com movimento.
    • Adição de WebmMuxer para permitir a multiplexação de streams de mídia OPUS, VORBIS, VP8 e VP9 em um formato de arquivo webm.
  • Extensão de IMA:
    • Remoção de regras personalizadas do ProGuard para que os apps possam usar as regras lançadas no arquivo do IMA para Android.
    • Adicionamos ImaServerSideAdInsertionUriBuilder.setNetworkCode, uma nova API para definir o código de rede do Google Ad Manager para que o SDK do IMA processe identificadores de anúncios conforme especificado nas configurações do Google Ad Manager. Os códigos de rede são opcionais, mas recomendados para solicitações de stream de serviço completo. Para encontrar o código de rede, consulte este artigo.
    • A dependência do IMA foi atualizada para a versão 3.37.0, que exige a ativação da simplificação da biblioteca principal. Isso também precisa ser ativado pelos apps dependentes. Consulte as observações de configuração do IMA. * Suporte a opções de interface personalizada de DAI do IMA no criador de URI de SSAI. As opções de interface personalizada para inserção de anúncios do lado do servidor incluem suporte à renderização de "Pulável" e "Sobre este anúncio". No momento, o recurso está disponível para editores selecionados em uma lista de permissões. Essa mudança também atualiza a versão do SDK do IMA para 3.38.0 (notas da versão) para acessar a API de opções de interface personalizada.
    • Correção de um problema em que o erro de preparação de conteúdo após um anúncio era informado incorretamente como um erro de reprodução de anúncio (#2656).
  • Sessão:
    • Adição de um novo parâmetro a MediaSession.Callback.onPlaybackResumption para indicar se a chamada acontece apenas para coletar informações ou para iniciar a reprodução (#1764).
    • Atualização de MediaSession.ControllerInfo.isTrusted para também declarar os controladores do próprio app como confiáveis (#2542).
    • Adição de MediaSessionService.triggerNotificationUpdate para acionar manualmente uma atualização de notificação (#1833).
    • Adicione ProgressListener aos métodos de comando personalizados.
    • Mude o valor padrão de MediaLibrarySession.Builder.setLibraryErrorReplicationMode para não fatal.
    • Adição de um parâmetro Context a MediaButtonReceiver.onForegroundServiceStartNotAllowedException (#2625).
    • Ler o ID de controle de volume da plataforma PlaybackInfo em vez de buscá-lo pelo binder. Isso garante que o tipo de reprodução e o ID de controle de volume sejam lidos de forma atômica e correspondam um ao outro.
    • Correção de um bug em que os eventos de tecla ACTION_UP eram filtrados antes de serem transmitidos ao callback para processamento personalizado. Isso traz paridade com o que o media1 e a plataforma fazem (#2637).
    • Correção de um bug em que getCurrentTimeline() era chamado por PlayerWrapper mesmo quando o comando não estava disponível (#2665).
    • Correção de um bug em que uma mensagem era deixada na fila de mensagens do looper principal, o que causava um vazamento de memória após o encerramento do serviço (#2692).
    • Quando conectado a um app de sessão legado com um MediaBrowser, os comandos personalizados são enviados para a sessão apenas se a ação personalizada for anunciada como uma ação personalizada em PlaybackStateCompat da sessão legada. Todas as outras ações personalizadas são enviadas ao serviço.
    • Implementação de onAudioSessionIdChanged para notificar os controladores de mídia quando um ID de sessão de áudio é definido pela sessão (#244).
    • Correção de um bug em que o KEYCODE_HEADSETHOOK não iniciava o player e o evento de tecla de mídia Intent chegava em onStartCommand(). Isso foi corrigido processando "KEYCODE_HEADSETHOOK" como KEYCODE_MEDIA_PLAY_PAUSE (#2816).
    • Correção de um bug em que o tamanho da superfície não era comunicado entre a sessão e o controlador, resultando na falha ao aplicar efeitos de vídeo na sessão de demonstração. Se você estiver usando um controlador, isso pode ser uma alteração interruptiva se o player não puder processar uma chamada setVideoSurfaceHolder.
    • Correção da propagação de valores de metadados CharSequence que não são String, como strings com estilo de span (#2853).
    • Adição de CommandButton.executeAction para que os controles possam acionar a ação pretendida com mais facilidade. Também permitem especificar parâmetros para alguns comandos de player e sessão para definir qual ação acionar.
    • Adicione compatibilidade com versões anteriores para instâncias de CommandButton usando Player.Command ou SessionCommand não personalizado para definir a ação. Agora, eles são representados corretamente nas sessões de mídia da plataforma, por exemplo, para a interface do sistema ou o Android Auto.
    • Correção de um problema em que o mesmo Bitmap é compactado várias vezes ao conectar um MediaController a uma sessão de mídia da plataforma.
  • Interface:
    • Adicione a classe ProgressStateWithTickInterval e o elemento combinável rememberProgressStateWithTickInterval correspondente ao módulo media3-ui-compose. Esse detentor de estado é usado em demo-compose para mostrar a posição e a duração atuais em formato de texto.
    • Adicione MuteButtonState a ui-compose, que processa o silenciamento do volume de Player. Esse detentor de estado é usado em demo-compose para mostrar o botão ativar/desativar som.
    • Adicione classes ProgressStateWithTickCount e o elemento que pode ser composto rememberProgressStateWithTickCount correspondente ao módulo media3-ui-compose. Esse detentor de estado é usado em demo-compose para mostrar o progresso como uma barra de progresso horizontal somente leitura.
    • Adicione o elemento combinável ContentFrame a media3-ui-compose, que combina o gerenciamento de PlayerSurface com o redimensionamento da proporção e a cobertura com um obturador.
    • Contornamos um bug conhecido da plataforma da API 34 que causava vídeos esticados/cortados ao usar SurfaceView dentro de um AndroidView do Compose e, portanto, afetava os elementos combináveis ContentFrame e PlayerSurface com SURFACE_TYPE_SURFACE_VIEW (#1237, #2811).
    • Crie um novo módulo media3-ui-compose-material3 e adicione elementos combináveis com o tema do Material 3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton).
    • Adicione o elemento combinável TimeText a media3-ui-compose-material3 para mostrar o progresso do jogador em formato de texto. Ele pode ser configurado para mostrar a posição atual, a duração ou o tempo restante.
    • Adição de suporte para colocar um botão de rota de mídia na PlayerView.
    • Uso de BidiFormatter para mostrar corretamente a pontuação em legendas de texto RTL (#11214).
  • Extensão HLS:
    • Analisar os atributos de pulo de intersticial do HLS.
    • Mapeie os atributos de controle de pulo da playlist HLS e do documento da lista de recursos no AdPlaybackState para acesso público.
    • Correção de bug em que o horário de início da playlist era descartado quando a tag EXT-X-PROGRAM-START-DATE que definia a data de início era removida de uma playlist (#2760).
    • Use a pesquisa binária para encontrar o índice de segmento de uma determinada posição na playlist (#2826).
    • Adição de HlsInterstitialsAdsLoader.skipCurrentAd() e skipCurrentAdGroup() e métodos correspondentes para pular anúncios e grupos de anúncios por índice.
    • Adição de HlsInterstitialsAdsLoader.Listener.onAdStarted para informar o início de um período de anúncio (#2859).
    • Aceitar espaço como separador de data/hora em strings de data/hora ISO 8601.
    • Processamento correto da busca do próximo bloco para um HlsMediaPlaylist sem segmentos (#2821).
    • Use a posição inicial padrão para anúncios precedentes em transmissões ao vivo.
  • Extensão DASH:
    • Correção de UnsupportedOperationException ao reproduzir streams DASH com um manifesto de URI data: não hierárquico (#2688).
    • Redefina LiveConfiguration para o valor fornecido pelo MediaItem do DashMediaSource quando liberado e quando o item de mídia for atualizado pelo usuário (#2606).
    • Evitamos falhas causadas por atualizações de manifesto inválidas que não foram informadas como erros do player (#2805).
  • Extensão RTSP:
    • Tratamento de erros de pacotes RTP ausentes ao processar unidades NAL fragmentadas para H264 e H265 (#2613).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Extensão AV1: o decodificador de software AV1 agora usa a biblioteca dav1d de alto desempenho, substituindo a implementação anterior de libgav1 para melhorar a velocidade de decodificação.
    • Extensão FFmpeg: correção de um problema que impedia a reprodução de alguns arquivos FLAC, garantindo que o bloco STREAMINFO seja analisado e transmitido corretamente para o decodificador (#2887).
  • Extensão do Google Cast:
    • Adicione CastPlayer.Builder, que permite que o CastPlayer faça a reprodução local e de transmissão. Para manter o comportamento antigo do CastPlayer de oferecer suporte apenas à reprodução do Cast, use RemoteCastPlayer. Os construtores CastPlayer preexistentes mantêm o comportamento antigo, mas foram descontinuados em favor do uso dos builders CastPlayer ou RemoteCastPlayer.
    • Parar de aplicar um tipo MIME não nulo em DefaultMediaItemConverter.
    • Use MediaItem.mediaMetadata.mediaType para inferir o MEDIA_TYPE do Cast a ser usado em DefaultCastOptionsProvider#toMediaQueueItem, quando disponível.
    • Ative as transferências remotas para locais em DefaultCastOptionsProvider.
    • Adicione suporte ao Cast na demonstração da sessão.
    • Adição de suporte para mostrar um botão de rota de mídia em uma interface combinável.
    • Adicione suporte para mostrar um botão de rota de mídia em um menu da barra de ações.
    • Adição de suporte para mostrar um botão de rota de mídia como uma interface de visualização.
  • Utilitários de teste:
    • Adicione a diferença de tempo máxima para o comportamento de avanço automático de FakeClock. O padrão é 1 segundo, mas é configurável por meio de FakeClock.Builder.
    • Adição da diferença máxima de tempo entre mensagens para RobolectricUtil.runMainLooperUntil (e runLooperUntil). O padrão é 1 segundo, mas é configurável usando novas sobrecargas desses métodos.
    • Mova CapturingRenderersFactory de test-utils para test-utils-robolectric.
  • Símbolos descontinuados foram removidos:
    • Remoção do construtor DefaultPreloadManager descontinuado. Use DefaultPreloadManager.Builder
    • Os construtores EditedMediaItemSequence descontinuados foram removidos. Use EditedMediaItemSequence.Builder
    • O BitmapFactoryImageDecoder.BitmapDecoder foi removido. Use ExternallyLoadedImageDecoder
    • Remoção do ShadowMediaCodecConfig.forAllSupportedMimeTypes() descontinuado. Use ShadowMediaCodecConfig.withAllDefaultSupportedCodecs().
    • Remoção de ShadowMediaCodecConfig.withNoDefaultSupportedMimeTypes(), que foi descontinuado. Use ShadowMediaCodecConfig.withNoDefaultSupportedCodecs()

1.9.0-rc01

1º de dezembro de 2025

Use a versão estável 1.9.0.

1.9.0-beta01

20 de novembro de 2025

Use a versão estável 1.9.0.

1.9.0-alpha01

22 de outubro de 2025

Use a versão estável 1.9.0.

Versão 1.8.0

1.8.1

21 de maio de 2026

A versão 1.8.1 contém os seguintes commits.

  • Efeito:
    • Defina explicitamente GL_DRAW_BUFFER e GL_READ_BUFFER ao fazer a transição do contexto sem superfície.

Versão 1.8.0

30 de julho de 2025

A versão 1.8.0 contém estes commits.

  • Biblioteca comum:
    • Adição de suporte para substituir o player em ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Adição de getter para o modo de ordem aleatória à interface ExoPlayer (#2522).
    • Gera uma exceção de forma mais clara se DefaultAudioSink for acessado de várias linhas de execução. Se isso acontecer devido a uma chamada para RendererCapabilities.getFormatSupport fora do player, chame esse método na mesma linha de execução de reprodução do ExoPlayer ou use uma instância diferente da usada para reprodução (#1191).
    • Correção de um bug em que formatos de áudio não estéreo em TVs podiam ser marcados como não compatíveis com DefaultTrackSelector.
    • Verifique se o último frame é renderizado corretamente ao usar a flag DECODE_ONLY do MediaCodec, que é ativada por padrão no modo de limpeza.
    • Adicionamos suporte ao uso do ID do dispositivo virtual do Context transmitido para ExoPlayer.Builder.
    • Ativar a programação dinâmica por padrão no modo de limpeza.
    • Evite o recarregamento desnecessário de uma fonte ao buscar o final de um item.
    • Use MediaCodec.BUFFER_FLAG_DECODE_ONLY por padrão no modo de limpeza.
    • Geração de IllegalStateException quando PreloadMediaSource é reproduzido por um ExoPlayer com uma linha de execução de reprodução diferente da linha de execução de pré-carregamento (#2495).
    • Adição de cloneAndMove a ShuffleMode com uma implementação padrão (#2226).
    • Mude o comportamento padrão de Renderer.getMinDurationToProgressUs para retornar um valor maior se nenhuma chamada para render for necessária.
    • Correção de um bug em que a programação interna atrasava o último frame ao buscar o fim durante uma pausa. Por enquanto, a correção de bug só entra em vigor se ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled estiver ativado.
    • Adicione o método ExoPlayer.setScrubbingModeEnabled(boolean). Isso otimiza o player para muitas buscas frequentes (por exemplo, de um usuário arrastando uma barra de rolagem). O comportamento do modo de limpeza pode ser personalizado com setScrubbingModeParameters(..) em ExoPlayer e ExoPlayer.Builder.
    • Permitir a personalização da tolerância de busca fracionária no modo de limpeza.
    • Aumente a taxa de operação do codec no modo de limpeza.
    • Correção de um bug em que os erros de preparação no conteúdo de AdsMediaSource podem nunca ser informados (#2337).
    • Correção do vazamento de memória em MergingMediaSource, por exemplo, usado ao carregar legendas (#2338).
    • Permitir que CmcdConfiguration.Factory retorne null para desativar a geração de registros de CMCD para itens de mídia específicos (#2386).
    • O tamanho padrão do buffer de imagem foi aumentado de 128 kB (erro de copiar e colar de faixas de texto) para 26 MB, o que é suficiente para imagens Ultra HDR de 50 MP (#2417).
    • Adicionamos PreCacheHelper, que permite que os apps pré-armazenem em cache uma única mídia com posição inicial e duração especificadas.
    • Adição de suporte ao pré-carregamento de uma posição especificada em DefaultPreloadManager.
  • Transformador:
    • Adição de CodecDbLite, que permite otimizações específicas do chipset para as configurações de codificação de vídeo.
    • Adicione a flag setEnableCodecDbLite ao DefaultEncoderFactory para ativar a otimização das configurações do CodecDB Lite. Por padrão, essa sinalização é definida como falsa.
    • O preenchimento de uma lacuna inicial (adicionada usando addGap()) com áudio silencioso agora requer a definição explícita de experimentalSetForceAudioTrack(true) em EditedMediaItemSequence.Builder. Se a lacuna estiver no meio da sequência, essa flag não será necessária.
    • Mover a interface Muxer de media3-transformer para media3-muxer.
    • Torne a configuração MediaItem.Builder().setImageDuration(long) obrigatória para importar um item de mídia como uma imagem.
    • Adicione Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean), que inclui uma lista de edição de MP4 ao cortar para instruir os players a ignorar amostras entre o frame-chave antes do ponto de início do corte e o ponto de início do corte.
    • Atualize o app de demonstração de composição para usar o Kotlin e o Jetpack Compose e adicione um VideoCompositorSettings personalizado para organizar sequências em um layout 2x2 ou PiP.
  • Extratores:
    • Análise de metadados de arquivos MP4 fragmentados (#2084).
    • JPEG: suporte a fotos com movimento que não têm um segmento Exif no início (link em inglês).
    • Adição de suporte para busca em MP4 fragmentado com vários átomos sidx. Esse comportamento pode ser ativado usando a flag FLAG_MERGE_FRAGMENTED_SIDX em FragmentedMp4Extractor (#9373).
    • Ignorar tabelas de busca vazias em arquivos FLAC (incluindo aquelas que contêm apenas pontos de busca de marcador de posição) e voltar para a busca binária se a duração do arquivo for conhecida (#2327).
    • Correção da análise de unidades SEI H.265 para pular totalmente os tipos de SEI não reconhecidos (#2456).
    • Atualização de WavExtractor para usar os dados de SubFormat da extensão de cabeçalho para o formato de áudio ao analisar um arquivo do tipo WAVE_FORMAT_EXTENSIBLE.
    • MP4: adicionamos suporte às caixas ipcm e fpcm que definem faixas de áudio PCM brutas (o PCM de ponto flutuante de 64 bits não é compatível).
    • MP4: processar a parte de rotação das matrizes de transformação tkhd que giram e refletem o vídeo. Isso garante que os vídeos refletidos feitos pela câmera frontal do iPhone sejam mostrados da maneira correta, mas refletidos incorretamente no eixo y (link em inglês).
    • MP3: use a duração e o tamanho dos dados de metadados de taxa de bits variável Xing, VBRI e similares não pesquisáveis ao voltar para a busca de taxa de bits constante devido a FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194).
  • Áudio:
    • Correção de um bug em que AnalyticsListener.onAudioPositionAdvancing não é chamado quando a reprodução de áudio é iniciada muito perto do fim da mídia.
    • Adição de suporte para todos os formatos de amostra de PCM linear em ChannelMappingAudioProcessor e TrimmingAudioProcessor.
    • Adição de suporte para lacunas de áudio em CompositionPlayer.
    • Remoção da chamada espúria para BaseAudioProcessor#flush() de BaseAudioProcessor#reset().
    • Permitir upmixing/downmixing de energia constante no DefaultAudioMixer.
    • Tornar ChannelMappingAudioProcessor, TrimmingAudioProcessor e ToFloatPcmAudioProcessor públicos (#2339).
    • Use AudioTrack#getUnderrunCount() em AudioTrackPositionTracker para detectar underruns em DefaultAudioSink em vez de estimativa de melhor esforço.
    • Melhoria na suavização do carimbo de data/hora de áudio para desvios de posição inesperados do dispositivo de saída de áudio.
    • Correção de um bug em que a sincronização de áudio/vídeo é interrompida nos primeiros 10 segundos após a retomada da pausa quando conectado a dispositivos Bluetooth.
    • Correção do bug em que AnalyticsListener.onAudioPositionAdvancing não informava o horário em que o áudio começou a avançar, mas o horário da primeira medição.
    • Correção da recuperação para áudio multicanal após o fallback para áudio estéreo em alguns dispositivos (#2258).
  • Vídeo:
    • Estendemos a solução alternativa de superfície separada para dispositivos "lenovo" e "motorola" (#2059).
    • Melhoria na liberação de frames de vídeo suaves na inicialização quando as amostras de áudio não começam exatamente na posição solicitada.
    • A solução alternativa de superfície separada foi estendida para dispositivos "realme" (#2059).
    • Adição da API experimental ExoPlayer para incluir a flag MediaCodec.BUFFER_FLAG_DECODE_ONLY ao colocar em fila buffers de entrada somente de decodificação. Essa flag sinaliza ao decodificador para pular os buffers somente de decodificação, resultando em uma busca mais rápida. Ative-o com DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. * Melhoria nas verificações de desempenho de codecs de vídeo de software. Isso pode fazer com que algumas faixas adicionais sejam marcadas como EXCEEDS_CAPABILITIES.
    • Correção de erros de reprodução do VP9 Widevine em alguns dispositivos (#2408).
  • Texto:
    • Adição de suporte a faixas VobSub em arquivos MP4 (#2510).
    • Correção de uma interrupção de reprodução quando um segmento de legenda não é carregado inicialmente e, depois, é carregado com sucesso, seguido por vários segmentos de legenda vazios (#2517).
    • Correção do SSA e do SubRip para mostrar uma indicação em andamento ao ativar legendas (#2309).
    • Correção do travamento da reprodução ao mudar de uma transmissão com um erro de legenda para uma transmissão ao vivo com uma faixa de legenda vazia (#2328).
    • Correção de legendas CEA-608 distorcidas ao reproduzir streams H.262 que contêm frames B (#2372).
    • Foi adicionado suporte a legendas SSA com CodecId = S_TEXT/SSA em arquivos Matroska. Anteriormente, o MatroskaExtractor só oferecia suporte a CodecId = S_TEXT/ASS, que representa a variante "avançada" (v4+) das legendas do SubStation Alpha (mas a lógica de análise do ExoPlayer é a mesma para as duas variantes) (#2384).
    • Adição de suporte à propriedade layer em arquivos de legenda SubStation Alpha (SSA), usada para definir a ordem Z de indicações quando mais de uma é mostrada na tela ao mesmo tempo (#2124).
  • Metadados:
    • Adicionamos suporte para recuperar a duração da mídia e Timeline para MetadataRetriever e migramos para uma API AutoCloseable baseada em instância. Use o novo Builder para criar uma instância para um MediaItem e, em seguida, chame retrieveTrackGroups(), retrieveTimeline() e retrieveDurationUs() para receber ListenableFutures para os metadados. Os métodos estáticos anteriores foram descontinuados (#2462).
  • Imagem:
    • Limite os bitmaps decodificados ao tamanho de exibição em BitmapFactoryImageDecoder para evitar que um app falhe com Canvas: trying to draw too large bitmap. de PlayerView ao tentar mostrar imagens muito grandes (por exemplo, 50 MP).
    • Mude a assinatura de DefaultRenderersFactory.getImageDecoderFactory() para usar um parâmetro Context.
    • Alinhamos o tamanho máximo de saída do bitmap usado em CompositionPlayer com o já usado em Transformer. Isso significa que CompositionPlayer não considera o tamanho da tela ao decodificar bitmaps, ao contrário de ExoPlayer.
  • DRM:
    • Adição de uma nova sobrecarga de OfflineLicenseHelper.newWidevineInstance que aceita um MediaItem.DrmConfiguration para que os cabeçalhos da solicitação HTTP possam ser aplicados corretamente (#2169).
  • Efeito:
    • Adição de Presentation.createForShortSide(int), que cria um Presentation que garante que o lado mais curto sempre corresponda ao valor fornecido, independentemente da orientação de entrada.
  • Muxers:
    • Correção de um bug em que as flags de amostra corretas não eram definidas para amostras de áudio em MP4 fragmentado.
    • A API writeSampleData() agora usa a classe BufferInfo específica do muxer, em vez de MediaCodec.BufferInfo.
    • Adicione Muxer.Factory#supportsWritingNegativeTimestampsInEditList, que tem como padrão "false".
  • Extensão de IMA:
    • Correção de um bug em que um erro de carregamento em um anúncio podia invalidar acidentalmente outro grupo de anúncios.
    • Correção de um bug em que os grupos de anúncios após o fim de uma janela de VOD travavam a reprodução. Os grupos de anúncios com um horário de início após a janela não são mais colocados na fila do MediaPeriodQueue (link em inglês).
  • Sessão:
    • Correção do bug em que as conexões de controladores Media3 de terceiros não privilegiados são ignoradas.
    • Remoção da verificação de comandos disponíveis ao enviar comandos personalizados para um MediaBrowserServiceCompat legado. Isso é equivalente ao comportamento de controladores/navegadores legados quando conectados a um app legado.
    • Correção de um bug que fazia com que o primeiro erro de reprodução de um player fosse tratado incorretamente como uma exceção personalizada persistente. Isso impede que o aplicativo se recupere.
    • Correção de um bug em que algumas mudanças no controlador que não são processadas pela sessão podem causar IllegalStateExceptions.
    • Correção de um bug em que as ações do controle que não são processadas pela sessão podem deixar o controle em um estado inválido.
    • Correção do aviso de violação de inicialização não segura do StrictMode (#2330).
    • Correção do bug em que chamar setSessionExtras da linha de execução principal ao executar o player de uma linha de execução de aplicativo diferente da linha de execução principal causava um IllegalStateException (#2265).
    • Não mostrar automaticamente uma notificação se um player estiver configurado com itens de mídia sem prepará-los ou reproduzi-los (#2423https://github.com/androidx/media/issues/2423). Esse comportamento pode ser configurado por meio de MediaSessionService.setShowNotificationForIdlePlayer.
    • Adicione PlaybackException personalizados para todos os controladores ou os selecionados.
    • Correção de um bug em que a busca em uma transmissão ao vivo em um MediaController pode causar um IllegalArgumentException.
    • Para transmissões ao vivo, interrompa a publicação de uma posição de reprodução e a capacidade de buscar no item atual para controladores de mídia da plataforma, para evitar artefatos de posição na interface do Android Auto (e outros controladores que usam essas informações da sessão de mídia da plataforma) (#1758).
    • Correção de um bug em que a transmissão de nulo para getLibraryRoot de um MediaBrowser conectado a um MediaBrowserServiceCompat legado produzia um NullPointerException.
    • Correção de um bug em que o envio de ações personalizadas, um resultado da pesquisa ou uma solicitação getItem causava falhas no app de sessão legado com um ClassNotFoundException.
    • Correção de um bug em que MediaItem.LocalConfiguration.uri era compartilhado com o MediaMetadata das sessões da plataforma. Para compartilhar intencionalmente um URI e permitir que os controladores solicitem a mídia novamente, defina MediaItem.RequestMetadata.mediaUri.
  • Interface:
    • Correção de um bug em que o PlayerSurface dentro de componentes reutilizáveis, como LazyColumn, não funcionava corretamente (#2493).
    • Correção de um bug do Compose que resultava em uma lacuna entre a definição dos estados iniciais do botão e a observação da mudança de estado (por exemplo, formas de ícones ou ativação). As mudanças feitas no Player fora do período de observação agora são detectadas (#2313).
    • Adicione detentores de estado e elementos combináveis ao módulo media3-ui-compose para SeekBackButtonState e SeekForwardButtonState.
    • Adição de suporte ao modo de limpeza do ExoPlayer para PlayerControlView. Quando ativado, o player entra no modo de arrasto quando o usuário começa a arrastar a barra de arrasto, emite uma chamada player.seekTo para cada movimento e sai do modo de arrasto quando o toque é levantado da tela. Essa integração pode ser ativada com time_bar_scrubbing_enabled = true em XML ou o método setTimeBarScrubbingEnabled(boolean) em Java/Kotlin.
    • Faça com que PlayerSurface aceite um argumento Player anulável.
  • Downloads:
    • Adição de suporte a download parcial para streams progressivos. Os apps podem preparar um stream progressivo com DownloadHelper e solicitar um DownloadRequest do auxiliar especificando as posições de início e término da mídia com base no tempo que o download precisa cobrir. O DownloadRequest retornado carrega o intervalo de bytes resolvido, com o qual um ProgressiveDownloader pode ser criado para baixar o conteúdo correspondente.
    • Adicione DownloadHelper.Factory, que substitui os métodos estáticos DownloadHelper.forMediaItem().
    • Adicione Factory para implementações de SegmentDownloader.
    • Adição de suporte a download parcial para streams adaptativos. Os apps podem preparar um stream adaptável com DownloadHelper e solicitar um DownloadRequest do auxiliar especificando as posições de início e término da mídia com base no tempo que o download precisa cobrir. O DownloadRequest retornado contém o período resolvido, com o qual um SegmentDownloader concreto pode ser criado para fazer o download do conteúdo correspondente.
  • Extensão do Cronet:
    • Adição do processamento automático de cookies (#5975).
  • Extensão HLS:
    • Correção de um bug em que o HlsSampleStreamWrapper tenta buscar dentro do buffer quando não há blocos disponíveis no buffer #2598.
    • Correção do bug em que as mudanças na seleção de faixas após o carregamento de partes de baixa latência e as dicas de pré-carregamento podiam fazer com que a reprodução ficasse travada ou congelasse (#2299).
    • Evitamos recargas excessivas aguardando metade da duração desejada quando CAN-BLOCK-RELOAD=YES não é respeitado pelo servidor (#2317).
    • Correção de um bug em que a reprodução era interrompida ao iniciar um stream de intersticiais antes de um anúncio intermediário e a resolução da lista de recursos era tentada para o anúncio errado (#2558).
    • Correção da análise de playlists para aceitar \f (alimentação de formulário) em valores de atributos de string entre aspas (#2420).
    • Suporte à atualização de intersticiais com o mesmo ID (#2427).
    • Correção do bug em que os erros de carregamento da playlist às vezes não eram propagados quando uma transmissão ao vivo ficava sem segmentos para carregar (#2401https://github.com/androidx/media/issues/2401).
    • Agrupar renderizações de legendas pela tag de nome, de forma semelhante ao agrupamento de renderizações de áudio (#1666).
    • Suporte a X-ASSET-LIST e transmissões ao vivo com HlsInterstitialsAdsLoader.
  • Extensão DASH:
    • Correção do problema em que o conjunto de adaptação de reprodução rápida é mesclado com o conjunto de adaptação principal para formar um TrackGroup inválido (#2148).
    • Correção de um bug em que reduzir a duração de um período DASH pode gerar uma exceção quando amostras além da nova duração já foram lidas pelo pipeline de renderização (#2440).
    • Correção do bug em que o redirecionamento não era seguido ao usar parâmetros de consulta CMCD (#2475).
  • Extensão RTSP:
    • Adição de suporte ao pacote de agregação RTP para H265 de acordo com a RFC 7798#4.4.2 (#2413).
    • Correção de RtspClient para usar o URI de local fornecido ao processar uma resposta HTTP 302 (#2398).
    • Adicionamos suporte à análise para SessionDescriptions que contêm linhas com caracteres de espaço em branco no final (#2357).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Correção de um bug em que DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange não tem efeito para extensões de decodificador de áudio (#2258).
  • Extensão do Google Cast:
    • Adição de suporte a setVolume() e getVolume() (#2279).
    • Impedir que o CastPlayer entre em STATE_BUFFERING enquanto a linha do tempo estiver vazia.
    • Adição de suporte a getDeviceVolume(), setDeviceVolume(), getDeviceMuted() e setDeviceMuted() (#2089).
  • Utilitários de teste:
    • Adicionamos advance(player).untilPositionAtLeast e untilMediaItemIndex a TestPlayerRunHelper para avançar o player até que uma posição específica seja alcançada. Na maioria dos casos, esses métodos são mais confiáveis do que os métodos untilPosition e untilStartOfMediaItem atuais.
    • Mova FakeDownloader para o módulo test-utils-robolectric para reutilização em outros testes.
    • transformer.TestUtil.addAudioDecoders(String...), transformer.TestUtil.addAudioEncoders(String...) e transformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...) foram removidos. Use ShadowMediaCodecConfig para configurar codificadores e decodificadores de sombra.
    • O prefixo "exotest" foi substituído por "media3" em nomes de codec informados por ShadowMediaCodecConfig.
  • Símbolos descontinuados foram removidos:
    • O construtor SegmentDownloader descontinuado SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) e os construtores correspondentes nas subclasses DashDownloader, HlsDownloader e SsDownloader foram removidos.
    • Remoção de Player.hasNext() e Player.hasNextWindow(), que foram descontinuados. Use Player.hasNextMediaItem().
    • Remoção de Player.next(), que foi descontinuado. Use Player.seekToNextMediaItem().
    • Remoção de Player.seekToPreviousWindow(), que foi descontinuado. Use Player.seekToPreviousMediaItem()
    • Remoção de Player.seekToNextWindow(), que foi descontinuado. Use Player.seekToNextMediaItem()
    • O BaseAudioProcessor descontinuado foi removido do módulo exoplayer. Use BaseAudioProcessor no módulo common.
    • Remoção do construtor MediaCodecVideoRenderer descontinuado MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider).

Versão 1.8.0-rc02

24 de julho de 2025

Use a versão estável 1.8.0.

Versão 1.8.0-rc01

16 de julho de 2025

Use a versão estável 1.8.0.

Versão 1.8.0-beta01

2 de julho de 2025

Use a versão estável 1.8.0.

Versão 1.8.0-alpha01

19 de maio de 2025

Use a versão estável 1.8.0.

Versão 1.7.0

Versão 1.7.1

16 de maio de 2025

Esta versão tem o mesmo código que a 1.6.1 e está sendo lançada para garantir que apareça como uma versão "mais recente" que a 1.7.0, que era uma versão Alfa acidentalmente marcada como estável (veja abaixo).

Versão 1.7.0

16 de maio de 2025

Esta versão deveria ser 1.7.0-alpha01, mas foi marcada acidentalmente como 1.7.0 (ou seja, estável) em maven.google.com. Não a use. Permaneça na versão 1.6.1 ou faça upgrade para a 1.7.1 (que tem o mesmo código da 1.6.1).

Versão 1.6.0

1.6.1

14 de abril de 2025

Lançamento de androidx.media3:media3-*:1.6.1. A versão 1.6.1 contém estes commits.

  • Biblioteca comum:
    • Adição do método PlaybackParameters.withPitch(float) para copiar facilmente um PlaybackParameters com um novo valor pitch (#2257).
  • ExoPlayer:
    • Correção do problema em que a transição do item de mídia falhava devido a um erro recuperável do renderizador durante a inicialização do próximo item de mídia (#2229).
    • Correção de um problema em que ProgressiveMediaPeriod gera um IllegalStateException quando PreloadMediaSource tenta chamar o getBufferedDurationUs() antes de ser preparado (#2315).
    • Correção do envio de CmcdData em solicitações de manifesto para DASH, HLS e SmoothStreaming (#2253).
    • Verifique se AdPlaybackState.withAdDurationsUs(long[][]) pode ser usado depois que os grupos de anúncios forem removidos. O usuário ainda precisa transmitir uma matriz de durações para grupos de anúncios removidos, que pode estar vazia ou nula (#2267).
  • Extratores:
    • MP4: analisa alternate_group da caixa tkhd e o expõe como uma entrada Mp4AlternateGroupData no Format.metadata de cada faixa (link em inglês).
  • Áudio:
    • Correção de um problema de descarregamento em que a posição podia ficar travada ao reproduzir uma playlist de conteúdo curto (#1920).
  • Sessão:
    • Reduzimos o tempo limite de agregação para callbacks da plataforma MediaSession de 500 para 100 milissegundos e adicionamos um setter experimental para permitir que os apps configurem esse valor.
    • Correção de um problema em que as notificações reapareciam depois de serem dispensadas pelo usuário (#2302).
    • Correção de um bug em que a sessão retornava uma linha do tempo de item único quando o player encapsulado estava vazio. Isso acontecia quando o player encapsulado não tinha COMMAND_GET_TIMELINE disponível enquanto COMMAND_GET_CURRENT_MEDIA_ITEM estava disponível e o player encapsulado estava vazio (#2320).
    • Correção de um bug em que a chamada de MediaSessionService.setMediaNotificationProvider é ignorada silenciosamente após outras interações com o serviço, como setForegroundServiceTimeoutMs (#2305).
  • Interface:
    • Ative o PlayerSurface para trabalhar com ExoPlayer.setVideoEffects e CompositionPlayer.
    • Correção de um bug em que o PlayerSurface não podia ser recomposto com um novo Player.
  • Extensão HLS:
    • Correção de um problema em que a duração do bloco não era definida em CmcdData para mídia HLS, causando uma falha de declaração ao processar segmentos de mídia criptografados (#2312).
  • Extensão RTSP:
    • Adição de suporte a URI com esquema RTSPT como uma forma de configurar a sessão RTSP para usar TCP (#1484).
  • Extensão do Google Cast:
    • Adição de suporte para metadados de playlist (#2235).

1.6.0

26 de março de 2025

Lançamento de androidx.media3:media3-*:1.6.0. A versão 1.6.0 contém estes commits.

  • Biblioteca comum:
    • Adição de AudioManagerCompat e AudioFocusRequestCompat para substituir as classes equivalentes em androidx.media.
    • Faça upgrade do Kotlin da versão 1.9.20 para a 2.0.20 e use o plug-in do Gradle do compilador do Compose. Fazer upgrade da biblioteca de corrotinas KotlinX da versão 1.8.1 para a 1.9.0.
    • Remova o método Format.toBundle(boolean excludeMetadata) e use Format.toBundle().
    • Correção de um bug em SimpleBasePlayer em que a definição de um novo currentMediaItemIndex em State após setPlaylist com null MediaMetadata não reavalia os metadados (#1940).
    • O acesso de SimpleBasePlayer.State foi alterado de protegido para público para facilitar o processamento de atualizações em outras classes (#2128).
  • ExoPlayer:
    • Adição de MediaExtractorCompat, uma nova classe que oferece recursos equivalentes à plataforma MediaExtractor.
    • Adição de suporte experimental de pré-aquecimento do ExoPlayer para reprodução usando MediaCodecVideoRenderer. É possível configurar DefaultRenderersFactory por meio de experimentalSetEnableMediaCodecVideoRendererPrewarming para fornecer um MediaCodecVideoRenderer secundário para ExoPlayer. Se ativado, o ExoPlayer pré-processa o vídeo de itens de mídia consecutivos durante a reprodução para reduzir a latência de transição de itens de mídia.
    • Reduza os valores padrão de bufferForPlaybackMs e bufferForPlaybackAfterRebufferMs em DefaultLoadControl para 1.000 e 2.000 ms, respectivamente.
    • Inicialize o DeviceInfo e o volume do dispositivo de forma assíncrona (se ativado usando setDeviceVolumeControlEnabled). Esses valores não ficam disponíveis imediatamente após ExoPlayer.Builder.build(), e Player.Listener notifica as mudanças usando onDeviceInfoChanged e onDeviceVolumeChanged.
    • O ID da sessão de áudio inicial não fica mais disponível imediatamente após a criação do player. Use AnalyticsListener.onAudioSessionIdChanged para ouvir a atualização inicial, se necessário.
    • Considere o idioma ao selecionar uma faixa de vídeo. Por padrão, selecione uma faixa de vídeo "principal" que corresponda ao idioma da faixa de áudio selecionada, se disponível. As preferências explícitas de idioma do vídeo podem ser expressas com TrackSelectionParameters.Builder.setPreferredVideoLanguage(s).
    • Adição do parâmetro selectedAudioLanguage ao método DefaultTrackSelector.selectVideoTrack().
    • Adição do parâmetro retryCount a MediaSourceEventListener.onLoadStarted e aos métodos MediaSourceEventListener.EventDispatcher correspondentes.
    • Correção de um bug em que itens de playlist ou períodos em streams DASH de vários períodos com durações que não correspondiam ao conteúdo real podiam causar congelamentos de frames no final do item (#1698).
    • Mova BasePreloadManager.Listener para um PreloadManagerListener de nível superior.
    • RenderersFactory.createSecondaryRenderer pode ser implementado para fornecer renderizadores secundários para pré-aquecimento. O pré-aquecimento permite transições mais rápidas de itens de mídia durante a reprodução.
    • Ativação do envio de CmcdData para solicitações de manifesto em formatos de streaming adaptável DASH, HLS e SmoothStreaming (#1951).
    • Forneça o MediaCodecInfo do codec que será inicializado em MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • Mude AdsMediaSource para permitir que o AdPlaybackStates cresça adicionando grupos de anúncios. Modificações inválidas são detectadas e geram uma exceção.
    • Correção de um problema em que outros frames somente de decodificação podiam ser mostrados em rápida sucessão ao fazer a transição para a mídia de conteúdo após um anúncio intermediário.
    • Faça com que DefaultRenderersFactory adicione duas instâncias de MetadataRenderer para permitir que os apps recebam dois esquemas diferentes de metadados por padrão.
    • Reavaliar se o carregamento em andamento de um bloco precisa ser cancelado quando a reprodução é pausada (link em inglês).
    • Adicionamos uma opção a ClippingMediaSource para permitir o corte em mídias não pesquisáveis.
    • Correção de um bug em que a busca com pré-aquecimento podia bloquear a transição do item de mídia seguinte.
    • Correção de um bug em que ExoPlayer.isLoading() permanecia true enquanto havia transição para STATE_IDLE ou STATE_ENDED (#2133).
    • Adição de lastRebufferRealtimeMs a LoadControl.Parameter (#2113).
  • Transformador:
    • Adição de suporte à transmutação em formatos alternativos compatíveis com versões anteriores.
    • Adição de suporte para transcodificação e transmuxing do formato Dolby Vision (perfil 8).
    • Atualize os parâmetros de VideoFrameProcessor.registerInputStream e VideoFrameProcessor.Listener.onInputStreamRegistered para usar Format.
    • Gerar metadados estáticos de HDR ao usar DefaultEncoderFactory.
    • Suporte adicionado ao diagnóstico da plataforma Android usando MediaMetricsManager. O Transformer encaminha eventos de edição e dados de performance para a plataforma, o que ajuda a fornecer informações de performance e depuração do sistema no dispositivo. Esses dados também poderão ser coletados pelo Google se o compartilhamento de dados de uso e diagnóstico for ativado pelo usuário do dispositivo. Os apps podem desativar a contribuição de diagnósticos da plataforma para o Transformer com Transformer.Builder.setUsePlatformDiagnostics(false).
    • Divida InAppMuxer em InAppMp4Muxer e InAppFragmentedMp4Muxer. Use InAppMp4Muxer para produzir um arquivo MP4 não fragmentado, enquanto InAppFragmentedMp4Muxer é para produzir um arquivo MP4 fragmentado.
    • Mover a interface Muxer de media3-muxer para media3-transformer.
    • Adição de MediaProjectionAssetLoader, que fornece mídia de um MediaProjection para gravação de tela, e adição de suporte à gravação de tela ao app de demonstração do Transformer.
    • Adicione #getInputFormat() à interface Codec.
    • A responsabilidade de liberar o GlObjectsProvider foi transferida para o autor da chamada em DefaultVideoFrameProcessor e DefaultVideoCompositor quando possível.
  • Extratores:
    • AVI: correção do processamento de arquivos com áudio compactado de taxa de bits constante em que o cabeçalho do stream armazena o número de bytes em vez do número de blocos.
    • Corrigimos o processamento de unidades NAL com comprimentos expressos em 1 ou 2 bytes (em vez de 4).
    • Correção de ArrayIndexOutOfBoundsException em listas de edição MP4 quando a lista começa em um frame não sincronizado sem um frame de sincronização anterior (#2062).
    • Correção de um problema em que os streams de TS podiam ficar travados em alguns dispositivos (#2069).
    • FLAC: foi adicionado suporte para arquivos FLAC de 32 bits. Anteriormente, eles não eram reproduzidos com IllegalStateException: Playback stuck buffering and not loading (#2197).
  • Áudio:
    • Correção de onAudioPositionAdvancing para ser chamado quando a reprodução é retomada (antes, ele era chamado quando a reprodução era pausada).
    • Não ignore SonicAudioProcessor quando SpeedChangingAudioProcessor estiver configurado com parâmetros padrão.
    • Correção de um underflow em Sonic#getOutputSize() que poderia causar a interrupção de DefaultAudioSink.
    • Corrigimos MediaCodecAudioRenderer.getDurationToProgressUs() e DecoderAudioRenderer.getDurationToProgressUs() para que as buscas redefinam corretamente as durações fornecidas.
    • Defina androidx.media3.common.audio.SonicAudioProcessor como final.
    • Adição de suporte para PCM flutuante a ChannelMappingAudioProcessor e TrimmingAudioProcessor.
  • Vídeo:
    • Mudança de MediaCodecVideoRenderer.shouldUsePlaceholderSurface para protegido, para que os aplicativos possam substituir para bloquear o uso de superfícies de marcador de posição (#1905).
    • Adicionamos a análise experimental de dependência de amostra AV1 de ExoPlayer para acelerar a busca. Ative-o com a nova API DefaultRenderersFactory.experimentalSetParseAv1SampleDependencies.
    • Adição da API experimental ExoPlayer para descartar buffers de entrada do decodificador MediaCodecVideoRenderer atrasados que não são dependentes. Ative-o com DefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. * Correção de um problema em que um player sem uma superfície ficava pronto imediatamente e decodificava muito lentamente os frames pendentes (#1973).
    • Os dispositivos Xiaomi e OPPO foram excluídos do modo de superfície separada para evitar a oscilação da tela (#2059).
  • Texto:
    • Adição de suporte a legendas VobSub (#8260).
    • Interrompa o carregamento antecipado de todos os arquivos de legenda configurados com MediaItem.Builder.setSubtitleConfigurations e, em vez disso, carregue apenas um se ele for selecionado pela seleção de faixa (#1721).
    • TTML: foi adicionado suporte para referenciar tts:origin e tts:extent usando style (#2953).
    • Restrinja as marcações de tempo do WebVTT e do SubRip a exatamente três casas decimais. Antes, analisávamos incorretamente qualquer número de casas decimais, mas sempre presumíamos que o valor estava em milissegundos, o que levava a carimbos de data/hora incorretos (#1997).
    • Correção do travamento da reprodução quando uma playlist contém itens cortados com legendas CEA-608 ou CEA-708.
    • Correção de IllegalStateException quando um arquivo SSA contém uma indicação com duração zero (horário de início e término iguais) (#2052).
    • Suprimir (e registrar) erros de análise de legendas quando elas são multiplexadas no mesmo contêiner que o áudio e o vídeo (#2052).
    • Correção do processamento de caracteres UTF-8 de vários bytes em arquivos WebVTT usando finais de linha CR (#2167).
  • DRM:
    • Correção do erro MediaCodec$CryptoException: Operation not supported in this configuration ao reproduzir conteúdo ClearKey em dispositivos com API anterior à 27 (link em inglês nº 1732).
  • Efeito:
    • A funcionalidade de OverlaySettings foi movida para StaticOverlaySettings. OverlaySettings pode ser uma subclasse para permitir configurações de sobreposição dinâmica.
  • Muxers:
    • MuxerException foi movido para fora da interface Muxer para evitar um nome totalmente qualificado muito longo.
    • O método setSampleCopyEnabled() foi renomeado como setSampleCopyingEnabled() em Mp4Muxer.Builder e FragmentedMp4Muxer.Builder.
    • Mp4Muxer.addTrack() e FragmentedMp4Muxer.addTrack() agora retornam um ID de rastreamento int em vez de um TrackToken.
    • Mp4Muxer e FragmentedMp4Muxer não implementam mais a interface Muxer.
    • Desativar o lote e a cópia de amostras de Mp4Muxer por padrão.
    • Correção de um bug em FragmentedMp4Muxer que cria muitos fragmentos quando apenas a faixa de áudio é gravada.
  • Sessão:
    • Manter o estado do serviço em primeiro plano por mais 10 minutos quando a reprodução for pausada, interrompida ou falhar. Isso permite que os usuários retomem a reprodução dentro desse tempo limite sem correr o risco de restrições de serviço em primeiro plano em vários dispositivos. Não é mais possível chamar player.pause() para interromper o serviço em primeiro plano antes de stopSelf() ao substituir onTaskRemoved. Use MediaSessionService.pauseAllPlayersAndStopSelf().
    • Mantenha a notificação visível quando a reprodução entrar em um estado de erro ou interrompido. A notificação só é removida se a playlist for limpa ou o player for liberado.
    • Melhoramos o processamento das ações ACTION_PLAY e ACTION_PAUSE da MediaSession da plataforma Android para definir apenas uma delas de acordo com os comandos disponíveis e também aceitar se apenas uma delas estiver definida.
    • Adição de Context como um parâmetro para MediaButtonReceiver.shouldStartForegroundService (#1887).
    • Correção de um bug em que a chamada de um método Player em um MediaController conectado a uma sessão legada descartava as mudanças de uma atualização pendente.
    • MediaSession.setSessionActivity(PendingIntent) agora aceita valores nulos (#2109).
    • Correção de um bug em que uma notificação desatualizada permanecia visível quando a playlist era limpa (#2211).
  • Interface:
    • Adicione detentores de estado e elementos combináveis ao módulo media3-ui-compose para PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState e PlaybackSpeedState.
  • Downloads:
    • Correção do bug em CacheWriter que deixa as fontes de dados abertas e as áreas de cache bloqueadas caso a fonte de dados gere um Exception diferente de IOException (#9760).
  • Extensão HLS:
    • Adicione uma primeira versão de HlsInterstitialsAdsLoader. O carregador de anúncios lê os intersticiais de uma playlist de mídia HLS e os mapeia para o AdPlaybackState que é transmitido para o AdsMediaSource. Essa versão inicial é compatível apenas com streams de VOD HLS com atributos X-ASSET-URI.
    • Adição do HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Os apps podem usá-la para criar instâncias de AdsMediaSource que usam um HlsInterstitialsAdsLoader de maneira conveniente e segura.
    • Analisar a tag SUPPLEMENTAL-CODECS da playlist HLS para detectar formatos Dolby Vision (#1785).
    • A condição para buscar posições de sincronização em um stream HLS foi flexibilizada (#2209).
  • Extensão DASH:
    • Adição de suporte ao formato AC-4 Level-4 para DASH (#1898).
    • Correção de um problema ao calcular o intervalo de atualização para inserção de anúncios em transmissões ao vivo de vários períodos (#1698).
    • Análise do atributo scte214:supplementalCodecs do manifesto DASH para detectar formatos Dolby Vision (#1785).
    • Melhoria no processamento de transições de período em transmissões ao vivo em que o período contém amostras de mídia além da duração declarada (#1698).
    • Correção de um problema em que conjuntos de adaptação marcados com adaptation-set-switching, mas com idiomas ou sinalizações de função diferentes, são mesclados (#2222).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Adição do módulo decodificador MPEG-H, que usa o decodificador MPEG-H integrado para decodificar áudio MPEG-H (#1826).
  • Extensão MIDI:
    • Conecte instâncias personalizadas de AudioSink e AudioRendererEventListener ao MidiRenderer.
  • Extensão do Google Cast:
    • A dependência play-services-cast-framework foi atualizada para a versão 21.5.0 para corrigir uma falha de FLAG_MUTABLE em apps destinados à API 34 ou mais recente em dispositivos com o Google Play Services instalado, mas desativado (#2178).
  • App de demonstração:
    • Estenda demo-compose com mais botões e melhore a integração de PlayerSurface com suporte a dimensionamento e obturador.
  • Símbolos descontinuados foram removidos:
    • O método AudioMixer.create() descontinuado foi removido. Use DefaultAudioMixer.Factory().create()
    • Remova os seguintes métodos Transformer.Builder descontinuados:
      • setTransformationRequest(), use setAudioMimeType(), setVideoMimeType() e setHdrMode().
      • setAudioProcessors(), defina o processador de áudio em um EditedMediaItem.Builder.setEffects() e transmita-o para Transformer.start().
      • setVideoEffects(), defina o efeito de vídeo em um EditedMediaItem.Builder.setEffects() e transmita-o para Transformer.start().
      • setRemoveAudio(), use EditedMediaItem.Builder.setRemoveAudio() para remover o áudio do EditedMediaItem transmitido para Transformer.start().
      • setRemoveVideo(), use EditedMediaItem.Builder.setRemoveVideo() para remover o vídeo do EditedMediaItem transmitido para Transformer.start().
      • setFlattenForSlowMotion(), use EditedMediaItem.Builder.setFlattenForSlowMotion() para nivelar o EditedMediaItem transmitido para Transformer.start().
      • setListener(), use addListener(), removeListener() ou removeAllListeners().
    • Remova os seguintes métodos Transformer.Listener descontinuados:
      • onTransformationCompleted(MediaItem), use onCompleted(Composition, ExportResult).
      • onTransformationCompleted(MediaItem, TransformationResult), use onCompleted(Composition, ExportResult).
      • onTransformationError(MediaItem, Exception), use onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationException), use onError(Composition, ExportResult, ExportException).
      • onTransformationError(MediaItem, TransformationResult, TransformationException), use onError(Composition, ExportResult, ExportException).
      • onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), use onFallbackApplied(Composition, TransformationRequest, TransformationRequest).
    • Remoção da classe TransformationResult descontinuada. Use ExportResult.
    • Remoção da classe TransformationException descontinuada. Use ExportException.
    • Remoção do Transformer.PROGRESS_STATE_NO_TRANSFORMATION descontinuado. Use Transformer.PROGRESS_STATE_NOT_STARTED
    • Remoção do Transformer.setListener() descontinuado. Use Transformer.addListener(), Transformer.removeListener() ou Transformer.removeAllListeners().
    • Remoção do Transformer.startTransformation() descontinuado. Use Transformer.start(MediaItem, String)
    • Remoção do SingleFrameGlShaderProgram descontinuado. Use BaseGlShaderProgram
    • O Transformer.flattenForSlowMotion foi removido. Use EditedMediaItem.flattenForSlowMotion
    • ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent e ExoPlayer.DeviceComponent foram removidos.
    • Contato removido: androidx.media3.exoplayer.audio.SonicAudioProcessor.
    • Os seguintes métodos DownloadHelper descontinuados foram removidos:
      • Construtor DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), use DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList).
      • getRendererCapabilities(RenderersFactory), é possível alcançar uma funcionalidade equivalente criando um DefaultRendererCapabilitiesList com um RenderersFactory e chamando DefaultRendererCapabilitiesList.getRendererCapabilities().
      • O método PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat) foi removido. Use PlayerNotificationManager.setMediaSessionToken(MediaSession.Token) e transmita (MediaSession.Token) compatToken.getToken().

1.6.0-rc02

19 de março de 2025

Use a versão estável 1.6.0.

1.6.0-rc01

12 de março de 2025

Use a versão estável 1.6.0.

1.6.0-beta01

26 de fevereiro de 2025

Use a versão estável 1.6.0.

Versão 1.6.0-alpha03

6 de fevereiro de 2025

Use a versão estável 1.6.0.

Versão 1.6.0-alpha02

30 de janeiro de 2025

Use a versão estável 1.6.0.

Versão 1.6.0-alpha01

20 de dezembro de 2024

Use a versão estável 1.6.0.

Versão 1.5

Versão 1.5.1

December 19, 2024

Lançamento de androidx.media3:media3-*:1.5.1. A versão 1.5.1 contém estes commits.

  • ExoPlayer:
    • Desativação do uso da descriptografia assíncrona no MediaCodec para evitar problemas de tempo limite de codec com essa API de plataforma (#1641).
  • Extratores:
    • MP3: não interrompa a reprodução antes do tempo quando o sumário de um frame VBRI não cobrir todos os dados de MP3 em um arquivo (link em inglês nº 1904).
  • Vídeo:
    • Reversão do uso de valores de proporção de pixels fornecidos por MediaCodecAdapter ao processar onOutputFormatChanged (link em inglês).
  • Texto:
    • Correção de um bug em ReplacingCuesResolver.discardCuesBeforeTimeUs em que a indicação ativa em timeUs (iniciada antes, mas ainda não encerrada) era descartada incorretamente (#1939).
  • Metadados:
    • Extraia a numeração de disco/faixa e o gênero dos comentários do Vorbis em MediaMetadata (#1958).

Versão 1.5.0

27 de novembro de 2024

Lançamento de androidx.media3:media3-*:1.5.0. A versão 1.5.0 contém estes commits.

  • Biblioteca comum:
    • Adição de ForwardingSimpleBasePlayer, que permite o encaminhamento para outro player com pequenos ajustes, garantindo total consistência e processamento de listeners (#1183).
    • Substitua o método SimpleBasePlayer.State.playlist por getPlaylist().
    • Adicione uma substituição para SimpleBasePlayer.State.Builder.setPlaylist() para especificar diretamente um Timeline e os Tracks e Metadata atuais, em vez de criar uma estrutura de playlist.
    • Aumente o minSdk para 21 (Android Lollipop). Isso está alinhado com todas as outras bibliotecas do AndroidX.
    • Adição do artefato androidx.media3:media3-common-ktx, que oferece funcionalidades específicas do Kotlin criadas com base na biblioteca Common.
    • Adição da função de extensão de suspensão Player.listen para criar uma corrotina que detecta Player.Events na biblioteca media3-common-ktx.
    • Remoção de anotações @DoNotInline de classes internas manualmente fora de linha projetadas para evitar falhas de verificação de classe no momento da execução. As versões recentes do R8 agora fazem automaticamente chamadas fora de linha como essas para evitar falhas no ambiente de execução. Portanto, a remoção manual não é mais necessária. Todos os usuários do Gradle da biblioteca já precisam estar usando uma versão do Plug-in do Android para Gradle que use uma versão do R8 que faça isso, devido a compileSdk = 35. Os usuários da biblioteca com sistemas de build que não são do Gradle precisam garantir que a etapa de redução/ofuscação equivalente ao R8 faça um processo de out-of-lining automático semelhante para evitar falhas de verificação de classe no ambiente de execução. Essa mudança já foi feita em outras bibliotecas do AndroidX.
  • ExoPlayer:
    • MediaCodecRenderer.onProcessedStreamChange() agora pode ser chamado para cada item de mídia. Antes, ele não era chamado para o primeiro. Use MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart() para ativar.
    • Adição de PreloadMediaSource.PreloadControl.onPreloadError para permitir que as implementações de PreloadMediaSource.PreloadControl realizem ações quando ocorrer um erro.
    • Adicione BasePreloadManager.Listener para propagar eventos de pré-carregamento para apps.
    • Permitir a mudança do tempo limite do cliente SNTP e tentar novamente endereços alternativos no tempo limite (#1540).
    • Remova MediaCodecAdapter.Configuration.flags, já que o campo sempre era zero.
    • Permitir que o usuário selecione o alto-falante integrado para reprodução no Wear OS API 35+ (em que o dispositivo anuncia suporte para isso).
    • Adie a chamada de bloqueio para Context.getSystemService(Context.AUDIO_SERVICE) até que o processamento do foco de áudio seja ativado. Isso garante que a chamada de bloqueio não seja feita se o processamento de foco de áudio não estiver ativado (link em inglês).
    • Permitir a reprodução, independente da duração do buffer, quando o carregamento falhar (#1571).
    • Adição de AnalyticsListener.onRendererReadyChanged() para sinalizar quando renderizadores individuais permitem que a reprodução esteja pronta.
    • Correção de MediaCodec.CryptoException, que às vezes é relatado como um "erro de tempo de execução inesperado" quando MediaCodec é operado no modo assíncrono (comportamento padrão na API 31+).
    • Transmita bufferedDurationUs em vez de bufferedPositionUs com PreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Também muda DefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS para DefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS. Os apps precisam transmitir um valor que represente uma duração específica da posição inicial padrão para que a fonte de mídia correspondente seja pré-carregada com esse IntDef, em vez de uma posição.
    • Adição da implementação de ForwardingRenderer que encaminha todas as chamadas de método para outro renderizador (1703).
    • Adicione o pré-carregamento de playlist para o próximo item na playlist. Os apps podem ativar o pré-carregamento chamando ExoPlayer.setPreloadConfiguration(PreloadConfiguration) de acordo. Por padrão, o pré-carregamento está desativado. Quando ativado, para não interferir na reprodução, o DefaultLoadControl restringe o pré-carregamento para iniciar e continuar somente quando o player não estiver carregando para reprodução. Os apps podem mudar esse comportamento implementando LoadControl.shouldContinuePreloading() de acordo (como ao substituir esse método em DefaultLoadControl). A implementação padrão de LoadControl desativa o pré-carregamento caso um app esteja usando uma implementação personalizada de LoadControl.
    • Adição do método MediaSourceEventListener.EventDispatcher.dispatchEvent() para permitir a invocação de eventos de listeners de subclasse (1736).
    • Adicione DefaultPreloadManager.Builder, que cria as instâncias DefaultPreloadManager e ExoPlayer com configurações compartilhadas de forma consistente.
    • Remoção do parâmetro Renderer[] de LoadControl.onTracksSelected(), já que a implementação de DefaultLoadControl pode recuperar os tipos de stream de ExoTrackSelection[].
    • O DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) foi descontinuado e o método foi marcado como final para evitar substituições. Use o novo DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]).
    • Informar eventos MediaSourceEventListener de fontes secundárias em MergingMediaSource. Isso vai resultar em eventos de início/erro/cancelamento/conclusão de carregamento sendo relatados para legendas de sideload (adicionadas com MediaItem.LocalConfiguration.subtitleConfigurations), que podem aparecer como eventos de carregamento duplicados emitidos por AnalyticsListener.
    • Evitar que erros de legenda e metadados interrompam completamente a reprodução. Em vez disso, a faixa problemática é desativada, e a reprodução das faixas restantes continua (#1722).
      • No novo processamento de legendas (durante a extração), os erros de análise associados (por exemplo, dados de legenda inválidos) e de carregamento (por exemplo, HTTP 404) são emitidos por callbacks onLoadError.
      • No processamento de legendas legado (durante a renderização), apenas os erros de carregamento associados são emitidos por callbacks onLoadError, enquanto os erros de análise são ignorados silenciosamente (esse é um comportamento preexistente).
    • Correção de um bug em que itens de playlist ou períodos em streams DASH de vários períodos com durações que não correspondiam ao conteúdo real podiam causar congelamentos de frames no final do item (#1698).
    • Adição de um setter a SntpClient para definir o tempo máximo decorrido desde a última atualização após a qual o cliente é reinicializado (#1794).
  • Transformador:
    • Adição de SurfaceAssetLoader, que oferece suporte ao enfileiramento de dados de vídeo para o Transformer usando um Surface.
    • ImageAssetLoader informa entrada sem suporte usando AssetLoader.onError em vez de gerar um IllegalStateException.
    • Defina a duração da imagem usando MediaItem.Builder.setImageDurationMs obrigatório para exportação de imagens.
    • Adição de suporte à exportação para lacunas em sequências de EditedMediaItems de áudio.
  • Seleção de faixas:
    • DefaultTrackSelector: prioriza o áudio baseado em objetos em relação ao áudio baseado em canais quando outros fatores são iguais.
  • Extratores:
    • Permitir que Mp4Extractor e FragmentedMp4Extractor identifiquem amostras H264 que não são usadas como referência por amostras subsequentes.
    • Adicionamos uma opção para ativar a busca baseada em índice em AmrExtractor.
    • Tratar arquivos MP3 com mais de 128 kB entre frames válidos como truncados (em vez de inválidos). Isso significa que os arquivos com dados que não são MP3 no final, sem outros metadados para indicar o tamanho dos bytes de MP3, agora interrompem a reprodução no final dos dados de MP3 em vez de falhar com ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • Correção do processamento de amostras de pré-lançamento para posições de início de mídia que não são de frames-chave ao processar listas de edição em arquivos MP4 (#1659).
    • Melhoramos o cálculo da taxa de frames usando a duração da mídia da caixa mdhd em Mp4Extractor e FragmentedMp4Extractor (#1531).
    • Correção do dimensionamento incorreto de media_time em listas de edição de MP4. Embora segment_duration já tenha sido dimensionado corretamente usando a escala de tempo do filme, media_time agora é dimensionado corretamente usando a escala de tempo da faixa, conforme especificado pelo padrão de formato MP4 (#1792).
    • Processamento de frames fora de ordem no cálculo de endIndices para MP4 com lista de edição (#1797).
    • Correção da análise de duração de mídia na caixa mdhd de arquivos MP4 para processar valores -1 (#1819).
    • Adição de suporte para identificar a caixa h263 em arquivos MP4 para vídeo H.263 (#1821).
    • Adição de suporte ao formato do arquivo de mídia de base ISO AC-4 Level-4 (#1265).
  • DataSource:
    • Atualização de HttpEngineDataSource para permitir o uso a partir da versão S da extensão 7 em vez do nível 34 da API (#1262).
    • DataSourceContractTest: declara que DataSource.getUri() retorna o URI resolvido (conforme documentado). Quando isso for diferente do URI solicitado, os testes poderão indicar isso usando o novo método DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: declara que DataSource.getUri() e getResponseHeaders() retornam o valor "open" após uma chamada com falha para open() (devido a um recurso "not found") e antes de uma chamada close() subsequente.
      • Substituir DataSourceContractTest.getNotFoundResources() permite que as subclasses de teste forneçam vários recursos "não encontrados" e também os cabeçalhos esperados. Isso permite distinguir entre HTTP 404 (com cabeçalhos) e "servidor não encontrado" (sem cabeçalhos).
  • Áudio:
    • Configura automaticamente os metadados de volume CTA-2075 no codec se estiverem presentes na mídia.
    • Garantir uma redução suave do volume ao buscar.
    • Correção de sons de estalo que podem ocorrer durante buscas.
    • Correção do acúmulo de erros de truncamento para o algoritmo de alongamento de tempo/mudança de tom do Sonic.
    • Correção de um bug em SpeedChangingAudioProcessor que causava a perda de frames de saída.
  • Vídeo:
    • O MediaCodecVideoRenderer evita decodificar amostras que não são renderizadas nem usadas como referência por outras amostras.
    • Na API 35 e em versões mais recentes, MediaCodecAdapter agora pode receber um null Surface em configure e chamadas para um novo método detachOutputSurface para remover um Surface definido anteriormente se o codec oferecer suporte a isso (MediaCodecInfo.detachedSurfaceSupported).
    • Use os valores de proporção de pixel fornecidos por MediaCodecAdapter, se houver, ao processar onOutputFormatChanged (#1371).
    • Adicionamos uma solução alternativa para um problema no Galaxy Tab S7 FE que faz com que streams H264 seguros de 60 fps sejam marcados como incompatíveis (#1619).
    • Adicionamos uma solução alternativa para codecs que travam após a última amostra sem retornar um sinal de fim de stream.
  • Texto:
    • Adição de um VoiceSpan personalizado e preenchimento para intervalos de voz do WebVTT (#1632).
    • Garantimos que o WebVTT em HLS com carimbos de data/hora de legenda muito grandes (que excedem um long de 64 bits quando representados como microssegundos e multiplicados pela base de tempo MPEG 90,000) seja exibido (#1763).
    • Suporte a legendas CEA-608 em conteúdo Dolby Vision (#1820).
    • Correção do travamento da reprodução em transmissões de vários períodos do DASH quando as legendas CEA-608 estão ativadas (#1863).
  • Metadados:
    • Atribua o tipo C.TRACK_TYPE_METADATA a faixas que contenham conteúdo icy ou vnd.dvb.ait.
  • Imagem:
    • Adicione ExternallyLoadedImageDecoder para simplificar a integração com bibliotecas externas de carregamento de imagens, como Glide ou Coil.
  • DataSource:
    • Adição de FileDescriptorDataSource, um novo DataSource que pode ser usado para ler de um FileDescriptor (#3757).
  • Efeito:
    • Adição de uma solução alternativa de DefaultVideoFrameProcessor para o escalonamento menor de SurfaceTexture. SurfaceTexture pode incluir um pequeno escalonamento que corta uma borda de 1 texel ao redor de um buffer cortado. Agora, isso é processado para que a saída seja mais próxima do esperado.
    • Acelerar DefaultVideoFrameProcessor.queueInputBitmap(). Como resultado, a exportação de imagens para vídeos com Transformer é mais rápida.
  • Extensão de IMA:
    • Correção de um bug em que limpar a playlist podia causar um ArrayIndexOutOfBoundsException em ImaServerSideAdInsertionMediaSource.
    • Correção do bug em que as transmissões de DAI inseridas do lado do servidor sem um anúncio precedente podiam resultar em um ArrayIndexOutOfBoundsException ao reproduzir após o último anúncio intermediário (#1741).
  • Sessão:
    • Adicione MediaButtonReceiver.shouldStartForegroundService(Intent) para permitir que os apps suprimam um comando de reprodução recebido para retomar a reprodução substituindo esse método. Por padrão, o serviço é sempre iniciado, e a reprodução não pode ser suprimida sem que o sistema cause uma falha no serviço com um ForegroundServiceDidNotStartInTimeException (#1528).
    • Correção de um bug que fazia com que comandos personalizados enviados de um MediaBrowser fossem enviados para o MediaSessionCompat.Callback em vez da variante MediaBrowserServiceCompat do método quando conectados a um serviço legado. Isso impedia que o MediaBrowser recebesse o valor de retorno real enviado pelo serviço legado (link em inglês).
    • Processamento de IllegalArgumentException gerado por dispositivos de determinados fabricantes ao definir o broadcast receiver para intents de botão de mídia (#1730).
    • Adicione botões de comando para itens de mídia. Isso adiciona a API Media3 para o que era conhecido como Custom browse actions com a biblioteca legada com MediaBrowserCompat. Com o Media3, os botões de comando para itens de mídia estão disponíveis para MediaBrowser e MediaController. Consulte Implementar ações de navegação personalizadas. * Correção de um bug em que um controlador do Media3 às vezes não permitia que um app de sessão iniciasse um serviço em primeiro plano depois de solicitar play().
    • Restrinja CommandButton.Builder.setIconUri para aceitar apenas URIs de conteúdo.
    • Transmitir dicas de conexão de um navegador Media3 para o MediaBrowserCompat inicial ao se conectar a um MediaBrowserCompat legado. O serviço pode receber as dicas de conexão transmitidas como dicas raiz com a primeira chamada para onGetRoot().
    • Correção de um bug em que um MediaBrowser conectado a um serviço de navegador legado não recebia um erro enviado pelo serviço depois que o navegador se inscrevia em um parentid.
    • Melhoria do comportamento de interoperabilidade para que um navegador do Media3 conectado a um MediaBrowserService legado não solicite os filhos de um parentId duas vezes ao se inscrever em um pai.
  • Interface:
    • Ajuste o vídeo esticado/cortado na solução alternativa PlayerView-in-Compose-AndroidView para que seja opcional, devido a problemas com transições compartilhadas baseadas em XML. Os apps que usam PlayerView dentro de AndroidView precisam chamar PlayerView.setEnableComposeSurfaceSyncWorkaround para ativar (#1237, #1594).
    • Adição de setFullscreenButtonState a PlayerView para permitir atualizações do ícone do botão de tela cheia sob demanda, ou seja, fora de banda e não de forma reativa a uma interação de clique (#1590, #184).
    • Correção de um bug em que a opção "None" na seleção de texto não funciona se houver preferências de seleção de faixa de texto definidas pelo app.
  • Extensão DASH:
    • Adição de suporte para períodos que começam no meio de um segmento (#1440).
  • Extensão Smooth Streaming:
    • Correção de um erro Bad magic number for Bundle ao reproduzir streams do SmoothStreaming com faixas de texto (#1779).
  • Extensão RTSP:
    • Correção da remoção de informações do usuário para URLs que contêm caracteres @ codificados (#1138).
    • Correção de falhas ao analisar pacotes RTP com extensões de cabeçalho (#1225).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Adicionamos o módulo decodificador IAMF, que oferece suporte à reprodução de arquivos MP4 com faixas IAMF usando a biblioteca nativa libiamf para sintetizar áudio.
      • A reprodução é ativada com um layout estéreo e 5.1 com espacialização, além do rastreamento da cabeça opcional, mas o suporte à reprodução binaural não está disponível no momento.
    • Adição de suporte a páginas de 16 KB para extensões de decodificador no Android 15 (#1685).
  • Extensão do Google Cast:
    • Interrompa a limpeza da linha do tempo após a desconexão da CastSession, o que permite que o app remetente retome a reprodução localmente após uma desconexão.
    • Preencha o DeviceInfo do CastPlayer quando um Context for fornecido. Isso permite vincular o MediaSession a um RoutingSession, o que é necessário para integrar o seletor de saída (#1056).
  • Utilitários de teste:
    • DataSourceContractTest agora inclui testes para verificar:
      • O stream de entrada read position foi atualizado.
      • O buffer de saída offset é aplicado corretamente.
  • App de demonstração
    • Os vazamentos de memória no app de demonstração de formato curto foram resolvidos (#1839).
  • Símbolos descontinuados foram removidos:
    • Remoção de Player.hasPrevious e Player.hasPreviousWindow(), que foram descontinuados. Em vez disso, use Player.hasPreviousMediaItem().
    • Remoção do método Player.previous() descontinuado. Use Player.seekToPreviousMediaItem()
    • O método DrmSessionEventListener.onDrmSessionAcquired descontinuado foi removido.
    • Os construtores DefaultEncoderFactory descontinuados foram removidos. Use DefaultEncoderFactory.Builder

Versão 1.5.0-rc02

19 de novembro de 2024

Use a versão estável 1.5.0.

Versão 1.5.0-rc01

13 de novembro de 2024

Use a versão estável 1.5.0.

Versão 1.5.0-beta01

30 de outubro de 2024

Use a versão estável 1.5.0.

Versão 1.5.0-alpha01

10 de setembro de 2024

Use a versão estável 1.5.0.

Versão 1.4.0

Versão 1.4.1

27 de agosto de 2024

Lançamento de androidx.media3:media3-*:1.4.1. A versão 1.4.1 contém estes commits.

  • ExoPlayer:
    • Processar callbacks de pré-carregamento de forma assíncrona em PreloadMediaSource (#1568).
    • Permitir a reprodução, independente da duração do buffer, quando o carregamento falhar (#1571).
  • Extratores:
    • MP3: correção do erro Searched too many bytes ao ignorar corretamente os dados finais que não são MP3 com base no campo de duração em um frame Info (#1480).
  • Texto:
    • TTML: correção do processamento de valores percentuais de tts:fontSize para garantir que sejam herdados corretamente de nós pai com valores percentuais de tts:fontSize.
    • Correção de IndexOutOfBoundsException em LegacySubtitleUtil devido ao tratamento incorreto do caso em que o horário de início da saída solicitado é maior ou igual ao horário do evento final no Subtitle (#1516).
  • DRM:
    • Correção do erro android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE em dispositivos com API 31 ou mais recente que reproduzem conteúdo L1 Widevine. Esse erro é causado por uma implementação incompleta do método MediaDrm.requiresSecureDecoder do framework (#1603).
  • Efeito:
    • Adicione um método release() a GlObjectsProvider.
  • Sessão:
    • Transforme um toque duplo de KEYCODE_HEADSETHOOK em uma ação de "buscar o próximo", conforme documentado (#1493).
    • Trate KEYCODE_HEADSETHOOK como um comando "play" em MediaButtonReceiver ao decidir se ele deve ser ignorado para evitar um ForegroundServiceDidNotStartInTimeException (#1581).
  • Extensão RTSP:
    • As descrições de mídia inválidas são ignoradas na análise de SDP (#1087).

Versão 1.4.0

25 de julho de 2024

Lançamento de androidx.media3:media3-*:1.4.0. A versão 1.4.0 contém estes commits.

  • Biblioteca comum:
    • Encaminhamento de chamadas de busca presumidas sem operação para os métodos protegidos BasePlayer.seekTo() e SimpleBasePlayer.handleSeek() em vez de ignorá-las. Se você estiver implementando esses métodos em um player personalizado, talvez seja necessário processar essas chamadas adicionais com mediaItemIndex == C.INDEX_UNSET.
    • Remoção da dependência de compilação na simplificação aprimorada do Java 8 (#1312).
    • Verifique se a duração transmitida para MediaItem.Builder.setImageDurationMs() é ignorada para um MediaItem que não é de imagem (conforme documentado).
    • Adicione Format.customData para armazenar informações personalizadas fornecidas pelo app sobre instâncias de Format.
  • ExoPlayer:
    • Adição de BasePreloadManager, que coordena o pré-carregamento de várias fontes com base nas prioridades definidas por rankingData. É possível personalizar estendendo essa classe. Adicione DefaultPreloadManager, que usa PreloadMediaSource para pré-carregar amostras de mídia das origens na memória, e usa um número inteiro rankingData que indica o índice de um item na interface.
    • Adicionamos PlayerId à maioria dos métodos de LoadControl para que as implementações de LoadControl ofereçam suporte a vários jogadores.
    • Buffer.isDecodeOnly() e C.BUFFER_FLAG_DECODE_ONLY foram removidos. Não é necessário definir essa flag, porque os renderizadores e decodificadores decidem pular buffers com base no carimbo de data/hora. As implementações personalizadas de Renderer precisam verificar se o tempo de intervalo é de pelo menos BaseRenderer.getLastResetPositionUs() para decidir se uma amostra precisa ser mostrada. As implementações personalizadas de SimpleDecoder podem verificar isAtLeastOutputStartTimeUs(), se necessário, ou marcar outros buffers com DecoderOutputBuffer.shouldBeSkipped para ignorá-los.
    • Permita que um valor nulo seja retornado por TargetPreloadStatusControl.getTargetPreloadStatus(T) para indicar que não é necessário pré-carregar um MediaSource com o rankingData fornecido.
    • remove(MediaSource) foi adicionada a BasePreloadManager.
    • Adicione reset() a BasePreloadManager para liberar todas as fontes de retenção enquanto mantém a instância do gerenciador de pré-carregamento.
    • Adição de ExoPlayer.setPriority() (e Builder.setPriority()) para definir o valor de prioridade usado em PriorityTaskManager e para a importância do MediaCodec da API 35.
    • Correção do problema com a atualização do último tempo de rebuffer, que resultava em uma chave bs (falta de buffer) incorreta no CMCD (#1124).
    • Adicione PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) para indicar que a fonte foi carregada até o fim. Isso permite que as implementações de DefaultPreloadManager e de PreloadMediaSource.PreloadControl personalizadas pré-carreguem a próxima fonte ou realizem outras ações.
    • Correção de um bug em que pular o silêncio no final dos itens podia acionar uma exceção de reprodução.
    • Adicione clear a PreloadMediaSource para descartar o período de pré-carregamento.
    • Adição do novo código de erro PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, que é usado quando os recursos do codec são recuperados para tarefas de maior prioridade.
    • Permitir que o AdsMediaSource carregue anúncios precedentes antes que a preparação inicial da mídia de conteúdo seja concluída (#1358).
    • Correção de um bug em que a reprodução era movida para STATE_ENDED ao preparar novamente uma transmissão ao vivo DASH de vários períodos depois que o período original já havia sido removido do manifesto.
    • onTimelineRefreshed() foi renomeado como onSourcePrepared(), e onPrepared() foi renomeado como onTracksSelected() em PreloadMediaSource.PreloadControl. Renomeie também os IntDefs em DefaultPreloadManager.Stage de acordo.
    • Adição de suporte experimental para programação dinâmica para alinhar melhor o trabalho com os ciclos de ativação da CPU e atrasar a ativação até que os renderizadores possam progredir. Para ativar esse recurso, use experimentalSetDynamicSchedulingEnabled() ao configurar a instância do ExoPlayer.
    • Adição do Renderer.getDurationToProgressUs(). Um Renderer pode implementar esse método para retornar ao ExoPlayer a duração que a reprodução precisa avançar para que o renderizador progrida. Se ExoPlayer for definido com experimentalSetDynamicSchedulingEnabled(), ExoPlayer vai chamar esse método ao calcular o tempo para programar a tarefa de trabalho.
    • Adição de MediaCodecAdapter#OnBufferAvailableListener para alertar quando os buffers de entrada e saída estiverem disponíveis para uso por MediaCodecRenderer. O MediaCodecRenderer vai sinalizar o ExoPlayer ao receber esses callbacks e, se o ExoPlayer estiver definido com experimentalSetDynamicSchedulingEnabled(), o ExoPlayer vai programar o loop de trabalho conforme os renderizadores avançarem.
    • Use a classe de dados para métodos LoadControl em vez de parâmetros individuais.
    • Adicione ExoPlayer.isReleased() para verificar se Exoplayer.release() foi chamado.
    • Adição de ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() para configurar a posição máxima em que seekToPrevious() busca o item anterior (#1425).
    • Correção de algumas inconsistências de foco de áudio, por exemplo, não informar a perda de foco total ou temporária enquanto o player está pausado (link em inglês).
    • Correção de um possível IndexOutOfBoundsException causado por extratores que informam outras faixas após a etapa de preparação inicial (#1476).
    • Effects em ExoPlayer.setVideoEffect() vai receber as marcações de tempo com o deslocamento do renderizador removido (#1098).
    • Correção de um possível IllegalArgumentException ao processar um erro do player que ocorreu ao ler antecipadamente outro item da playlist (#1483).
  • Transformador:
    • Adicione audioConversionProcess e videoConversionProcess a ExportResult, indicando como a respectiva faixa no arquivo de saída foi criada.
    • As verificações de nível H.264 da otimização de corte foram flexibilizadas.
    • Adicionamos suporte para alternar entre mídia de entrada SDR e HDR em uma sequência.
    • Adição de suporte a efeitos de áudio no nível da composição.
    • Adição de suporte para transcodificar imagens Ultra HDR em vídeos HDR.
    • Correção de um problema em que o DefaultAudioMixer não gera a quantidade correta de bytes depois de ser redefinido e reutilizado.
    • Contornamos um bug do decodificador em que o número de canais de áudio era limitado ao estéreo ao processar a entrada PCM.
    • Ao selecionar faixas em ExoPlayerAssetLoader, ignore as restrições de contagem de canais de áudio, já que elas se aplicam apenas à reprodução.
    • Substitua a interface androidx.media3.transformer.Muxer por androidx.media3.muxer.Muxer e remova androidx.media3.transformer.Muxer.
    • Correção do carregamento de imagens HEIC de esquemas de URI de conteúdo. (#1373).
    • Ajuste a duração da faixa de áudio em AudioGraphInput para melhorar a sincronização de áudio e vídeo.
    • Remover o campo ExportResult.processedInputs. Se você usar esse campo para detalhes do codec, use DefaultDecoderFactory.listener. No caso de uma exceção de codec, os detalhes do codec estarão disponíveis no ExportException.codecInfo.
  • Extratores:
    • MPEG-TS: avance a mudança que garante que o último frame seja renderizado transmitindo a última unidade de acesso de um stream para a fila de amostras (#7909). Incorporação de correções para resolver os problemas que surgiram em streams HLS somente de frame I(#1150) e streams HLS H.262 (#1126).
    • MP3: prefira o tamanho dos dados de um frame Info ao tamanho informado pelo stream de base (por exemplo, tamanho do arquivo ou cabeçalho HTTP Content-Length). Isso ajuda a excluir dados de trailer não reproduzíveis (por exemplo, arte do álbum) dos cálculos de busca de taxa de bits constante, tornando as buscas mais precisas (#1376).
    • MP3: use a contagem de frames e outros dados em um frame Info (se houver) para calcular uma taxa de bits média para busca de taxa de bits constante, em vez de extrapolar da taxa de bits do frame após o frame Info, que pode ser artificialmente pequena, por exemplo, frame PCUT (link em inglês).
    • Correção da extração do formato de áudio PCM em contêineres AVI.
  • Áudio:
    • Correção dos atributos de codificação do DTS:X Profile 2 para reprodução de passagem (#1299).
    • Para reprodução descarregada, redefina o campo de rastreamento para conclusão do stream em DefaultAudioSink antes de chamar AudioTrack.stop() para que AudioTrack.StreamEventCallback#onPresentationEnded identifique corretamente quando todos os dados pendentes forem reproduzidos.
    • Correção de um bug em SilenceSkippingAudioProcessor em que as transições entre diferentes formatos de áudio (por exemplo, estéreo para mono) podem fazer com que o processador gere uma exceção (#1352).
    • Implemente MediaCodecAudioRenderer.getDurationToProgressUs() para que o ExoPlayer programe dinamicamente o loop de trabalho principal para quando o MediaCodecAudioRenderer puder progredir.
  • Vídeo:
    • Correção do problema em que Listener.onRenderedFirstFrame() chega muito cedo ao alternar superfícies durante a reprodução.
    • Correção da lógica de substituição do decodificador para Dolby Vision para usar um decodificador AV1 compatível, se necessário (#1389).
    • Correção da exceção de codec que pode ser causada pela ativação de um renderizador de vídeo durante a reprodução.
  • Texto:
    • Correção de um problema em que as legendas que começavam antes de uma posição de busca eram puladas. Esse problema foi introduzido apenas no Media3 1.4.0-alpha01.
    • Mudança do comportamento padrão de análise de legendas para que ela ocorra durante a extração, e não durante a renderização. Consulte o diagrama de arquitetura do ExoPlayer para entender a diferença entre extração e renderização.
      • Essa mudança pode ser substituída chamando ambos MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) e TextRenderer.experimentalSetLegacyDecodingEnabled(true). Consulte a documentação sobre personalização para saber como conectar esses componentes a uma instância do ExoPlayer. Esses métodos (e todo o suporte para decodificação de legendas legadas) serão removidos em uma versão futura.
      • Os apps com implementações personalizadas de SubtitleDecoder precisam ser atualizados para implementar SubtitleParser (e SubtitleParser.Factory em vez de SubtitleDecoderFactory).
    • PGS: a decodificação de comprimento de execução foi corrigida para resolver 0 como um índice de cor, em vez de um valor de cor literal (#1367).
    • CEA-708: ignorar o valor rowLock. A especificação CEA-708-E S-2023 afirma que rowLock e columnLock precisam ser considerados verdadeiros, independentemente dos valores presentes no stream. O suporte a columnLock não está implementado, então ele é considerado sempre falso.
      • Isso foi incluído originalmente nas notas da versão 1.3.0-alpha01, mas a mudança foi revertida acidentalmente antes da versão 1.3.0-rc01. Isso já foi corrigido, então a mudança está presente novamente.
    • CEA-708: evita que novas linhas duplicadas sejam adicionadas pelo processamento simples do ExoPlayer do comando "set pen location" (#1315).
    • Correção de um IllegalArgumentException de LegacySubtitleUtil quando uma amostra de legenda WebVTT não contém dicas, por exemplo, como parte de uma transmissão DASH (link nº 1516).
  • Metadados:
    • Correção do mapeamento de MP4 para tags de classificação ID3. Anteriormente, as tags MP4 "classificação do álbum" (soal), "classificação do artista" (soar) e "classificação do artista do álbum" (soaa) eram mapeadas incorretamente para as tags ID3 TSO2, TSOA e TSOP (#1302).
    • Correção da leitura de tags numéricas MP4 (/iTunes) gnre (gênero) e tmpo (tempo) quando o valor tem mais de um byte.
    • Propagação do frame ID3 TCON para MediaMetadata.genre (#1305).
  • Imagem:
    • Adição de suporte a grades de miniaturas DASH não quadradas (#1300).
    • Adição de suporte a AVIF para a API 34+.
    • Permitir null como parâmetro para ExoPlayer.setImageOutput() para limpar um ImageOutput definido anteriormente.
  • DataSource:
    • Implemente suporte para URIs de recursos brutos android.resource://package/id, em que package é diferente do pacote do aplicativo atual. Isso não estava documentado anteriormente, mas é uma maneira mais eficiente de acessar recursos em outro pacote do que pelo nome.
    • Verifique se url não é nulo nos construtores DataSpec. Esse parâmetro já foi anotado como não nulo.
    • Permitir que ByteArrayDataSource resolva um URI para uma matriz de bytes durante open(), em vez de ser codificado na construção (#1405).
  • DRM:
    • Permitir a configuração de um LoadErrorHandlingPolicy em DefaultDrmSessionManagerProvider (#1271).
  • Efeito:
    • Suporte a várias mudanças de velocidade no mesmo EditedMediaItem ou Composition em SpeedChangeEffect.
    • Suporte para saída HLG e PQ de entrada de bitmap Ultra HDR.
    • Adição de suporte para EGL_GL_COLORSPACE_BT2020_HLG_EXT, que melhora a saída de superfície HLG em ExoPlayer.setVideoEffect e na SurfaceView de depuração do Transformer.
    • Atualizamos a implementação da matriz de sobreposição para que ela seja consistente com a documentação, invertendo os valores x e y aplicados em setOverlayFrameAnchor(). Se estiver usando OverlaySettings.Builder.setOverlayFrameAnchor(), inverta os valores x e y multiplicando-os por -1.
    • Correção do bug em que o TimestampWrapper falhava quando usado com ExoPlayer#setVideoEffects (#821).
    • Mudar o espaço de trabalho de cores SDR padrão de cores lineares para vídeo elétrico BT 709 SDR. Também forneça uma terceira opção para manter o espaço de cores original.
    • Permitir a definição de ordem z indeterminada de EditedMediaItemSequences (#1055).
    • Manter um intervalo de luminância consistente em diferentes partes do conteúdo HDR (usa o intervalo HLG).
    • Adição de suporte a sobreposições Ultra HDR (bitmap) em conteúdo HDR.
    • Permite que os efeitos de SeparableConvolution sejam usados antes da API 26.
    • Remova o OverlaySettings.useHdr não utilizado, já que o intervalo dinâmico da sobreposição e do frame precisam ser iguais.
    • Adição de suporte a HDR para TextOverlay. A luminância da sobreposição de texto pode ser ajustada com OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Extensão de IMA:
    • Promover a API necessária para que os apps reproduzam streams de anúncios de DAI para estável.
    • Adição de replaceAdTagParameters(Map <String, String>) a ImaServerSideAdInsertionMediaSource.AdLoader, que permite substituir parâmetros de tag de anúncio no ambiente de execução.
    • Correção de um bug em que VideoAdPlayer.VideoAdPlayerCallback.onError() não era chamado quando ocorria um erro do player durante a reprodução do anúncio (#1334).
    • O SDK do IMA foi movido para a versão 3.33.0 para corrigir um NullPointerException ao usar URIs de tag de anúncio data:// (#700).
  • Sessão:
    • Mude o padrão de CommandButton.enabled para true e garanta que o valor possa permanecer falso para os controladores, mesmo que o comando associado esteja disponível.
    • Adição de constantes de ícone para CommandButton que precisam ser usadas em vez de recursos de ícone personalizados.
    • Adição de MediaSessionService.isPlaybackOngoing() para permitir que os apps consultem se o serviço precisa ser interrompido em onTaskRemoved() (#1219).
    • Adicione MediaSessionService.pauseAllPlayersAndStopSelf(), que permite pausar a reprodução de todas as sessões e chamar stopSelf() para encerrar o ciclo de vida do MediaSessionService.
    • Substitua MediaSessionService.onTaskRemoved(Intent) para fornecer uma implementação padrão segura que mantenha o serviço em execução em primeiro plano se a reprodução estiver em andamento ou interrompa o serviço caso contrário.
    • Ocultar a barra de busca na notificação de mídia para transmissões ao vivo, não definindo a duração nos metadados de sessão da plataforma (#1256).
    • Alinhar a conversão de MediaMetadata para MediaDescriptionCompat para usar a mesma ordem e lógica preferenciais ao selecionar propriedades de metadados como em media1.
    • Adição de MediaSession.sendError(), que permite enviar erros não fatais ao controlador do Media3. Ao usar o controlador de notificações (consulte MediaSession.getMediaNotificationControllerInfo()), o erro personalizado é usado para atualizar o PlaybackState da sessão da plataforma para um estado de erro com as informações de erro fornecidas (#543).
    • Adicione MediaSession.Callback.onPlayerInteractionFinished() para informar às sessões quando uma série de interações do player de um controlador específico for concluída.
    • Adicione SessionError e use-o em SessionResult e LibraryResult em vez do código do erro para fornecer mais informações sobre o erro e como resolvê-lo, se possível.
    • Publicar o código do app de teste do controlador do Media3, que pode ser usado para testar interações com apps que publicam uma sessão de mídia.
    • Propagar extras transmitidos para o MediaSession[Builder].setSessionExtras() do media3 para o PlaybackStateCompat.getExtras() de um controlador do media1.
    • Mapeie erros fatais e não fatais de e para a sessão da plataforma. Um PlaybackException é mapeado para um estado de erro fatal do PlaybackStateCompat. Um SessionError enviado ao controlador de notificação de mídia com MediaSession.sendError(ControllerInfo, SessionError) é mapeado para um erro não fatal em PlaybackStateCompat, o que significa que o código do erro e a mensagem são definidos, mas o estado da sessão da plataforma permanece diferente de STATE_ERROR.
    • Permitir que a atividade da sessão seja definida por controlador para substituir a atividade global da sessão. A atividade da sessão pode ser definida para um controlador no momento da conexão criando um ConnectionResult com AcceptedResultBuilder.setSessionActivivty(PendingIntent). Depois de conectada, a atividade da sessão pode ser atualizada com MediaSession.setSessionActivity(ControllerInfo, PendingIntent).
    • Melhoria na replicação de erros de chamadas para MediaLibrarySession.Callback. Agora é possível configurar a replicação de erros usando MediaLibrarySession.Builder.setLibraryErrorReplicationMode() para escolher o tipo de erro ou desativar a replicação de erros, que está ativada por padrão.
  • Interface:
    • Adição de suporte à exibição de imagens ao PlayerView quando conectado a um ExoPlayer (#1144).
    • Adicionamos a personalização de vários ícones em PlayerControlView usando atributos XML para permitir diferentes drawables por instância de PlayerView, em vez de substituições globais (#1200).
    • Foi corrigido um bug da plataforma que causava vídeos esticados/cortados ao usar SurfaceView dentro de um AndroidView do Compose na API 34 (#1237).
  • Downloads:
    • Garantimos que o DownloadHelper não vaze instâncias não lançadas de Renderer, o que pode resultar em uma falha do app com IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Extensão Cronet:
    • Correção de SocketTimeoutException em CronetDataSource. Em algumas versões do Cronet, a solicitação fornecida pelo callback nem sempre é a mesma. Isso faz com que o callback não seja concluído e a solicitação expire (https://issuetracker.google.com/328442628).
  • Extensão HLS:
    • Correção de um bug em que amostras de EMSG pendentes que aguardavam uma descontinuidade eram delegadas em HlsSampleStreamWrapper com um deslocamento incorreto, causando um IndexOutOfBoundsException ou um IllegalArgumentException (#1002).
    • Correção de um bug em que playlists não primárias continuavam sendo recarregadas para streams LL-HLS (#1240).
    • Correção de um bug em que a ativação do CMCD para HLS com segmentos de inicialização resultava em Source Error e IllegalArgumentException.
    • Correção do bug em que as playlists não principais não eram atualizadas durante a reprodução ao vivo (#1240).
    • Correção de um bug em que a ativação do CMCD para transmissões ao vivo HLS causava ArrayIndexOutOfBoundsException (#1395).
  • Extensão DASH:
    • Correção do bug em que a nova preparação de uma transmissão ao vivo de vários períodos pode gerar uma IndexOutOfBoundsException (#1329).
    • Adição de suporte a URLs de licença dashif:Laurl (#1345).
  • Extensão do Google Cast:
    • Correção do bug que convertia o título do álbum do MediaQueueItem para o artista no item de mídia do Media3 (#1255).
  • Utilitários de teste:
    • Implemente onInit() e onRelease() em FakeRenderer.
    • Mudança nos métodos TestPlayerRunHelper.runUntil()/playUntil() para falhar em erros não fatais (por exemplo, aqueles informados ao AnalyticsListener.onVideoCodecError()). Use a nova cadeia de métodos TestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX() para desativar esse comportamento.
  • App de demonstração:
    • Use DefaultPreloadManager no app de demonstração de formato curto.
    • Permitir a configuração do modo de repetição com argumentos Intent na linha de comando (#1266).
    • Use HttpEngineDataSource como HttpDataSource quando houver suporte do dispositivo.
  • Símbolos descontinuados foram removidos:
    • Remoção de CronetDataSourceFactory. Use CronetDataSource.Factory.
    • Alguns construtores DataSpec foram removidos. Use DataSpec.Builder.
    • O método setContentTypePredicate(Predicate) foi removido de DefaultHttpDataSource, OkHttpDataSource e CronetDataSource. Em vez disso, use o método equivalente em cada XXXDataSource.Factory.
    • Os construtores OkHttpDataSource e OkHttpDataSourceFactory foram removidos. Em vez disso, use OkHttpDataSource.Factory.
    • O PlayerMessage.setHandler(Handler) foi removido. Use setLooper(Looper).
    • Remover o campo Timeline.Window.isLive. Use o método isLive().
    • Os construtores DefaultHttpDataSource foram removidos. Use DefaultHttpDataSource.Factory
    • O DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS foi removido. Use DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
    • O MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean) foi removido. Use MediaCodecInfo.canReuseCodec(Format, Format).
    • Os métodos DrmSessionManager.DUMMY e getDummyDrmSessionManager() foram removidos. Em vez disso, use DrmSessionManager.DRM_UNSUPPORTED.
    • Remova AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). Use as sobrecargas que usam um DecoderReuseEvaluation.
    • Remoção de RendererSupport.FormatSupport IntDef e das constantes FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE e FORMAT_UNSUPPORTED_TYPE. Use o IntDef equivalente e as constantes em androidx.media3.common.C (por exemplo, C.FORMAT_HANDLED).
    • Remova a interface Bundleable. Isso inclui remover todos os campos constantes Bundleable.Creator<Foo> CREATOR. Os autores de chamada precisam usar os métodos Bundle toBundle() e static Foo fromBundle(Bundle) em cada tipo.

Versão 1.4.0-rc01

10 de julho de 2024

Use a versão estável 1.4.0.

Versão 1.4.0-beta01

26 de junho de 2024

Use a versão estável 1.4.0.

Versão 1.4.0-alpha02

7 de junho de 2024

Use a versão estável 1.4.0.

Versão 1.4.0-alpha01

17 de abril de 2024

Use a versão estável 1.4.0.

Versão 1.3.0

Versão 1.3.1

11 de abril de 2024

Lançamento de androidx.media3:media3-*:1.3.1. A versão 1.3.1 contém estas confirmações.

  • Biblioteca comum:
    • Adicione Format.labels para permitir rótulos localizados ou alternativos.
  • ExoPlayer:
    • Correção de um problema em que o PreloadMediaPeriod não conseguia reter os streams quando era pré-carregado novamente.
    • Aplique o TrackSelectionResult correspondente correto ao período de reprodução na nova seleção de faixa.
    • Inicie renderizadores ativados antecipadamente somente após avançar o período de reprodução ao fazer a transição entre itens de mídia (#1017).
    • Adição do tipo de retorno ausente à regra -keepclasseswithmembers do ProGuard para DefaultVideoFrameProcessor.Factory.Builder.build() (#1187).
  • Transformador:
    • Adicionamos uma solução alternativa para a exceção gerada porque o MediaMuxer não oferece suporte a carimbos de data/hora de apresentação negativos antes da API 30.
  • Seleção de faixas:
    • DefaultTrackSelector: prioriza faixas de vídeo com um frame rate "razoável" (>=10 fps) em relação àquelas com um frame rate menor ou não definido. Isso garante que o player selecione a faixa de vídeo "real" em MP4s extraídos de fotos com movimento que podem conter duas faixas HEVC, em que uma tem uma resolução mais alta, mas um número muito pequeno de frames (#1051).
  • Extratores:
    • Correção de um problema em que o padding não era ignorado ao ler blocos de tamanho ímpar de arquivos WAV (#1117).
    • MP3: preencha Format.averageBitrate com base em frames de metadados, como XING e VBRI.
    • MPEG-TS: foi revertida uma mudança que tinha como objetivo garantir que o último frame fosse renderizado ao transmitir a última unidade de acesso de um stream para a fila de amostras (link em inglês#7909). Isso ocorre porque a mudança causa novos problemas com streams HLS somente de frame I (#1150) e streams HLS H.262 (#1126).
  • Áudio:
    • Permitir a recuperação do renderizador desativando o descarregamento se a faixa de áudio não for inicializada no modo de descarregamento.
  • Vídeo:
    • Adicionamos uma solução alternativa para um problema no Galaxy Tab S7 FE, no Chromecast com Google TV e no Lenovo M10 FHD Plus que faz com que as transmissões H265 de 60 qps sejam marcadas como incompatíveis.
    • Adição de uma solução alternativa que garante que o primeiro frame seja sempre renderizado durante o tunelamento, mesmo que o dispositivo não faça isso automaticamente, conforme exigido pela API (#1169). (#966).
    • Correção do problema em que o processamento de informações de cores HDR causava um comportamento inadequado do codec e impedia mudanças de formato adaptável para faixas de vídeo SDR (#1158).
  • Texto:
    • WebVTT: evitamos que indicações consecutivas criem instâncias CuesWithTiming falsas adicionais de WebvttParser.parse (link em inglês).
  • DRM:
    • Contornamos um NoSuchMethodError que pode ser gerado pelo framework MediaDrm em vez de ResourceBusyException ou NotProvisionedException em alguns dispositivos Android 14 (#1145).
  • Efeito:
    • Melhoria no mapeamento de tons de PQ para SDR com a conversão de espaços de cores.
  • Sessão:
    • Correção do problema em que a posição atual volta quando o controlador substitui o item atual (#951).
    • Correção do problema em que MediaMetadata com apenas extras não nulo não é transmitido entre controladores de mídia e sessões (#1176).
  • Interface:
    • O nome do idioma da faixa de áudio é usado como substituto se o Locale não conseguir identificar um nome de exibição (#988).
  • Extensão DASH:
    • Preenchimento de todos os elementos Label do manifesto em Format.labels (#1054).
  • Extensão RTSP:
    • Os valores de informações de sessão vazios (i-tags) são ignorados na análise de SDP (#1087).
  • Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • Desativar a extensão MIDI como uma dependência local por padrão, porque ela requer a configuração de um repositório Maven adicional. Os usuários que precisam desse módulo de uma dependência local podem reativá-lo.

Versão 1.3.0

6 de março de 2024

Lançamento de androidx.media3:media3-*:1.3.0. A versão 1.3.0 contém estes commits.

  • Biblioteca comum:
    • Implemente suporte para URIs de recursos brutos android.resource://package/[type/]name em que package é diferente do pacote do aplicativo atual. Isso sempre foi documentado para funcionar, mas não foi implementado corretamente até agora.
    • Normaliza os tipos MIME definidos pelo código do app ou lidos da mídia para que fiquem totalmente em letras minúsculas.
    • Defina anúncios com um MediaItem completo em vez de um único Uri em AdPlaybackState.
    • Aumente minSdk para 19 (Android KitKat). Isso está alinhado com todas as outras bibliotecas do AndroidX e é necessário para que possamos fazer upgrade para as versões mais recentes das nossas dependências do AndroidX.
    • Preencha artworkUri e artworkData em MediaMetadata.Builder.populate(MediaMetadata) quando pelo menos um deles não for nulo (#964).
  • ExoPlayer:
    • Adição de PreloadMediaSource e PreloadMediaPeriod, que permitem que os apps pré-carreguem uma fonte de mídia de conteúdo em uma posição inicial específica antes da reprodução. O PreloadMediaSource cuida da preparação da fonte de mídia de conteúdo para receber o Timeline, preparando e armazenando em cache o período na posição inicial especificada, selecionando faixas e carregando dados de mídia para o período. Os apps controlam o progresso do pré-carregamento implementando PreloadMediaSource.PreloadControl e definem a origem pré-carregada para o player para reprodução.
    • Adição de ExoPlayer.setImageOutput, que permite que os apps definam ImageRenderer.ImageOutput.
    • O DefaultRenderersFactory agora fornece um ImageRenderer ao player por padrão com ImageOutput e ImageDecoder.Factory.DEFAULT nulos.
    • Emita o evento Player.Listener.onPositionDiscontinuity quando o silêncio for pulado (#765).
    • Adição de suporte experimental para analisar legendas durante a extração. É possível ativar isso usando MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Oferecer suporte a fontes de mídia adaptáveis com PreloadMediaSource.
    • Implemente HttpEngineDataSource, um HttpDataSource que usa a API HttpEngine.
    • Evite a subclasse CompositeSequenceableLoader. Esse componente foi tornado extensível anteriormente, mas nunca foi subclassificado na biblioteca. As personalizações podem ser feitas envolvendo uma instância usando o padrão decorador e implementando um CompositeSequenceableLoaderFactory personalizado.
    • Correção do problema em que repetir o mesmo horário faz com que os metadados desse item sejam apagados (#1007).
    • Os métodos experimentalSetSubtitleParserFactory em BundledChunkExtractor.Factory e DefaultHlsExtractorFactory foram renomeados como setSubtitleParserFactory, e a transmissão de null foi proibida. Use os novos métodos experimentalParseSubtitlesDuringExtraction(boolean) para controlar o comportamento de análise.
    • Adicionamos suporte para personalizar o SubtitleParser.Factory usado durante a extração. Isso pode ser feito com MediaSource.Factory.setSubtitleParserFactory().
    • Adicione o prefixo de origem a todos os campos Format.id gerados de MergingMediaSource. Isso ajuda a identificar qual origem produziu um Format (#883).
    • Correção da regex usada para validar nomes de chaves personalizados de dados comuns do cliente de mídia (CMCD, na sigla em inglês) modificando-a para verificar apenas o hífen (#1028).
    • Os parâmetros de consulta CMCD não são mais codificados duas vezes (#1075).
  • Transformador:
    • Adicionamos suporte para nivelar vídeos em câmera lenta H.265/HEVC SEF.
    • Aumentamos a velocidade de transmuxing, especialmente para edições de "remover vídeo".
    • Adicionamos uma API para garantir que o arquivo de saída comece em um frame de vídeo. Isso pode tornar a saída das operações de corte mais compatível com implementações de player que não mostram o primeiro frame do vídeo até o carimbo de data/hora da apresentação (#829).
    • Adicionamos suporte para otimizar as operações de corte de MP4 de um único recurso.
    • Adição de suporte para garantir que um frame de vídeo tenha o primeiro carimbo de data/hora no arquivo de saída. Correção de arquivos de saída que começam com um frame preto em players baseados em iOS (link em inglês).
  • Seleção de faixas:
    • Adicione DefaultTrackSelector.selectImageTrack para ativar a seleção de faixa de imagem.
    • Adicione TrackSelectionParameters.isPrioritizeImageOverVideoEnabled para determinar se uma faixa de imagem será selecionada quando uma faixa de imagem e uma faixa de vídeo estiverem disponíveis. O valor padrão é false, o que significa que a seleção de uma faixa de vídeo é priorizada.
  • Extratores:
    • Adição de mais análise de AV1C ao extrator de MP4 para recuperar os valores ColorInfo.colorSpace, ColorInfo.colorTransfer e ColorInfo.colorRange (#692).
    • MP3: use a busca de taxa de bits constante (CBR, na sigla em inglês) para arquivos com um cabeçalho Info (o equivalente em CBR do cabeçalho Xing). Antes, usávamos a tabela de busca do cabeçalho Info, mas isso resulta em uma busca exata menos precisa do que se a ignorarmos e presumirmos que o arquivo é CBR.
    • MPEG2-TS: adição de suporte a DTS, DTS-LBR e DTS:X Profile2 (#275).
    • Extraia tipos de áudio de descritores TS e os mapeie para sinalizações de função, permitindo que os usuários façam seleções de faixas de áudio mais informadas (#973).
  • Áudio:
    • Melhoria do algoritmo de pulo de silêncio com rampa de volume suave, silêncio mínimo retido e durações de silêncio mais naturais (#7423).
    • O silêncio ignorado é informado de forma mais determinista (link em inglês).
  • Vídeo:
    • Mude o construtor MediaCodecVideoRenderer que usa um argumento VideoFrameProcessor.Factory e o substitua por um construtor que usa um argumento VideoSinkProvider. Os apps que querem injetar um VideoFrameProcessor.Factory personalizado podem instanciar um CompositingVideoSinkProvider que usa o VideoFrameProcessor.Factory personalizado e transmitir o provedor de coletor de vídeo para MediaCodecVideoRenderer.
  • Texto:
    • Correção da serialização de marcações de bitmap para resolver o erro Tried to marshall a Parcel that contained Binder objects ao usar DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • CEA-708: ignorar o valor rowLock. A especificação CEA-708-E S-2023 afirma que rowLock e columnLock precisam ser considerados verdadeiros, independentemente dos valores presentes no stream. O suporte a columnLock não está implementado, então ele é considerado sempre falso.
  • Imagem:
    • Adição de suporte a miniaturas DASH. As imagens da grade são cortadas, e as miniaturas individuais são fornecidas ao ImageOutput perto dos horários de apresentação.
  • DRM:
    • Reproduza amostras não criptografadas de "clear lead" em conteúdo de DRM imediatamente por padrão, mesmo que as chaves para as amostras criptografadas posteriores ainda não estejam prontas. Isso pode levar a interrupções no meio da reprodução se as chaves ainda não estiverem prontas quando a posição de reprodução alcançar as amostras criptografadas (mas, antes, a reprodução não teria começado de jeito nenhum até esse ponto). Esse comportamento pode ser desativado com MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey ou DefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
      • Extensão de IMA:
    • Correção de um problema em que anúncios DASH e HLS sem a extensão de arquivo adequada não podiam ser reproduzidos.
  • Sessão:
    • A detecção de clique duplo foi desativada para apps de TV (link em inglês nº 962).
    • Correção de um problema em que MediaItem.RequestMetadata com extras não nulos não é transmitido entre controladores de mídia e sessões.
    • Adição de um construtor a MediaLibrarySession.Builder que usa apenas um Context em vez de um MediaLibraryService.
  • Extensão HLS:
    • Reduza HlsMediaPeriod para a visibilidade privada do pacote. Esse tipo não pode ser dependente diretamente de fora do pacote HLS.
    • As buscas no início de um segmento são resolvidas de forma mais eficiente (#1031).
  • Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • Decodificador MIDI: as mensagens de evento SysEx foram ignoradas (#710).
  • Utilitários de teste:
    • Não pausar a reprodução em TestPlayerRunHelper.playUntilPosition. O teste mantém a reprodução em um estado de reprodução, mas suspende o progresso até que seja possível adicionar declarações e outras ações.
  • App de demonstração:
    • Adicione um módulo de demonstração de formato curto para demonstrar o uso de PreloadMediaSource com o caso de uso de conteúdo de formato curto.

Versão 1.3.0-rc01

22 de fevereiro de 2024

Use a versão estável 1.3.0.

Versão 1.3.0-beta01

7 de fevereiro de 2024

Use a versão estável 1.3.0.

Versão 1.3.0-alpha01

15 de janeiro de 2024

Use a versão estável 1.3.0.

Versão 1.2.0

Versão 1.2.1

9 de janeiro de 2024

  • ExoPlayer:
    • Correção de um problema em que as buscas manuais fora do intervalo LiveConfiguration.min/maxOffset continuavam ajustando o deslocamento de volta para min/maxOffset.
    • Correção do problema em que os layouts de canal OPUS e VORBIS estavam incorretos para 3, 5, 6, 7 e 8 canais (#8396).
    • Foi corrigido um problema em que as seleções de faixa após a busca por zero em uma transmissão ao vivo permitiam incorretamente que a transmissão começasse na posição padrão (#9347, link em inglês).
    • Correção do problema em que novas instâncias de CmcdData.Factory recebiam valores negativos para bufferedDurationUs de fontes de blocos, resultando em um IllegalArgumentException (#888).
  • Transformador:
    • Contornamos um problema em que o codificador era gerado no momento da configuração devido à definição de uma alta taxa de operação.
  • Extratores:
    • Marque as faixas HEVC secundárias (não reproduzíveis) em fotos com movimento JPEG como ROLE_FLAG_ALTERNATE para evitar que sejam selecionadas automaticamente para reprodução devido à resolução mais alta.
    • Correção da detecção incorreta de frames-chave para streams TS H264 (#864).
    • Correção da estimativa de duração de streams de TS com mais de 47.721 segundos (#855).
  • Áudio:
    • Correção do processamento de EOS para SilenceSkippingAudioProcessor quando chamado várias vezes (#712).
  • Vídeo:
    • Adicionamos uma solução alternativa para um problema de dispositivo no Galaxy Tab S7 FE, no Chromecast com Google TV e no Lenovo M10 FHD Plus que faz com que streams AVC de 60 fps sejam marcados como incompatíveis (#693).
  • Metadados:
    • Correção de um bug em que MediaMetadata era preenchido apenas com comentários do Vorbis com chaves em maiúsculas (#876).
    • Captura de OutOfMemoryError ao analisar frames ID3 muito grandes, o que significa que a reprodução pode continuar sem as informações da tag, em vez de falhar completamente.
  • DRM:
    • Estendemos a solução alternativa para o URL de licença https://default.url espúrio do ClearKey para a API 33+ (antes, a solução alternativa só era aplicada na API 33) (#837).
    • Correção de ERROR_DRM_SESSION_NOT_OPENED ao alternar de conteúdo criptografado para conteúdo limpo sem uma superfície anexada ao player. O erro ocorreu devido ao uso incorreto de um decodificador seguro para reproduzir o conteúdo sem criptografia.
  • Sessão:
    • Coloque as chaves e os valores personalizados em MediaMetadataCompat para MediaMetadata.extras e MediaMetadata.extras para MediaMetadataCompat (#756, #802).
    • Correção da transmissão de notifyChildrenChanged para controladores legados (#644).
    • Correção de um bug em que a definição de um tempo negativo para um timer setWhen desativado da notificação causava uma falha em alguns dispositivos (#903).
    • Correção de IllegalStateException quando o controlador de notificação de mídia não conclui a conexão quando a primeira atualização de notificação é solicitada (#917).
  • Interface:
    • Correção de um problema em que os botões de avançar e voltar não ficavam visíveis quando usados com o Material Design em um BottomSheetDialogFragment (#511).
    • Correção de um problema em que os números no botão de avanço rápido do PlayerControlView estavam desalinhados (#547).
  • Extensão DASH:
    • Análise de "f800" como contagem de canais de 5 para Dolby no manifesto DASH (#688).
  • Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • MIDI: correção do problema em que a busca para frente pulava os eventos de mudança de programa (#704).
    • Migre para o FFmpeg 6.0 e atualize o NDK compatível para r26b (#707, #867).
  • Extensão do Google Cast:
    • A criação de um Timeline foi limpa para não causar falhas no app quando o carregamento de mídia falhar no dispositivo de transmissão (#708).

Versão 1.2.0

15 de novembro de 2023

  • Biblioteca comum:
    • Adicione um parâmetro @Nullable Throwable aos métodos na interface Log.Logger. O parâmetro message desses métodos não contém mais informações sobre o Throwable transmitido aos métodos Log.{d,i,w,e}(). Portanto, as implementações precisarão anexar manualmente essas informações, se desejado (possivelmente usando Logger.appendThrowableString(String, Throwable)).
    • Correção de um problema de compatibilidade do Kotlin em que parâmetros de tipo genérico anuláveis e tipos de elementos de matriz anuláveis não são detectados como anuláveis. Exemplos são os parâmetros de método TrackSelectorResult e SimpleDecoder (#6792).
    • Mudar a interface padrão e o comportamento de notificação em Util.shouldShowPlayButton para mostrar um botão "Reproduzir" enquanto a reprodução estiver temporariamente suprimida (por exemplo, devido à perda temporária de foco de áudio). O comportamento legado pode ser mantido usando PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) ou MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Fazer upgrade de androidx.annotation:annotation-experimental para 1.3.1 para corrigir https://issuetracker.google.com/251172715.
    • Mova ExoPlayer.setAudioAttributes para a interface Player.
  • ExoPlayer:
    • Correção de problemas de busca em streams AC4 causados pela não identificação correta de amostras somente de decodificação (#11000).
    • Adição da supressão de reprodução em dispositivos de saída de áudio inadequados (por exemplo, o alto-falante integrado em dispositivos Wear OS) quando esse recurso é ativado usando ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. O motivo da supressão da reprodução será atualizado como Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT se houver uma tentativa de reprodução quando não houver saídas de áudio adequadas disponíveis ou se todas as saídas adequadas forem desconectadas durante a reprodução. O motivo da supressão será removido quando uma saída adequada for conectada.
    • Adicione MediaSource.canUpdateMediaItem e MediaSource.updateMediaItem para aceitar atualizações de MediaItem após a criação usando Player.replaceMediaItem(s).
    • Permitir atualizações de MediaItem para todas as classes MediaSource fornecidas pela biblioteca usando Player.replaceMediaItem(s) (#33, #9978).
    • O MimeTypes.TEXT_EXOPLAYER_CUES foi renomeado como MimeTypes.APPLICATION_MEDIA3_CUES.
    • Adicione PngExtractor que envia e lê um arquivo PNG inteiro no TrackOutput como uma amostra.
    • Melhoria do método SequenceableLoader.continueLoading(long) na interface SequenceableLoader para SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo contém parâmetros adicionais, incluindo playbackSpeed e lastRebufferRealtimeMs, além do playbackPositionUs.
    • Melhoria do método ChunkSource.getNextChunk(long, long, List, ChunkHolder) na interface ChunkSource para ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Adição de mais campos à geração de registros de dados comuns do cliente de mídia (CMCD, na sigla em inglês): falta de buffer (bs), prazo (dl), velocidade do vídeo (pr) e inicialização (su) (#8699).
    • Adição de profundidade de bits de luma e croma a ColorInfo (#491).
    • Adição de mais campos à geração de registros de dados comuns do cliente de mídia (CMCD, na sigla em inglês): próxima solicitação de objeto (nor) e próxima solicitação de intervalo (nrr) (#8699).
    • Adição de funcionalidade para transmitir dados de Common Media Client Data (CMCD) usando parâmetros de consulta (#553).
    • Correção de ConcurrentModificationException em ExperimentalBandwidthMeter (#612).
    • Adição do parâmetro MediaPeriodId a CompositeMediaSource.getMediaTimeForChildMediaTime.
    • Suporte a ClippingMediaSource (e outras fontes com ajustes de tempo de período/janela) em ConcatenatingMediaSource2 (#11226).
    • Mude BaseRenderer.onStreamChanged() para também receber um argumento MediaPeriodId.
  • Transformador:
    • Analisar dados de rotação EXIF para entradas de imagem.
    • O tipo de anotação TransformationRequest.HdrMode e as constantes associadas foram removidos. Use Composition.HdrMode e as constantes associadas.
    • Simplifique o OverlaySettings para corrigir problemas de rotação.
    • Os parâmetros frameRate e durationUs de SampleConsumer.queueInputBitmap foram alterados para TimestampIterator.
  • Seleção de faixas:
    • Adicione DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness para permitir ou proibir explicitamente a adaptação não integrada. O padrão permanece no comportamento atual de true.
  • Extratores:
    • MPEG-TS: garanta que o último frame seja renderizado transmitindo a última unidade de acesso de um stream para a fila de amostras (link em inglês#7909).
    • Correção de um erro de digitação ao determinar rotationDegrees. Mudança de projectionPosePitch para projectionPoseRoll (#461).
    • Remoção da suposição de que as instâncias de Extractor podem ser inspecionadas diretamente com instanceof. Se você quiser acesso ao ambiente de execução para os detalhes de implementação de um Extractor, primeiro chame Extractor.getUnderlyingInstance.
    • Adição do BmpExtractor.
    • Adição do WebpExtractor.
    • Adição do HeifExtractor.
    • Adição de suporte ao QuickTime clássico ao Mp4Extractor.
  • Áudio:
    • Adição de suporte para PCM big-endian de 24/32 bits em MP4 e Matroska e análise da codificação PCM para lpcm em MP4.
    • Adição de suporte para extrair áudio Vorbis em MP4.
    • Adição de AudioSink.getFormatOffloadSupport(Format), que recupera o nível de suporte de descarregamento que o coletor pode fornecer para o formato usando um DefaultAudioOffloadSupportProvider. Ele retorna o novo AudioOffloadSupport que contém isFormatSupported, isGaplessSupported e isSpeedChangeSupported.
    • Adição de AudioSink.setOffloadMode(), que configura o descarregamento no coletor de áudio. O padrão é 1 AudioSink.OFFLOAD_MODE_DISABLED.
    • A transferência pode ser ativada por meio de setAudioOffloadPreference em TrackSelectionParameters. Se a preferência definida for ativar, o dispositivo oferecer suporte ao descarregamento para o formato e a seleção de faixa for uma única faixa de áudio, o descarregamento de áudio será ativado.
    • Se audioOffloadModePreference for definido como AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, o DefaultTrackSelector vai selecionar apenas uma faixa de áudio e somente se o formato dela for compatível com o descarregamento. Se nenhuma faixa de áudio for compatível com o descarregamento, nenhuma faixa será selecionada.
    • Desativação do suporte sem interrupções para descarregamento em níveis da API anteriores ao 33 devido a um problema de posição de reprodução após a transição da faixa.
    • Remova o parâmetro enableOffload da assinatura do método DefaultRenderersFactory.buildAudioSink.
    • Remover o método DefaultAudioSink.Builder.setOffloadMode.
    • Remova o valor intdef DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Adição de suporte para metadados sem interrupções do Opus durante a reprodução de descarregamento.
    • Permitida a recuperação do renderizador desativando o descarregamento se houver falha na primeira gravação (#627).
    • Ative a programação de descarregamento por padrão para a reprodução descarregada somente de áudio.
    • Exclua ExoPlayer.experimentalSetOffloadSchedulingEnabled e AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • onExperimentalSleepingForOffloadChanged foi renomeado como onSleepingForOffloadChanged, e onExperimentalOffloadedPlayback foi renomeado como onOffloadedPlayback.
    • Mova as interfaces e definições de TrackSelectionParameters relacionadas ao modo de descarregamento de áudio para uma classe AudioOffloadPreferences interna.
    • Adicione callbacks onAudioTrackInitialized e onAudioTrackReleased a AnalyticsListener, AudioRendererEventListener e AudioSink.Listener.
    • Correção do problema de subfluxo do buffer de áudio do DTS Express (#650).
    • Foi corrigido o bug em que a verificação de recursos para E-AC3-JOC gera uma IllegalArgumentException (#677).
  • Vídeo:
    • Permitir que MediaCodecVideoRenderer use um VideoFrameProcessor.Factory personalizado.
    • Correção do bug em que o primeiro frame não podia ser renderizado se o stream de áudio começasse com carimbos de data/hora negativos (#291).
  • Texto:
    • O ExoplayerCuesDecoder foi removido. As faixas de texto com sampleMimeType = application/x-media3-cues agora são processadas diretamente por TextRenderer, sem precisar de uma instância SubtitleDecoder.
  • Metadados:
    • MetadataDecoder.decode não será mais chamado para amostras "somente decodificação", já que a implementação precisa retornar nulo de qualquer maneira.
  • Efeito:
    • Adicione VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>), que enfileira a entrada de bitmap por carimbo de data/hora.
    • Mude VideoFrameProcessor.registerInputStream() para que não seja de bloqueio. Os apps precisam implementar VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Os parâmetros frameRate e durationUs de VideoFrameProcessor.queueInputBitmap foram alterados para TimestampIterator.
  • Extensão de IMA:
    • Correção do bug em que uma transmissão ao vivo DASH de vários períodos que não é o primeiro item em uma playlist pode gerar uma exceção (#571).
    • Libere o StreamManager antes de chamar AdsLoader.destroy().
    • O SDK do IMA foi movido para a versão 3.31.0.
  • Sessão:
    • Defina o comportamento do serviço em primeiro plano de notificações como FOREGROUND_SERVICE_IMMEDIATE em DefaultMediaNotificationProvider (#167).
    • Uso apenas de android.media.session.MediaSession.setMediaButtonBroadcastReceiver() acima da API 31 para evitar problemas com a API descontinuada em dispositivos Samsung (#167).
    • Use o controlador de notificação de mídia como proxy para definir os comandos disponíveis e o layout personalizado usado para preencher a notificação e a sessão da plataforma.
    • Converter eventos de botão de mídia recebidos por MediaSessionService.onStartCommand() no Media3 em vez de encaminhá-los para a sessão da plataforma e de volta para o Media3. Com isso, o controlador de chamadas é sempre o controlador de notificações de mídia, e os apps podem reconhecer facilmente as chamadas que vêm da notificação da mesma forma em todos os níveis da API compatíveis.
    • Correção do bug em que MediaController.getCurrentPosition() não avançava quando conectado a uma MediaSessionCompat legada.
    • Adicione MediaLibrarySession.getSubscribedControllers(mediaId) para facilitar.
    • Substitua MediaLibrarySession.Callback.onSubscribe() para declarar a disponibilidade do ID pai em que o controlador se inscreve. Se for bem-sucedida, a assinatura será aceita e notifyChildrenChanged() será chamado imediatamente para informar o navegador (#561).
    • Adição do módulo de demonstração de sessão para o Automotive OS e ativação da demonstração de sessão para o Android Auto.
    • Não defina a fila da sessão do framework quando COMMAND_GET_TIMELINE não estiver disponível para o controlador de notificação de mídia. Com o Android Auto como o controlador do cliente lendo da sessão do framework, o botão queue na interface do Android Auto não é mostrado (#339).
    • Use DataSourceBitmapLoader por padrão em vez de SimpleBitmapLoader (#271, #327).
    • Adição de MediaSession.Callback.onMediaButtonEvent(Intent), que permite que os apps substituam o processamento de eventos padrão do botão de mídia.
  • Interface:
    • Adicione uma implementação de Player.Listener para dispositivos Wear OS que lide com a supressão de reprodução devido a Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT iniciando uma caixa de diálogo do sistema para permitir que o usuário conecte uma saída de áudio adequada (por exemplo, fones de ouvido com Bluetooth). O listener vai retomar automaticamente a reprodução se um dispositivo adequado for conectado dentro de um tempo limite configurável (o padrão é 5 minutos).
  • Downloads:
    • Declare o tipo de serviço em primeiro plano "data sync" para DownloadService para compatibilidade com o Android 14. Ao usar esse serviço, o app também precisa adicionar dataSync como foregroundServiceType no manifesto e adicionar a permissão FOREGROUND_SERVICE_DATA_SYNC (#11239).
  • Extensão HLS:
    • Atualize a playlist ao vivo do HLS com um intervalo calculado com base no último horário de início do carregamento, em vez do último horário de conclusão do carregamento (#663).
  • Extensão DASH:
    • Permitir vários identificadores DASH iguais no URL do modelo de segmento.
    • Adição de suporte experimental para analisar legendas durante a extração. Isso oferece melhor suporte para mesclar legendas sobrepostas, incluindo a resolução de oscilações ao fazer a transição entre segmentos de legenda. É possível ativar isso usando DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Extensão RTSP:
    • Correção de uma disputa que poderia levar a IndexOutOfBoundsException ao recorrer ao TCP ou ao travamento da reprodução em algumas situações.
    • Verifique o estado na configuração do RTSP ao retornar o estado de carregamento de RtspMediaPeriod (#577).
    • Ignoramos os métodos de solicitação RTSP personalizados no cabeçalho público de resposta de opções (#613).
    • Use o valor de tempo limite da resposta de configuração do RTSP no intervalo de tempo de envio de solicitações de opções de RTSP de atividade (#662).
  • Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • Lançamento do módulo decodificador MIDI, que oferece suporte à reprodução de arquivos MIDI padrão usando a biblioteca Jsyn para sintetizar áudio.
    • Adição de DecoderOutputBuffer.shouldBeSkipped para marcar diretamente os buffers de saída que não precisam ser apresentados. Essa é a opção recomendada em vez de C.BUFFER_FLAG_DECODE_ONLY, que será descontinuado.
    • Adição de Decoder.setOutputStartTimeUs e SimpleDecoder.isAtLeastOutputStartTimeUs para permitir que os decodificadores descartem amostras somente de decodificação antes do horário de início. Essa é a opção recomendada em vez de Buffer.isDecodeOnly, que será descontinuado.
    • Correção de um bug que publicava o artefato do decodificador MIDI no repositório Maven. O artefato foi renomeado como media3-exoplayer-midi (#734).
  • Extensão do Leanback:
    • Foi corrigido o bug em que a desativação de uma superfície podia causar uma ArithmeticException no código do Leanback (#617).
  • Utilitários de teste:
    • Tornar TestExoPlayerBuilder e FakeClock compatíveis com os testes de interface do Espresso e do Compose. Isso corrige um bug em que a reprodução avança de forma não determinística durante as interações de visualização do Espresso ou do Compose.
  • Símbolos descontinuados foram removidos:
    • Remova TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) e TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Use Composition.Builder.setHdrMode(int) e transmita o Composition para Transformer.start(Composition, String).
    • Remoção do método DownloadNotificationHelper.buildProgressNotification descontinuado. Use um método não descontinuado que use um parâmetro notMetRequirements.

Versão 1.2.0-rc01

1º de novembro de 2023

Use a versão estável 1.2.0.

Versão 1.2.0-beta01

19 de outubro de 2023

Use a versão estável 1.2.0.

Versão 1.2.0-alpha02

29 de setembro de 2023

Use a versão estável 1.2.0.

Versão 1.2.0-alpha01

17 de agosto de 2023

Use a versão estável 1.2.0.

Versão 1.1.0

Versão 1.1.1

16 de agosto de 2023

  • Biblioteca comum:
    • Remoção da dependência multidex adicionada acidentalmente de todos os módulos (#499).
  • ExoPlayer:
    • Correção de um problema em PlaybackStatsListener em que PlaybackStatss falsos são criados depois que a playlist é limpa.
    • Adição de mais campos à geração de registros de dados comuns de clientes de mídia (CMCD, na sigla em inglês): formato de streaming (sf), tipo de stream (st), versão (v), taxa de bits máxima (tb), duração do objeto (d), capacidade de processamento medida (mtp) e tipo de objeto (ot) (#8699).
  • Áudio:
    • Correção de um bug em que Player.getState() nunca fazia a transição para STATE_ENDED ao reproduzir arquivos muito curtos (#538).
  • Descarregamento de áudio:
    • Adicione as páginas de cabeçalho de ID e de comentário do Ogg ao bitstream para reprodução do Opus descarregado de acordo com a RFC 7845.
  • Vídeo:
    • H.265/HEVC: correção da análise de informações de imagens de referência de curto e longo prazo do SPS.
  • Texto:
    • CEA-608: mudamos a lógica de truncamento de dicas para considerar apenas o texto visível. Antes, o recuo e o deslocamento de tabulação eram incluídos ao limitar o tamanho da sugestão a 32 caracteres, o que estava tecnicamente correto de acordo com a especificação (#11019).
  • Extensão de IMA:
    • O SDK do IMA foi movido para a versão 3.30.3.
  • Sessão:
    • Adicione o layout personalizado ao estado do controlador e forneça um getter para acessá-lo. Quando o layout personalizado muda, MediaController.Listener.onCustomLayoutChanged é chamado. Os apps que querem enviar layouts personalizados diferentes para controladores Media3 diferentes podem fazer isso em MediaSession.Callback.onConnect usando um AcceptedResultBuilder para garantir que o layout personalizado esteja disponível para o controlador quando a conexão for concluída.
    • Correção de casos em que MediaLibraryServiceLegacyStub enviava um erro para um Result que não oferecia suporte a isso, o que produzia um UnsupportedOperationException (#78).
    • Correção da maneira como PlayerWrapper cria um VolumeProviderCompat determinando volumeControlType por comandos legados (COMMAND_ADJUST_DEVICE_VOLUME e COMMAND_SET_DEVICE_VOLUME) e novos comandos (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS e COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).

Versão 1.1.0

5 de julho de 2023

  • Biblioteca comum:
    • Adicionar motivo de supressão para rota de áudio inadequada e tocar quando estiver pronto mudar o motivo da supressão por muito tempo. (#15).
    • Adicione comandos ao Player:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Adição de métodos sobrecarregados ao Player que permitem aos usuários especificar flags de volume:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Adição de Builder para DeviceInfo e descontinuação do construtor atual.
    • Adicione DeviceInfo.routingControllerId para especificar o ID do controlador de roteamento para reproduções remotas.
    • Adição de Player.replaceMediaItem(s) como um atalho para adicionar e remover itens na mesma posição (#8046).
  • ExoPlayer:
    • Permita que o ExoPlayer controle os métodos de volume do dispositivo apenas se isso for explicitamente ativado. Use ExoPlayer.Builder.setDeviceVolumeControlEnabled para ter acesso a:
      • getDeviceVolume()
      • isDeviceMuted()
      • setDeviceVolume(int) e setDeviceVolume(int, int)
      • increaseDeviceVolume(int) e increaseDeviceVolume(int, int)
      • decreaseDeviceVolume(int) e decreaseDeviceVolume(int, int)
    • Adicionamos FilteringMediaSource, que permite filtrar os tipos de faixa disponíveis em um MediaSource.
    • Adição de suporte para incluir dados comuns do cliente de mídia (CMCD, na sigla em inglês) nas solicitações de saída dos formatos de streaming adaptável DASH, HLS e SmoothStreaming. Os campos br, bl, cid, rtp e sid foram incorporados (#8699). Estrutura da API e métodos de API:
      • A geração de registros de CMCD está desativada por padrão. Use MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) para ativá-la.
      • Todas as chaves são ativadas por padrão. Substitua CmcdConfiguration.RequestConfig.isKeyAllowed(String key) para filtrar as chaves que são registradas.
      • Substitua CmcdConfiguration.RequestConfig.getCustomData() para ativar o registro de chaves personalizadas.
    • Adição de uma ação ao manifesto da demonstração principal para facilitar a inicialização do app de demonstração com um arquivo *.exolist.json personalizado (#439).
    • Adicione ExoPlayer.setVideoEffects() para usar Effect durante a reprodução de vídeo.
    • Atualize SampleQueue para armazenar sourceId como um long em vez de um int. Isso muda as assinaturas dos métodos públicos SampleQueue.sourceId e SampleQueue.peekSourceId.
    • Adição de parâmetros aos métodos shouldStartPlayback e onTracksSelected de LoadControl que permitem associar esses métodos ao MediaPeriod relevante.
    • Mude a assinatura de ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>) adicionando um parâmetro de linha do tempo que contenha os períodos com os UIDs usados como chaves no mapa. Isso é necessário para evitar problemas de simultaneidade com transmissões ao vivo de vários períodos.
    • Descontinuação de EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) e BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Em vez disso, é possível chamar a variante dos métodos sem o mediaTimeOffsetUs. Mesmo para as variantes descontinuadas, o deslocamento não é mais adicionado a startTimeUs e endTimeUs dos objetos MediaLoadData que são enviados pelo despachante.
    • ExoTrackSelection.blacklist foi renomeado como excludeTrack, eisBlacklisted foi renomeado como isTrackExcluded.
    • Correção do comportamento inconsistente entre ExoPlayer.setMediaItem(s) e addMediaItem(s) quando chamados em uma playlist vazia.
  • Transformador:
    • O Transformer.Builder.setMediaSourceFactory(MediaSource.Factory) foi removido. Use ExoPlayerAssetLoader.Factory(MediaSource.Factory) e Transformer.Builder.setAssetLoaderFactory(AssetLoader.Factory).
    • O Transformer.startTransformation(MediaItem, ParcelFileDescriptor) foi removido.
    • Correção de um bug em que a transformação podia ficar travada (levando ao tempo limite do muxer) se o fim do stream de vídeo fosse sinalizado no momento em que um frame de entrada estava com o processamento pendente.
    • Consultar codecs usando MediaCodecList em vez de utilitários findDecoder/EncoderForFormat para ampliar o suporte.
    • Remoção da configuração de frame B em DefaultEncoderFactory porque ela não funciona em alguns dispositivos.
  • Seleção de faixas:
    • Adição de DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange, que é desativado por padrão. Quando ativado, o DefaultTrackSelector aciona uma nova seleção de faixa quando as capacidades do renderizador mudam.
  • Extratores:
    • Ogg: correção de um bug ao buscar em arquivos com longa duração (#391).
    • FMP4: correção de um problema em que TimestampAdjuster inicializa um deslocamento de carimbo de data/hora incorreto com o tempo de amostragem de metadados do átomo emsg (#356).
  • Áudio:
    • Correção do bug em que algumas reproduções falhavam quando o tunelamento estava ativado e AudioProcessors estava ativo, por exemplo, para corte sem intervalos (#10847).
    • Encapsule frames Opus em pacotes Ogg em reproduções diretas (descarregamento).
    • Extrapolar a posição atual durante o sono com a programação de descarregamento.
    • Adicione Renderer.release() e AudioSink.release() para liberar os recursos no final do ciclo de vida do player.
    • Detecte mudanças nos recursos de áudio em DefaultAudioSink. Adicione um parâmetro obrigatório context no construtor de DefaultAudioSink, com o qual o DefaultAudioSink vai se registrar como o listener do AudioCapabilitiesReceiver e atualizar a propriedade audioCapabilities quando informado sobre uma mudança de recursos.
    • Propagar mudanças nos recursos de áudio usando um novo evento onAudioCapabilitiesChanged na interface AudioSink.Listener e uma nova interface RendererCapabilities.Listener que aciona eventos onRendererCapabilitiesChanged.
    • Adição de ChannelMixingAudioProcessor para aplicar dimensionamento/mixagem a canais de áudio.
    • Adicionamos um novo valor int DISCARD_REASON_AUDIO_BYPASS_POSSIBLE a DecoderDiscardReasons para descartar o decodificador de áudio quando o modo de desvio for possível após a mudança nos recursos de áudio.
    • Adição de suporte à reprodução direta para DTS Express e DTS:X (#335).
  • Vídeo:
    • Faça com que MediaCodecVideoRenderer informe um VideoSize com largura e altura de 0 quando o renderizador estiver desativado. Player.Listener.onVideoSizeChanged é chamado de acordo quando Player.getVideoSize() muda. Com essa mudança, o tamanho do vídeo do ExoPlayer com MediaCodecVideoRenderer tem largura e altura de 0 quando Player.getCurrentTracks não oferece suporte a vídeo ou o tamanho da faixa de vídeo com suporte ainda não foi determinado.
  • DRM:
    • Reduzimos a visibilidade de vários métodos somente internos em DefaultDrmSession que não devem ser chamados de fora do pacote de DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Adicionamos uma nova biblioteca de muxer que pode ser usada para criar um arquivo de contêiner MP4.
  • Extensão de IMA:
    • Ative as transmissões ao vivo DASH de vários períodos para a DAI. A implementação atual ainda não oferece suporte à busca em transmissões ao vivo (#10912).
    • Correção de um bug em que um novo grupo de anúncios é inserido em transmissões ao vivo porque a posição de conteúdo calculada em linhas do tempo consecutivas varia um pouco.
  • Sessão:
    • Adicione o método auxiliar MediaSession.getControllerForCurrentRequest para receber informações sobre o controlador que está chamando um método Player.
    • Adição de androidx.media3.session.MediaButtonReceiver para permitir que os apps implementem a retomada da reprodução com eventos de botão de mídia enviados, por exemplo, por um fone de ouvido Bluetooth (#167).
    • Adição da implementação padrão a MediaSession.Callback.onAddMediaItems para permitir que o MediaItems solicitado seja transmitido para Player se tiver LocalConfiguration (por exemplo, URI) (#282).
    • Adição dos botões de comando "buscar anterior" e "buscar próximo" na visualização compacta de notificação de mídia por padrão para o Android 12 e versões anteriores (#410).
    • Adição da implementação padrão a MediaSession.Callback.onAddMediaItems para permitir que o MediaItems solicitado seja transmitido para Player se tiver LocalConfiguration (por exemplo, URI) (#282).
    • Adição dos botões de comando "buscar anterior" e "buscar próximo" na visualização compacta de notificação de mídia por padrão para o Android 12 e versões anteriores (#410).
  • Interface:
    • Adição dos métodos utilitários shouldShowPlayButton e handlePlayPauseButtonAction para criar elementos de interface personalizados com um botão de tocar/pausar.
  • Extensão RTSP:
    • Para MPEG4-LATM, use o valor padrão de profile-level-id se ele estiver ausente na mensagem SDP de resposta de descrição (#302).
    • Use o URI de base para resolução de caminho relativo da sessão RTSP, se presente no cabeçalho de resposta DESCRIBE (#11160).
  • Extensão DASH:
    • Remoção do ajuste de tempo de mídia de MediaLoadData.startTimeMs e MediaLoadData.endTimeMs para streams DASH de vários períodos.
    • Correção de um bug em que a nova preparação de uma fonte de mídia DASH ao vivo de vários períodos produzia uma IndexOutOfBoundsException (#10838).
  • Extensão HLS:
    • Adicione HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) para definir um tempo limite para que a linha de execução de carregamento aguarde a inicialização do TimestampAdjuster. Se a inicialização não for concluída antes do tempo limite, uma PlaybackException será gerada para evitar que a reprodução seja interrompida indefinidamente. O tempo limite é definido como zero por padrão (#323).
  • Utilitários de teste:
    • Verifique se o esquema de URI não diferencia maiúsculas de minúsculas em DataSourceContractTest.
  • Símbolos descontinuados foram removidos:
    • Os construtores DefaultAudioSink foram removidos. Use DefaultAudioSink.Builder.
    • Remova HlsMasterPlaylist e use HlsMultivariantPlaylist.
    • O Player.stop(boolean) foi removido. Use Player.stop() e Player.clearMediaItems() (se reset for true).
    • Remoção de dois construtores SimpleCache descontinuados. Use um construtor não descontinuado que use um DatabaseProvider para melhorar o desempenho.
    • O construtor DefaultBandwidthMeter foi removido. Use DefaultBandwidthMeter.Builder.
    • Os construtores DefaultDrmSessionManager foram removidos. Use DefaultDrmSessionManager.Builder.
    • Remoção de dois construtores HttpDataSource.InvalidResponseCodeException descontinuados. Use um construtor não descontinuado que aceite campos adicionais(cause, responseBody) para melhorar o registro de erros.
    • Remova DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash e DownloadHelper.forSmoothStreaming e use DownloadHelper.forMediaItem.
    • Remoção do construtor DownloadService descontinuado. Use um construtor não descontinuado que inclua a opção de fornecer um parâmetro channelDescriptionResourceId.
    • Remova as constantes de string descontinuadas para Charsets (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME e UTF16LE_NAME). Use os Charsets do Kotlin do pacote kotlin.text, java.nio.charset.StandardCharsets ou com.google.common.base.Charsets.
    • Remoção do construtor WorkManagerScheduler descontinuado. Use um construtor não descontinuado que inclua a opção de fornecer um parâmetro Context.
    • Remoção dos métodos descontinuados createVideoSampleFormat, createAudioSampleFormat, createContainerFormat e createSampleFormat, que eram usados para instanciar a classe Format. Em vez disso, use Format.Builder para criar instâncias de Format.
    • Remova os métodos descontinuados copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate e copyWithVideoSize. Use Format.buildUpon() e métodos setter.
    • Remoção do ExoPlayer.retry() descontinuado. Use prepare().
    • O construtor DefaultTrackSelector de argumento zero descontinuado foi removido. Use DefaultTrackSelector(Context).
    • Remoção do construtor OfflineLicenseHelper descontinuado. Use OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Remoção do construtor DownloadManager descontinuado. Use o construtor que usa um Executor.
    • Os construtores Cue descontinuados foram removidos. Use Cue.Builder.
    • Remova o construtor OfflineLicenseHelper descontinuado e use OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Remoção de quatro métodos AnalyticsListener descontinuados:
      • onDecoderEnabled, use onAudioEnabled e/ou onVideoEnabled.
      • onDecoderInitialized, use onAudioDecoderInitialized e/ou onVideoDecoderInitialized.
      • onDecoderInputFormatChanged, use onAudioInputFormatChanged e/ou onVideoInputFormatChanged.
      • onDecoderDisabled, use onAudioDisabled e/ou onVideoDisabled.
    • Remova os elementos descontinuados Player.Listener.onSeekProcessed e AnalyticsListener.onSeekProcessed e use onPositionDiscontinuity com DISCONTINUITY_REASON_SEEK.
    • Remova ExoPlayer.setHandleWakeLock(boolean) e use setWakeMode(int).
    • Remova o DefaultLoadControl.Builder.createDefaultLoadControl() descontinuado e use build().
    • Remova o MediaItem.PlaybackProperties descontinuado e use MediaItem.LocalConfiguration. O campo descontinuado MediaItem.playbackProperties agora é do tipo MediaItem.LocalConfiguration.

Versão 1.1.0-rc01

21 de junho de 2023

Use a versão estável 1.1.0.

Versão 1.1.0-beta01

7 de junho de 2013

Use a versão estável 1.1.0.

Versão 1.1.0-alpha01

10 de maio de 2023

Use a versão estável 1.1.0.

Versão 1.0.0

Versão 1.0.2

18 de maio de 2023

Lançamento de androidx.media3:media3-*:1.0.2. A versão 1.0.2 contém estas confirmações.

Ela corresponde à versão do ExoPlayer 2.18.7.

Esta versão contém as seguintes mudanças desde a versão 1.0.1:

  • Biblioteca principal:
    • Adição de Buffer.isLastSample(), que indica se Buffer contém a flag C.BUFFER_FLAG_LAST_SAMPLE.
    • Correção do problema em que o último frame pode não ser renderizado se a última amostra com frames for removida da fila sem ler a amostra de "fim do stream". (#11079).
  • Extratores:
    • Correção da análise de H.265 SPS em arquivos MPEG-TS ao reutilizar a lógica de análise já usada pelos extratores RTSP e MP4 (#303).
  • Texto:
    • SSA: foi adicionado suporte para arquivos UTF-16 que começarem com uma marca de ordem de byte (#319).
  • Sessão:
    • Correção de um problema em que o MediaController não atualizava os comandos disponíveis quando conectado a um MediaSessionCompat legado que atualiza as ações.
    • Correção de um bug que impedia que o MediaLibraryService retornasse nulo para uma chamada da interface do sistema para Callback.onGetLibraryRoot com params.isRecent == true na API 30 (#355).
    • Correção do vazamento de memória de MediaSessionService ou MediaLibraryService (#346).
    • Correção de um bug em que uma atualização combinada de Timeline e posição em um MediaSession pode fazer com que um MediaController gere uma IllegalStateException.

Versão 1.0.1

18 de abril de 2023

Lançamento de androidx.media3:media3-*:1.0.1. A versão 1.0.1 contém estas confirmações.

Ela corresponde à versão 2.18.6 do ExoPlayer.

  • Biblioteca principal:
    • A substituição da transmissão ao vivo de destino é redefinida ao buscar a posição padrão (#11051).
    • Correção de um bug em que streams de amostra vazios na mídia podiam fazer com que a reprodução ficasse travada.
  • Sessão:
    • Correção de um bug em que vários itens de fila idênticos publicados por um MediaSessionCompat legado resultavam em uma exceção em MediaController (#290).
    • Adição do encaminhamento ausente de MediaSession.broadcastCustomCommand para o MediaControllerCompat.Callback.onSessionEvent legado (#293).
    • Correção de um bug em que chamar MediaSession.setPlayer não atualiza os comandos disponíveis.
    • Correção do problema em que as instâncias de TrackSelectionOverride enviadas de um MediaController eram ignoradas se fizessem referência a um grupo com Format.metadata (#296).
    • Correção do problema em que Player.COMMAND_GET_CURRENT_MEDIA_ITEM precisa estar disponível para acessar metadados pelo MediaSessionCompat legado.
    • Correção do problema em que as instâncias de MediaSession em uma linha de execução em segundo plano causam falhas quando usadas em MediaSessionService (#318).
    • Correção de um problema em que um receptor de botão de mídia era declarado pela biblioteca sem que o app pretendesse isso (#314).
  • DASH:
    • Correção do processamento de linhas do tempo de segmentos vazios (#11014).
  • RTSP:
    • Tente novamente com TCP se a configuração do RTSP com UDP falhar com o erro 461 do RTSP UnsupportedTransport (#11069).

Versão 1.0.0

22 de março de 2023

Lançamento de androidx.media3:media3-*:1.0.0. A versão 1.0.0 contém estas confirmações.

Ela corresponde à versão do ExoPlayer 2.18.5.

Não há mudanças desde a versão 1.0.0-rc02.

Versão 1.0.0-rc02

2 de março de 2023

Lançamento de androidx.media3:media3-*:1.0.0-rc02. A versão 1.0.0-rc02 contém estas confirmações.

Ela corresponde à versão do ExoPlayer 2.18.4.

  • Biblioteca principal:
    • Correção da detecção do tipo de rede na API 33 (#10970).
    • Correção de NullPointerException ao chamar ExoPlayer.isTunnelingEnabled (#10977).
  • Downloads:
    • Tornar a diferença máxima do horário de início de dois segmentos a serem mesclados configurável em SegmentDownloader e subclasses (#248).
  • Áudio:
    • Correção da reprodução de MP3 sem interrupções em dispositivos Samsung (#8594).
    • Correção do bug em que as velocidades de reprodução definidas imediatamente após a desativação do áudio podiam ser substituídas por uma mudança de velocidade anterior (#10882).
  • Vídeo:
    • Mapeie o formato HEVC HDR10 para HEVCProfileMain10HDR10 em vez de HEVCProfileMain10.
    • Adicionamos uma solução alternativa para um problema no Chromecast com Google TV e no Lenovo M10 FHD Plus que faz com que streams AVC de 60 qps sejam marcados como não compatíveis (#10898).
    • Correção de problemas de desempenho de liberação de frames ao reproduzir mídia com uma taxa de frames muito maior que a taxa de atualização da tela.
  • Transmitir:
    • Correção de STATE_IDLE temporário ao fazer a transição entre itens de mídia (#245).
  • RTSP:
    • Captura a IllegalArgumentException gerada na análise de mensagens de resposta Describe do RTSP inválidas (#10971).
  • Sessão:
    • Correção de um bug em que o botão de reproduzir/pausar da notificação não era atualizado com o estado do player (#192).
  • Extensão de IMA:
    • Correção de um bug que impedia o início de transmissões de DAI sem anúncios porque o primeiro evento LOADED (e, no caso sem anúncios, o único) não era recebido.

Versão 1.0.0-rc01

16 de fevereiro de 2023

Lançamento de androidx.media3:media3-*:1.0.0-rc01. A versão 1.0.0-rc01 contém estas confirmações.

Ela corresponde à versão do ExoPlayer 2.18.3.

  • Biblioteca principal:
    • Ajustar a lógica de ordem do decodificador do renderizador para manter as preferências do MediaCodecSelector, mesmo se um decodificador informar que não consegue reproduzir a mídia de maneira eficiente. Por exemplo, com o seletor padrão, o decodificador de hardware com suporte apenas funcional terá preferência ao decodificador de software que tem suporte total para o formato (10604, link em inglês).
    • Foi adicionado o ExoPlayer.Builder.setPlaybackLooper, que define uma linha de execução de reprodução existente para uma nova instância do ExoPlayer.
    • Isso permite que os auxiliares do gerenciador de download sejam apagados (10776, link em inglês).
    • Foi adicionado um parâmetro ao BasePlayer.seekTo para indicar o comando usado para a busca.
    • O tema é usado ao carregar drawables no nível 21 ou mais recente da API (220, link em inglês).
    • ConcatenatingMediaSource2 foi adicionado, o que permite combinar vários itens de mídia em uma única janela (247, link em inglês).
  • Extratores:
    • Uma ParserException é gerada em vez de NullPointerException se a tabela de amostras (stbl) estiver sem a descrição necessária (stsd) ao analisar os átomos da lixeira.
    • Amostras são puladas corretamente ao buscar um frame de sincronização em fMP4 diretamente (10941).
  • Áudio:
    • Use a taxa de bits do formato de áudio compactado para calcular o tamanho mínimo do buffer para AudioTrack em reproduções diretas (passagem).
  • Texto:
    • O TextRenderer, que transmitia um índice inválido (negativo) para Subtitle.getEventTime se um arquivo de legenda não contivesse dicas, foi corrigido.
    • SubRip: foi adicionado suporte para arquivos UTF-16 que começarem com uma marca de ordem de byte.
  • Metadados:
    • Análise de diversos valores separados por nulo de frames ID3, conforme permitido pelo ID3 v2.4.
    • MediaMetadata.mediaType foi adicionado para indicar o tipo de conteúdo ou de pasta descrito pelos metadados.
    • MediaMetadata.folderType foi substituído por MediaMetadata.isBrowsable. O tipo de pasta será descontinuado na próxima versão.
  • DASH:
    • Foi adicionada uma análise completa para conjuntos de adaptação de imagens, incluindo contagens de blocos (3752, link em inglês).
  • Interface:
    • O PlayerView.setControllerVisibilityListener(PlayerControlView.VisibilityListener) descontinuado foi corrigido para garantir que as mudanças de visibilidade sejam transmitidas ao listener registrado (229, link em inglês).
    • Correção da ordem dos controles do player central em PlayerView ao usar um layout da direita para a esquerda (RTL, na sigla em inglês) (227, link em inglês).
  • Sessão:
    • O abstrato SimpleBasePlayer foi adicionado para ajudar a implementar a interface Player para players personalizados.
    • O método auxiliar SessionToken foi adicionado para converter o token de sessão da plataforma em Media3 (171, link em inglês).
    • Uso de onMediaMetadataChanged para acionar atualizações da sessão de mídia da plataforma (219, link em inglês).
    • A sessão de mídia foi adicionada como argumento de getMediaButtons() do DefaultMediaNotificationProvider e usa listas imutáveis para maior clareza (216, link em inglês).
    • O listener de callback onSetMediaItems foi adicionado para fornecer meios de modificar/definir a lista MediaItem, iniciando o índice e a posição por sessão antes de definir no Player (156, link em inglês).
    • A detecção de toque duplo é evitada para eventos do botão de mídia que não são de Bluetooth (233, link em inglês).
    • Agora, a QueueTimeline é mais robusta em caso de um estado de sessão legado sombreado (241, link em inglês).
  • Metadados:
    • Análise de diversos valores separados por nulo de frames ID3, conforme permitido pelo ID3 v2.4.
    • MediaMetadata.mediaType foi adicionado para indicar o tipo de conteúdo ou de pasta descrito pelos metadados.
    • MediaMetadata.folderType foi substituído por MediaMetadata.isBrowsable. O tipo de pasta será descontinuado na próxima versão.
  • Extensão do Google Cast:
    • Atualização do SDK do Cast para a versão 21.2.0.
  • Extensão de IMA:
    • O listener do player foi removido do ImaServerSideAdInsertionMediaSource na linha de execução do app para evitar problemas.
    • Foi adicionada uma propriedade focusSkipButtonWhenAvailable ao ImaServerSideAdInsertionMediaSource.AdsLoader.Builder para solicitar o foco no botão "Pular" em dispositivos de TV e defini-lo como "true" por padrão.
    • Foi adicionado um método focusSkipButton() ao ImaServerSideAdInsertionMediaSource.AdsLoader para solicitar de maneira programática o foco no botão "Pular".
    • O SDK do IMA foi movido para a versão 3.29.0.
  • App de demonstração:
    • Agora é solicitada uma permissão para notificação de download durante a execução (10884, link em inglês).

Versão 1.0.0-beta03

22 de novembro de 2022

Lançamento de androidx.media3:media3-*:1.0.0-beta03. A versão 1.0.0-beta03 contém estas confirmações.

Ela corresponde à versão do ExoPlayer 2.18.2.

  • Biblioteca principal:
    • O ExoPlayer.isTunnelingEnabled foi adicionado para verificar se o encapsulamento está ativado para as faixas selecionadas no momento (#2518).
    • O WrappingMediaSource foi adicionado para simplificar o encapsulamento de um único MediaSource (#7279).
    • Descarte do buffer de retorno antes que a reprodução travasse devido à falta de memória.
    • Quando o descarregamento estiver ativado, o bloco de rastreamento "doSomeWork" será fechado.
    • Correção do problema de rastreamento de sessão com buscas rápidas no PlaybackStatsListener (#180).
    • O callback onMediaItemTransition ausente é enviado ao chamar seekToNext ou seekToPrevious em uma playlist de item único (#10667).
    • Novo Player.getSurfaceSize, que retorna o tamanho da superfície em que o vídeo é renderizado.
    • O bug em que a remoção de listeners durante a liberação do player poderia causar uma IllegalStateException (#10758) foi corrigido.
  • Build:
    • O compileSdkVersion mínimo foi aplicado para evitar erros de compilação (#10684).
    • Evite publicar o bloco quando estiver incluído em outro build do Gradle.
  • Seleção de faixas:
    • Uso de outras faixas no lugar de Dolby Vision caso não haja suporte para a exibição (#8944).
  • Downloads:
    • Correção de um possível loop infinito em ProgressiveDownloader causado por download e reprodução simultâneos com o mesmo PriorityTaskManager (#10570).
    • A notificação de download aparecerá imediatamente (#183).
    • A remoções de download paralelas foram limitadas a 1 para evitar a criação excessiva de linhas de execução (#10458).
  • Vídeo:
    • Caso não haja suporte para a tela, um decodificador alternativo para o Dolby Vision será utilizado (#9794).
  • Áudio:
    • SingleThreadExecutor será usado para liberar instâncias de AudioTrack e evitar erros de OutOfMemory ao liberar vários reprodutores ao mesmo tempo (#10057).
    • Novo AudioOffloadListener.onExperimentalOffloadedPlayback para o estado de descarga do AudioTrack (#134).
    • O AudioTrackBufferSizeProvider foi transformado em uma interface pública.
    • Novo ExoPlayer.setPreferredAudioDevice para definir o dispositivo de saída de áudio preferencial (#135).
    • O androidx.media3.exoplayer.audio.AudioProcessor foi renomeado como androidx.media3.common.audio.AudioProcessor.
    • O áudio dos canais 8 e 12 foi mapeado para as máscaras de canal 7.1 e 7.1.4, respectivamente, em todas as versões do Android (#10701).
  • Metadados:
    • Agora, MetadataRenderer pode ser configurado para renderizar metadados assim que eles estiverem disponíveis. Foi criada uma instância com MetadataRenderer(MetadataOutput, Looper, MetadataDecoderFactory, boolean) para especificar se o renderizador vai gerar metadados de saída antecipadamente ou em sincronia com a posição do reprodutor.
  • DRM:
    • Resolução de um bug na implementação da ClearKey no Android 13, que retorna um URL de licença não vazio, mas inválido.
    • Correção do erro setMediaDrmSession failed: session not opened ao alternar entre esquemas DRM em uma playlist, como mudar de Widevine para ClearKey.
  • Texto:
    • CEA-608: garante que os comandos de alternância do serviço no campo 2 sejam processados corretamente (#10666).
  • DASH:
    • Análise de EventStream.presentationTimeOffset dos manifestos (#10460).
  • Interface:
    • Uso de substituições atuais do reprodutor como predefinição em TrackSelectionDialogBuilder (#10429).
  • Sessão:
    • Os comandos serão sempre executados na ordem correta, mesmo se alguns precisarem de resolução assíncrona (#85).
    • DefaultMediaNotificationProvider.Builder foi adicionado para criar instâncias de DefaultMediaNotificationProvider. O builder pode configurar o ID de notificação, o ID do canal de notificação e o nome do canal de notificação usados pelo provedor. Além disso, foi incluído o novo método DefaultMediaNotificationProvider.setSmallIcon(int) para definir o ícone pequeno de notificações (#104).
    • Comandos enviados antes de MediaController.release() não são descartados (#99).
    • SimpleBitmapLoader pode carregar bitmaps de URIs file:// (#108).
    • A declaração que impede que MediaController busque um anúncio em um período foi corrigida (#122).
    • Quando a reprodução termina, o MediaSessionService é interrompido em primeiro plano e uma notificação é mostrada para reiniciar a reprodução do último item de mídia reproduzido (#112).
    • Serviços em primeiro plano não serão iniciados com uma intent pendente para pausa (#167).
    • O "selo" associado à notificação criada por DefaultNotificationProvider foi ocultado nas APIs 26 e 27. O selo é oculto automaticamente na API 28 e mais recentes (#131).
    • Correção do bug em que uma segunda conexão do binder de uma MediaSession legada para uma MediaController Media3 causava IllegalStateExceptions (#49).
  • RTSP:
    • Novo processamento de pacotes fragmentados H263 (#119).
    • Novo suporte a MP4A-LATM (#162).
  • IMA:
    • Inclusão de tempo limite para carregar informações do anúncio para lidar com casos em que o SDK do IMA travava ao carregar um anúncio (#10510).
    • Anúncios intermediários não são mais pulados ao buscar o final do conteúdo (#10685).
    • A duração da janela de transmissões ao vivo foi calculada corretamente com anúncios inseridos do lado do servidor, como DAI do IMA (#10764).
  • Extensão FFmpeg:
    • Novas flags necessárias foram adicionadas para vincular as bibliotecas do FFmpeg ao NDK 23.1.7779620 e versões mais recentes (#9933).
  • Extensão AV1:
    • A versão do CMake foi atualizada para evitar incompatibilidades com as versões mais recentes do Android Studio (#9933).
  • Extensão do Google Cast:
    • Implementação de getDeviceInfo() para poder identificar CastPlayer ao controlar a reprodução com um MediaController (#142).
  • Transformador:
    • Novo timer de watchdog do multiplexador para detectar quando a geração de uma amostra de saída é muito lenta.
  • Símbolos descontinuados foram removidos:
    • O Transformer.Builder.setOutputMimeType(String) foi removido. Esse recurso foi removido. O tipo MIME sempre será MP4 quando o multiplexador padrão for usado.

Versão 1.0.0-beta02

21 de julho de 2022

Lançamento de androidx.media3:media3-*:1.0.0-beta02. A versão 1.0.0-beta02 contém estas confirmações.

Ela corresponde à versão do ExoPlayer 2.18.1.

  • Biblioteca principal:
    • Garanta que mudar a ShuffleOrder com ExoPlayer.setShuffleOrder resulta em uma chamada para Player.Listener#onTimelineChanged com reason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED (#9889).
    • Para mídias progressivas, inclua apenas faixas selecionadas na posição em buffer (#10361).
    • Agora há um logger personalizado para toda a saída de registro do ExoPlayer (#9752).
    • Correção da implementação de setDataSourceFactory em DefaultMediaSourceFactory, que não funcionava em alguns casos (#116).
  • Extratores:
    • Correção da análise dos conjuntos de imagens de referência de curto prazo H265 (#10316).
    • Correção da análise de taxas de bits das caixas esds (#10381).
  • DASH:
    • Análise do URL da licença da ClearKey nos manifestos (#10246).
  • Interface:
    • Confirme se o TalkBack anuncia a opção de velocidade atualmente ativa no menu dos controles de mídia (#10298).
  • RTSP:
    • Adição do processamento de pacotes fragmentados VP8 (#110).
  • Extensão do Leanback:
    • Detecte mudanças no playWhenReady em LeanbackAdapter (10420).
  • Transmitir:
    • Use o MediaItem que foi transmitido aos métodos da playlist como Window.mediaItem na CastTimeline (#25, #8212).
    • Suporte a Player.getMetadata() e Listener.onMediaMetadataChanged() com CastPlayer (#25).

Versão 1.0.0-beta01

16 de junho de 2022

Lançamento de androidx.media3:media3-*:1.0.0-beta01. A versão 1.0.0-beta01 contém estas confirmações.

Ela corresponde à versão do ExoPlayer 2.18.0.

  • Biblioteca principal:
    • Suporte adicionado ao diagnóstico da plataforma Android pelo MediaMetricsManager. O ExoPlayer vai encaminhar os eventos de reprodução e os dados de desempenho para a plataforma, o que ajuda a fornecer informações de desempenho e depuração do sistema no dispositivo. Esses dados também poderão ser coletados pelo Google se o compartilhamento de dados de uso e diagnóstico for ativado pelo usuário do dispositivo. Os apps podem desativar a contribuição de diagnósticos da plataforma para o ExoPlayer com ExoPlayer.Builder.setUsePlatformDiagnostics(false).
    • Correção do bug em que as faixas eram redefinidas com muita frequência ao usar MergingMediaSource, por exemplo, ao carregar legendas e mudar a legenda intermediária selecionada (#10248).
    • O tipo de rede 5G-NSA nas APIs 29 e 30 não são mais detectados. Essas reproduções vão supor que é uma rede 4G.
    • null e MediaSource.Factory.setDrmSessionManagerProvider foram renomeados como MediaSource.Factory.setLoadErrorHandlingPolicy. As instâncias de DefaultDrmSessionManagerProvider e DefaultLoadErrorHandlingPolicy podem ser explicitamente transmitidas, se necessário.
    • MediaItem.RequestMetadata foi adicionado para representar os metadados necessários para reproduzir a mídia quando LocalConfiguration não for conhecido. MediaMetadata.mediaUrl também foi removido, porque agora ele está incluído em RequestMetadata.
    • Adicionamos Player.Command.COMMAND_SET_MEDIA_ITEM para que os jogadores possam permitir a configuração de um único item.
  • Seleção de faixas:
    • A classe TrackSelectionOverrides foi nivelada em TrackSelectionParameters, e TrackSelectionOverride foi promovida para uma classe de nível superior.
    • TracksInfo foi renomeado como Tracks, eTracksInfo.TrackGroupInfo foi renomeado como Tracks.Group. Player.getCurrentTracksInfo e Player.Listener.onTracksInfoChanged também foram renomeados como Player.getCurrentTracks e Player.Listener.onTracksChanged. Isso inclui o "cancelamento da descontinuação" do nome do método Player.Listener.onTracksChanged, mas com diferentes tipos de parâmetro.
    • DefaultTrackSelector.buildUponParameters e DefaultTrackSelector.Parameters.buildUpon foram alterados para retornar DefaultTrackSelector.Parameters.Builder em vez do DefaultTrackSelector.ParametersBuilder descontinuado.
    • Adicionado DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities, que é ativado por padrão. Quando ativado, o DefaultTrackSelector prefere faixas de áudio cuja contagem de canais não exceda aos recursos de saída do dispositivo. Em dispositivos portáteis, o DefaultTrackSelector tem preferência pelo formato estéreo/mono em vez de vários formatos de áudio multicanal, a menos que o formato multicanal possa ser espacializado (Android 12L+) ou o áudio está em um formato de som surround Dolby. Além disso, em dispositivos com suporte à espacialização de áudio, o DefaultTrackSelector monitora as mudanças nas propriedades Spatializer e aciona uma nova seleção de faixas. Dispositivos com um modo de interface de television não têm essas restrições, e o formato com a maior contagem de canais vai ter preferência.television Para ativar esse recurso, a instância DefaultTrackSelector precisa ser criada com um Context.
  • Vídeo:
    • DummySurface foi renomeado como PlaceholderSurface.
    • Adicionado suporte a AV1 ao MediaCodecVideoRenderer.getCodecMaxInputSize.
  • Áudio:
    • Use o decodificador de áudio LG AC3 anunciando o tipo MIME não padrão.
    • Tipo de retorno de AudioAttributes.getAudioAttributesV21() alterado de android.media.AudioAttributes para uma nova classe wrapper AudioAttributesV21. Assim, é possível evitar uma verificação lenta da ART na API anterior a 21.
    • Consulte a plataforma (API 29 ou mais recente) ou suponha a contagem de canais de codificação para passagem de áudio quando o formato da contagem de canais de áudio não estiver configurado, o que ocorre com a preparação sem separações em blocos do HLS (10204).
    • Configure a AudioTrack com a máscara de canal AudioFormat.CHANNEL_OUT_7POINT1POINT4 se o decodificador produzir áudio PCM de 12 canais (#10322).
  • DRM
    • Garanta que a sessão de DRM sempre seja atualizada corretamente ao pesquisar imediatamente após uma mudança de formato (10274).
  • Texto:
    • Player.getCurrentCues() foi alterado para retornar CueGroup em vez de List<Cue>.
    • SSA: adicionado suporte à configuração de estilo OutlineColour quando BorderStyle == 3, ou seja, a OutlineColour define o plano de fundo do sinal (#8435).
    • CEA-708: analisa dados em vários blocos de serviços e ignora os blocos não associados ao número de serviço selecionado.
    • O RawCcExtractor foi removido. Ele era usado apenas para processar um formato de legenda interno do Google.
  • Extratores:
    • Adição de suporte à AVI (#2092).
    • Matroska: analisa o DiscardPadding para faixas Opus.
    • MP4: analisa as taxas de bits de caixas de esds.
    • Ogg: permite o ID duplicado da Opus e os cabeçalhos de comentários (#10038).
  • Interface:
    • Corrigida a entrega de eventos para os OnClickListeners definidos em PlayerView caso useController=false (#9605). Também foi corrigida a entrega de eventos ao OnLongClickListener para todas as configurações de visualização.
    • Corrigido tratamento incorreto de uma sequência de eventos de toque que saem dos limites da PlayerView antes da ACTION_UP como um clique (#9861).
    • Corrigido problema de acessibilidade da PlayerView em que o toque podia alternar a reprodução em vez de ocultar os controles (#8627).
    • TrackSelectionView e TrackSelectionDialogBuilder foram reescritos para trabalhar com a interface Player em vez de ExoPlayer. Isso permite que as visualizações sejam usadas com outras implementações do Player e remove a dependência do módulo da interface para o módulo ExoPlayer. Essa é uma alteração interruptiva.
    • Não mostre faixas de texto forçadas no seletor de faixas da PlayerView e mantenha uma faixa de texto forçada adequada selecionada, se a opção "None" estiver selecionada (#9432).
  • DASH:
    • Analisada contagem de canais dos elementos de AudioChannelConfiguration do DTS. Isso reativa a passagem de áudio para fluxos do DTS (#10159).
    • A transmissão de null para DashMediaSource.Factory.setCompositeSequenceableLoaderFactory foi desativada. As instâncias de DefaultCompositeSequenceableLoaderFactory podem ser transmitidas explicitamente, se necessário.
  • HLS:
    • A preparação com separações em blocos é substituída se o atributo CODECS da playlist não tem o codec de áudio (#10065).
    • A transmissão de null para HlsMediaSource.Factory.setCompositeSequenceableLoaderFactory, HlsMediaSource.Factory.setPlaylistParserFactory e HlsMediaSource.Factory.setPlaylistTrackerFactory foi desativada. Instâncias de DefaultCompositeSequenceableLoaderFactory e DefaultHlsPlaylistParserFactory ou uma referência a DefaultHlsPlaylistTracker.FACTORY podem ser transmitidas explicitamente, se necessário.
  • Smooth Streaming:
    • A transmissão de null para SsMediaSource.Factory.setCompositeSequenceableLoaderFactory foi desativada. As instâncias de DefaultCompositeSequenceableLoaderFactory podem ser transmitidas explicitamente, se necessário.
  • RTSP:
    • Adição do leitor RTP para H263 (#63).
    • Adicionado leitor de RTP para MPEG4 (#35).
    • Adicionado leitor de RTP para HEVC (#36).
    • Adicionado leitor de RTP para AMR. Atualmente, há suporte apenas para os fluxos AMR de canal mono e não intercalados. Não há suporte para o payload de RTP do composto AMR (#46).
    • Adicionado leitor de RTP para VP8 (#47).
    • Adicionado leitor de RTP para WAV (#56).
    • Correção do cabeçalho de autorização básico do RTSP (#9544).
    • Os campos SDP obrigatórios não são mais verificados, porque o ExoPlayer não precisa deles (#10049).
    • Geradas exceções verificadas ao analisar o tempo do RTSP (#10165).
    • Adicionado leitor de RTP para VP9 (#47).
    • Adicionado do leitor de RTP para OPUS (#53).
  • Fontes de dados:
    • DummyDataSource foi renomeado como PlaceholderDataSource.
    • Foi criada uma solução alternativa de processamento para a interrupção OkHttp.
  • Sessão:
    • MediaSession.MediaItemFiller foi substituído por MediaSession.Callback.onAddMediaItems para permitir a resolução assíncrona de solicitações.
    • Suporte aos métodos setMediaItems(s) quando o MediaController se conecta a uma sessão de mídia legada.
    • MediaController.setMediaUri e MediaSession.Callback.onSetMediaUri foram removidos. A mesma funcionalidade pode ser encontrada em MediaController.setMediaItem e MediaSession.Callback.onAddMediaItems.
    • Encaminhamento de chamadas do MediaController legadas para reproduzir mídia para MediaSession.Callback.onAddMediaItems em vez de onSetMediaUri.
    • MediaNotification.Provider e DefaultMediaNotificationProvider foram adicionados para fornecer personalização das notificações.
    • BitmapLoader e SimpleBitmapLoader foram adicionados para fazer o download das imagens de arte.
    • Adicionamos MediaSession.setCustomLayout() para oferecer compatibilidade com versões anteriores da sessão legada.
    • MediaSession.setSessionExtras() foi adicionado para fornecer paridade de recursos com a sessão legada.
    • MediaSession.MediaSessionCallback foi renomeado como MediaSession.Callback, MediaLibrarySession.MediaLibrarySessionCallback como MediaLibrarySession.Callback, e MediaSession.Builder.setSessionCallback como setCallback.
    • Correção do NPE em MediaControllerImplLegacy (#59).
    • Atualizadas informações de posição da sessão ao realizar mudanças na linha do tempo (#51).
    • NPE foi corrigido em MediaControllerImplBase após o lançamento do controlador (#74).
  • Reprodução de anúncios / IMA:
    • A taxa de pesquisa de anúncio foi reduzida de cada 100 ms para cada 200 ms, de acordo com as recomendações do Media Rating Council (MRC).
  • Extensão FFmpeg:
    • Atualizada versão do CMake para 3.21.0+ para evitar um bug no CMake que causava falha na sincronização do Gradle do Android Studio (#9933).
  • Símbolos descontinuados foram removidos:
    • Remoção de Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). Use Player.Listener.onTracksChanged(Tracks).
    • REmoção de Player.getCurrentTrackGroups e Player.getCurrentTrackSelections. Use Player.getCurrentTracks. Também é possível continuar usando ExoPlayer.getCurrentTrackGroups e ExoPlayer.getCurrentTrackSelections, embora esses métodos permaneçam descontinuados.
    • As constantes DownloadHelper, DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT e DEFAULT_TRACK_SELECTOR_PARAMETERS foram removidas. Use getDefaultTrackSelectorParameters(Context) quando possível. Caso contrário, use DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT.
    • Construtor DefaultTrackSelector(ExoTrackSelection.Factory) foi removido. Use DefaultTrackSelector(Context, ExoTrackSelection.Factory).
    • Transformer.Builder.setContext foi removido. O Context precisa ser transmitido para o construtor Transformer.Builder.

Versão 1.0.0-alpha03

14 de março de 2022

Lançamento de androidx.media3:media3-*:1.0.0-alpha03. A versão 1.0.0-alpha03 contém estas confirmações.

Ela corresponde à versão 2.17.1 do ExoPlayer (link em inglês).

  • Áudio:
    • Os recursos de áudio de verificação de erro para Dolby Atmos (E-AC3-JOC) no HLS foram corrigidos.
  • Extratores:
    • FMP4: o problema em que os metadados de exemplo do emsg podem ser emitidos na ordem errada para streams contendo átomos emsg v0 e v1 foi corrigido (#9996, link em inglês).
  • Texto:
    • A interação de SingleSampleMediaSource.Factory.setTrackId e MediaItem.SubtitleConfiguration.Builder.setId foi corrigida para priorizar o campo SubtitleConfiguration e voltar ao valor da Factory se o campo não estiver definido (#10016, link em inglês).
  • Reprodução de anúncio:
    • Os underruns de áudio entre os períodos de anúncios em tempo real nos streams SSAI HLS foram corrigidos.

Versão 1.0.0-alpha02

2 de março de 2022

Lançamento de androidx.media3:media3-*:1.0.0-alpha02. A versão 1.0.0-alpha02 contém estas confirmações.

Ela corresponde à versão do ExoPlayer 2.17.0 (link em inglês).

  • Biblioteca principal:
    • Adicione o método protegido DefaultRenderersFactory.getCodecAdapterFactory() para que as subclasses da DefaultRenderersFactory que substituem os métodos buildVideoRenderers() ou buildAudioRenderers() possam acessar a fábrica do adaptador de codec e a transmitir para instâncias MediaCodecRenderer que eles criam.
    • Propague os campos de cabeçalho ICY name e genre para MediaMetadata.station e MediaMetadata.genre, respectivamente. Assim, eles chegam ao app via Player.Listener.onMediaMetadataChanged() (#9677, link em inglês).
    • As chaves nulas foram removidas de DefaultHttpDataSource#getResponseHeaders.
    • Quando a criação de uma instância do MediaCodec falhar, o dispositivo entra em suspensão e tenta novamente. Isso corrige um problema que ocorre em alguns dispositivos ao alternar uma superfície de um codec seguro para outro (#8696, link em inglês).
    • O método MediaCodecAdapter.getMetrics() foi adicionado para permitir que os usuários acessem os dados de métricas do MediaCodec (#9766, link em inglês).
    • A resolução da dependência do Maven foi corrigida (#8353, link em inglês).
    • O ajuste automático da velocidade foi desativado para transmissões ao vivo que não têm recursos de baixa latência nem uma solicitação do usuário que defina a velocidade (#9329, link em inglês).
    • DecoderCounters#inputBufferCount foi renomeado como queuedInputBufferCount.
    • Os SimpleExoPlayer.renderers agora são particulares. Os renderizadores podem ser acessados usando o ExoPlayer.getRenderer.
    • Atualização de alguns valores constantes das AnalyticsListener.EventFlags para corresponder aos valores nas Player.EventFlags.
    • O AnalyticsCollector foi dividido em uma interface e implementação padrão para permitir que ele seja removido pelo R8 se um app não precisar dele.
  • Seleção de faixas:
    • Suporte às sinalizações de vídeo preferidas na seleção de faixas (#9402, link em inglês).
    • A lógica de seleção de faixa de vídeo foi atualizada para que os tipos MIME e as sinalizações preferidos sejam considerados ao selecionar várias faixas de vídeo para adaptação (#9519, link em inglês).
    • A lógica de seleção de faixa de vídeo e áudio foi atualizada para escolher apenas formatos para seleções adaptáveis que têm o mesmo nível de suporte ao decodificador e ao hardware (#9565, link em inglês).
    • A lógica de seleção de faixa de vídeo foi atualizada para preferir codecs mais eficientes se vários oferecerem suporte aos decodificadores com aceleração de hardware principais (#4835, link em inglês).
    • As preferências de conteúdo de áudio são priorizadas, por exemplo, a faixa de áudio "padrão" ou uma faixa correspondente ao idioma da localidade do sistema, em vez de restrições técnicas de seleção de faixa, por exemplo, um tipo MIME preferido ou contagem máxima de canais.
    • O problema com a seleção de faixas em que a modificação de um grupo de faixas não desativava outros grupos do mesmo tipo foi corrigido (#9675, link em inglês).
    • Um problema com a seleção de faixa em que uma mistura das substituições de faixas não vazias e vazias não era aplicada corretamente foi corrigido (#9649, link em inglês).
    • TrackGroups duplicados são proibidos em uma TrackGroupArray. Os TrackGroups sempre podem ser distinguíveis definindo um id no construtor do TrackGroup. Isso corrige uma falha ao retomar a reprodução após colocar o app em segundo plano com uma substituição da faixa ativa (#9718, link em inglês).
    • A lógica na AdaptiveTrackSelection mudou para permitir um aumento da qualidade em uma largura de banda de rede suficiente, mesmo que a reprodução esteja muito próxima da extremidade ativa (#9784, link em inglês).
  • Vídeo:
    • A lógica de substituição do decodificador para Dolby Vision foi corrigida a fim de usar um decodificador H264/H265 compatível, se necessário.
  • Áudio:
    • A lógica de substituição do decodificador para Dolby Atmos (E-AC3-JOC) foi corrigida a fim de usar um decodificador E-AC3 compatível, se necessário.
    • As APIs AudioCapabilities foram alteradas para exigir a transmissão explícita de AudioCapabilities.DEFAULT_AUDIO_CAPABILITIES em vez de null.
    • A personalização do cálculo do tamanho do buffer da AudioTrack agora pode ser feita injetando um AudioTrackBufferSizeProvider no DefaultAudioSink (8891, link em inglês).
    • Tente criar a AudioTrack novamente se o tamanho do buffer solicitado for > 1 MB (9712, link em inglês).
  • Extratores:
    • WAV: foi adicionado suporte aos streams RF64 (#9543, link em inglês).
    • A análise incorreta de unidades H.265 SPS NAL foi corrigida (#9719, link em inglês).
    • Analise os comentários do Vorbis (incluindo METADATA_BLOCK_PICTURE) em arquivos Ogg Opus e Ogg Vorbis.
  • Texto:
    • Um campo MediaItem.SubtitleConfiguration.id, que é propagado para o campo Format.id da faixa de legenda criada com a configuração, foi adicionado (#9673, link em inglês).
    • Foi adicionado suporte básico para legendas WebVTT em contêineres Matroska (#9886, link em inglês).
    • O Cea708Decoder não pode ler mais do que o tamanho declarado de um bloco de serviços.
  • DRM:
    • O playbackLooper foi removido de DrmSessionManager.(pre)acquireSession Quando um DrmSessionManager é usado por um app em uma MediaSource personalizada, o playbackLooper precisa ser transmitido para DrmSessionManager.setPlayer.
  • Reprodução de anúncios / IMA:
    • Agora é possível usar a Inserção de anúncios dinâmicos do IMA (DAI) (#8213, link em inglês).
    • Um método foi adicionado ao AdPlaybackState para permitir a redefinição de um grupo de anúncios. Assim, ele pode ser reproduzido novamente (#9615, link em inglês).
    • A velocidade de reprodução de 1,0 é aplicada durante a reprodução do anúncio (#9018, link em inglês).
    • O problema em que um grupo de anúncios falhava ao carregar e causava uma redefinição imediata da reprodução foi corrigido (#9929, link em inglês).
  • Interface:
    • A cor dos números nos botões "Voltar" e "Avançar" da StyledPlayerView quando determinados temas são usados foi corrigida (#9765, link em inglês).
    • As strings da velocidade de reprodução agora são traduzidas corretamente (#9811, link em inglês).
  • DASH:
    • As propriedades essenciais e complementares analisadas foram adicionadas ao arquivo Representation (#9579, link em inglês).
    • Suporte ao papel da faixa forced-subtitle (#9727, link em inglês).
    • O papel da faixa main não é mais interpretado como C.SELECTION_FLAG_DEFAULT.
    • A lógica de exclusão de URL de base foi corrigida para manifestos que não declaram o namespace do DVB (#9856).
    • Suporte aos URLs MPD.Location relativos (#9939, link em inglês).
  • HLS:
    • O Format.label é preenchido corretamente para streams HLS somente de áudio (#9608, link em inglês).
    • Use a preparação sem separações em blocos por padrão para melhorar o tempo de inicialização. Se as renderizações contiverem faixas com legendas multiplexadas que não foram declaradas na playlist master, é preciso as adicionar à playlist master para que fiquem disponíveis para reprodução ou desativar a preparação sem separações em blocos com HlsMediaSource.Factory.setAllowChunklessPreparation(false).
    • Suporte à busca de frame de chave com precisão em HLS (#2882, link em inglês).
  • RTSP:
    • Uma API cliente é oferecida para substituir a SocketFactory usada para qualquer conexão com o servidor (#9606, link em inglês).
    • O método de autenticação DIGEST é usado em vez de BASIC se ambos estiverem presentes (#9800, link em inglês).
    • Gerencie quando o tempo de rastreamento RTSP não está disponível (#9775, link em inglês).
    • Os valores do cabeçalho das informações de RTP inválidos são ignorados (#9619, link em inglês).
  • Transformador:
    • A versão mínima necessária da API aumentou para 21.
    • A TransformationException agora é usada para descrever erros que ocorrem durante uma transformação.
    • A TransformationRequest foi adicionada para especificar as opções de transformação.
    • Agora, vários listeners podem ser registrados.
    • O travamento do transformador quando a saída do codec é parcialmente lida foi corrigido.
    • Uma possível NPE em Transformer.getProgress ao liberar a geração do multiplexador foi corrigida.
    • Um app de demonstração para aplicar transformações foi adicionado.
  • Extensão MediaSession:
    • Por padrão, o MediaSessionConnector agora limpa a playlist ao parar. Os apps que querem manter a playlist retida podem chamar setClearMediaItemsOnStop(false) no conector.
  • Extensão do Google Cast:
    • O bug que impedia o CastPlayer de chamar onIsPlayingChanged corretamente foi corrigido (#9792, link em inglês).
    • Foi adicionado suporte aos metadados de áudio, incluindo imagens com o DefaultMediaItemConverter (#9663, link em inglês).
  • Extensão FFmpeg:
    • O build_ffmpeg.sh agora depende dos utilitários de agrupamento do LLVM em vez dos utilitários do GNU (#9933, link em inglês).
  • Compatibilidade com o Android 12:
    • Upgrade da extensão do Google Cast para depender do com.google.android.gms:play-services-cast-framework:20.1.0. As versões anteriores do play-services-cast-framework não são compatíveis com apps destinados ao Android 12 e vão falhar com uma IllegalArgumentException ao criar PendingIntents (#9528, link em inglês).
  • Símbolos descontinuados foram removidos:
    • O Player.EventListener foi removido. Use Player.Listener.
    • MediaSourceFactory#setDrmSessionManager, MediaSourceFactory#setDrmHttpDataSourceFactory e MediaSourceFactory#setDrmUserAgent foram removidos. Use MediaSourceFactory#setDrmSessionManagerProvider.
    • O MediaSourceFactory#setStreamKeys foi removido. Use MediaItem.Builder#setStreamKeys
    • O MediaSourceFactory#createMediaSource(Uri) foi removido. Use MediaSourceFactory#createMediaSource(MediaItem)
    • O setTag foi removido de DashMediaSource, HlsMediaSource e SsMediaSource. Use MediaItem.Builder#setTag.
    • O DashMediaSource#setLivePresentationDelayMs(long, boolean) foi removido. Use MediaItem.Builder#setLiveConfiguration e MediaItem.LiveConfiguration.Builder#setTargetOffsetMs para substituir o manifesto ou DashMediaSource#setFallbackTargetLiveOffsetMs para fornecer um valor de substituição.
    • O (Simple)ExoPlayer.setThrowsWhenUsingWrongThread foi removido. Não é mais possível desativar a aplicação da linha de execução.
    • ActionFile e ActionFileUpgradeUtil foram removidos. Use o ExoPlayer 2.16.1 ou anterior para usar ActionFileUpgradeUtil a fim de mesclar arquivos de ações legadas no DefaultDownloadIndex.
    • A ProgressiveMediaSource#setExtractorsFactory foi removida. Use o construtor ProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory).
    • ProgressiveMediaSource.Factory#setTag e ProgressiveMediaSource.Factory#setCustomCacheKey foram removidos. Use MediaItem.Builder#setTag e MediaItem.Builder#setCustomCacheKey.
    • Os construtores DefaultRenderersFactory(Context, @ExtensionRendererMode int) e DefaultRenderersFactory(Context, @ExtensionRendererMode int, long) foram removidos. Use os construtores DefaultRenderersFactory(Context), DefaultRenderersFactory#setExtensionRendererMode e DefaultRenderersFactory#setAllowedVideoJoiningTimeMs.
    • Todos os construtores CronetDataSource públicos foram removidos. Use CronetDataSource.Factory
  • Mude o IntDefs para apenas @Target(TYPE_USE). Isso pode interromper a compilação de usos no Kotlin, que podem ser corrigida movendo a anotação para o 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 (no pacote com.google.android.exoplayer2.ext.flac)
    • @FlacExtractor.Flags (no pacote 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

Versão 1.0.0-alpha01

27 de outubro de 2021

Lançamento de androidx.media3:media3-*:1.0.0-alpha01. A versão 1.0.0-alpha01 contém estas confirmações.

Novos recursos

A Media3 é o novo lar das bibliotecas de suporte de mídia, incluindo o ExoPlayer. A primeira versão Alfa contém implementações antecipadas e funcionais de bibliotecas para casos de uso de mídia, incluindo:

  • o ExoPlayer, um player de mídia no nível do aplicativo para Android que é fácil de personalizar e estender;
  • funcionalidade de sessão de mídia para expor e controlar reproduções. Esse novo módulo de sessão usa a mesma interface de Player que o ExoPlayer;
  • componentes de IU para criar interfaces do usuário para reprodução de mídia;
  • módulos que unem as funcionalidades em outras bibliotecas para uso com o ExoPlayer, por exemplo, a inserção de anúncios usando o SDK do IMA.

Para ver mais informações, consulte o projeto Media3 do GitHub (link em inglês).

O ExoPlayer era hospedado anteriormente em um projeto separado do ExoPlayer no GitHub (link em inglês). Na Media3, o nome do pacote é androidx.media3.exoplayer. Planejamos continuar com a manutenção e o lançamento do projeto ExoPlayer no GitHub por um certo período. Assim, os desenvolvedores vão ter tempo de migrar os aplicativos para a Media3. A Media3 tem substituições para todos os módulos do ExoPlayer, exceto as extensões de media2 e mediasession legadas, que foram substituídas pelo novo módulo media3-session. Esse módulo fornece integração direta entre os players de mídia e as sessões de mídia sem precisar usar uma classe de adaptador/conector.