Media3

  Exemplo de código (link em inglês)
Bibliotecas de suporte para casos de uso de mídia.
Atualização mais recente Versão estável Candidata a lançamento Versão Beta Versão Alfa
16 de fevereiro de 2023 - 1.0.0-rc01 - -

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.0.0-rc01"

    // 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 RTSP playback support with ExoPlayer
    implementation "androidx.media3:media3-exoplayer-rtsp:$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"

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

Kotlin

dependencies {
    val media3_version = "1.0.0-rc01"

    // 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 RTSP playback support with ExoPlayer
    implementation("androidx.media3:media3-exoplayer-rtsp:$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")

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

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.0.0

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 recurso Transformer.Builder.setOutputMimeType(String) 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 IU de television não têm essas restrições, e o formato com a maior contagem de canais vai ter preferência. 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 IU 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 principal, é preciso as adicionar à playlist principal 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.