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
2 de julho de 2025 1.7.1 - 1.8.0-beta01 1.8.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.6.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 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 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.6.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 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 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.

Versão 1.8.0

Versão 1.8.0-beta01

2 de julho de 2025

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

  • Biblioteca comum:
    • Adição de suporte para substituir o player em ForwardingSimpleBasePlayer.
  • ExoPlayer:
    • Adicione suporte para usar o ID do dispositivo virtual do Context transmitido para ExoPlayer.Builder.
    • Ativar a programação dinâmica por padrão no modo de limpeza.
    • Evita o recarregamento desnecessário de uma origem ao buscar o final de um item.
    • Use MediaCodec.BUFFER_FLAG_DECODE_ONLY por padrão no modo de limpeza.
    • Gerar IllegalStateException quando PreloadMediaSource for reproduzido por um ExoPlayer com uma linha de execução de reprodução diferente da linha de execução de pré-carregamento (#2495).
    • Adicione 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 o agendamento interno atrasava o último frame ao buscar o final enquanto estava pausado. Por enquanto, a correção de bug só entra em vigor se ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabled estiver ativado.
  • Transformador:
    • Adicione CodecDbLite, que permite otimizações específicas do chipset das 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 flag é definida como "false".
  • Extratores:
    • 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 usar a busca binária se a duração do arquivo for conhecida (#2327).
    • Correção da análise de unidades SEI H.265 para ignorar totalmente tipos SEI não reconhecidos (#2456).
    • Atualize 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: adicionado suporte para caixas ipcm e fpcm que definem faixas de áudio PCM bruto (o PCM de ponto flutuante de 64 bits não é compatível).
    • MP4: processa 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 gravados pela câmera frontal do iPhone sejam exibidos na orientação correta, mas refletidos incorretamente no eixo y (#2012).
  • Áudio:
    • Adição de compatibilidade com todos os formatos de amostra PCM lineares em ChannelMappingAudioProcessor e TrimmingAudioProcessor.
    • Adição de suporte para falhas de áudio em CompositionPlayer.
    • Remova a chamada espúria para BaseAudioProcessor#flush() de BaseAudioProcessor#reset().
  • Vídeo:
    • Melhoramos a liberação suave de frames de vídeo na inicialização quando as amostras de áudio não começam exatamente na posição solicitada.
    • Estender a solução alternativa de superfície separada para dispositivos "realme" (#2059).
  • Texto:
    • Correção de uma interrupção na 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).
  • Metadados:
    • Foi adicionado suporte para recuperar a duração da mídia e Timeline para MetadataRetriever e migrado para uma API AutoCloseable baseada em instâncias. Use o novo Builder para criar uma instância de um MediaItem e chame retrieveTrackGroups(), retrieveTimeline() e retrieveDurationUs() para receber ListenableFutures dos metadados. Os métodos estáticos anteriores foram descontinuados (#2462).
  • Imagem:
    • Limite os bitmaps decodificados ao tamanho da tela 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.
    • Alinhe o tamanho máximo de saída de bitmap usado em CompositionPlayer com o que já é usado em Transformer. Isso significa que CompositionPlayer não considera o tamanho da tela ao decodificar bitmaps, ao contrário de ExoPlayer.
  • Multiplexadores:
    • Correção de um bug em que as flags de amostra corretas não eram definidas para amostras de áudio em MP4 fragmentado.
  • Sessão:
    • Correção de um 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 principal causava um IllegalStateException (#2265).
    • Não mostrar uma notificação automaticamente se um jogador 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 MediaSessionService.setShowNotificationForIdlePlayer.
    • Adicione PlaybackException personalizados a todos os controladores ou apenas aos selecionados.
    • Correção de um bug em que a busca em uma transmissão ao vivo em um MediaController podia causar um IllegalArgumentException.
    • Para transmissões ao vivo, pare de publicar uma posição de reprodução e a capacidade de buscar no item atual para controladores de mídia da plataforma, evitando 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).
  • Extensão do Cronet:
    • Adição do processamento automático de cookies (#5975).
  • Extensão HLS:
    • Correção da análise de playlists para aceitar \f (avanç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 de um 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).
    • Agrupe as renderizações de legendas usando a tag NAME, assim como as renderizações de áudio já são agrupadas (#1666).
  • Extensão DASH:
    • Foi corrigido um bug em que a redução da duração de um período DASH podia gerar uma exceção quando amostras além da nova duração já tinham sido 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:
    • Correção de RtspClient para usar o URI de local fornecido ao processar uma resposta HTTP 302 (#2398).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • O bug em que DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChange não tem efeito para extensões de decodificador de áudio (#2258) foi corrigido.
  • Extensão do Google Cast:
    • Adição de suporte a setVolume() e getVolume() (#2279).
    • Impede que o CastPlayer entre em STATE_BUFFERING enquanto a linha do tempo estiver vazia.
  • Utilitários de teste:
    • Adicione advance(player).untilPositionAtLeast e untilMediaItemIndex a TestPlayerRunHelper para avançar o player até que uma posição especificada 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.

Versão 1.8.0-alpha01

19 de maio de 2025

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

  • ExoPlayer:
    • Adicione o método ExoPlayer.setScrubbingModeEnabled(boolean). Isso otimiza o player para muitas buscas frequentes (por exemplo, quando um usuário arrasta uma barra de limpeza). O comportamento do modo de limpeza pode ser personalizado com setScrubbingModeParameters(..) em ExoPlayer e ExoPlayer.Builder.
    • Permite personalizar a tolerância de busca fracionada no modo de limpeza.
    • Aumenta a taxa de operação do codec no modo de limpeza.
    • Correção de um bug em que 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).
    • Permita que CmcdConfiguration.Factory retorne null para desativar o registro em log da CMCD em itens de mídia específicos (#2386).
    • Aumentamos o tamanho padrão do buffer de imagem de 128 KB (erro de copiar e colar de faixas de texto) para 26 MB, o que é grande o suficiente para imagens Ultra HDR de 50 MP (#2417).
    • Adicione PreCacheHelper para permitir que os apps façam pré-cache de uma única mídia com posição inicial e duração especificadas.
  • Transformador:
    • Para preencher uma lacuna inicial (adicionada via addGap()) com áudio silencioso, agora é necessário definir explicitamente experimentalSetForceAudioTrack(true) em EditedMediaItemSequence.Builder. Se a lacuna estiver no meio da sequência, essa flag não será necessária.
    • Mova a interface Muxer de media3-transformer para media3-muxer.
    • Tornar 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 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, além de adicionar um VideoCompositorSettings personalizado para organizar sequências em um layout 2x2 ou PiP.
  • Extratores:
    • MP3: use a duração e o tamanho dos dados de metadados de taxa de bits variável não pesquisáveis do Xing, VBRI e semelhantes ao fazer fallback para a pesquisa de taxa de bits constante devido a FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS) (#2194).
  • Áudio:
    • Permitir upmixing/downmixing de energia constante em DefaultAudioMixer.
    • Tornar ChannelMappingAudioProcessor, TrimmingAudioProcessor e ToFloatPcmAudioProcessor públicos (#2339).
    • Use AudioTrack#getUnderrunCount() em AudioTrackPositionTracker para detectar subexecuções em DefaultAudioSink em vez de estimativa de melhor esforço.
    • Melhoramos a suavização do carimbo de data/hora de áudio para desvios inesperados de posição do dispositivo de saída de áudio.
    • Correção de um bug em que a sincronização de A/V era interrompida nos primeiros 10 segundos após a retomada da pausa quando conectado a dispositivos Bluetooth.
    • Correção de um bug em que AnalyticsListener.onAudioPositionAdvancing não informava o horário em que o áudio começou a avançar, mas sim o horário da primeira medição.
  • Vídeo:
    • Adição da API experimental ExoPlayer para incluir a flag MediaCodec.BUFFER_FLAG_DECODE_ONLY ao enfileirar buffers de entrada somente de decodificação. Essa flag vai sinalizar para o decodificador pular os buffers somente de decodificação, resultando em uma busca mais rápida. Ative o recurso com DefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag.
    • Melhorar as verificações de desempenho de codec para 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 Widevine VP9 em alguns dispositivos (#2408).
  • Texto:
    • Correção do SSA e do SubRip para mostrar uma sugestão em andamento ao ativar as legendas (#2309).
    • Correção do problema de travamento da reprodução ao alternar de um stream com um erro de legenda para uma transmissão ao vivo com uma faixa de legenda vazia (#2328).
    • Correção de legendas CEA-608 ilegíveis ao reproduzir streams H.262 que contêm B-frames (#2372).
    • Adicionamos suporte para legendas SSA com CodecId = S_TEXT/SSA em arquivos Matroska. Antes, o MatroskaExtractor só era compatível com CodecId = S_TEXT/ASS, que representa a variante "avançada" (v4 ou mais recente) de legendas SubStation Alpha, mas a lógica de análise do ExoPlayer é a mesma para as duas variantes (#2384).
    • Adicionado suporte à propriedade layer em arquivos de legendas SubStation Alpha (SSA), que é usada para definir a ordem z de sinais quando mais de um é mostrado na tela ao mesmo tempo (#2124).
  • Efeito:
    • Adicione Presentation.createForShortSide(int) que cria um Presentation que garante que o lado mais curto sempre corresponda ao valor especificado, independente da orientação da entrada.
  • Multiplexadores:
    • A API writeSampleData() agora usa a classe BufferInfo específica do muxer em vez de MediaCodec.BufferInfo.
    • Adicione Muxer.Factory#supportsWritingNegativeTimestampsInEditList, que é definido como "false" por padrão.
  • Extensão de IMA:
    • Correção de um bug em que um erro de carregamento em um anúncio podia invalidar outro grupo de anúncios por engano.
    • Correção de um bug em que grupos de anúncios após o fim de uma janela de VOD interrompiam a reprodução. Os grupos de anúncios com um horário de início posterior à janela não são mais enfileirados no MediaPeriodQueue (#2215).
  • Sessão:
    • Correção de um bug em que a transmissão de um valor 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 falhava no app de sessão legada 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:
    • Foi corrigido 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 ícone ou ativação). Agora, as mudanças feitas no Player fora do período de observação são capturadas (#2313).
    • Adicione elementos combináveis e titulares de estado ao módulo media3-ui-compose para SeekBackButtonState e SeekForwardButtonState.
    • Adição de compatibilidade com o modo de limpeza do ExoPlayer ao PlayerControlView. Quando ativado, isso coloca o player no modo de limpeza quando o usuário começa a arrastar a barra de limpeza, emite uma chamada player.seekTo para cada movimento e sai do modo de limpeza quando o toque é removido da tela. Essa integração pode ser ativada com time_bar_scrubbing_enabled = true em XML ou com o método setTimeBarScrubbingEnabled(boolean) em Java/Kotlin.
    • Faça com que PlayerSurface aceite um argumento Player anulável.
  • Downloads:
    • Adição de suporte para downloads parciais de transmissões progressivas. Os apps podem preparar um stream progressivo com DownloadHelper e solicitar um DownloadRequest do auxiliar especificando as posições de início e fim da mídia com base no tempo que o download deve abranger. O DownloadRequest retornado carrega o intervalo de bytes resolvido, com o qual um ProgressiveDownloader pode ser criado e fazer o download do conteúdo de acordo.
    • Adicione DownloadHelper.Factory, com que os métodos estáticos DownloadHelper.forMediaItem() são substituídos.
    • Adicione Factory para implementações de SegmentDownloader.
    • Adição de suporte a downloads parciais para streams adaptáveis. Os apps podem preparar um stream adaptável com DownloadHelper e solicitar um DownloadRequest do auxiliar especificando as posições de início e fim da mídia com base no tempo que o download deve abranger. O DownloadRequest retornado carrega o período resolvido, com o qual um SegmentDownloader concreto pode ser criado e fazer o download do conteúdo correspondente.
  • Extensão HLS:
    • Suporte a X-ASSET-LIST e transmissões ao vivo com HlsInterstitialsAdsLoader.
  • Extensão RTSP:
    • Adicionado suporte de análise para SessionDescriptions que contêm linhas com caracteres de espaço em branco à direita (#2357).
  • Extensão do Google Cast:
    • Adição de suporte a getDeviceVolume(), setDeviceVolume(), getDeviceMuted() e setDeviceMuted() (#2089).
  • Utilitários de teste:
    • 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.
    • Substituímos o prefixo "exotest" por "media3" nos nomes de codecs informados por ShadowMediaCodecConfig.
  • Símbolos descontinuados foram removidos:
    • Remoção do construtor SegmentDownloader obsoleto SegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor) e dos construtores correspondentes nas subclasses DashDownloader, HlsDownloader e SsDownloader.
    • Removemos Player.hasNext() e Player.hasNextWindow(), que estavam descontinuados. Use Player.hasNextMediaItem() em vez disso.
    • Removemos Player.next(), que estava em desuso. Use Player.seekToNextMediaItem().
    • Removemos Player.seekToPreviousWindow(), que estava em desuso. Use Player.seekToPreviousMediaItem()
    • Removemos Player.seekToNextWindow(), que estava em desuso. Use Player.seekToNextMediaItem()
    • Remoção de BaseAudioProcessor descontinuado no módulo exoplayer. Use BaseAudioProcessor no módulo common.
    • Remoção do construtor MediaCodecVideoRenderer MediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider) descontinuado.

Versão 1.7.0

Versão 1.7.1

16 de maio de 2025

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

Versão 1.7.0

16 de maio de 2025

Essa versão deveria ter sido 1.7.0-alpha01, mas foi marcada acidentalmente como 1.7.0 (ou seja, estável) em maven.google.com. Não use essa versão. Permanecer na versão 1.6.1 ou fazer 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 estas confirmações.

  • Biblioteca comum:
    • Adição do método PlaybackParameters.withPitch(float) para copiar facilmente um PlaybackParameters com um novo valor pitch (#2257).
  • ExoPlayer:
    • Correção de um problema em que a transição de itens 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 gerava um IllegalStateException quando PreloadMediaSource tentava 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 a expõe como uma entrada Mp4AlternateGroupData no Format.metadata de cada faixa (#2242).
  • Áudio:
    • Correção de um problema de descarregamento em que a posição podia ficar travada ao tocar 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 um único item quando o player encapsulado estava vazio. Isso aconteceu 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 era 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 não era possível recompor PlayerSurface com um novo Player.
  • Extensão HLS:
    • Corrigimos o problema em que a duração do bloco não era definida em CmcdData para mídia HLS, causando uma falha de asserção ao processar segmentos de mídia criptografados (#2312).
  • Extensão RTSP:
    • Adição de suporte para 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 aos 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 estas confirmações.

  • Biblioteca comum:
    • Adicione 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. Faça upgrade da biblioteca KotlinX Coroutines 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 no SimpleBasePlayer em que a definição de um novo currentMediaItemIndex em State após setPlaylist com null MediaMetadata não reavalia os metadados (#1940).
    • Mude o acesso de SimpleBasePlayer.State de protegido para público para facilitar o processamento de atualizações em outras classes (2128).
  • ExoPlayer:
    • Adicione 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 pelo experimentalSetEnableMediaCodecVideoRendererPrewarming para fornecer um MediaCodecVideoRenderer secundário ao 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 entre eles.
    • Reduza os valores padrão de bufferForPlaybackMs e bufferForPlaybackAfterRebufferMs em DefaultLoadControl para 1.000 e 2.000 ms, respectivamente.
    • Inicialize DeviceInfo e o volume do dispositivo de forma assíncrona (se ativado usando setDeviceVolumeControlEnabled). Esses valores não ficam disponíveis instantaneamente após ExoPlayer.Builder.build(), e Player.Listener notifica as mudanças por 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. Você pode usar 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).
    • Adicione o parâmetro selectedAudioLanguage ao método DefaultTrackSelector.selectVideoTrack().
    • Adicione o 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 correspondem ao conteúdo real podiam causar travamentos de frames no final do item (#1698).
    • Mova BasePreloadManager.Listener para um PreloadManagerListener de nível superior.
    • O 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.
    • Ative o envio de CmcdData para solicitações de manifesto em formatos de streaming adaptável DASH, HLS e SmoothStreaming (#1951).
    • Informe MediaCodecInfo do codec que será inicializado em MediaCodecRenderer.onReadyToInitializeCodec (#1963).
    • Mude AdsMediaSource para permitir que AdPlaybackStates cresça anexando grupos de anúncios. Modificações inválidas são detectadas e geram uma exceção.
    • Corrigimos 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 MetadataRenderer para permitir que os apps recebam dois esquemas diferentes de metadados por padrão.
    • Reavalie se o carregamento contínuo de um trecho deve ser cancelado quando a reprodução é pausada (#1785).
    • Adicione a opção ClippingMediaSource para permitir o corte em mídia não pesquisável.
    • Correção de um bug em que a busca com pré-aquecimento podia bloquear a transição do item de mídia a seguir.
    • Correção de um bug em que ExoPlayer.isLoading() permanecia true enquanto fazia a transição para STATE_IDLE ou STATE_ENDED (#2133).
    • Adição de lastRebufferRealtimeMs a LoadControl.Parameter (#2113).
  • Transformador:
    • Adição de suporte à transmuxação em formatos alternativos compatíveis com versões anteriores.
    • Adição de suporte à transcodificação e transmuxing do formato Dolby Vision (perfil 8).
    • Atualize os parâmetros de VideoFrameProcessor.registerInputStream e VideoFrameProcessor.Listener.onInputStreamRegistered para usar Format.
    • Gere 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 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 Transformer com Transformer.Builder.setUsePlatformDiagnostics(false).
    • Divida InAppMuxer em InAppMp4Muxer e InAppFragmentedMp4Muxer. Você usa InAppMp4Muxer para produzir um arquivo MP4 não fragmentado, enquanto InAppFragmentedMp4Muxer é para produzir um arquivo MP4 fragmentado.
    • Mova a interface Muxer de media3-muxer para media3-transformer.
    • Adicione MediaProjectionAssetLoader, que fornece mídia de um MediaProjection para gravação de tela, e adicione suporte para gravação de tela ao app de demonstração do Transformer.
    • Adicione #getInputFormat() à interface Codec.
    • Transfira a responsabilidade de liberar o GlObjectsProvider para o chamador 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 fluxo armazena o número de bytes em vez do número de partes.
    • Correção do 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 de MP4 quando a lista começa em um frame sem sincronização e sem um frame de sincronização anterior (#2062).
    • Correção de um problema em que os fluxos TS podiam ficar travados em alguns dispositivos (#2069).
    • FLAC: adicionado suporte para arquivos FLAC de 32 bits. Antes, eles não eram reproduzidos com IllegalStateException: Playback stuck buffering and not loading (#2197).
  • Áudio:
    • Corrigimos onAudioPositionAdvancing para que ele seja chamado quando a reprodução for retomada (antes, ele era chamado quando a reprodução era pausada).
    • Não ignore SonicAudioProcessor quando SpeedChangingAudioProcessor for configurado com parâmetros padrão.
    • Correção de um problema de underflow em Sonic#getOutputSize() que poderia causar a paralisação de DefaultAudioSink.
    • Corrija MediaCodecAudioRenderer.getDurationToProgressUs() e DecoderAudioRenderer.getDurationToProgressUs() para que as buscas redefinam corretamente as durações fornecidas.
    • androidx.media3.common.audio.SonicAudioProcessor foi finalizado.
    • Adição de suporte para PCM de ponto flutuante a ChannelMappingAudioProcessor e TrimmingAudioProcessor.
  • Vídeo:
    • Mude MediaCodecVideoRenderer.shouldUsePlaceholderSurface para protected para que os aplicativos possam substituir e bloquear o uso de superfícies de marcador de posição (#1905).
    • Adição da análise de dependência de amostra AV1 ExoPlayer experimental 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 recurso 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, link em inglês).
    • Exclua dispositivos Xiaomi e OPPO do modo de superfície separada para evitar oscilação da tela (#2059).
  • Texto:
    • Adição de suporte a legendas VobSub (#8260).
    • Pare de carregar 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 os carimbos de data/hora WebVTT e 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 da interrupção 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 sugestão com duração zero (horários 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 de áudio e vídeo (#2052).
    • Foi corrigido o processamento de caracteres UTF-8 multibyte 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 do ClearKey em dispositivos com API < 27 (#1732).
  • Efeito:
    • A funcionalidade de OverlaySettings foi movida para StaticOverlaySettings. OverlaySettings pode ser subclassificado para permitir configurações de sobreposição dinâmica.
  • Multiplexadores:
    • Movemos MuxerException 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 faixa int em vez de um TrackToken.
    • Mp4Muxer e FragmentedMp4Muxer não implementam mais a interface Muxer.
    • Desativa o agrupamento e a cópia de amostras Mp4Muxer por padrão.
    • Foi corrigido 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. Chamar apenas player.pause() não pode mais ser usado para interromper o serviço em primeiro plano antes de stopSelf() ao substituir onTaskRemoved. Use MediaSessionService.pauseAllPlayersAndStopSelf() em vez disso.
    • Mantenha a notificação visível quando a reprodução entrar em um estado de erro ou parada. 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.
    • Adicione Context como um parâmetro a MediaButtonReceiver.shouldStartForegroundService (#1887).
    • Correção de um bug em que chamar um método Player em um MediaController conectado a uma sessão legada descartava as mudanças de uma atualização pendente.
    • Fazer MediaSession.setSessionActivity(PendingIntent) aceitar nulo (#2109).
    • Correção de um bug em que uma notificação desatualizada permanecia visível quando a playlist era limpa (#2211).
  • Interface:
    • Adicione elementos combináveis e titulares de estado ao módulo media3-ui-compose para PlayerSurface, PresentationState, PlayPauseButtonState, NextButtonState, PreviousButtonState, RepeatButtonState, ShuffleButtonState e PlaybackSpeedState.
  • Downloads:
    • Correção de um bug no 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 HLS de uma playlist de mídia HLS e os mapeia para o AdPlaybackState transmitido ao AdsMediaSource. Essa versão inicial só é compatível com streams de VOD HLS com atributos X-ASSET-URI.
    • Adição do HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Os apps podem usar isso para criar instâncias AdsMediaSource que usam um HlsInterstitialsAdsLoader de maneira conveniente e segura.
    • Analise a tag SUPPLEMENTAL-CODECS da playlist HLS para detectar formatos Dolby Vision (#1785).
    • Redução da condição para buscar posições de sincronização em um stream HLS (#2209).
  • Extensão DASH:
    • Adição de suporte ao formato AC-4 Nível 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).
    • Analisar o atributo scte214:supplementalCodecs do manifesto DASH para detectar formatos Dolby Vision (#1785).
    • Melhoramos o 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).
    • Foi corrigido um problema em que conjuntos de adaptação marcados com adaptation-set-switching, mas com idiomas ou flags de função diferentes, eram mesclados (#2222).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Adicione o 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 a MidiRenderer.
  • Extensão do Google Cast:
    • Aumente a dependência play-services-cast-framework para 21.5.0 e corrija 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 botões extras e melhore a integração do PlayerSurface com suporte a escalonamento e obturador.
  • Símbolos descontinuados foram removidos:
    • Remoção do método AudioMixer.create() descontinuado. 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 para Transformer.start().
      • setVideoEffects(), defina o efeito de vídeo em um EditedMediaItem.Builder.setEffects() e transmita 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 simplificar 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).
    • Remova a classe TransformationResult descontinuada. Use ExportResult.
    • Remova a classe TransformationException descontinuada. Use ExportException.
    • A função Transformer.PROGRESS_STATE_NO_TRANSFORMATION descontinuada foi removida. Use Transformer.PROGRESS_STATE_NOT_STARTED
    • A função Transformer.setListener() descontinuada foi removida. Use Transformer.addListener(), Transformer.removeListener() ou Transformer.removeAllListeners().
    • A função Transformer.startTransformation() descontinuada foi removida. Use Transformer.start(MediaItem, String)
    • A função SingleFrameGlShaderProgram descontinuada foi removida. Use BaseGlShaderProgram
    • O Transformer.flattenForSlowMotion foi removido. Use EditedMediaItem.flattenForSlowMotion
    • ExoPlayer.VideoComponent, ExoPlayer.AudioComponent, ExoPlayer.TextComponent e ExoPlayer.DeviceComponent foram removidos.
    • androidx.media3.exoplayer.audio.SonicAudioProcessor foi removido.
    • Os seguintes métodos DownloadHelper descontinuados foram removidos:
      • Construtor DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]). Use DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList).
      • getRendererCapabilities(RenderersFactory), a funcionalidade equivalente pode ser alcançada 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

19 de dezembro de 2024

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

  • ExoPlayer:
    • Desativa o uso da descriptografia assíncrona no MediaCodec para evitar problemas de tempo limite do codec relatados com essa API da 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 (#1904).
  • Vídeo:
    • Reversão do uso de valores de proporção de pixels MediaCodecAdapter fornecidos ao processar onOutputFormatChanged (#1371).
  • Texto:
    • Correção de um bug no ReplacingCuesResolver.discardCuesBeforeTimeUs em que a sugestão ativa em timeUs (iniciada antes, mas ainda não concluída) era descartada incorretamente (#1939).
  • Metadados:
    • Extraia a numeração do disco/faixa e o gênero dos comentários do Vorbis para 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 estas confirmações.

  • Biblioteca comum:
    • Adição de ForwardingSimpleBasePlayer, que permite encaminhar para outro player com pequenos ajustes, garantindo consistência total e processamento de listeners (#1183).
    • Substitua SimpleBasePlayer.State.playlist pelo método 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 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 funcionalidade específica do Kotlin criada com base na biblioteca Common
    • Adicione a função de extensão de suspensão Player.listen para girar uma corrotina e ouvir Player.Events na biblioteca media3-common-ktx.
    • Remova as anotações @DoNotInline das classes internas manualmente desenhadas para evitar falhas na verificação de classes em tempo de execução. As versões recentes do R8 agora fazem automaticamente chamadas fora da linha como essas para evitar falhas de tempo de execução. Portanto, não é mais necessário fazer isso manualmente. Todos os usuários do Gradle da biblioteca já precisam usar 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 não Gradle precisam garantir que a etapa de redução/ofuscação equivalente ao R8 faça um processo automático sem linha semelhante para evitar falhas de verificação de classe em tempo de execução. Essa mudança já foi feita em outras bibliotecas do AndroidX.
  • ExoPlayer:
    • Agora, MediaCodecRenderer.onProcessedStreamChange() 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 implementações de PreloadMediaSource.PreloadControl realizem ações quando ocorrer um erro.
    • Adicione BasePreloadManager.Listener para propagar eventos de pré-carregamento aos apps.
    • Permitir a mudança do tempo limite do cliente SNTP e tentar endereços alternativos em tempo limite (#1540).
    • Remova MediaCodecAdapter.Configuration.flags, já que o campo sempre foi zero.
    • Permite que o usuário selecione o alto-falante integrado para reprodução no Wear OS API 35 ou mais recente (quando 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 do foco de áudio não estiver ativado (#1616).
    • Permitir a reprodução independente da duração armazenada em buffer quando o carregamento falha (#1571).
    • Adicione AnalyticsListener.onRendererReadyChanged() para sinalizar quando renderizadores individuais permitem que a reprodução fique pronta.
    • Correção do problema em que MediaCodec.CryptoException às vezes era informado como um "erro inesperado de tempo de execução" quando MediaCodec era operado no modo assíncrono (comportamento padrão na API 31 e versões mais recentes).
    • 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.
    • Adicione a implementação de ForwardingRenderer que encaminha todas as chamadas de método para outro renderizador (1703).
    • Adiciona a pré-carga da playlist para o próximo item. Os apps podem ativar o pré-carregamento chamando ExoPlayer.setPreloadConfiguration(PreloadConfiguration). Por padrão, o pré-carregamento está desativado. Quando ativada e para não interferir na reprodução, a 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.
    • Adicione o método MediaSourceEventListener.EventDispatcher.dispatchEvent() para permitir a invocação de eventos de listeners de subclasses (1736).
    • Adicione DefaultPreloadManager.Builder que cria as instâncias DefaultPreloadManager e ExoPlayer com configurações compartilhadas de forma consistente.
    • Remova o parâmetro Renderer[] de LoadControl.onTracksSelected(), já que a implementação de DefaultLoadControl pode recuperar os tipos de stream de ExoTrackSelection[].
    • O método DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) foi suspenso e marcado como final para evitar substituições. Use o novo DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]) em vez disso.
    • Informar eventos MediaSourceEventListener de fontes secundárias em MergingMediaSource. Isso vai resultar em eventos de início/erro/cancelamento/conclusão de carregamento sendo informados para legendas transferidas por sideload (aquelas adicionadas com MediaItem.LocalConfiguration.subtitleConfigurations), que podem aparecer como eventos de carregamento duplicados emitidos de 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 tratamento de legendas (durante a extração), os erros de análise (por exemplo, dados de legendas inválidos) e de carregamento (por exemplo, HTTP 404) associados são emitidos por callbacks onLoadError.
      • No processamento de legendas legadas (durante a renderização), apenas erros de carregamento associados são emitidos por callbacks onLoadError, enquanto 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 correspondem ao conteúdo real podiam causar travamentos 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:
    • Adicione SurfaceAssetLoader, que oferece suporte ao enfileiramento de dados de vídeo para o Transformer usando um Surface.
    • ImageAssetLoader informa entradas sem suporte via AssetLoader.onError em vez de gerar um IllegalStateException.
    • Torne obrigatório definir a duração da imagem usando MediaItem.Builder.setImageDurationMs para exportação de imagens.
    • Adição de suporte à exportação de lacunas em sequências de EditedMediaItems de áudio.
  • Seleção de faixas:
    • DefaultTrackSelector: prefira áudio baseado em objetos em vez de áudio baseado em canais quando outros fatores forem iguais.
  • Extratores:
    • Permitir que Mp4Extractor e FragmentedMp4Extractor identifiquem amostras H264 que não são usadas como referência por amostras subsequentes.
    • Adicionada a opção de ativar a busca com base em índice no AmrExtractor.
    • Trate arquivos MP3 com mais de 128 kB entre frames válidos como truncados (em vez de inválidos). Isso significa que arquivos com dados não MP3 no final, sem outros metadados para indicar o comprimento dos bytes MP3, agora param a reprodução no final dos dados MP3 em vez de falhar com ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
    • Correção do processamento de amostras de pré-roll para posições de início de mídia que não são de keyframe 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 na caixa mdhd em Mp4Extractor e FragmentedMp4Extractor (#1531).
    • Correção do dimensionamento incorreto de media_time nas listas de edição de MP4. Embora segment_duration já fosse 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).
    • Processar frames fora de ordem no cálculo de endIndices para MP4 com lista de edição (#1797).
    • Correção da análise da duração da 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 de arquivo de mídia base ISO AC-4 nível 4 (#1265).
  • DataSource:
    • Atualize HttpEngineDataSource para permitir o uso a partir da extensão S 7 em vez do nível 34 da API (#1262).
    • DataSourceContractTest: asserção de que DataSource.getUri() retorna o URI resolvido (conforme documentado). Quando isso é diferente do URI solicitado, os testes podem indicar isso usando o novo método DataSourceContractTest.TestResource.Builder.setResolvedUri().
    • DataSourceContractTest: asserção de que DataSource.getUri() e getResponseHeaders() retornam o valor "open" após uma chamada com falha para open() (devido a um recurso "não encontrado") e antes de uma chamada close() subsequente.
      • A substituição de DataSourceContractTest.getNotFoundResources() permite que subclasses de teste forneçam vários recursos "não encontrados" e também forneçam 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 intensidade sonora CTA-2075 no codec, se eles estiverem presentes na mídia.
    • Garantir uma redução suave do volume ao buscar.
    • Correção de estalos que podem ocorrer durante as buscas.
    • Correção do acúmulo de erros de truncamento no algoritmo de mudança de tempo/altura do Sonic.
    • Correção do bug em SpeedChangingAudioProcessor que causa a queda 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 for compatível com isso (MediaCodecInfo.detachedSurfaceSupported).
    • Use os valores de proporção de pixels fornecidos MediaCodecAdapter, se disponíveis, ao processar onOutputFormatChanged (#1371).
    • Adição de uma solução alternativa para um problema do dispositivo no Galaxy Tab S7 FE que faz com que streams H264 seguros de 60 fps sejam marcados como não compatíveis (#1619).
    • Adicione uma solução alternativa para codecs que ficam presos após a última amostra sem retornar um sinal de fim de stream.
  • Texto:
    • Adicione um VoiceSpan personalizado e preencha-o para intervalos de voz WebVTT (#1632).
    • Garantir que o WebVTT em HLS com timestamps de legendas muito grandes (que excedem um long de 64 bits quando representados como microssegundos e multiplicados pela base de tempo 90,000 MPEG) sejam exibidos (#1763).
    • Suporte a legendas CEA-608 em conteúdo Dolby Vision (#1820).
    • Correção da suspensão da reprodução em transmissões multiponto DASH quando as legendas CEA-608 estão ativadas (#1863).
  • Metadados:
    • Atribua o tipo C.TRACK_TYPE_METADATA a faixas com 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 DefaultVideoFrameProcessor para escalonamento SurfaceTexture de menor importância. SurfaceTexture pode incluir um pequeno escalonamento que corta uma borda de 1 texel ao redor da borda de um buffer cortado. Agora isso é processado para que a saída fique mais próxima do esperado.
    • Acelere DefaultVideoFrameProcessor.queueInputBitmap(). Como resultado, a exportação de imagens para vídeos com o 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 streams de DAI inseridos do lado do servidor sem um pré-roll podiam resultar em um ArrayIndexOutOfBoundsException ao passar do último anúncio intermediário (#1741).
  • Sessão:
    • Adicione MediaButtonReceiver.shouldStartForegroundService(Intent) para permitir que os apps suprimam um comando de reprodução para retomada 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 falhe o serviço com um ForegroundServiceDidNotStartInTimeException (#1528).
    • Correção de um bug que fazia com que comandos personalizados enviados de um MediaBrowser fossem despachados 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 (#1474).
    • 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 Ações de navegação personalizadas do AAOS.
    • 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 após solicitar play().
    • Restrinja CommandButton.Builder.setIconUri para aceitar apenas URIs de conteúdo.
    • Transmita 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 de 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.
    • Melhorar o comportamento de interoperabilidade para que um navegador Media3 conectado a um MediaBrowserService legado não solicite os filhos de um parentId duas vezes ao se inscrever em um pai.
  • Interface:
    • Ative a solução alternativa de vídeo esticado/cortado em PlayerView-in-Compose-AndroidView devido a problemas com transições compartilhadas baseadas em XML. Os apps que usam PlayerView em AndroidView precisam chamar PlayerView.setEnableComposeSurfaceSyncWorkaround para ativar (#1237, #1594).
    • Adicione setFullscreenButtonState a PlayerView para permitir atualizações do ícone do botão de tela cheia sob demanda, ou seja, fora da 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 "Nenhum" na seleção de texto não funcionava se houvesse 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 do Smooth Streaming:
    • Correção de um erro Bad magic number for Bundle ao reproduzir streams 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.):
    • Adicione o módulo decodificador IAMF, que oferece suporte à reprodução de arquivos MP4 que contêm 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 opcional da cabeça. No entanto, a compatibilidade com reprodução binaural não está disponível no momento.
    • Adicionamos suporte a páginas de 16 KB para extensões de decodificador no Android 15 (#1685).
  • Extensão do Google Cast:
    • Pare de limpar a linha do tempo depois que o CastSession for desconectado, 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:
    • O 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
    • Correção dos vazamentos de memória no app de demonstração de formato curto (#1839).
  • Símbolos descontinuados foram removidos:
    • Remoção de Player.hasPrevious e Player.hasPreviousWindow() descontinuados. Use Player.hasPreviousMediaItem().
    • Remoção do método Player.previous() descontinuado. Use Player.seekToPreviousMediaItem()
    • Remoção do método DrmSessionEventListener.onDrmSessionAcquired descontinuado.
    • Remoção de construtores DefaultEncoderFactory obsoletos. 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 estas confirmações.

  • ExoPlayer:
    • Processar callbacks de pré-carregamento de forma assíncrona em PreloadMediaSource (#1568).
    • Permitir a reprodução independente da duração armazenada em buffer quando o carregamento falha (#1571).
  • Extratores:
    • MP3: correção do erro Searched too many bytes ao ignorar corretamente dados não MP3 finais com base no campo de comprimento em um frame Info (#1480).
  • Texto:
    • TTML: correção do processamento de valores de porcentagem tts:fontSize para garantir que eles sejam herdados corretamente de nós principais com valores de porcentagem tts:fontSize.
    • Correção de IndexOutOfBoundsException em LegacySubtitleUtil devido ao processamento incorreto do caso em que o horário de início da saída solicitada é 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 ao reproduzir 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:
    • Transformar um toque duplo em KEYCODE_HEADSETHOOK em uma ação de "ir para o próximo", conforme documentado (#1493).
    • Processe KEYCODE_HEADSETHOOK como um comando "play" em MediaButtonReceiver ao decidir se é necessário ignorá-lo para evitar um ForegroundServiceDidNotStartInTimeException (#1581).
  • Extensão RTSP:
    • Ignorar descrições de mídia inválidas na análise do 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 estas confirmações.

  • Biblioteca comum:
    • Encaminhe 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.
    • Remova a dependência de compilação da dessugarização avançada 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:
    • Adicione BasePreloadManager, que coordena o pré-carregamento de várias origens com base nas prioridades definidas pelo rankingData. É possível personalizar estendendo essa classe. Adicione DefaultPreloadManager, que usa PreloadMediaSource para pré-carregar amostras de mídia das fontes na memória e usa um número inteiro rankingData que indica o índice de um item na interface.
    • Adicione PlayerId à maioria dos métodos de LoadControl para permitir que as implementações de LoadControl sejam compatíveis com vários jogadores.
    • Buffer.isDecodeOnly() e C.BUFFER_FLAG_DECODE_ONLY foram removidos. Não é necessário definir essa flag, porque 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 buffer é de pelo menos BaseRenderer.getLastResetPositionUs() para decidir se uma amostra deve ser mostrada. Implementações personalizadas de SimpleDecoder podem verificar isAtLeastOutputStartTimeUs(), se necessário, ou marcar outros buffers com DecoderOutputBuffer.shouldBeSkipped para ignorá-los.
    • Permite que um valor nulo seja retornado por TargetPreloadStatusControl.getTargetPreloadStatus(T) para indicar que não é necessário pré-carregar um MediaSource com o rankingData especificado.
    • remove(MediaSource) foi adicionada a BasePreloadManager.
    • Adicione reset() a BasePreloadManager para liberar todas as fontes de retenção e manter 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.
    • Foi corrigido um problema com a atualização do último tempo de rebuffer, que resultava em chave bs (falta de buffer) incorreta no CMCD (#1124).
    • Adicione PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) para indicar que a origem foi carregada até o fim. Isso permite que o DefaultPreloadManager e as implementações personalizadas de PreloadMediaSource.PreloadControl pré-carreguem a próxima origem ou realizem outras ações.
    • Correção de um bug em que o pulo de 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.
    • Adicione o novo código de erro PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, que é usado quando os recursos de codec são recuperados para tarefas de maior prioridade.
    • Permita que 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.
    • Adição de suporte experimental para programação dinâmica, a fim de alinhar melhor o trabalho com ciclos de ativação da CPU e atrasar a ativação até que os renderizadores possam progredir. É possível ativar isso usando experimentalSetDynamicSchedulingEnabled() ao configurar sua 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.
    • Adicione MediaCodecAdapter#OnBufferAvailableListener para alertar quando os buffers de entrada e saída estiverem disponíveis para uso pelo MediaCodecRenderer. O MediaCodecRenderer vai sinalizar o ExoPlayer ao receber esses callbacks. Se o ExoPlayer estiver definido com experimentalSetDynamicSchedulingEnabled(), ele vai programar o loop de trabalho à medida que os renderizadores avançam.ExoPlayer
    • 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.
    • Adicione 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 perda de foco total ou transitória enquanto o player está pausado (#1436).
    • Correção de um possível IndexOutOfBoundsException causado por extratores que informam faixas adicionais após a etapa de preparação inicial (#1476).
    • Effects em ExoPlayer.setVideoEffect() vai receber os carimbos de data/hora com o ajuste do renderizador removido (#1098).
    • Correção de um possível IllegalArgumentException ao processar um erro do player que ocorreu durante a leitura antecipada de outro item da playlist (#1483).
  • Transformador:
    • Adicione audioConversionProcess e videoConversionProcess a ExportResult, indicando como a faixa respectiva no arquivo de saída foi criada.
    • Relaxar as verificações de nível H.264 da otimização de corte.
    • Adição de 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.
    • Adicionamos suporte para transcodificação de imagens Ultra HDR em vídeos HDR.
    • Correção de um problema em que o DefaultAudioMixer não gerava a quantidade correta de bytes após 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 entrada PCM.
    • Ao selecionar faixas em ExoPlayerAssetLoader, ignore as restrições de contagem de canais de áudio, já que elas só se aplicam à 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 AV.
    • Remova o campo ExportResult.processedInputs. Se você usar esse campo para detalhes do codec, use DefaultDecoderFactory.listener. Em caso de uma exceção de codec, os detalhes dele estarão disponíveis no ExportException.codecInfo.
  • Extratores:
    • MPEG-TS: faça o roll forward da mudança garantindo que o último frame seja renderizado transmitindo a última unidade de acesso de um fluxo 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 HLS H.262 (#1126).
    • MP3: prefira o tamanho dos dados de um frame Info em vez do tamanho informado pelo fluxo subjacente (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 da capa 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 (#1376).
    • 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 direta (#1299).
    • Para a 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 foram reproduzidos.
    • Correção de um bug em SilenceSkippingAudioProcessor em que 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 avançar.
  • Vídeo:
    • Correção do problema em que Listener.onRenderedFirstFrame() chega muito cedo ao trocar de plataforma durante a reprodução.
    • A lógica de substituição do decodificador para Dolby Vision foi corrigida a fim de usar um decodificador AV1 compatível, se necessário (#1389).
    • Corrigimos uma exceção de codec que pode ser causada pela ativação de um renderizador de vídeo durante a reprodução.
  • Texto:
    • Foi corrigido um problema em que legendas iniciadas antes de uma posição de busca eram ignoradas. Esse problema foi introduzido apenas na Media3 1.4.0-alpha01.
    • Mude o comportamento padrão de análise de legendas para que ele ocorra durante a extração em vez de durante a renderização. Consulte o diagrama de arquitetura do ExoPlayer para saber a diferença entre extração e renderização.
      • Essa mudança pode ser substituída chamando both MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) e TextRenderer.experimentalSetLegacyDecodingEnabled(true). Consulte a documentação sobre personalização para saber como integrar esses componentes a uma instância ExoPlayer. Esses métodos (e todo o suporte à 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: corrige a decodificação de extensão para resolver 0 como um índice de cor, em vez de um valor literal de cor (#1367).
    • CEA-708: ignore o valor rowLock. A especificação CEA-708-E S-2023 afirma que rowLock e columnLock devem ser considerados verdadeiros, independente dos valores presentes no stream. Como o suporte a columnLock não é implementado, ele é considerado sempre falso.
      • Isso foi incluído originalmente nas notas da versão 1.3.0-alpha01, mas a mudança foi revertida por engano antes da versão 1.3.0-rc01. Isso já foi corrigido, então a mudança está presente novamente.
    • CEA-708: evite que novas linhas duplicadas sejam adicionadas pelo processamento ingênuo do comando "definir local da caneta" do ExoPlayer (#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 (#1516).
  • Metadados:
    • Correção do mapeamento de MP4 para tags de classificação ID3. Antes, as tags MP4 "ordem do álbum" (soal), "ordem do artista" (soar) e "ordem 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 gnre (gênero) e tmpo (tempo) de MP4 (/iTunes) quando o valor tem mais de um byte de comprimento.
    • Propague o 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 API 34 e versões mais recentes.
    • Permita null como parâmetro para ExoPlayer.setImageOutput() limpar um ImageOutput definido anteriormente.
  • DataSource:
    • Implemente a compatibilidade com URIs de recursos brutos android.resource://package/id em que package é diferente do pacote do aplicativo atual. Antes, isso não era documentado como uma forma de funcionar, mas é uma maneira mais eficiente de acessar recursos em outro pacote do que por nome.
    • Verifique se url não é nulo nos construtores DataSpec. Esse parâmetro já foi anotado como não nulo.
    • Permita que ByteArrayDataSource resolva um URI para uma matriz de bytes durante open(), em vez de ser codificado permanentemente na construção (#1405).
  • DRM:
    • Permite definir um LoadErrorHandlingPolicy em DefaultDrmSessionManagerProvider (#1271).
  • Efeito:
    • Oferece 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 Debug SurfaceView do Transformer.
    • Atualize 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 de x e y multiplicando-os por -1.
    • Correção do bug em que TimestampWrapper falhava quando usado com ExoPlayer#setVideoEffects (#821).
    • Mude o espaço de trabalho de cores SDR padrão de cores lineares para vídeo SDR BT 709 elétrico. Também ofereça uma terceira opção para manter o espaço de cores original.
    • Permite definir a ordem Z indeterminada de EditedMediaItemSequences (#1055).
    • Mantenha um intervalo de luminância consistente em diferentes partes do conteúdo HDR (usa o intervalo HLG).
    • Adição de suporte para sobreposições Ultra HDR (bitmap) em conteúdo HDR.
    • Permite que os efeitos SeparableConvolution sejam usados antes da API 26.
    • Remova OverlaySettings.useHdr não usado, já que o intervalo dinâmico da sobreposição e do frame precisam corresponder.
    • Adição de compatibilidade com HDR para TextOverlay. A luminância da sobreposição de texto pode ser ajustada com OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Extensão de IMA:
    • Promova a API necessária para que os apps reproduzam streams de anúncios da DAI para estável.
    • Adicione replaceAdTagParameters(Map <String, String>) a ImaServerSideAdInsertionMediaSource.AdLoader, o que permite substituir parâmetros de tag de anúncio no tempo de execução.
    • Foi corrigido um bug em que VideoAdPlayer.VideoAdPlayerCallback.onError() não era chamado quando um erro do player acontecia durante a reprodução do anúncio (#1334).
    • A versão do SDK do IMA foi atualizada para 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 controladores mesmo que o comando associado esteja disponível.
    • Adicione constantes de ícone para CommandButton que devem ser usadas em vez de recursos de ícone personalizados.
    • Adicione 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.
    • Ocultamos a barra de busca na notificação de mídia para transmissões ao vivo ao não definir a duração nos metadados da sessão da plataforma (#1256).
    • Alinhe a conversão de MediaMetadata para MediaDescriptionCompat e use a mesma ordem e lógica preferenciais ao selecionar propriedades de metadados, como em media1.
    • Adicione MediaSession.sendError() que permite enviar erros não fatais ao controlador 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 as sessões quando uma série de interações do player de um controle específico terminar.
    • Adicione SessionError e use em SessionResult e LibraryResult em vez do código de 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 media3 que pode ser usado para testar interações com apps que publicam uma sessão de mídia.
    • Propaga extras transmitidos para MediaSession[Builder].setSessionExtras() do Media3 para um PlaybackStateCompat.getExtras() do controlador do Media1.
    • Mapeie erros fatais e não fatais para e da sessão da plataforma. Um PlaybackException é mapeado para um estado de erro fatal do PlaybackStateCompat. Um SessionError enviado ao controlador de notificações de mídia com MediaSession.sendError(ControllerInfo, SessionError) é mapeado para um erro não fatal em PlaybackStateCompat, o que significa que o código e a mensagem de erro são definidos, mas o estado da sessão da plataforma permanece diferente de STATE_ERROR.
    • Permite que a atividade da sessão seja definida por controlador para substituir a atividade global. 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 fica ativada por padrão.
  • Interface:
    • Adição de suporte à exibição de imagens ao PlayerView quando conectado a um ExoPlayer (#1144).
    • Adicionada a personalização de vários ícones em PlayerControlView usando atributos xml para permitir diferentes elementos gráficos por instância PlayerView, em vez de substituições globais (#1200).
    • Solução alternativa para um bug da plataforma que causa esticamento/corte de vídeo ao usar SurfaceView em um AndroidView do Compose na API 34 (#1237).
  • Downloads:
    • Verifique se DownloadHelper não vaza instâncias Renderer não lançadas, 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 atinja o tempo limite (https://issuetracker.google.com/328442628).
  • Extensão HLS:
    • Correção de um bug em que amostras EMSG pendentes aguardando uma descontinuidade eram delegadas em HlsSampleStreamWrapper com um deslocamento incorreto, causando um IndexOutOfBoundsException ou um IllegalArgumentException (#1002).
    • Correção de um bug em que as playlists não principais eram recarregadas continuamente 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 de um bug em que o novo preparo de uma transmissão ao vivo de vários períodos podia gerar um IndexOutOfBoundsException (#1329).
    • Adição de suporte aos URLs de licença dashif:Laurl (#1345).
  • Extensão do Google Cast:
    • Correção de um 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.
    • Mude os métodos TestPlayerRunHelper.runUntil()/playUntil() para falhar em erros não fatais (por exemplo, aqueles informados a 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 definição do modo de repetição com argumentos Intent da linha de comando (#1266).
    • Use HttpEngineDataSource como HttpDataSource quando compatível com o dispositivo.
  • Símbolos descontinuados foram removidos:
    • Remoção de CronetDataSourceFactory. Use CronetDataSource.Factory.
    • Remoção de alguns construtores DataSpec. 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. Use OkHttpDataSource.Factory.
    • O PlayerMessage.setHandler(Handler) foi removido. Use setLooper(Looper).
    • Remova o campo Timeline.Window.isLive. Em vez disso, use o método isLive().
    • Remova os construtores DefaultHttpDataSource. 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).
    • Remoção dos métodos DrmSessionManager.DUMMY e getDummyDrmSessionManager(). Use DrmSessionManager.DRM_UNSUPPORTED.
    • Remova AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format), VideoRendererEventListener.onVideoInputFormatChanged(Format). Use as sobrecargas que aceitam um DecoderReuseEvaluation.
    • Remova a IntDef RendererSupport.FormatSupport e as constantes FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE e FORMAT_UNSUPPORTED_TYPE. Use o IntDef e as constantes equivalentes em androidx.media3.common.C (por exemplo, C.FORMAT_HANDLED).
    • Remova a interface Bundleable. Isso inclui a remoção de todos os campos constantes de Bundleable.Creator<Foo> CREATOR. Os chamadores 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 podia reter os fluxos quando era pré-carregado novamente.
    • Aplique o TrackSelectionResult correspondente correto ao período de reprodução na nova seleção de faixas.
    • Inicie renderizadores ativados antecipadamente somente depois de 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:
    • Adicione uma solução alternativa para a exceção gerada porque MediaMuxer não oferece suporte a carimbos de data/hora de apresentação negativos antes da API 30.
  • Seleção de faixas:
    • DefaultTrackSelector: prefira faixas de vídeo com uma taxa de frames "razoável" (>=10 fps) em vez daquelas com uma taxa de frames mais baixa ou não definida. Isso garante que o player selecione a faixa de vídeo "real" em MP4s extraídos de fotos em movimento que podem conter duas faixas HEVC, em que uma tem uma resolução maior, 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 partes de tamanho ímpar de arquivos WAV (#1117).
    • MP3: preencha Format.averageBitrate com frames de metadados, como XING e VBRI.
    • MPEG-TS: revertemos uma mudança que visava garantir a renderização do último frame transmitindo a última unidade de acesso de um stream para a fila de amostras (#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:
    • Permite a recuperação do renderizador desativando o descarregamento se a faixa de áudio não inicializar no modo de descarregamento.
  • Vídeo:
    • Adicionamos uma solução alternativa para um problema em dispositivos Galaxy Tab S7 FE, Chromecast com Google TV e Lenovo M10 FHD Plus que faz com que streams H265 de 60 fps sejam marcados como não compatíveis.
    • Adicione 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).
    • Foi corrigido um problema em que o processamento de informações de cores HDR causava um comportamento inadequado do codec e impedia a troca de formato adaptável para faixas de vídeo SDR (#1158).
  • Texto:
    • WebVTT: impede que dicas consecutivas criem instâncias CuesWithTiming adicionais espúrias de WebvttParser.parse (#1177).
  • DRM:
    • Solução alternativa para um NoSuchMethodError que pode ser gerado pelo framework MediaDrm em vez de ResourceBusyException ou NotProvisionedException em alguns dispositivos Android 14 (#1145).
  • Efeito:
    • Melhoria do mapeamento de tons PQ para SDR com a conversão de espaços de cores.
  • Sessão:
    • Correção de um problema em que a posição atual voltava quando o controlador substituía o item atual (#951).
    • Correção de um problema em que MediaMetadata com apenas extras não nulo não era transmitido entre controladores e sessões de mídia (#1176).
  • Interface:
    • O nome do idioma da faixa de áudio é incluído se Locale não conseguir identificar um nome de exibição (#988).
  • Extensão DASH:
    • Preencha todos os elementos Label do manifesto em Format.labels (#1054).
  • Extensão RTSP:
    • Ignorar valores de informações de sessão vazias (i-tags) na análise do SDP (#1087).
  • Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • Desative a extensão MIDI como uma dependência local por padrão porque ela exige 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 estas confirmações.

  • Biblioteca comum:
    • Implemente a compatibilidade com 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 serem totalmente minúsculos.
    • 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 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:
    • Adicione PreloadMediaSource e PreloadMediaPeriod para permitir que os apps pré-carreguem uma origem 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.
    • Adicione ExoPlayer.setImageOutput que permite que os apps definam ImageRenderer.ImageOutput.
    • Agora, DefaultRenderersFactory 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 ignorado (#765).
    • Adição de suporte experimental para analisar legendas durante a extração. É possível ativar isso usando MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Compatibilidade com fontes de mídia adaptáveis com PreloadMediaSource.
    • Implemente HttpEngineDataSource, um HttpDataSource usando a API HttpEngine.
    • Impeça a criação de subclasses de CompositeSequenceableLoader. Esse componente foi anteriormente extensível mas nunca foi subclassificado na biblioteca. As personalizações podem ser feitas encapsulando uma instância usando o padrão de decorador e implementando um CompositeSequenceableLoaderFactory personalizado.
    • Correção de um problema em que a repetição do mesmo horário fazia com que os metadados do item fossem limpos (#1007).
    • Renomeie os métodos experimentalSetSubtitleParserFactory em BundledChunkExtractor.Factory e DefaultHlsExtractorFactory para setSubtitleParserFactory e não permita a transmissão de null. 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 fonte produziu um Format (#883).
    • Correção da regex usada para validar nomes de chaves de dados comuns do cliente de mídia (CMCD) personalizados. Para isso, ela foi modificada para verificar apenas o hífen (#1028).
    • Parar de codificar duas vezes os parâmetros de consulta CMCD (#1075).
  • Transformador:
    • Adicionamos suporte para reduzir vídeos em câmera lenta SEF H.265/HEVC.
    • Aumenta a velocidade de transmuxing, principalmente para edições de "remover vídeo".
    • Adição de 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é que o carimbo de data/hora de apresentação (#829) seja exibido.
    • Adição de compatibilidade para otimizar operações de corte de MP4 de um único recurso.
    • Adiciona 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 (#829).
  • Seleção de faixas:
    • Adicione DefaultTrackSelector.selectImageTrack para ativar a seleção de faixas de imagem.
    • Adicione TrackSelectionParameters.isPrioritizeImageOverVideoEnabled para determinar se uma faixa de imagem será selecionada se uma faixa de imagem e uma 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 análise AV1C ao extrator MP4 para recuperar valores de ColorInfo.colorSpace, ColorInfo.colorTransfer e ColorInfo.colorRange (#692).
    • MP3: use a busca de taxa de bits constante (CBR) para arquivos com um cabeçalho Info (o equivalente CBR do cabeçalho Xing). Antes, usávamos a tabela de busca do cabeçalho Info, mas isso resulta em uma busca menos precisa do que se ignorarmos e presumirmos que o arquivo é CBR.
    • MPEG2-TS: adicionado suporte a DTS, DTS-LBR e DTS:X Profile2 (#275).
    • Extraia tipos de áudio de descritores TS e mapeie-os para flags de função, permitindo que os usuários façam seleções de faixa de áudio mais bem informadas (#973, link em inglês).
  • Áudio:
    • Melhoramos o algoritmo de pular silêncio com uma rampa de volume suave. Mantivemos o silêncio mínimo e durações de silêncio mais naturais (#7423).
    • Relatar o silêncio ignorado de forma mais determinística (#1035).
  • Vídeo:
    • Mude o construtor MediaCodecVideoRenderer que usa um argumento VideoFrameProcessor.Factory e substitua-o 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 dicas de bitmap para resolver o erro Tried to marshall a Parcel that contained Binder objects ao usar DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836).
    • CEA-708: ignore o valor rowLock. A especificação CEA-708-E S-2023 afirma que rowLock e columnLock devem ser considerados verdadeiros, independente dos valores presentes no stream. Como o suporte a columnLock não é implementado, ele é considerado sempre falso.
  • Imagem:
    • Adição de suporte a miniaturas DASH. As imagens em grade são cortadas, e miniaturas individuais são fornecidas para ImageOutput perto dos horários de apresentação.
  • DRM:
  • 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 (962, link em inglês).
    • Correção de um problema em que MediaItem.RequestMetadata com apenas extras não nulos não era transmitido entre controladores e sessões de mídia.
    • Adicione um construtor ao MediaLibrarySession.Builder que usa apenas um Context em vez de um MediaLibraryService.
  • Extensão HLS:
    • Reduza HlsMediaPeriod para visibilidade privada do pacote. Esse tipo não deve ser usado diretamente de fora do pacote HLS.
    • As buscas para o início de um segmento são resolvidas com mais eficiência (#1031).
  • Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • Decodificador MIDI: ignora mensagens de eventos SysEx (#710).
  • Utilitários de teste:
    • Não pause a reprodução em TestPlayerRunHelper.playUntilPosition. O teste mantém a reprodução em um estado de execução, mas suspende o progresso até que o teste possa adicionar asserções e outras ações.
  • App de demonstração:
    • Adicione um módulo de demonstração de conteúdo curto para demonstrar o uso de PreloadMediaSource com o caso de uso de conteúdo 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 buscas manuais fora do intervalo LiveConfiguration.min/maxOffset continuavam ajustando o deslocamento de volta para min/maxOffset.
    • Correção de um problema em que os layouts de canais 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).
    • Correção do problema em que novas instâncias de CmcdData.Factory estavam recebendo valores negativos para bufferedDurationUs de fontes de partes, resultando em um IllegalArgumentException (#888).
  • Transformador:
    • Contornar um problema em que o codificador gerava um erro no momento da configuração devido à definição de uma taxa de operação alta.
  • Extratores:
    • Marque as faixas HEVC secundárias (não reproduzíveis) em fotos dinâmicas JPEG como ROLE_FLAG_ALTERNATE para evitar que elas sejam selecionadas automaticamente para reprodução devido à resolução mais alta.
    • Correção da detecção incorreta de frame-chave para transmissões TS H264 (#864).
    • Correção da estimativa de duração de streams 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 não compatíveis (#693).
  • Metadados:
    • Correção do bug em que MediaMetadata era preenchido apenas com comentários do Vorbis com chaves em maiúsculas (#876).
    • Captura OutOfMemoryError ao analisar frames ID3 muito grandes, ou seja, a reprodução pode continuar sem as informações da tag em vez de falhar completamente.
  • DRM:
    • Estender a solução alternativa para URL de licença https://default.url ClearKey espúrio para API 33 e versões mais recentes. Antes, a solução alternativa era aplicada apenas na API 33 (#837).
    • Correção do ERROR_DRM_SESSION_NOT_OPENED ao alternar de conteúdo criptografado para não criptografado sem uma superfície anexada ao player. O erro ocorreu devido ao uso incorreto de um decodificador seguro para abrir o conteúdo sem proteção.
  • 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 definir 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 concluiu 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çar rápido da PlayerControlView estavam desalinhados (#547, link em inglês).
  • Extensão DASH:
    • Analisar "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 de um problema em que a busca para frente ignorava 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:
    • Sanitização da criação de um Timeline para não falhar o app quando o carregamento de mídia falha 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 precisam anexar manualmente essas informações, se necessário (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 eram detectados como anuláveis. Exemplos são os parâmetros de método TrackSelectorResult e SimpleDecoder (#6792).
    • Mude o comportamento padrão da interface e das notificações em Util.shouldShowPlayButton para mostrar um botão "Reproduzir" enquanto a reprodução está temporariamente suprimida (por exemplo, devido a uma perda temporária de seleção de áudio). O comportamento legado pode ser mantido usando PlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false) ou MediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false) (#11213).
    • Faça upgrade do androidx.annotation:annotation-experimental para o 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 fluxos AC4 causados pela identificação incorreta de amostras somente de decodificação (#11000).
    • Adicione a supressão da reprodução em dispositivos de saída de áudio inadequados (por exemplo, o alto-falante integrado em dispositivos Wear OS) quando esse recurso estiver ativado via ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. O motivo da supressão da reprodução será atualizado como Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT se a reprodução for tentada 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 via Player.replaceMediaItem(s).
    • Permitir atualizações de MediaItem para todas as classes MediaSource fornecidas pela biblioteca via 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 para o TrackOutput como uma amostra.
    • Melhore o método SequenceableLoader.continueLoading(long) na interface SequenceableLoader para SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo contém outros parâmetros, incluindo playbackSpeed e lastRebufferRealtimeMs, além do playbackPositionUs atual.
    • Melhore o método ChunkSource.getNextChunk(long, long, List, ChunkHolder) na interface ChunkSource para ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Adicione outros campos ao registro de dados comuns do cliente de mídia (CMCD): falta de buffer (bs), prazo (dl), taxa de reprodução (pr) e inicialização (su) (#8699).
    • Adição de bitdepth de luma e croma a ColorInfo (#491).
    • Adicione outros campos ao registro de dados comuns do cliente de mídia (CMCD): próxima solicitação de objeto (nor) e próxima solicitação de intervalo (nrr) (#8699).
    • Adicionamos a funcionalidade de transmitir dados comuns do cliente de mídia (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 períodos/janelas de tempo de compensação) 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.
    • Mudança dos parâmetros frameRate e durationUs de SampleConsumer.queueInputBitmap para TimestampIterator.
  • Seleção de faixas:
    • Adicione DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness para permitir ou não explicitamente a adaptação não contínua. 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 fluxo para a fila de amostras (#7909).
    • Correção de erro de digitação ao determinar rotationDegrees. Mudança de projectionPosePitch para projectionPoseRoll (#461).
    • Remova a proposição de que as instâncias Extractor podem ser inspecionadas diretamente com instanceof. Se você quiser acesso em tempo de execução aos detalhes de implementação de um Extractor, primeiro chame Extractor.getUnderlyingInstance.
    • Adição do BmpExtractor.
    • Adição do WebpExtractor.
    • Adição do HeifExtractor.
    • Adicione suporte ao QuickTime clássico ao Mp4Extractor.
  • Áudio:
    • Adição de suporte para PCM big-endian de 24/32 bits em MP4 e Matroska, além de análise da codificação PCM para lpcm em MP4.
    • Adição de suporte para extrair áudio Vorbis em MP4.
    • Adicione 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.
    • Adicione AudioSink.setOffloadMode(), em que a configuração de descarga no coletor de áudio é definida. O padrão é AudioSink.OFFLOAD_MODE_DISABLED.
    • O descarregamento pode ser ativado em setAudioOffloadPreference no 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 estiver definido como AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, o DefaultTrackSelector só vai selecionar uma faixa de áudio 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 antes do nível 33 da API 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.
    • Remova o método DefaultAudioSink.Builder.setOffloadMode.
    • Remova o valor intdef DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED.
    • Adição de suporte para metadados sem lacunas do Opus durante a reprodução de descarga.
    • Permitir a recuperação do renderizador desativando o descarregamento se a primeira gravação falhar (#627).
    • Ativar o agendamento de descarga por padrão para reprodução descarregada somente de áudio.
    • Exclua ExoPlayer.experimentalSetOffloadSchedulingEnabled e AudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged.
    • onExperimentalSleepingForOffloadChanged foi renomeado como onSleepingForOffloadChanged e onExperimentalOffloadedPlayback como onOffloadedPlayback.
    • Mova as interfaces e definições TrackSelectionParameters relacionadas ao modo de descarga de áudio para uma classe AudioOffloadPreferences interna.
    • Adicione callbacks onAudioTrackInitialized e onAudioTrackReleased a AnalyticsListener, AudioRendererEventListener e AudioSink.Listener.
    • Correção do problema de estouro negativo do buffer de áudio do DTS Express (#650).
    • Correção de um bug em que a verificação de recursos para E-AC3-JOC gerava um IllegalArgumentException (#677).
  • Vídeo:
    • Permitir que MediaCodecVideoRenderer use um VideoFrameProcessor.Factory personalizado.
    • Correção de um bug em que o primeiro frame não podia ser renderizado se o fluxo 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 pelo TextRenderer sem precisar de uma instância SubtitleDecoder.
  • Metadados:
    • MetadataDecoder.decode não será mais chamado para amostras "somente decodificar", já que a implementação precisa retornar nulo de qualquer maneira.
  • Efeito:
    • Adicione a entrada de bitmap de enfileiramento VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) por carimbo de data/hora.
    • Mude VideoFrameProcessor.registerInputStream() para não bloqueio. Os apps precisam implementar VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Mudança dos parâmetros frameRate e durationUs de VideoFrameProcessor.queueInputBitmap para TimestampIterator.
  • Extensão de IMA:
    • Correção de um 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).
    • Use apenas 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ções de mídia como proxy para definir comandos disponíveis e o layout personalizado usado para preencher a notificação e a sessão da plataforma.
    • Converta eventos de botões de mídia recebidos por MediaSessionService.onStartCommand() na Media3 em vez de encaminhá-los para a sessão da plataforma e de volta para a Media3. Assim, o controlador de chamadas é sempre o controlador de notificações de mídia, e os apps podem reconhecer facilmente as chamadas vindas da notificação da mesma forma em todos os níveis de API compatíveis.
    • Correção de um bug em que o MediaController.getCurrentPosition() não avança quando conectado a um MediaSessionCompat legado.
    • Adicione MediaLibrarySession.getSubscribedControllers(mediaId) para facilidade.
    • Substitua MediaLibrarySession.Callback.onSubscribe() para confirmar a disponibilidade do ID principal a que o controlador se inscreve. Se for bem-sucedida, a assinatura será aceita e notifyChildrenChanged() será chamado imediatamente para informar o navegador (#561).
    • Adicione o módulo de demonstração de sessão para o Automotive OS e ative a 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ções de mídia. Com o Android Auto como o controlador cliente lendo da sessão do framework, o botão queue na interface do Android Auto não é exibido (#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 Player.Listener para dispositivos Wear OS que lide com a supressão da reprodução devido a Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT ao iniciar uma caixa de diálogo do sistema para permitir que um usuário conecte uma saída de áudio adequada (por exemplo, fones de ouvido Bluetooth). O listener vai retomar a reprodução automaticamente se um dispositivo adequado for conectado dentro de um tempo limite configurável (o padrão é de 5 minutos).
  • Downloads:
    • Declare o tipo de serviço em primeiro plano "sincronização de dados" 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 HLS com um intervalo calculado a partir do ú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 melhora a compatibilidade com a fusão de legendas sobrepostas, incluindo a resolução de oscilações na transição entre segmentos de legendas. É possível ativar essa opção usando DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Extensão RTSP:
    • Correção de uma disputa que poderia levar a IndexOutOfBoundsException ao reverter para TCP ou a reprodução travar em algumas situações.
    • Verifique o estado na configuração do RTSP ao retornar o estado de carregamento de RtspMediaPeriod (#577).
    • Ignorar métodos de solicitação Rtsp personalizados no cabeçalho público da resposta de opções (#613).
    • Use o valor de tempo limite da resposta de configuração RTSP no intervalo de envio de solicitações de opções RTSP de manutenção (#662).
  • Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • Lançamento do módulo de decodificador MIDI, que oferece suporte à reprodução de arquivos MIDI padrão usando a biblioteca Jsyn para sintetizar áudio.
    • Adicione DecoderOutputBuffer.shouldBeSkipped para marcar diretamente buffers de saída que não precisam ser apresentados. Essa é a opção preferencial em vez de C.BUFFER_FLAG_DECODE_ONLY, que será descontinuada.
    • Adicione Decoder.setOutputStartTimeUs e SimpleDecoder.isAtLeastOutputStartTimeUs para permitir que os decodificadores descartem amostras somente de decodificação antes do horário de início. É preferível usar isso em vez de Buffer.isDecodeOnly, que será descontinuado.
    • Correção de um bug na publicação do artefato do decodificador MIDI no repositório Maven. O artefato foi renomeado como media3-exoplayer-midi (#734).
  • Extensão do Leanback:
    • Correção de um bug em que a desativação de uma superfície podia causar um ArithmeticException no código do Leanback (#617).
  • Utilitários de teste:
    • Tornar TestExoPlayerBuilder e FakeClock compatíveis com testes de interface do Espresso e do Compose. Isso corrige um bug em que a reprodução avança de maneira não determinística durante as interações de visualização do Espresso ou do Compose.
  • Símbolos descontinuados foram removidos:
    • TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) e TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean) foram removidos. Use Composition.Builder.setHdrMode(int) e transmita o Composition para Transformer.start(Composition, String).
    • Remova o método DownloadNotificationHelper.buildProgressNotification obsoleto e use um método não obsoleto que receba 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 por engano de todos os módulos (#499).
  • ExoPlayer:
    • Correção de um problema em PlaybackStatsListener em que PlaybackStats espúrios eram criados depois que a playlist era limpa.
    • Adicionamos mais campos ao registro de dados comuns do cliente de mídia (CMCD): formato de streaming (sf), tipo de stream (st), versão (v), taxa de bits máxima (tb), duração do objeto (d), taxa de transferência 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:
    • Adiciona cabeçalhos de ID Ogg e de comentários ao fluxo de bits para reprodução de Opus descarregada 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: mude a lógica de truncamento de sugestões para considerar apenas o texto visível. Antes, o recuo e o deslocamento de tabulação eram incluídos ao limitar o comprimento da dica 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 um 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).
    • Corrigimos a maneira como PlayerWrapper cria um VolumeProviderCompat ao determinar volumeControlType usando 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:
    • Adicione o motivo da supressão para uma rota de áudio inadequada e toque quando estiver pronto. Mude o motivo para "suprimido por tempo excessivo". (#15).
    • Adicione comandos ao player:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Adicione 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)
    • Adicione Builder para DeviceInfo e descontinue o construtor atual.
    • Adicione DeviceInfo.routingControllerId para especificar o ID do controlador de roteamento para reproduções remotas.
    • Adicione Player.replaceMediaItem(s) como um atalho para adicionar e remover itens na mesma posição (#8046).
  • ExoPlayer:
    • Permitir que o ExoPlayer controle os métodos de volume do dispositivo somente se a opção for ativada explicitamente. 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)
    • Adicione FilteringMediaSource, que permite filtrar os tipos de faixa disponíveis de um MediaSource.
    • Adição de suporte para incluir dados comuns do cliente de mídia (CMCD) nas solicitações de saída dos formatos de streaming adaptável DASH, HLS e SmoothStreaming. Os campos a seguir, br, bl, cid, rtp e sid, foram incorporados (#8699). Estrutura e métodos da API:
      • A geração de registros da CMCD está desativada por padrão. Use MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) para ativar.
      • Todas as chaves são ativadas por padrão. Substitua CmcdConfiguration.RequestConfig.isKeyAllowed(String key) para filtrar quais chaves são registradas.
      • Substitua CmcdConfiguration.RequestConfig.getCustomData() para ativar a geração de registros de chaves personalizadas.
    • Adicione outra ação ao manifesto da demonstração principal para facilitar o início 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.
    • Adicione 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.
    • O uso de EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) e BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs) foi descontinuado. 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 enviados pelo dispatcher.
    • ExoTrackSelection.blacklist foi renomeado como excludeTrack, e isBlacklisted 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 (resultando em um tempo limite do muxer) se o final do fluxo de vídeo fosse sinalizado no momento em que um frame de entrada estava pendente de processamento.
    • Consulte codecs usando MediaCodecList em vez de usar utilitários findDecoder/EncoderForFormat para ampliar o suporte.
    • Remova a configuração de frame B em DefaultEncoderFactory porque ela não funciona em alguns dispositivos.
  • Seleção de faixas:
    • Adicionado DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange, que é desativado por padrão. Quando ativada, a DefaultTrackSelector aciona uma nova seleção de faixa quando as funcionalidades do renderizador mudam.
  • Extratores:
    • Ogg: correção de um bug ao buscar em arquivos de longa duração (#391).
    • FMP4: foi corrigido um problema em que o TimestampAdjuster inicializa um deslocamento de carimbo de data/hora incorreto com o tempo de exemplo de metadados do átomo emsg (#356).
  • Áudio:
    • Correção de um bug em que algumas reproduções falhavam quando o tunelamento estava ativado e AudioProcessors estavam ativos, por exemplo, para corte sem intervalos (#10847).
    • Encapsular frames Opus em pacotes Ogg em reproduções diretas (descarregamento).
    • Extrapolar a posição atual durante o sono com programação de descarga.
    • Adicione Renderer.release() e AudioSink.release() para liberar os recursos no final do ciclo de vida do player.
    • Detectar mudanças nas funcionalidades de áudio em DefaultAudioSink. Adicione um parâmetro obrigatório context no construtor de DefaultAudioSink, com o qual o DefaultAudioSink vai se registrar como listener do AudioCapabilitiesReceiver e atualizar a propriedade audioCapabilities quando informado sobre uma mudança de recursos.
    • Propague as mudanças de recursos de áudio usando um novo evento onAudioCapabilitiesChanged na interface AudioSink.Listener e uma nova interface RendererCapabilities.Listener que aciona eventos onRendererCapabilitiesChanged.
    • Adicione ChannelMixingAudioProcessor para aplicar escalonamento/mixagem a canais de áudio.
    • Adicione o novo valor int DISCARD_REASON_AUDIO_BYPASS_POSSIBLE a DecoderDiscardReasons para descartar o decodificador de áudio quando o modo de bypass for possível após a mudança nas funcionalidades de áudio.
    • Adição de suporte à reprodução direta para DTS Express e DTS:X (#335).
  • Vídeo:
    • Faça com que o MediaCodecVideoRenderer informe um VideoSize com largura e altura 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 0 quando Player.getCurrentTracks não oferece suporte a vídeo ou o tamanho da faixa de vídeo compatível 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 DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxer:
    • Adicione uma nova biblioteca de muxer que pode ser usada para criar um arquivo de contêiner MP4.
  • Extensão de IMA:
    • Ative transmissões DASH ao vivo de vários períodos para a DAI. A implementação atual ainda não permite buscar 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 calculada do conteúdo 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.
    • Adicione 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).
    • Adicione a 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).
    • Adicione botões de comando "Ir para o anterior" e "Ir para o próximo" na visualização compacta de notificação de mídia por padrão para o Android 12 e versões anteriores (#410).
    • Adicione a 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).
    • Adicione botões de comando "Ir para o anterior" e "Ir para o 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:
    • Adicione os métodos Util shouldShowPlayButton e handlePlayPauseButtonAction para gravar elementos de interface personalizados com um botão de reproduzir/pausar.
  • Extensão RTSP:
    • Para MPEG4-LATM, use o valor padrão de profile-level-id se ele não estiver presente na mensagem SDP de resposta de descrição (#302).
    • Use o URI base para resolução de caminho relativo da sessão RTSP se estiver presente no cabeçalho de resposta DESCRIBE (#11160).
  • Extensão DASH:
    • Remova o ajuste de tempo da mídia de MediaLoadData.startTimeMs e MediaLoadData.endTimeMs para streams DASH de vários períodos.
    • Foi corrigido um bug em que o reparo de uma fonte de mídia Dash ao vivo de vários períodos produzia um 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 o travamento infinito da reprodução. 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 em vez disso.
    • Remova HlsMasterPlaylist e use HlsMultivariantPlaylist.
    • O Player.stop(boolean) foi removido. Use Player.stop() e Player.clearMediaItems() (se reset for true).
    • Remova dois construtores SimpleCache descontinuados e use um construtor não descontinuado que receba um DatabaseProvider para melhorar o desempenho.
    • O construtor DefaultBandwidthMeter foi removido. Use DefaultBandwidthMeter.Builder.
    • Os construtores DefaultDrmSessionManager foram removidos. Use DefaultDrmSessionManager.Builder.
    • Remova dois construtores HttpDataSource.InvalidResponseCodeException obsoletos e 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. Use DownloadHelper.forMediaItem.
    • Remova o construtor DownloadService suspenso e use um construtor não suspenso 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.
    • Remova o construtor WorkManagerScheduler descontinuado e use um construtor não descontinuado que inclua a opção de fornecer um parâmetro Context em vez disso.
    • Remova os métodos obsoletos 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 obsoletos copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate e copyWithVideoSize. Use Format.buildUpon() e métodos setter.
    • Remoção do obsoleto ExoPlayer.retry(). Use prepare()
    • Remoção do construtor DefaultTrackSelector de zero argumentos obsoleto. Use DefaultTrackSelector(Context).
    • Remoção do construtor OfflineLicenseHelper obsoleto. Use OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • Remova o construtor DownloadManager descontinuado e use o construtor que usa um Executor.
    • Remoção dos construtores Cue obsoletos. Use Cue.Builder.
    • Remoção do construtor OfflineLicenseHelper obsoleto. 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 comandos Player.Listener.onSeekProcessed e AnalyticsListener.onSeekProcessed obsoletos. Use onPositionDiscontinuity com DISCONTINUITY_REASON_SEEK.
    • Remova ExoPlayer.setHandleWakeLock(boolean) e use setWakeMode(int).
    • Remoção do obsoleto DefaultLoadControl.Builder.createDefaultLoadControl(). Use build()
    • Remoção do obsoleto MediaItem.PlaybackProperties. 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 2023

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.2.0 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:
    • Adicione Buffer.isLastSample() que indica se Buffer contém a flag C.BUFFER_FLAG_LAST_SAMPLE.
    • Correção do problema em que o último frame não era renderizado se a última amostra com frames fosse 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 reutilizando 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 atualiza os comandos disponíveis quando conectado a um MediaSessionCompat legado que atualiza as ações.
    • Correção de um bug que impedia o MediaLibraryService de retornar 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 um 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 do ExoPlayer 2.18.6.

  • 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 fluxos de amostra vazios na mídia podiam travar a reprodução.
  • Sessão:
    • Foi corrigido 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 a chamada de MediaSession.setPlayer não atualizava os comandos disponíveis.
    • Correção de um problema em que as instâncias TrackSelectionOverride enviadas de um MediaController eram ignoradas se fizessem referência a um grupo com Format.metadata (#296).
    • Correção de um problema em que Player.COMMAND_GET_CURRENT_MEDIA_ITEM precisa estar disponível para acessar metadados usando o MediaSessionCompat legado.
    • Correção de um problema em que instâncias de MediaSession em uma linha de execução em segundo plano causavam 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 tivesse essa intenção (#314, link em inglês).
  • DASH:
    • Correção do processamento de linhas do tempo de segmentos vazias (#11014).
  • RTSP:
    • Tente novamente com TCP se a configuração do RTSP com UDP falhar com o erro 461 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 de tipo de rede na API 33 (#10970).
    • Correção de NullPointerException ao chamar ExoPlayer.isTunnelingEnabled (#10977).
  • Downloads:
    • Configure a diferença máxima do horário de início de dois segmentos a serem mesclados 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 podem 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 de dispositivo no Chromecast com Google TV e no Lenovo M10 FHD Plus que faz com que streams AVC de 60 fps 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 do que a taxa de atualização da tela.
  • Transmitir:
    • Correção do STATE_IDLE transitório ao fazer a transição entre itens de mídia (#245).
  • RTSP:
    • Captura a IllegalArgumentException gerada na análise de RTSP inválido Descreve mensagens de resposta (#10971).
  • Sessão:
    • Correção de um bug em que o botão de reprodução/pausa 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 streams da 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.1.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

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

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

  • 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).
  • Origens 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 do URL base foi corrigida para manifestos que não declaram o namespace do DVB (#9856, link em inglês).
    • 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.