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
30 de outubro de 2024 1.4.1 - 1.5.0-beta01 1.5.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.4.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
    implementation "androidx.media3:media3-ui:$media3_version"
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation "androidx.media3:media3-ui-leanback:$media3_version"

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

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

    // For 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.4.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
    implementation("androidx.media3:media3-ui:$media3_version")
    // For building media playback UIs for Android TV using the Jetpack Leanback library
    implementation("androidx.media3:media3-ui-leanback:$media3_version")

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

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

    // For 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.5

Versão 1.5.0-beta01

30 de outubro de 2024

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

  • Biblioteca comum:
    • As anotações @DoNotInline foram removidas de classes internas fora da linha criadas manualmente para evitar falhas de verificação de classe no momento da execução. As versões recentes do R8 agora fazem chamadas off-line automaticamente, como essas, para evitar falhas de execução. Portanto, a saída manual não é mais necessária. Todos os usuários do Gradle da biblioteca já precisam estar usando uma versão do Plug-in do Android para Gradle que use uma versão do R8 que faça isso, devido a compileSdk = 35. Os usuários da biblioteca com sistemas de build que não são do Gradle precisam garantir que a etapa de redução/obfuscação equivalente ao R8 faça um processo de saída automática semelhante para evitar falhas de verificação de classe no tempo de execução. Essa mudança já foi feita em outras bibliotecas do AndroidX.
  • ExoPlayer:
    • Correção de MediaCodec.CryptoException, que às vezes era relatado como um "erro de execução inesperado" 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(). Além disso, 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 a qual a fonte de mídia correspondente precisa ser pré-carregada com esse IntDef, em vez de uma posição.
    • Adição de implementação de ForwardingRenderer que encaminha todas as chamadas de método para outro renderizador (1703).
    • Adicione o carregamento prévio da playlist para o próximo item. Os apps podem ativar o carregamento prévio chamando ExoPlayer.setPreloadConfiguration(PreloadConfiguration). Por padrão, o pré-carregamento está desativado. Quando ativado e para não interferir na reprodução, o DefaultLoadControl restringe o pré-carregamento para iniciar e continuar somente quando o player não estiver sendo carregado para reprodução. Os apps podem mudar esse comportamento implementando LoadControl.shouldContinuePreloading() adequadamente (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.
    • O método MediaSourceEventListener.EventDispatcher.dispatchEvent() foi adicionado para permitir a invocação de eventos de listeners de subclasse (1736).
    • Adicione DefaultPreloadManager.Builder que cria as instâncias DefaultPreloadManager e ExoPlayer com configurações compartilhadas de forma consistente.
    • O parâmetro Renderer[] foi removido de LoadControl.onTracksSelected(), já que a implementação de DefaultLoadControl pode recuperar os tipos de transmissão de ExoTrackSelection[].
    • O método DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[]) foi descontinuado e marcado como final para evitar substituições. O novo DefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]) precisa ser usado.
    • Informe 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 sideloaded (aquelas adicionadas com MediaItem.LocalConfiguration.subtitleConfigurations), que podem aparecer como eventos de carregamento duplicados emitidos por AnalyticsListener.
    • Evite que erros de legenda e metadados parem completamente a reprodução. Em vez disso, a faixa problemática é desativada, e a reprodução das faixas restantes continua (1722, link em inglês).
      • No novo processamento de legendas (durante a extração), a análise associada (por exemplo, dados de legenda inválidos) e os erros de carregamento (por exemplo, HTTP 404) são emitidos por callbacks onLoadError.
      • No processamento de legendas legados (durante a renderização), apenas erros de carregamento associados são emitidos por callbacks onLoadError, enquanto erros de análise são ignorados silenciosamente (este é um comportamento preexistente).
  • Transformador:
    • A configuração da duração da imagem usando MediaItem.Builder.setImageDurationMs é obrigatória para a exportação de imagens.
    • Adição de suporte à exportação para lacunas em sequências de EditedMediaItems de áudio.
  • Seleção de faixas:
    • DefaultTrackSelector: prefira o áudio baseado em objetos em vez do áudio baseado em canal quando outros fatores forem iguais.
  • Extratores:
    • Foi corrigido o processamento de amostras de anúncios precedentes para posições de início de mídia que não são frames-chave ao processar listas de edição em arquivos MP4 (#1659).
    • Melhoramos o cálculo da taxa de frames usando a duração da mídia da caixa mdhd em Mp4Extractor e FragmentedMp4Extractor (#1531).
    • Correção da escalação incorreta de media_time nas listas de edição de MP4. Embora segment_duration já tenha sido dimensionado corretamente usando a escala de tempo do filme, media_time agora é dimensionado corretamente usando a escala de tempo da faixa, conforme especificado pelo padrão de formato MP4 (#1792).
    • Processamento de frames fora de ordem no cálculo de endIndices para MP4 com a lista de edição (#1797).
  • Áudio:
    • Correção de sons de estouro que podem ocorrer durante buscas.
    • Correção de acúmulo de erros de truncamento para o algoritmo de alongamento/mudança de tom do Sonic.
    • Correção de um bug no SpeedChangingAudioProcessor que causa frames de saída desativados.
  • Vídeo:
    • Foi adicionada uma solução alternativa para um problema de dispositivo no Galaxy Tab S7 FE que faz com que streams H264 seguros de 60 fps sejam marcados como sem suporte (#1619).
    • Adição de solução alternativa para codecs que ficam presos após a última amostra sem retornar um sinal de fim de transmissão.
  • Texto:
    • Verifique se o WebVTT em HLS com carimbos de data/hora de legendas muito grandes (que excedem um long de 64 bits quando representado como microssegundos e multiplicado pela base de tempo MPEG 90,000) são exibidos (#1763).
  • Metadados:
    • Atribua o tipo C.TRACK_TYPE_METADATA a faixas que contêm conteúdo icy ou vnd.dvb.ait.
  • DRM:
    • Correção de IllegalStateException de DefaultDrmSession.requiresSecureDecoder após a abertura de uma sessão de DRM falhou. Esse problema foi introduzido na versão 1.5.0-alpha01.
  • Muxers:
  • Extensão de IMA:
    • Foi corrigido um bug em que os streams da DAI inseridos no lado do servidor sem um anúncio precedente podem resultar em um ArrayIndexOutOfBoundsException ao reproduzir o último anúncio intermediário (#1741).
  • Sessão:
    • Correção de um bug que fazia com que comandos personalizados enviados de um MediaBrowser fossem enviados para o MediaSessionCompat.Callback em vez da variante MediaBrowserServiceCompat do método quando conectado a um serviço legado. Isso impediu que o MediaBrowser recebesse o valor de retorno real enviado de volta 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. Os botões de comando do Media3 para itens de mídia estão disponíveis para MediaBrowser e MediaController. Consulte Ações de navegação personalizadas do AAOS.
    • Foi corrigido um bug em que um controlador da Media3 às vezes não podia permitir que um app de sessão iniciasse um serviço em primeiro plano depois de solicitar play()
    • Restrinja CommandButton.Builder.setIconUri para aceitar apenas URIs de conteúdo.
    • Transmita as sugestões de conexão de um navegador Media3 para o MediaBrowserCompat inicial ao se conectar a um MediaBrowserCompat legado. O serviço pode receber as dicas de conexão transmitidas como dicas raiz com a primeira chamada para onGetRoot().
    • Correção de um bug em que uma MediaBrowser conectada a um serviço de navegador legada não recebia um erro enviado pelo serviço depois que o navegador se inscrevia em uma parentid.
    • Melhoria no comportamento de interoperabilidade, para que um navegador Media3 conectado a uma MediaBrowserService legada não solicite as filhas de uma parentId duas vezes ao se inscrever em uma mãe.
  • Interface:
    • O vídeo esticado/recortado foi incluído na alternativa PlayerView-in-Compose-AndroidView, devido a problemas com transições compartilhadas baseadas em XML. Os apps que usam PlayerView dentro de AndroidView precisam chamar PlayerView.setEnableComposeSurfaceSyncWorkaround para ativar (#1237, #1594).
    • O setFullscreenButtonState foi adicionado ao PlayerView para permitir atualizações do ícone do botão de tela cheia sob demanda, ou seja, fora da banda e não reativo 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 do Smooth Streaming:
    • Correção de um erro Bad magic number for Bundle ao reproduzir streams do SmoothStreaming com faixas de texto (#1779).
  • Extensão RTSP:
    • Correção da remoção de informações do usuário para URLs que contêm caracteres @ codificados (#1138).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Adicionamos suporte de 16 KB para extensões de decodificador no Android 15 (#1685).
  • Extensão do Google Cast:
    • A limpeza da linha do tempo é interrompida após a desconexão da CastSession, o que permite que o app de envio 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).
  • Símbolos descontinuados foram removidos:
    • Os construtores DefaultEncoderFactory descontinuados foram removidos. Use DefaultEncoderFactory.Builder

Versão 1.5.0-alpha01

10 de setembro de 2024

Esta versão inclui as seguintes mudanças desde a versão 1.4.1:

  • Biblioteca comum:
    • Foi adicionado ForwardingSimpleBasePlayer, que permite o encaminhamento para outro player com pequenos ajustes, garantindo a consistência total e o tratamento do listener (1183, link em inglês).
    • Substitua SimpleBasePlayer.State.playlist pelo método getPlaylist().
    • Foi adicionada uma substituição para SimpleBasePlayer.State.Builder.setPlaylist() a fim de especificar diretamente um Timeline e um Tracks e Metadata atuais, em vez de criar uma estrutura de playlist.
    • Aumento de 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 fornece funcionalidade específica do Kotlin criada com base na biblioteca Common
    • A função de extensão de suspensão Player.listen foi adicionada para girar uma corrotina e ouvir Player.Events na biblioteca media3-common-ktx.
  • ExoPlayer:
    • Agora, MediaCodecRenderer.onProcessedStreamChange() pode ser chamado para todos os itens de mídia. Anteriormente, ele não era chamado para o primeiro. Use MediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart() para ativar.
    • PreloadMediaSource.PreloadControl.onPreloadError foi adicionado para permitir que implementações de PreloadMediaSource.PreloadControl realizem ações quando ocorre um erro.
    • Adicionar BasePreloadManager.Listener para propagar eventos de pré-carregamento para apps
    • Foi permitido mudar o tempo limite do cliente SNTP e tentar novamente endereços alternativos no tempo limite (#1540).
    • Remova MediaCodecAdapter.Configuration.flags, porque o campo sempre era zero.
    • Permita que o usuário selecione o alto-falante integrado para reprodução na API Wear OS 35 ou mais recente, em que o dispositivo anuncia suporte a isso.
    • Adiar 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 tratamento de foco de áudio não estiver ativado (#1616).
    • A reprodução é permitida independentemente da duração em buffer quando o carregamento falha (#1571).
    • Adição de AnalyticsListener.onRendererReadyChanged() para sinalizar quando renderizadores individuais permitem que a reprodução esteja pronta.
  • Transformador:
    • Adição de SurfaceAssetLoader, que oferece suporte à fila de dados de vídeo para o Transformer por meio de um Surface.
    • ImageAssetLoader informa entrada sem suporte usando AssetLoader.onError em vez de gerar uma IllegalStateException.
  • Extratores:
    • Permitir que Mp4Extractor e FragmentedMp4Extractor identifiquem amostras H264 que não são usadas como referência por amostras subsequentes.
    • Adicionamos a opção de ativar a busca com base no índice em 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 falharem com ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1} (#1563).
  • DataSource:
    • Atualização de HttpEngineDataSource para permitir o uso a partir da versão S da extensão 7 em vez do nível 34 da API (#1262).
  • Áudio:
    • Configura automaticamente os metadados de intensidade CTA-2075 no codec, se presentes na mídia.
    • O volume diminui suavemente ao buscar.
  • Vídeo:
    • MediaCodecVideoRenderer evita a decodificação de amostras que não são renderizadas nem usadas como referência por outras amostras.
    • Na API 35 e versões mais recentes, MediaCodecAdapter agora pode receber um Surface null em configure e chamadas para um novo método detachOutputSurface para remover um Surface definido anteriormente, se o codec oferecer suporte a isso (MediaCodecInfo.detachedSurfaceSupported).
    • Use os valores de proporção de pixel fornecidos por MediaCodecAdapter, se fornecidos ao processar onOutputFormatChanged (1371).
  • Texto:
  • Imagem:
    • ExternallyLoadedImageDecoder foi adicionado para integração simplificada com bibliotecas externas de carregamento de imagens, como Glide ou Coil.
  • Fonte de dados:
    • FileDescriptorDataSource, um novo DataSource que pode ser usado para ler de um FileDescriptor, foi adicionado (3757, link em inglês).
  • Efeito:
    • Adição de uma solução alternativa DefaultVideoFrameProcessor para escalonamento menor de SurfaceTexture. SurfaceTexture pode incluir uma pequena escalação que corta uma borda de 1 texel ao redor da borda de um buffer cortado. Agora, isso é tratado 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 Transformer é mais rápida.
  • Extensão de IMA:
    • Correção de um bug em que limpar a playlist pode causar um ArrayIndexOutOfBoundsException em ImaServerSideAdInsertionMediaSource.
  • Sessão:
    • Adicione MediaButtonReceiver.shouldStartForegroundService(Intent) para permitir que os apps suprimam um comando de reprodução que entra para a retomada da reprodução, substituindo esse método. Por padrão, o serviço é sempre iniciado, e a reprodução não pode ser suprimida sem que o sistema cause uma falha no serviço com um ForegroundServiceDidNotStartInTimeException (#1528).
  • Extensão DASH:
    • Foi adicionado suporte para períodos que começam no meio de um segmento (#1440).
  • Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
    • Adiciona o módulo de decodificador IAMF, que oferece suporte à reprodução de arquivos MP4 que contêm faixas IAMF usando a biblioteca nativa libiamf para sintonizar áudio.
      • A reprodução é ativada com um layout estéreo e 5.1 com espacialização e rastreamento opcional da cabeça ativado, mas o suporte à reprodução binaural não está disponível no momento.
  • Extensão do Google Cast:
    • A linha do tempo não é mais limpa após a desconexão da CastSession, o que permite que o app de envio retome a reprodução localmente após uma desconexão.
    • Preencha a DeviceInfo do CastPlayer quando um Context for fornecido. Isso permite vincular o MediaSession a um RoutingSession, o que é necessário para integrar o comutador de saída (1056, link em inglês).
  • Utilitários de teste:
    • O DataSourceContractTest agora inclui testes para verificar:
      • O fluxo de entrada read position foi atualizado.
      • O buffer de saída offset foi aplicado corretamente.
  • Símbolos descontinuados foram removidos:
    • O Player.hasPrevious descontinuado Player.hasPreviousWindow() foi removido. Use Player.hasPreviousMediaItem().
    • O método Player.previous() descontinuado foi removido. Use Player.seekToPreviousMediaItem()
    • O método DrmSessionEventListener.onDrmSessionAcquired descontinuado foi removido.

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:
    • Callbacks de pré-carregamento são processados de maneira assíncrona em PreloadMediaSource (#1568).
    • A reprodução é permitida independentemente da duração em buffer quando o carregamento falha (#1571).
  • Extratores:
    • MP3: correção do erro Searched too many bytes ignorando corretamente os 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 tts:fontSize de porcentagem para garantir que eles sejam herdados corretamente de nós pai com valores de tts:fontSize de porcentagem.
    • Correção de IndexOutOfBoundsException em LegacySubtitleUtil devido ao processamento incorreto do caso em que o horário de início da saída solicitado era maior ou igual ao horário final do evento 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 a API 31 ou mais recente que reproduzem conteúdo do L1 Widevine. Esse erro é causado por uma implementação incompleta do método MediaDrm.requiresSecureDecoder do framework (#1603, link em inglês).
  • Efeito:
    • Adicione um método release() a GlObjectsProvider.
  • Sessão:
    • Um toque duplo em KEYCODE_HEADSETHOOK agora é transformado em uma ação "procurar o próximo", conforme documentado (#1493).
    • Processe KEYCODE_HEADSETHOOK como um comando "play" em MediaButtonReceiver ao decidir se ele será ignorado para evitar um ForegroundServiceDidNotStartInTimeException (#1581).
  • Extensão RTSP:
    • As descrições de mídia inválidas na análise SDP foram puladas (#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:
    • Encaminhamento de chamadas de busca sem operação presumidas 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 outras chamadas com mediaItemIndex == C.INDEX_UNSET.
    • Remoção da dependência de compilação na simplificação aprimorada do Java 8 (#1312).
    • Verifique se a duração transmitida para MediaItem.Builder.setImageDurationMs() é ignorada para um MediaItem que não seja de imagem, conforme documentado.
    • Adição de 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 pela rankingData. A personalização é possível 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.
    • Adicionamos PlayerId à maioria dos métodos de LoadControl para permitir que as implementações de LoadControl ofereçam suporte a vários jogadores.
    • Buffer.isDecodeOnly() e C.BUFFER_FLAG_DECODE_ONLY foram removidos. Não é necessário definir essa flag, já que os renderizadores e decodificadores decidirão pular os buffers com base no carimbo de data/hora. Implementações personalizadas de Renderer precisam verificar se o tempo de buffer é pelo menos BaseRenderer.getLastResetPositionUs() para decidir se uma amostra será mostrada. Implementações SimpleDecoder personalizadas 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 precarrega um MediaSource com o rankingData fornecido.
    • remove(MediaSource) foi adicionada a BasePreloadManager.
    • Adicione reset() a BasePreloadManager para liberar todas as origens de retenção e manter a instância do gerenciador de pré-carregamento.
    • Adicione 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 o problema com a atualização do horário do último rebuffer que resultava na chave bs (privação de buffer) incorreta no CMCD (#1124).
    • Adicione PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource) para indicar que a origem foi carregada até o final. Isso permite que DefaultPreloadManager e as implementações personalizadas do PreloadMediaSource.PreloadControl pré-carreguem a próxima origem ou realizem outras ações.
    • Correção de um bug em que o pular silêncio no final dos itens pode 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 prioridade mais alta.
    • AdsMediaSource agora carrega anúncios precedentes antes que a preparação inicial de mídia de conteúdo seja concluída (1358, link em inglês).
    • 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á tinha sido removido do manifesto.
    • Renomeie onTimelineRefreshed() para onSourcePrepared() e onPrepared() para onTracksSelected() em PreloadMediaSource.PreloadControl. Renomeie também os IntDefs em DefaultPreloadManager.Stage.
    • Adição de suporte experimental para programação dinâmica para 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 a instância do ExoPlayer.
    • Adição do Renderer.getDurationToProgressUs(). Um Renderer pode implementar esse método para retornar ao ExoPlayer a duração que a reprodução precisa avançar para que o renderizador progrida. Se ExoPlayer for definido com experimentalSetDynamicSchedulingEnabled(), ExoPlayer vai chamar esse método ao calcular o tempo para programar a tarefa de trabalho.
    • Adição de MediaCodecAdapter#OnBufferAvailableListener para alertar quando os buffers de entrada e saída estiverem disponíveis para uso por MediaCodecRenderer. MediaCodecRenderer sinalizará ExoPlayer ao receber esses callbacks e, se ExoPlayer for definido com experimentalSetDynamicSchedulingEnabled(), ExoPlayer vai programar o loop de trabalho conforme os renderizadores podem progredir.
    • 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.
    • ExoPlayer.Builder.setMaxSeekToPreviousPositionMs() foi adicionado para configurar a posição máxima para a qual seekToPrevious() busca o item anterior (#1425).
    • Algumas inconsistências de seleção de áudio foram corrigidas, como o não relato de perda de seleção completa ou temporária enquanto o player está pausado (#1436, link em inglês).
    • 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 deslocamento do renderizador removido (#1098).
    • Correção de uma possível IllegalArgumentException ao processar o erro do player que aconteceu ao ler um item de playlist (#1483).
  • Transformador:
    • Adicione audioConversionProcess e videoConversionProcess a ExportResult, indicando como a respectiva faixa no arquivo de saída foi criada.
    • As verificações de nível H.264 da otimização de corte foram relaxadas.
    • Adicionamos suporte para alternar entre mídia de entrada SDR e HDR em uma sequência
    • Foi adicionado suporte a efeitos de áudio no nível de composição.
    • Adicionamos suporte para transcodificar imagens Ultra HDR em vídeos HDR.
    • Correção de um problema em que o DefaultAudioMixer não gera a quantidade correta de bytes após ser redefinido e reutilizado.
    • Resolva um bug do decodificador em que o número de canais de áudio era limitado em estéreo ao processar a entrada PCM.
    • Ao selecionar faixas em ExoPlayerAssetLoader, ignore as restrições de contagem de canais de áudio, porque elas se aplicam apenas à reprodução.
    • Substitua a interface androidx.media3.transformer.Muxer por androidx.media3.muxer.Muxer e remova androidx.media3.transformer.Muxer.
    • Correção do carregamento de imagem HEIC de esquemas de URI de conteúdo. (#1373).
    • Ajuste a duração da faixa de áudio no 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 do codec vão estar disponíveis no ExportException.codecInfo.
  • Extratores:
    • MPEG-TS: a mudança é revertida para garantir que o último frame seja renderizado transmitindo a última unidade de acesso de um stream para a fila de amostras (#7909). Incorporação de correções para resolver os problemas que surgiram em streams HLS somente I-frame(#1150) e H.262 HLS (#1126).
    • MP3: prefira o tamanho de dados de um frame Info em vez do tamanho informado pelo fluxo principal (por exemplo, tamanho do arquivo ou cabeçalho HTTP Content-Length). Isso ajuda a excluir dados de trailers não reproduzíveis (por exemplo, arte de álbuns) dos cálculos de busca de taxa de bits constantes, tornando as buscas mais precisas (#1376).
    • MP3: use a contagem de frames e outros dados em um frame Info (se presente) para calcular um bitrate médio para a busca de bitrate constante, em vez de extrapolar o bitrate do frame após o frame Info, que pode ser artificialmente pequeno, por exemplo, o 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 perfil DTS:X 2 para a reprodução de passagem (1299, link em inglês).
    • Para a reprodução transferida, redefina o campo de rastreamento para a conclusão do stream em DefaultAudioSink antes de chamar AudioTrack.stop() para que AudioTrack.StreamEventCallback#onPresentationEnded identifique corretamente quando todos os dados pendentes forem reproduzidos.
    • O bug na SilenceSkippingAudioProcessor foi corrigido, 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 possa progredir.
  • Vídeo:
    • Correção do problema em que Listener.onRenderedFirstFrame() chega muito cedo ao mudar de plataforma durante a reprodução
    • A lógica de substituição do decodificador para Dolby Vision foi corrigida para usar um decodificador AV1 compatível, se necessário (#1389).
    • Correção da exceção de codec que pode ser causada pela ativação de um renderizador de vídeo durante a reprodução.
  • Texto:
    • Correção de um problema em que as legendas que começam antes de uma posição de busca são puladas. Esse problema só foi introduzido na Media3 1.4.0-alpha01.
    • O comportamento padrão de análise de legendas mudou para que ele aconteça durante a extração e não durante a renderização. Consulte o diagrama de arquitetura do ExoPlayer para ver a diferença entre extração e renderização.
      • Essa mudança pode ser substituída chamando ambos MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false) e TextRenderer.experimentalSetLegacyDecodingEnabled(true). Consulte os documentos sobre personalização para saber como conectar esses componentes a uma instância de ExoPlayer. Esses métodos (e todo o suporte à decodificação de legendas legada) 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: correção da decodificação de comprimento de série para resolver 0 como um índice de cores, em vez de um valor de cor literal (#1367).
    • CEA-708: ignora o valor rowLock. A especificação CEA-708-E S-2023 afirma que rowLock e columnLock devem ser considerados verdadeiros, independentemente dos valores presentes no stream. O suporte a columnLock não é implementado, então é considerado que ele sempre é falso.
      • Essa mudança foi originalmente incluída nas notas da versão 1.3.0-alpha01, mas foi revertida acidentalmente antes da versão 1.3.0-rc01. O problema foi corrigido, então a mudança está presente novamente.
    • CEA-708: evitar que novas linhas duplicadas sejam adicionadas pelo processamento simples do ExoPlayer do comando "set pen location" (#1315).
    • Foi corrigida uma IllegalArgumentException de LegacySubtitleUtil quando uma amostra de legenda WebVTT não contém dicas, por exemplo, como parte de um stream DASH (#1516).
  • Metadados:
    • Correção do mapeamento de MP4 para tags de classificação ID3. Anteriormente, as tags MP4 "classificação de álbum" (soal), "classificação de artista" (soar) e "classificação de artista do álbum" (soaa) eram mapeadas incorretamente para as tags ID3 TSO2, TSOA e TSOP (#1302).
    • Foi corrigida a leitura de tags numéricas gnre (gênero) e tmpo (tempo) MP4 (/iTunes) quando o valor tem mais de um byte.
    • Propagação do frame TCON do ID3 para MediaMetadata.genre (#1305).
  • Imagem:
    • Adição de suporte a grids de miniaturas DASH não quadradas (#1300).
    • Foi adicionado suporte a AVIF para a API 34 e versões mais recentes.
    • Permitir que null seja usado como parâmetro para ExoPlayer.setImageOutput() para limpar um ImageOutput definido anteriormente.
  • DataSource:
    • Implemente o suporte para URIs de recursos brutos android.resource://package/id, em que package é diferente do pacote do aplicativo atual. Isso não foi documentado anteriormente, 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á estava anotado para não ser nulo.
    • O ByteArrayDataSource agora pode resolver um URI em uma matriz de bytes durante open(), em vez de ser codificado na construção (#1405).
  • DRM:
    • Foi permitido definir um LoadErrorHandlingPolicy em DefaultDrmSessionManagerProvider (1271).
  • Efeito:
    • Ofereça 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.
    • Foi adicionado suporte a EGL_GL_COLORSPACE_BT2020_HLG_EXT, que melhora a saída de superfície HLG no ExoPlayer.setVideoEffect e no Transformer's Debug SurfaceView.
    • A implementação da matriz de sobreposição foi atualizada para torná-la consistente com a documentação, invertendo os valores x e y aplicados em setOverlayFrameAnchor(). Se estiver usando OverlaySettings.Builder.setOverlayFrameAnchor(), inverta os valores x e y multiplicando-os por -1.
    • O bug em que TimestampWrapper falha quando usado com ExoPlayer#setVideoEffects (#821) foi corrigido.
    • Mudança do espaço de trabalho de cores SDR padrão de cores lineares para vídeo BT 709 SDR elétrico. Também forneça uma terceira opção para manter o espaço de cores original.
    • Agora é possível definir a ordem z indeterminada de EditedMediaItemSequences (#1055).
    • Manter uma faixa de luminância consistente em diferentes partes do conteúdo HDR (usa a faixa HLG).
    • Adicionamos suporte a sobreposições Ultra HDR (bitmap) em conteúdo HDR.
    • Permite que os efeitos SeparableConvolution sejam usados antes da API 26.
    • Remova o OverlaySettings.useHdr não utilizado, porque o intervalo dinâmico de sobreposição e o frame precisam ser correspondentes.
    • Adição de suporte a HDR para TextOverlay. A luminância da sobreposição de texto pode ser ajustada com OverlaySettings.Builder.setHdrLuminanceMultiplier().
  • Extensão de IMA:
    • Promover a API necessária para que os apps reproduzam streams de anúncios da DAI para a versão estável.
    • Adição de replaceAdTagParameters(Map <String, String>) a ImaServerSideAdInsertionMediaSource.AdLoader, que permite substituir os parâmetros da tag de anúncio no momento da execução.
    • Correção de um bug em que VideoAdPlayer.VideoAdPlayerCallback.onError() não era chamado quando um erro do player ocorria durante a reprodução do anúncio (#1334).
    • A versão do SDK do IMA foi atualizada para 3.33.0 para corrigir uma NullPointerException ao usar URIs de tag de anúncio data:// (#700).
  • Sessão:
    • Mude o padrão de CommandButton.enabled para true e verifique se o valor pode permanecer falso para os controladores, mesmo que o comando associado esteja disponível.
    • Adição de constantes de ícone para CommandButton que devem ser usadas em vez de recursos de ícone personalizados.
    • O MediaSessionService.isPlaybackOngoing() foi adicionado para que os apps possam consultar se o serviço precisa ser interrompido em onTaskRemoved() (#1219).
    • Adição de MediaSessionService.pauseAllPlayersAndStopSelf(), que permite pausar a reprodução de todas as sessões e chamar stopSelf() para encerrar o ciclo de vida da 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 pare o serviço.
    • A barra de pesquisa foi oculta 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, link em inglês).
    • A conversão de MediaMetadata foi alinhada a MediaDescriptionCompat para usar a mesma ordem e lógica de preferência ao selecionar propriedades de metadados, como em media1.
    • Adição de MediaSession.sendError(), que permite o envio de erros não fatais para o 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).
    • Adição de MediaSession.Callback.onPlayerInteractionFinished() para informar sessões quando uma série de interações do jogador de um controle específico for concluída.
    • Adicione SessionError e use-o 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.
    • Publique o código do app de teste dos controles de mídia3 que pode ser usado para testar interações com apps que publicam uma sessão de mídia.
    • Propague os extras transmitidos para o MediaSession[Builder].setSessionExtras() do media3 para o 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 do erro são definidos, mas o estado da sessão da plataforma permanece diferente de STATE_ERROR.
    • Permita que a atividade da sessão seja definida por controlador para substituir a atividade global da sessão. A atividade da sessão pode ser definida para um controlador no momento da conexão criando um ConnectionResult com AcceptedResultBuilder.setSessionActivivty(PendingIntent). Depois de conectar, 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, a replicação de erros pode ser configurada usando MediaLibrarySession.Builder.setLibraryErrorReplicationMode() para escolher o tipo de erro ou desativar a replicação de erros, que está ativada por padrão.
  • Interface:
    • Adição de suporte à exibição de imagens para PlayerView quando conectado a um ExoPlayer (1144).
    • A personalização de vários ícones em PlayerControlView foi adicionada por atributos XML para permitir diferentes drawables por instância de PlayerView, em vez de substituições globais (#1200).
    • Solução para um bug da plataforma que causa um vídeo esticado/cortado ao usar SurfaceView dentro de um AndroidView do Compose na API 34 (1237, link em inglês).
  • Downloads:
    • Garanta que DownloadHelper não vazar instâncias de Renderer não lançadas, o que pode resultar na falha de um app com IllegalStateException: Too many receivers, total of 1000, registered for pid (#1224).
  • Extensão do 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 o tempo limite de solicitação seja excedido (https://issuetracker.google.com/328442628).
  • Extensão HLS:
    • Foi corrigido um bug em que as amostras de EMSG pendentes que aguardavam uma descontinuidade eram delegadas em HlsSampleStreamWrapper com um deslocamento incorreto, causando uma IndexOutOfBoundsException ou uma IllegalArgumentException (#1002).
    • Correção do bug em que as playlists não principais continuavam sendo recarregadas para transmissões 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 de reprodução não principais não eram atualizadas durante a reprodução em tempo real (#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 a preparação de uma transmissão ao vivo com vários períodos podia gerar uma IndexOutOfBoundsException (#1329).
    • Adição de suporte a URLs de licença dashif:Laurl (#1345).
  • Extensão Cast:
    • O bug que convertia o título do álbum de MediaQueueItem para o artista no item de mídia da Media3 (#1255) foi corrigido.
  • Test Utilities:
    • Implemente onInit() e onRelease() em FakeRenderer.
    • Os métodos TestPlayerRunHelper.runUntil()/playUntil() foram alterados para falhar em erros não fatais (por exemplo, aqueles informados para 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 formulário curto.
    • A configuração do modo de repetição com argumentos Intent da linha de comando (#1266) foi permitida.
    • Use HttpEngineDataSource como HttpDataSource quando o dispositivo oferecer suporte a ele.
  • Símbolos descontinuados foram removidos:
    • Remoção de CronetDataSourceFactory. Use CronetDataSource.Factory.
    • Alguns construtores DataSpec foram removidos. Use DataSpec.Builder.
    • O método setContentTypePredicate(Predicate) foi removido de DefaultHttpDataSource, OkHttpDataSource e CronetDataSource. 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).
    • Remover o campo Timeline.Window.isLive. Use o método isLive().
    • Os construtores DefaultHttpDataSource foram removidos. Use DefaultHttpDataSource.Factory
    • O DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS foi removido. Use DashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
    • O MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean) foi removido. Use MediaCodecInfo.canReuseCodec(Format, Format).
    • Os métodos DrmSessionManager.DUMMY e getDummyDrmSessionManager() foram removidos. Use DrmSessionManager.DRM_UNSUPPORTED.
    • Remova AnalyticsListener.onAudioInputFormatChanged(EventTime, Format), AnalyticsListener.onVideoInputFormatChanged(EventTime, Format), AudioRendererEventListener.onAudioInputFormatChanged(Format) e VideoRendererEventListener.onVideoInputFormatChanged(Format). Use as sobrecargas que usam um DecoderReuseEvaluation.
    • As constantes RendererSupport.FormatSupport IntDef e FORMAT_HANDLED, FORMAT_EXCEEDS_CAPABILITIES, FORMAT_UNSUPPORTED_DRM, FORMAT_UNSUPPORTED_SUBTYPE e FORMAT_UNSUPPORTED_TYPE foram removidas. Use a 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 Bundleable.Creator<Foo> CREATOR. Os autores da chamada precisam usar os métodos Bundle toBundle() e static Foo fromBundle(Bundle) em cada tipo.

Versão 1.4.0-rc01

10 de julho de 2024

Use a versão estável 1.4.0.

Versão 1.4.0-beta01

26 de junho de 2024

Use a versão estável 1.4.0.

Versão 1.4.0-alpha02

7 de junho de 2024

Use a versão estável 1.4.0.

Versão 1.4.0-alpha01

17 de abril de 2024

Use a versão estável 1.4.0.

Versão 1.3.0

Versão 1.3.1

11 de abril de 2024

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

  • Biblioteca comum:
    • Adicione Format.labels para permitir rótulos alternativos ou localizados.
  • ExoPlayer:
    • Correção de um problema em que PreloadMediaPeriod não conseguia reter os streams quando era pré-carregado novamente
    • Aplique o TrackSelectionResult correspondente correto ao período de reprodução na reseleção de faixas.
    • Renderizadores ativados antecipadamente são iniciados somente após o avanço do 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, link em inglês).
  • Transformador:
    • Adicionamos 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" (>=10fps) em vez de faixas 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 mais alta, mas um número muito pequeno de frames (#1051).
  • Extratores:
    • Correção do problema em que o preenchimento não era ignorado ao ler blocos de tamanho ímpar de arquivos WAV (#1117).
    • MP3: preencha Format.averageBitrate de frames de metadados, como XING e VBRI.
    • MPEG-TS: reverta uma mudança que tinha como objetivo garantir que o último frame fosse renderizado 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 I-frame (#1150) e streams HLS H.262 (#1126).
  • Áudio:
    • Permitir a recuperação do renderizador desativando o descarregamento se a faixa de áudio não for inicializada no modo de descarregamento.
  • Vídeo:
    • Adicionamos uma solução alternativa para um problema de dispositivo no Galaxy Tab S7 FE, Chromecast com Google TV e Lenovo M10 FHD Plus que faz com que as transmissões H265 de 60 fps sejam marcadas como sem suporte.
    • Adição de uma solução alternativa que garante que o primeiro frame seja sempre renderizado durante o encapsulamento, mesmo que o dispositivo não faça isso automaticamente, conforme exigido pela API (#1169). (966).
    • Correção do problema em que o processamento de informações de cor HDR causava um comportamento incorreto do codec e impedia a troca de formato adaptável para faixas de vídeo SDR (#1158).
  • Texto:
    • WebVTT: impede que dicas diretamente consecutivas criem outras instâncias CuesWithTiming falsas de WebvttParser.parse (1177, link em inglês).
  • 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 pela conversão de espaços de cores.
  • Sessão:
    • Correção do problema em que a posição atual voltava quando o controle 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 controles de mídia e sessões (#1176).
  • Interface:
    • O substituto para incluir o nome do idioma da faixa de áudio se Locale não puder identificar um nome de exibição (#988, link em inglês).
  • Extensão DASH:
    • Preencha todos os elementos Label do manifesto em Format.labels (#1054).
  • Extensão RTSP:
    • Os valores de informações de sessão vazios (i-tags) são ignorados na análise do SDP (1087, link em inglês).
  • Extensões do decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • Desative a extensão MIDI como uma dependência local por padrão, porque ela requer que um repositório Maven adicional seja configurado. 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:
    • Implementação de suporte a 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 em letras minúsculas.
    • Defina anúncios com uma MediaItem completa em vez de uma única Uri no AdPlaybackState.
    • Aumente minSdk para 19 (Android KitKat). Isso está alinhado com todas as outras bibliotecas do AndroidX e é necessário para fazermos upgrade para as versões mais recentes das nossas dependências do AndroidX.
    • artworkUri e artworkData foram preenchidos em MediaMetadata.Builder.populate(MediaMetadata) quando pelo menos um deles não for nulo (#964).
  • ExoPlayer:
    • Foram adicionados PreloadMediaSource e PreloadMediaPeriod, que permitem que os apps pré-carreguem uma origem de mídia do conteúdo em uma posição inicial específica antes da reprodução. O PreloadMediaSource prepara a fonte de mídia de conteúdo para receber o Timeline, preparando e armazenando em cache o período na posição de início 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 de reprodução.
    • Adição de ExoPlayer.setImageOutput, que permite que apps definam ImageRenderer.ImageOutput.
    • Agora, DefaultRenderersFactory fornece um ImageRenderer ao player por padrão com ImageOutput e ImageDecoder.Factory.DEFAULT nulos.
    • O evento Player.Listener.onPositionDiscontinuity é emitido quando o silêncio é ignorado (#765, link em inglês).
    • Adição de suporte experimental para analisar legendas durante a extração. É possível ativar usando MediaSource.Factory.experimentalParseSubtitlesDuringExtraction().
    • Suporte a fontes de mídia adaptativas com PreloadMediaSource.
    • Implemente HttpEngineDataSource, um HttpDataSource usando a API HttpEngine.
    • Evite a subclassificação de CompositeSequenceableLoader. Esse componente foi feito extensível anteriormente, mas nunca foi subclassificado na biblioteca. As personalizações podem ser feitas encerrando 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 faz com que os metadados desse item sejam limpos (1007, link em inglês).
    • 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.
    • Foi adicionado suporte à personalização do SubtitleParser.Factory usado durante a extração. Isso pode ser feito com MediaSource.Factory.setSubtitleParserFactory().
    • Adicionar prefixo de origem a todos os campos Format.id gerados a partir de MergingMediaSource. Isso ajuda a identificar qual origem produziu um Format (#883).
    • Foi corrigido o regex usado para validar nomes de chave personalizados de dados de cliente de mídia comuns (CMCD, na sigla em inglês), modificando-o para verificar apenas o hífen (#1028).
    • A codificação dupla dos parâmetros de consulta do CMCD foi desativada (1075, link em inglês).
  • Transformador:
    • Foi adicionado suporte para a compactação de vídeos em câmera lenta H.265/HEVC SEF.
    • Aumento da velocidade de transmuxing, especialmente para edições de "remover vídeo".
    • Adição de uma API para garantir que o arquivo de saída comece em um frame de vídeo. Isso pode tornar a saída das operações de corte mais compatível com as implementações do player que não mostram o primeiro frame de vídeo até o carimbo de data/hora da apresentação (#829).
    • Adição de suporte para otimizar operações de corte de MP4 de recurso único.
    • Adicionamos 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:
    • Foi adicionado DefaultTrackSelector.selectImageTrack para permitir a seleção de imagens.
    • Adição de TrackSelectionParameters.isPrioritizeImageOverVideoEnabled para determinar se uma faixa de imagem será selecionada quando 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 mais análise de AV1C ao extrator MP4 para recuperar os valores ColorInfo.colorSpace, ColorInfo.colorTransfer e ColorInfo.colorRange (#692).
    • MP3: use a taxa de bits constante (CBR) para procurar arquivos com um cabeçalho Info, o equivalente CBR do cabeçalho Xing. Anteriormente, usávamos a tabela de busca do cabeçalho Info, mas isso resulta em uma busca menos precisa do que se a ignorássemos e presumirmos que o arquivo é CBR.
    • MPEG2-TS: adição de suporte a DTS, DTS-LBR e DTS:X Profile2 (275).
    • Extração de tipos de áudio dos descritores de TS e mapeamento para flags de função, permitindo que os usuários façam seleções de faixa de áudio mais informadas (#973).
  • Áudio:
    • O algoritmo de pular silêncio foi melhorado com a ampliação de volume, mantendo silêncio mínimo e durações de silêncio mais naturais (#7423, link em inglês).
    • O silêncio pulado é informado de maneira 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 sink de vídeo para MediaCodecVideoRenderer.
  • Texto:
    • A serialização de dicas de bitmap foi corrigida para resolver o erro Tried to marshall a Parcel that contained Binder objects ao usar DefaultExtractorsFactory.setTextTrackTranscodingEnabled (#836, link em inglês).
    • CEA-708: ignora o valor rowLock. A especificação CEA-708-E S-2023 afirma que rowLock e columnLock devem ser considerados verdadeiros, independentemente dos valores presentes no stream. O suporte a columnLock não é implementado, então é considerado que ele sempre é falso.
  • Imagem:
    • Adição de suporte a miniaturas DASH. As imagens da grade são cortadas e miniaturas individuais são fornecidas para ImageOutput próximas dos horários de apresentação.
  • DRM:
  • Extensão de IMA:
    • Correção do 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 do problema em que MediaItem.RequestMetadata apenas com extras não nulos não é transmitido entre controladores de mídia e sessões
    • Foi adicionado um construtor à MediaLibrarySession.Builder, que só usa um Context em vez de um MediaLibraryService.
  • Extensão HLS:
    • Reduza HlsMediaPeriod para a visibilidade privada do pacote. Esse tipo não pode depender diretamente de fora do pacote HLS.
    • A resolução busca o início de um trecho com mais eficiência (#1031).
  • Extensões do decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • Decodificador MIDI: ignora mensagens de eventos SysEx (#710).
  • Test Utilities:
    • Não pausar a reprodução em TestPlayerRunHelper.playUntilPosition. O teste mantém a reprodução em um estado de reprodução, mas suspende o progresso até que o teste possa adicionar declaraçõ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:
    • Foi corrigido um problema em que as buscas manuais fora do intervalo de LiveConfiguration.min/maxOffset continuam ajustando o deslocamento de volta para min/maxOffset
    • O problema em que os layouts de canal OPUS e VORBIS estavam errados para 3, 5, 6, 7 e 8 canais (#8396, link em inglês).
    • Correção de um problema em que as seleções de faixas depois de buscar zero em uma transmissão ao vivo permitiam que a transmissão começasse na posição padrão (#9347).
    • Foi corrigido o problema em que novas instâncias de CmcdData.Factory recebiam valores negativos de bufferedDurationUs de origens de bloco, resultando em uma IllegalArgumentException (#888).
  • Transformador:
    • Solução para um problema em que o codificador era gerado no momento da configuração por definir uma taxa de operação alta.
  • Extratores:
    • As faixas HEVC secundárias (não reproduzíveis) em fotos em movimento JPEG são marcadas como ROLE_FLAG_ALTERNATE para evitar que sejam selecionadas automaticamente para reprodução devido à resolução mais alta.
    • Foi corrigida a detecção incorreta de frames-chave para streams TS H264 (#864, link em inglês).
    • Correção da estimativa de duração de streams TS com mais de 47721 segundos (#855).
  • Áudio:
    • Correção do processamento de EOS para SilenceSkippingAudioProcessor quando chamado várias vezes (#712).
  • Vídeo:
    • Adição de uma solução alternativa para um problema de dispositivo no Galaxy Tab S7 FE, Chromecast com Google TV e Lenovo M10 FHD Plus que faz com que as transmissões AVC de 60 fps sejam marcadas como sem suporte (693, link em inglês).
  • Metadados:
    • Correção do bug em que MediaMetadata era preenchido apenas com comentários do Vorbis com teclas maiúsculas (#876).
    • OutOfMemoryError é detectado ao analisar frames ID3 muito grandes, o que significa que a reprodução pode continuar sem as informações de tag, em vez de falhar completamente.
  • DRM:
    • A solução alternativa para o URL de licença https://default.url do ClearKey foi estendida para a API 33 e versões mais recentes (antes, a solução alternativa era aplicada apenas na API 33). (#837).
    • Correção de ERROR_DRM_SESSION_NOT_OPENED ao mudar de conteúdo criptografado para limpar sem uma superfície conectada ao player O erro ocorreu por usar incorretamente um decodificador seguro para abrir o conteúdo claro.
  • Sessão:
    • Coloque as chaves e os valores personalizados em MediaMetadataCompat para MediaMetadata.extras e MediaMetadata.extras para MediaMetadataCompat (#756, #802).
    • Correção da transmissão de notifyChildrenChanged para controladores legados (644).
    • Correção de um bug em que a configuração de um tempo negativo para um temporizador 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 foi solicitada (#917).
  • Interface:
    • O problema em que os botões "Avançar" e "Voltar" não eram visíveis quando usados com o Material Design em um BottomSheetDialogFragment (#511) foi corrigido.
    • Foi corrigido o problema em que os números no botão de avanço rápido da PlayerControlView estavam desalinhados (#547).
  • Extensão DASH:
    • Análise de "f800" como contagem de canais de 5 para Dolby no manifesto DASH (#688, link em inglês).
  • Extensões do decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • MIDI: correção do problema em que a busca para frente pula os eventos de mudança de programa (#704).
    • Migração para o FFmpeg 6.0 e atualização do NDK com suporte para r26b (#707, #867).
  • Extensão Cast:
    • A criação de uma Timeline foi limpa para que o app não falhe ao carregar mídia no dispositivo de transmissão (708, link em inglês).

Versão 1.2.0

15 de novembro de 2023

  • Biblioteca comum:
    • Adicione um parâmetro @Nullable Throwable aos métodos na interface Log.Logger. O parâmetro message desses métodos não contém mais informações sobre o Throwable transmitido aos métodos Log.{d,i,w,e}(). Portanto, as implementações precisarão anexar manualmente essas informações, se desejado (possivelmente usando Logger.appendThrowableString(String, Throwable)).
    • Foi corrigido 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 dos métodos TrackSelectorResult e SimpleDecoder (#6792).
    • Mudamos o comportamento padrão da interface e das notificações em Util.shouldShowPlayButton para mostrar um botão "play" enquanto a reprodução é temporariamente suprimida (por exemplo, devido à perda temporária do foco do á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 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 transmissões AC4 causados pela não identificação correta de amostras somente de decodificação (11000).
    • Adicione supressão de reprodução em dispositivos de saída de áudio inadequados (por exemplo, o alto-falante integrado em dispositivos Wear OS) quando esse recurso for ativado via ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. O motivo da supressão de reprodução será atualizado como Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT se ocorrer uma tentativa de reprodução quando nenhuma saída de áudio adequada estiver disponível ou se todas as saídas adequadas forem desconectadas durante a reprodução. O motivo da supressão será removido quando uma saída adequada for conectada.
    • Adicione MediaSource.canUpdateMediaItem e MediaSource.updateMediaItem para aceitar atualizações de MediaItem após a criação usando Player.replaceMediaItem(s).
    • Agora é possível permitir atualizações de MediaItem para todas as classes MediaSource fornecidas pela biblioteca usando Player.replaceMediaItem(s) (#33, #9978).
    • O MimeTypes.TEXT_EXOPLAYER_CUES foi renomeado como MimeTypes.APPLICATION_MEDIA3_CUES.
    • Adição de PngExtractor, que envia e lê um arquivo PNG inteiro no TrackOutput como uma amostra.
    • Melhore o método SequenceableLoader.continueLoading(long) na interface SequenceableLoader para SequenceableLoader.continueLoading(LoadingInfo loadingInfo). LoadingInfo contém parâmetros adicionais, incluindo playbackSpeed e lastRebufferRealtimeMs, além do playbackPositionUs.
    • Melhore o método ChunkSource.getNextChunk(long, long, List, ChunkHolder) na interface ChunkSource para ChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder).
    • Foram adicionados mais campos à geração de registros de dados do cliente de mídia comum (CMCD): privação de buffer (bs), prazo (dl), taxa de reprodução (pr) e inicialização (su) (#8699).
    • A profundidade de bits de luminância e crominância foi adicionada a ColorInfo (491, link em inglês).
    • Foram adicionados mais campos ao registro de dados comuns do cliente de mídia (CMCD, na sigla em inglês): próxima solicitação de objeto (nor) e próxima solicitação de intervalo (nrr) (#8699).
    • Foi adicionada uma funcionalidade para transmitir dados de clientes de mídia comuns (CMCD, na sigla em inglês) 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 origens com ajustes de horário de período/janela) em ConcatenatingMediaSource2 (#11226).
    • Mude BaseRenderer.onStreamChanged() para receber também um argumento MediaPeriodId.
  • Transformador:
    • Analise os 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:
    • Foi adicionado DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness para permitir ou não permitir a adaptação não integrada. O padrão permanece no comportamento atual de true.
  • Extratores:
    • MPEG-TS: garante que o último frame seja renderizado transmitindo a última unidade de acesso de um stream para a fila de amostras (#7909).
    • Correção de erro de digitação ao determinar rotationDegrees. Mudança de projectionPosePitch para projectionPoseRoll (#461).
    • Remove a suposição de que as instâncias de Extractor podem ser inspecionadas diretamente com instanceof. Se você quiser acesso 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.
    • Adição de suporte ao QuickTime clássico a Mp4Extractor.
  • Áudio:
    • Adição de suporte a PCM big-endian de 24/32 bits em MP4 e Matroska e análise da codificação PCM para lpcm em MP4.
    • Foi adicionado suporte para extrair áudio Vorbis em MP4.
    • Foi adicionado AudioSink.getFormatOffloadSupport(Format), que recupera o nível de suporte de transferência que o sink pode fornecer para o formato usando um DefaultAudioOffloadSupportProvider. Ele retorna o novo AudioOffloadSupport que contém isFormatSupported, isGaplessSupported e isSpeedChangeSupported.
    • Adicione AudioSink.setOffloadMode(), que configura a configuração de transferência no sink de áudio. O padrão é AudioSink.OFFLOAD_MODE_DISABLED.
    • O offload pode ser ativado usando setAudioOffloadPreference em TrackSelectionParameters. Se a preferência definida for ativar, o dispositivo oferece suporte ao desligamento para o formato e a seleção de faixa for uma única faixa de áudio, o desligamento de áudio será ativado.
    • Se audioOffloadModePreference for definido como AUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, o DefaultTrackSelector vai selecionar apenas uma faixa de áudio e somente se o formato dela for compatível com o descarregamento. Se nenhuma faixa de áudio tiver suporte no offload, nenhuma faixa será selecionada.
    • Desativação do suporte sem intervalos para transferência de dados quando o nível anterior à API 33 devido a um problema na posição de reprodução após a transição da faixa.
    • O parâmetro enableOffload foi removido 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.
    • Foi adicionado suporte a metadados sem lacunas do Opus durante a reprodução de descarregamento.
    • Permitir a recuperação do renderizador desativando o offload se houver falha na primeira gravação (627).
    • Ativar programação de descarregamento 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.
    • Movimentação de interfaces TrackSelectionParameters relacionadas ao modo de transferência de áudio e definições para uma classe AudioOffloadPreferences interna.
    • Adicione callbacks onAudioTrackInitialized e onAudioTrackReleased a AnalyticsListener, AudioRendererEventListener e AudioSink.Listener.
    • Correção do problema de underflow do buffer de áudio DTS Express (#650).
    • Correção de um bug em que a verificação de recursos para E-AC3-JOC gerava uma IllegalArgumentException (677).
  • Vídeo:
    • Permita 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, link em inglês).
  • Texto:
    • O ExoplayerCuesDecoder foi removido. As faixas de texto com sampleMimeType = application/x-media3-cues agora são processadas diretamente por TextRenderer, sem a necessidade de uma instância de SubtitleDecoder.
  • Metadados:
    • MetadataDecoder.decode não será mais chamado para amostras "somente decodificação", já que a implementação precisa retornar nulo.
  • Efeito:
    • Adicionamos VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>) na fila de entrada de bitmap por carimbo de data/hora.
    • Mude VideoFrameProcessor.registerInputStream() para não causar bloqueio. Os apps precisam implementar VideoFrameProcessor.Listener#onInputStreamRegistered().
    • Os parâmetros frameRate e durationUs de VideoFrameProcessor.queueInputBitmap foram alterados para TimestampIterator.
  • Extensão de IMA:
    • Correção de um bug em que uma transmissão ao vivo DASH de vários períodos que não é o primeiro item de uma playlist podia gerar uma exceção (571, link em inglês).
    • Libere o StreamManager antes de chamar AdsLoader.destroy().
    • A versão do SDK do IMA foi alterada para 3.31.0.
  • Sessão:
    • O comportamento do serviço em primeiro plano de notificações foi definido como FOREGROUND_SERVICE_IMMEDIATE em DefaultMediaNotificationProvider (#167).
    • Use apenas android.media.session.MediaSession.setMediaButtonBroadcastReceiver() acima do nível 31 da API para evitar problemas com a API descontinuada em dispositivos Samsung (#167).
    • Use o MediaNotificationController como proxy para definir os comandos disponíveis e o layout personalizado usado para preencher a notificação e a sessão da plataforma.
    • Converta eventos de botão de mídia que são recebidos por MediaSessionService.onStartCommand() na Media3 em vez de roteá-los para a sessão da plataforma e de volta para a Media3. Com isso, o controlador de chamada é sempre o controlador de notificação de mídia, e os apps podem reconhecer facilmente as chamadas provenientes da notificação da mesma forma em todos os níveis de API com suporte.
    • Correção do bug em que o MediaController.getCurrentPosition() não avançava quando conectado a um MediaSessionCompat legado.
    • Adicione MediaLibrarySession.getSubscribedControllers(mediaId) para conveniência.
    • Substitua MediaLibrarySession.Callback.onSubscribe() para declarar a disponibilidade do ID pai em que o controlador é inscrito. Se for bem-sucedido, a assinatura será aceita e notifyChildrenChanged() será chamada 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ção de mídia. Com o Android Auto como controlador do cliente lendo a sessão do framework, o botão queue na interface do Android Auto não é mostrado (#339).
    • Use DataSourceBitmapLoader por padrão em vez de SimpleBitmapLoader (#271, #327).
    • Adição de MediaSession.Callback.onMediaButtonEvent(Intent), que permite que apps substituam o processamento de eventos padrão do botão de mídia.
  • Interface:
    • Adicione uma implementação de Player.Listener para dispositivos Wear OS que processam a supressão de reprodução devido a Player.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT iniciando uma caixa de diálogo do sistema para permitir que o usuário conecte uma saída de áudio adequada (por exemplo, fones de ouvido Bluetooth). O listener retoma automaticamente a reprodução se um dispositivo adequado estiver conectado dentro de um tempo limite configurável (o padrão é cinco minutos).
  • Downloads:
    • Declare o tipo de serviço em primeiro plano "dataSync" 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:
    • A playlist ao vivo HLS foi atualizada com um intervalo calculado a partir do horário de início do último carregamento, e não do horário da conclusão do último carregamento (#663).
  • Extensão DASH:
    • Permitir vários identificadores DASH no URL do modelo de segmento.
    • Adição de suporte experimental para analisar legendas durante a extração. Isso tem melhor suporte para mesclar legendas sobrepostas, incluindo a resolução de cintilação ao fazer a transição entre segmentos de legenda. É possível ativar esse recurso usando DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction() (#288).
  • Extensão RTSP:
    • Foi corrigida uma disputa que poderia levar a IndexOutOfBoundsException ao voltar ao TCP ou travar a reprodução em algumas situações.
    • Verificação do estado na configuração do RTSP ao retornar o estado de carregamento de RtspMediaPeriod (#577).
    • Os métodos de solicitação Rtsp personalizados são ignorados no cabeçalho público de resposta de opções (#613, link em inglês).
    • O valor do tempo limite da resposta de configuração RTSP é usado no intervalo de tempo do envio de solicitações de opções RTSP de keep-alive (662).
  • Extensões do decodificador (FFmpeg, VP9, AV1, MIDI etc.):
    • Libere o módulo de decodificador MIDI, que oferece suporte à reprodução de arquivos MIDI padrão usando a biblioteca Jsyn para sintetizar áudio.
    • DecoderOutputBuffer.shouldBeSkipped foi adicionado para marcar diretamente os buffers de saída que não precisam ser apresentados. Essa é a opção recomendada em vez de C.BUFFER_FLAG_DECODE_ONLY, que será descontinuado.
    • Foram adicionados Decoder.setOutputStartTimeUs e SimpleDecoder.isAtLeastOutputStartTimeUs para permitir que os decodificadores descartem amostras somente de decodificação antes do horário de início. Esse é o preferido em vez de Buffer.isDecodeOnly, que será descontinuado.
    • Correção de bug de publicação do artefato do decodificador MIDI no repositório Maven. O artefato foi renomeado para media3-exoplayer-midi (#734).
  • Extensão do Leanback:
    • Correção de um bug em que a desativação de uma superfície podia causar uma ArithmeticException no código Leanback (#617).
  • Test Utilities:
    • Tornar TestExoPlayerBuilder e FakeClock compatíveis com testes de interface do Espresso e testes de interface do Compose. Isso corrige um bug em que a reprodução avança de forma não determinística durante as interações de visualização do Espresso ou do Compose.
  • Símbolos descontinuados foram removidos:
    • Remover TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean) e TransformationRequest.Builder.experimental_setEnableHdrEditing(boolean). Use Composition.Builder.setHdrMode(int) e transmita o Composition para Transformer.start(Composition, String).
    • Remova o método DownloadNotificationHelper.buildProgressNotification descontinuado e use um método não descontinuado que aceite 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:
    • A dependência multidex adicionada acidentalmente foi removida de todos os módulos (#499).
  • ExoPlayer:
    • Correção de um problema em PlaybackStatsListener em que PlaybackStatss espúrias eram criadas depois que a playlist era apagada.
    • Foram adicionados mais campos à geração de registros de dados do cliente de mídia comum (CMCD, na sigla em inglês): formato de streaming (sf), tipo de stream (st), versão (v), birate superior (tb), duração do objeto (d), capacidade medida (mtp) e tipo de objeto (ot) (#8699).
  • Áudio:
    • Foi corrigido um bug em que o Player.getState() não fazia a transição para STATE_ENDED ao reproduzir arquivos muito curtos (#538, link em inglês).
  • Transferência de áudio:
    • Adicione cabeçalhos de ID e de comentário do Ogg ao bitstream para reprodução de Opus descarregado de acordo com o RFC 7845.
  • Vídeo:
    • H.265/HEVC: corrigir a análise de informações da imagem de referência de curto e longo prazo do SPS.
  • Texto:
    • CEA-608: muda a lógica de truncamento de sugestões para considerar apenas texto visível. Anteriormente, o recuo e o deslocamento de tabulação eram incluídos ao limitar o comprimento da dica a 32 caracteres (o que era 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 acessar. Quando o layout personalizado muda, MediaController.Listener.onCustomLayoutChanged é chamado. Os apps que querem enviar layouts personalizados diferentes para diferentes controladores Media3 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 tinha suporte a ele, o que produzia um UnsupportedOperationException (#78).
    • Corrija a maneira como PlayerWrapper cria um VolumeProviderCompat determinando 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:
    • Foi adicionado um motivo de supressão para rota de áudio inadequada e tocar quando estiver pronto o motivo da mudança para ser suprimido por muito tempo. (15).
    • Adicionar comandos ao player:
      • COMMAND_GET_METADATA
      • COMMAND_SET_PLAYLIST_METADATA
      • COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
      • COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
    • Adicionamos métodos sobrecarregados ao Player para permitir que os usuários especifiquem sinalizações de volume:
      • void setDeviceVolume(int, int)
      • void increaseDeviceVolume(int)
      • void decreaseDeviceVolume(int)
      • void setDeviceMuted(boolean, int)
    • Adição de Builder para DeviceInfo e descontinuação do construtor
    • A DeviceInfo.routingControllerId foi adicionada para especificar o ID do controlador de roteamento para reprodução remota.
    • Player.replaceMediaItem(s) foi adicionado como um atalho para adicionar e remover itens na mesma posição (8046, link em inglês).
  • ExoPlayer:
    • Permitir que o ExoPlayer tenha controle dos métodos de volume do dispositivo somente se ele tiver sido ativado 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)
    • Adicionamos FilteringMediaSource, que permite filtrar os tipos de faixa disponíveis de um MediaSource.
    • Adição de suporte para a inclusão de dados comuns do cliente de mídia (CMCD, na sigla em inglês) nas solicitações de saída de formatos de streaming adaptável DASH, HLS e SmoothStreaming. Os seguintes campos, br, bl, cid, rtp e sid, foram incorporados (#8699). Estrutura e métodos da API:
      • A geração de registros de CMCD está desativada por padrão. Use MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory) para ativá-la.
      • Todas as chaves são ativadas por padrão. Substitua CmcdConfiguration.RequestConfig.isKeyAllowed(String key) para filtrar quais chaves são registradas.
      • Substitua CmcdConfiguration.RequestConfig.getCustomData() para ativar a geração de registros de chaves personalizadas.
    • Ação adicional adicionada ao manifesto da demonstração principal para facilitar o início do app de demonstração com um arquivo *.exolist.json personalizado (439, link em inglês).
    • Adição de ExoPlayer.setVideoEffects() para usar Effect durante a reprodução do vídeo.
    • Atualize SampleQueue para armazenar sourceId como um long em vez de um int. Isso muda as assinaturas dos métodos públicos SampleQueue.sourceId e SampleQueue.peekSourceId.
    • Adição de parâmetros aos métodos LoadControl shouldStartPlayback e onTracksSelected 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.
    • Suspensão do uso de EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs) e BaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs). Em vez disso, a variante dos métodos sem o mediaTimeOffsetUs pode ser chamada. Mesmo para as variantes descontinuadas, o deslocamento não é mais adicionado a startTimeUs e endTimeUs dos objetos MediaLoadData que são enviados pelo dispatcher.
    • Renomeie ExoTrackSelection.blacklist como excludeTrack e isBlacklisted como isTrackExcluded.
    • Correção do comportamento inconsistente entre ExoPlayer.setMediaItem(s) e addMediaItem(s) quando chamado 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 travar (levando ao tempo limite do muxer) se o fim do fluxo de vídeo fosse sinalizado no momento em que um frame de entrada estava em processamento pendente.
    • Consultar codecs por MediaCodecList em vez de usar utilitários findDecoder/EncoderForFormat para ampliar o suporte.
    • A configuração de frame B no DefaultEncoderFactory foi removida, já que ela não funciona em alguns dispositivos.
  • Seleção de faixas:
    • Adição da DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange, que fica desativada por padrão. Quando ativado, o DefaultTrackSelector aciona uma nova seleção de faixa quando os recursos do renderizador são alterados.
  • Extratores:
    • Ogg: correção de um bug ao buscar em arquivos com uma duração longa (391).
    • FMP4: o problema em que TimestampAdjuster inicializa um deslocamento de carimbo de data/hora incorreto com o tempo de amostra de metadados do atom emsg foi corrigido (356, link em inglês).
  • Áudio:
    • Correção de um bug em que algumas reproduções falhavam quando o encapsulamento era ativado e AudioProcessors estavam ativos, por exemplo, para corte sem intervalos (#10847).
    • Encapsular frames Opus em pacotes Ogg em transmissões diretas (descarga).
    • Extrapolar a posição atual durante o modo de suspensão com a programação de transferência de carga.
    • Renderer.release() e AudioSink.release() foram adicionados para liberar os recursos ao final do ciclo de vida do jogador.
    • Ouvir as mudanças nos recursos de áudio em DefaultAudioSink. Adicione um parâmetro obrigatório context no construtor de DefaultAudioSink, com o qual o DefaultAudioSink vai se registrar como o listener do AudioCapabilitiesReceiver e atualizar a propriedade audioCapabilities quando informado sobre uma mudança de recursos.
    • Propagar mudanças de recursos de áudio usando um novo evento onAudioCapabilitiesChanged na interface AudioSink.Listener e uma nova interface RendererCapabilities.Listener que aciona eventos onRendererCapabilitiesChanged.
    • Adição de ChannelMixingAudioProcessor para aplicar escalonamento/mixagem a canais de áudio.
    • Foi adicionado um novo valor int DISCARD_REASON_AUDIO_BYPASS_POSSIBLE a DecoderDiscardReasons para descartar o decodificador de áudio quando o modo de bypass é possível após a mudança dos recursos de áudio.
    • Adição de suporte à reprodução direta para DTS Express e DTS:X (335, link em inglês).
  • Vídeo:
    • Fazer com que MediaCodecVideoRenderer informe um VideoSize com largura e altura de 0 quando o renderizador estiver desativado. Player.Listener.onVideoSizeChanged é chamado de acordo com a mudança de Player.getVideoSize(). Com essa mudança, o tamanho do vídeo do ExoPlayer com MediaCodecVideoRenderer tem uma largura e altura de 0 quando Player.getCurrentTracks não oferece suporte a vídeo ou o tamanho da faixa de vídeo com suporte ainda não foi determinado.
  • DRM:
    • Reduza a visibilidade de vários métodos somente internos no DefaultDrmSession que não precisam ser chamados de fora do pacote DRM:
      • void onMediaDrmEvent(int)
      • void provision()
      • void onProvisionCompleted()
      • onProvisionError(Exception, boolean)
  • Muxador:
    • Adicionou uma nova biblioteca de muxer que pode ser usada para criar um arquivo de contêiner MP4.
  • Extensão de IMA:
    • Ativar transmissões DASH ao vivo de vários períodos para DAI. A implementação atual ainda não oferece suporte à busca em transmissões ao vivo (10912).
    • Correção de um bug em que um novo grupo de anúncios era inserido em transmissões ao vivo porque a posição do conteúdo calculado em linhas do tempo consecutivas variava um pouco.
  • Sessão:
    • Adicione o método auxiliar MediaSession.getControllerForCurrentRequest para receber informações sobre o controlador que está chamando o método aPlayer.
    • androidx.media3.session.MediaButtonReceiver foi adicionado para permitir que apps implementem a retomada da reprodução com eventos do botão de mídia enviados por, por exemplo, um fone de ouvido Bluetooth (167, link em inglês).
    • Foi adicionada a implementação padrão a MediaSession.Callback.onAddMediaItems para permitir que o MediaItems solicitado seja transmitido para Player se ele tiver LocalConfiguration (por exemplo, URI) (#282).
    • Botões de comando "seek to previous" e "seek to next" foram adicionados à visualização de notificação de mídia compacta por padrão para o Android 12 e versões anteriores (410, link em inglês).
    • Adição de implementação padrão a MediaSession.Callback.onAddMediaItems para permitir que o MediaItems solicitado seja transmitido para Player se ele tiver LocalConfiguration (por exemplo, URI) (282).
    • Botões de comando "seek to previous" e "seek to next" foram adicionados à visualização de notificação de mídia compacta por padrão para o Android 12 e versões anteriores (410, link em inglês).
  • Interface:
    • Os métodos utilitários shouldShowPlayButton e handlePlayPauseButtonAction foram adicionados para gravar elementos personalizados da interface com um botão de reproduzir/pausar.
  • Extensão RTSP:
    • Para MPEG4-LATM, use o valor padrão de id do nível do perfil 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 presente no cabeçalho de resposta DESCRIBE (#11160).
  • Extensão DASH:
    • O deslocamento de tempo da mídia foi removido de MediaLoadData.startTimeMs e MediaLoadData.endTimeMs para transmissões DASH de vários períodos.
    • Correção de um bug em que a preparação de uma fonte de mídia Dash ao vivo com vários períodos produzia uma IndexOutOfBoundsException (#10838).
  • Extensão HLS:
    • Adicione HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long) para definir um tempo limite para que a linha de execução de carregamento aguarde a inicialização da TimestampAdjuster. Se a inicialização não for concluída antes do tempo limite, uma PlaybackException será gerada para evitar a reprodução infinita. O tempo limite é definido como zero por padrão (#323).
  • Utilitários de teste:
    • Verifique se o esquema de URI não diferencia maiúsculas de minúsculas em DataSourceContractTest.
  • Símbolos descontinuados foram removidos:
    • Os construtores DefaultAudioSink foram removidos. Use DefaultAudioSink.Builder.
    • Remova HlsMasterPlaylist e use HlsMultivariantPlaylist.
    • O Player.stop(boolean) foi removido. Use Player.stop() e Player.clearMediaItems() (se reset for true).
    • Para melhorar o desempenho, remova dois construtores SimpleCache descontinuados e use um construtor não descontinuado que use um DatabaseProvider.
    • O construtor DefaultBandwidthMeter foi removido. Use DefaultBandwidthMeter.Builder.
    • Remova os construtores DefaultDrmSessionManager e use DefaultDrmSessionManager.Builder.
    • Dois construtores HttpDataSource.InvalidResponseCodeException descontinuados foram removidos. Use um construtor não descontinuado que aceite campos adicionais(cause, responseBody) para melhorar a geração de registros de erros.
    • Remova DownloadHelper.forProgressive, DownloadHelper.forHls, DownloadHelper.forDash e DownloadHelper.forSmoothStreaming. Use DownloadHelper.forMediaItem.
    • O construtor DownloadService foi removido e substituído por um construtor que inclui a opção de fornecer um parâmetro channelDescriptionResourceId.
    • As constantes de string descontinuadas para Charsets (ASCII_NAME, UTF8_NAME, ISO88591_NAME, UTF16_NAME e UTF16LE_NAME) foram removidas. Use Charsets do Kotlin do pacote kotlin.text, java.nio.charset.StandardCharsets ou com.google.common.base.Charsets.
    • O construtor WorkManagerScheduler foi removido e substituído por um construtor que inclui a opção de fornecer um parâmetro Context.
    • Os métodos createVideoSampleFormat, createAudioSampleFormat, createContainerFormat e createSampleFormat, que foram usados para instanciar a classe Format, foram removidos. Em vez disso, use Format.Builder para criar instâncias de Format.
    • Remova os métodos copyWithMaxInputSize, copyWithSubsampleOffsetUs, copyWithLabel, copyWithManifestFormatInfo, copyWithGaplessInfo, copyWithFrameRate, copyWithDrmInitData, copyWithMetadata, copyWithBitrate e copyWithVideoSize descontinuados. Use Format.buildUpon() e os métodos de definição em vez disso.
    • Remova o ExoPlayer.retry() descontinuado e use prepare().
    • O construtor DefaultTrackSelector com zero argumentos foi removido. Use DefaultTrackSelector(Context).
    • O construtor OfflineLicenseHelper descontinuado foi removido. Use OfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher).
    • O construtor DownloadManager foi descontinuado. Use o construtor que usa um Executor.
    • Os construtores Cue foram removidos. Use Cue.Builder.
    • O construtor OfflineLicenseHelper foi descontinuado. 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 o Player.Listener.onSeekProcessed e o AnalyticsListener.onSeekProcessed descontinuados. Use onPositionDiscontinuity com DISCONTINUITY_REASON_SEEK.
    • Remova ExoPlayer.setHandleWakeLock(boolean) e use setWakeMode(int).
    • Remova o DefaultLoadControl.Builder.createDefaultLoadControl() descontinuado e use build().
    • Remova o MediaItem.PlaybackProperties descontinuado. Em vez dele, 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:
    • Adição de Buffer.isLastSample() que indica se Buffer contém a flag C.BUFFER_FLAG_LAST_SAMPLE.
    • Correção do problema em que o último frame pode não ser renderizado se a última amostra com frames for removida da fila sem ler a amostra "fim do stream". (#11079).
  • Extratores:
    • A análise de SPS H.265 em arquivos MPEG-TS foi corrigida reutilizando a lógica de análise já usada por 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 do problema em que o MediaController não atualiza os comandos disponíveis quando conectado a um MediaSessionCompat legado que atualiza as ações.
    • O 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) foi corrigido.
    • Correção do vazamento de memória de MediaSessionService ou MediaLibraryService (#346).
    • O bug em que uma Timeline e uma atualização de posição combinadas em uma MediaSession podem fazer com que uma MediaController gere uma IllegalStateException

Versão 1.0.1

18 de abril de 2023

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

Ela corresponde à versão do ExoPlayer 2.18.6.

  • Biblioteca principal:
    • Redefinição de substituição de transmissão ao vivo de destino ao buscar a posição padrão (11051).
    • Correção de um bug em que fluxos de amostra vazios na mídia podiam causar travamento da reprodução.
  • Sessão:
    • Correção de um bug em que vários itens de fila idênticos publicados por um MediaSessionCompat legado resultam em uma exceção em MediaController (290).
    • Adicionamos o redirecionamento ausente de MediaSession.broadcastCustomCommand ao MediaControllerCompat.Callback.onSessionEvent legada (293, link em inglês).
    • Correção do bug em que chamar MediaSession.setPlayer não atualiza os comandos disponíveis.
    • Correção de um problema em que as instâncias TrackSelectionOverride enviadas de um MediaController eram ignoradas se referenciassem um grupo com Format.metadata (#296).
    • Correção do problema em que Player.COMMAND_GET_CURRENT_MEDIA_ITEM precisa estar disponível para acessar metadados por meio do MediaSessionCompat legado.
    • Foi corrigido o problema em que instâncias MediaSession em uma linha de execução em segundo plano causavam falhas quando usadas em MediaSessionService (#318).
    • Foi corrigido um problema em que um receptor de botão de mídia era declarado pela biblioteca sem a intenção do app (314, link em inglês).
  • DASH:
    • Correção do processamento de linhas do tempo de segmentos vazios (#11014).
  • RTSP:
    • Tente novamente com TCP se a configuração do RTSP com o UDP falhar com o erro 461 supportedTransport (#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:
    • A diferença máxima do horário de início de dois segmentos a serem combinados é configurável em SegmentDownloader e subclasses (#248).
  • Áudio:
    • Correção da reprodução de MP3 sem intervalos em dispositivos Samsung (#8594).
    • Correção de um bug em que as velocidades de reprodução definidas imediatamente após a desativação do áudio podiam ser substituídas por uma mudança de velocidade anterior (#10882).
  • Vídeo:
    • Mapeie o formato HEVC HDR10 para HEVCProfileMain10HDR10 em vez de HEVCProfileMain10.
    • Adicionamos uma solução alternativa para um problema de dispositivo no Chromecast com Google TV e Lenovo M10 FHD Plus que faz com que os streams AVC de 60 fps sejam marcados como sem suporte (#10898).
    • Correção de problemas de desempenho de liberação de frame ao reproduzir mídia com uma taxa de frames muito maior do que a taxa de atualização da tela.
  • Transmitir:
    • Correção de STATE_IDLE transitório ao fazer a transição entre itens de mídia (245, link em inglês).
  • RTSP:
    • A exceção IllegalArgumentException gerada na análise de mensagens de resposta de RTSP inválidas foi detectada (#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, link em inglês).
  • Extensão de IMA:
    • Correção de um bug que impedia o início de streams de DAI sem anúncios porque o primeiro (e, no caso sem anúncios, o único) evento LOADED não foi 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. Este 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.