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
9 de março de 2022 - - - 1.0.0-alpha02

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 {
    val media3_version = "1.0.0-alpha02"

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

    // 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 compilação.

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-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).
  • IU:
    • 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 rastreamento de 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.EventLister 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 (link em inglês).

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.