Media3
| Atualização mais recente | Versão estável | Versão candidata a lançamento | Versão Beta | Versão Alfa |
|---|---|---|---|---|
| 22 de outubro de 2025 | 1.8.0 | - | - | 1.9.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.8.0" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs using Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs using Views implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs using Jetpack Compose implementation "androidx.media3:media3-ui-compose:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.8.0" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs using Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs using Views implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs using Jetpack Compose implementation("androidx.media3:media3-ui-compose:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
Para ver mais informações sobre dependências, consulte Adicionar dependências de build.
Feedback
Seu feedback ajuda a melhorar o Jetpack. Você pode usar o Issue Tracker da Media3 (link em inglês) para ver respostas a perguntas, problemas conhecidos e solicitações de recursos e relatar novos problemas.
Versão 1.9.0
Versão 1.9.0-alpha01
22 de outubro de 2025
Lançamento de androidx.media3:media3-*:1.9.0-alpha01.
A versão 1.9.0-alpha01 contém estes commits.
- Biblioteca comum:
- Atualize
minSdkpara23de acordo com outras bibliotecas do AndroidX. - Adicione
PlayerTransferState, que facilita a transferência do estado de reprodução entre instâncias dePlayer. - Adicione os métodos
void mute()evoid unmute()ao Player para preservar e restaurar o volume do Player antes e depois de defini-lo como zero. - Publicação das classes de utilitário
WakeLockManager,WifiLockManager,AudioFocusManager,AudioBecomingNoisyManagereStuckPlayerDetectorusadas anteriormente peloExoPlayerinternamente para permitir a reutilização por outros players (#1893). - Correção do processamento de listeners
ForwardingPlayerquando o player delegado usa igualdade de referência para comparar instâncias de listener (#2675). - Adicione uma função de extensão de suspensão
Player.listenTona bibliotecamedia3-common-ktxque especifica oPlayer.Eventsespecífico que deve ser processado. - Correção de uma falha no
BasePlayer.getBufferedPercentageresultante de estouro de número inteiro quando a posição em buffer informada é muito maior do que a duração informada (#2750).
- Atualize
- ExoPlayer:
- Adicione uma detecção de player travado que aciona um erro de player
StuckPlayerExceptionse o player parecer travado. Isso acontece nos seguintes casos, em que cada tempo limite padrão pode ser configurado emExoPlayer.Builder, se necessário:- Após 10 minutos de
STATE_BUFFERINGao tentar reproduzir e sem progresso no buffer. - Após 10 segundos de
STATE_READYao tentar reproduzir e sem progresso na reprodução. - Após 1 minuto de
STATE_READYalém da duração declarada sem chegar ao fim do item. - Após 10 minutos com um motivo de supressão de reprodução ao tentar reproduzir.
- Após 10 minutos de
- Ativar o processamento de bloqueio de despertar por padrão para corrigir problemas com o buffer durante a
reprodução em segundo plano. Isso equivale a definir
ExoPlayer.Builder.setWakeModecomoC.WAKE_MODE_LOCAL. - Adicione uma lógica de escuta para atualizar automaticamente o ID do dispositivo virtual quando uma
mudança for informada ao
Contextoriginalmente transmitido paraExoPlayer.Builder. - Adicione
ExoPlayer.setVirtualDeviceIdpara atualizar manualmente o ID do dispositivo virtual obtido doContexttransmitido paraExoPlayer.Builder. - Verifique se os renderizadores não consomem dados do próximo item da playlist mais de 10 segundos antes do fim do item atual.
- Adição de
setSeekBackIncrementMs,setSeekForwardIncrementMsesetMaxSeekToPreviousPositionMsaExoPlayerpara atualizar essas configurações após a construção (#2736). - Adicione a funcionalidade de pré-cache em
DefaultPreloadManager. Agora, os apps podem retornarDefaultPreloadManager.PreloadStatus.specifiedRangeCached(startPositionMs, durationMs)ouDefaultPreloadManager.PreloadStatus.specifiedRangeCached(durationMs)viaTargetPreloadStatusControl.getTargetPreloadStatus(T rankingData)para indicar que um item de mídia precisa ser pré-armazenado em cache. - Use a funcionalidade de pré-armazenamento em cache do
DefaultPreloadManagerno app de demonstração de formato curto. - Adicione setters
DefaultLoadControl.Builderpara reprodução local e ajuste os valores padrão deDefaultLoadControlpara funcionar bem com uma ampla variedade de arquivos locais. - Correção de um bug em que definir uma playlist vazia pode deixar o player em
STATE_READYouSTATE_BUFFERING. - Melhoria das APIs do gerenciador de pré-carregamento:
- Adicione
addMediaItems(List<MediaItem>, List<T>)eaddMediaSources(List<MediaSource>, List<T>)que adicionam os itens de mídia ou fontes de mídia em lote e chamam automaticamenteinvalidate()depois. - Adicione
removeMediaItems((List<MediaItem>)eremoveMediaSources(List<MediaSource>)que removem os itens de mídia ou as fontes de mídia em lote e verifique se o gerenciador de pré-carregamento não inicia nem continua o pré-carregamento de nenhum deles após a remoção. - Permita que
DefaultPreloadManager.setCurrentPlayingIndex(int)se invalide automaticamente. Os apps não precisam mais chamarinvalidate()explicitamente depois de atualizar o índice de reprodução atual.
- Adicione
- Adiciona a capacidade de pular a redefinição de frame-chave para avanços rápidos no mesmo grupo de imagens no modo de limpeza.
- Adicione
DefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)para que os apps definam um valor de bytes de buffer de destino para um player com oplayerNameespecificado. ODefaultLoadControlagora pode tomar decisões de cada jogador separadamente com base nos próprios bytes alocados e bytes de buffer de destino. - Adicione
SkipInfoaoAdPlaybackState.AdGrouppara transmitir informações de pulo de cada anúncio no grupo. - Correção de um bug em que chamar
removeMediaItems(List)durante a reprodução de um pós-roll criava uma falha (#2746). - Corrigimos algumas falhas na reprodução de playlists em que os frames eram sempre definidos e renderizados como a última amostra por engano.
- Ativa o caminho de nova tentativa se o player não conseguir gerar um ID de sessão de áudio (#2382, #2678).
- Adicione suporte para controlar o total de bytes de buffer das fontes em
DefaultPreloadManagerpara evitar que o total de bytes de buffer para pré-carregamento cresça arbitrariamente. Para usar a lógica de controle padrão, os apps podem definir os bytes do buffer de destino para pré-carregamento viaDefaultLoadControl.Builder.setPlayerTargetBufferBytes(String, int)para umplayerNamedePlayerId.Preload.name("preload") e injetar oDefaultLoadControlcriado viaDefaultPreloadManager.Builder.setLoadControl(LoadControl).
- Adicione uma detecção de player travado que aciona um erro de player
- CompositionPlayer:
- Publique
CompositionPlayerem uma nova anotação@ExperimentalApipara indicar que ele está disponível para testes, mas ainda está em desenvolvimento. Algumas APIs provavelmente vão mudar significativamente em versões futuras, e há problemas e limitações conhecidos com alguns casos de uso (alguns não documentados). - Adição de suporte para
COMMAND_SET_AUDIO_ATTRIBUTESe processamento de foco de áudio emCompositionPlayer. - Adição de suporte para mudança de velocidade em sequências secundárias em
CompositionPlayer.
- Publique
- Transformador:
- Use
InAppMp4Muxercomo muxer padrão. - Adicione
EditedMediaItem.Builder#setSpeed()e descontinueEffects#createExperimentalSpeedChangingEffects(). - Substitua
forceAudioTrackeforceVideoTrackportrackTypesemEditedMediaItemSequence.
- Use
- Seleção de faixas:
- Adicione
TrackSelectionParameters.selectTextByDefaultpara preferir a seleção de qualquer faixa de texto sem especificar outras preferências mais específicas. - Adicione
preferredVideoLabels,preferredAudioLabelsepreferredTextLabelsemTrackSelectionParameterspara especificar uma preferência por faixas com um rótulo específico, por exemplo, aquelas lidas de tags NAME do HLS (#1666).
- Adicione
- Extratores:
- FLAC: aperte a detecção de cabeçalho para reduzir a chance de encontrar cabeçalhos espúrios nos dados FLAC codificados, resultando em erros de decodificação (#558).
- MP3: permite lacunas entre (e antes) das tags ID3 no início dos arquivos MP3 (#811, #5718).
- MP4: diferencie os tipos MIME
audio/mpeg(MP3),audio/mpeg-L1eaudio/mpeg-L2ao espiar o valor da camada da primeira amostra antes de emitir um formato de faixa do extrator (#2683). - MP4: melhora a eficiência de detecção de arquivos muito grandes ao presumir que uma caixa
stblmaior que 1 MB implica que o arquivo não pode ser fragmentado (#2650). - Matroska: adiciona suporte à detecção de DTS-HD (#6225).
- Correção de um problema no
MatroskaExtractorem que a busca poderia ser imprecisa para arquivos com várias faixas. Os pontos de sinalização agora estão associados corretamente às respectivas faixas, o que leva a uma busca mais precisa. - MP4: adicionamos suporte aos metadados
©mvn(nome do movimento) e©mvi(índice do movimento). Agora eles são emitidos como objetosTextInformationFrameemFormat.metadatacom IDsMVNMeMVIN, respectivamente (#2754). - MPEG-TS: correção de
IllegalArgumentExceptiondeReorderingBufferQueuecausada por pacotes PES sem carimbo de data/hora (#2764). - MP4: ignora faixas sem caixa
stsdem vez de não analisar o arquivo inteiro. - Adição de suporte para extrair Motion Photos HEIC. O
HeifExtractoragora pode analisar arquivos HEIC que contêm faixas de vídeo e áudio incorporadas. - MP3: mude
FLAG_ENABLE_INDEX_SEEKINGpara preferir buscar informações em cabeçalhos de metadados (como Xing e VBRI) quando disponíveis, voltando para a busca baseada em índice se nenhuma outra informação de busca estiver presente. Isso melhora o desempenho de arquivos com metadados de busca (#2839).
- Inspetor:
- Introduzimos um novo módulo
:media3-inspectorpara servir como a página inicial dedicada dos utilitários de inspeção de mídia. Esse módulo agora abriga um novoandroidx.media3.inspector.MetadataRetriever, que vai fornecer uma API unificada para metadados e extração de frames. Oandroidx.media3.exoplayer.MetadataRetrieveratual foi descontinuado em favor desta nova versão. - Lançamos a
androidx.media3.inspector.FrameExtractor, uma nova API pública para extração de frames. Essa classeAutoCloseableoferece uma maneira de extrair frames com suporte a vídeos HDR, efeitos de vídeo e seleção personalizada de decodificador. Ele precisa ser criado usando oBuilderpara umMediaItemespecífico. - FrameExtractor: adicione
getThumbnail()para extrair um frame de miniatura representativo de um arquivo de mídia sem exigir um carimbo de data/hora específico.
- Introduzimos um novo módulo
- Áudio:
- Faça com que as instâncias
AudioProcessorreconheçam a ação de buscar. - Permite injetar a nova interface
AudioOutputProvideremDefaultAudioSink.Builderpara oferecer suporte a caminhos de saída de áudio personalizados. O padrão éAudioTrackAudioOutputProvider. - Processar buscas em
GainProcessor. - Utilize recursos de perfil e nível do decodificador AC-4 na avaliação de suporte ao formato de faixa (#2580).
- Evite possíveis atrasos causados pelo processamento de callbacks de mudança de roteamento no início da reprodução (#2646).
- Permitir a reutilização de codec para formatos EAC3, EAC3-JOC e AC-4 (#1346).
- Adição de suporte para amostras PCM de ponto flutuante em
Sonic. - Adição de suporte para amostras PCM de 16 bits em
ToFloatPcmAudioProcessor.
- Faça com que as instâncias
- Vídeo:
- Desative a reutilização de codec para conteúdo Dolby Vision com perfis diferentes.
- Texto:
- Correção da análise de legendas CEA-6/708 em conteúdo Dolby Vision (#2775).
- Imagem:
- Correção do problema do ScrubbingMode em que o player ficava travado ao limpar uma faixa de miniatura DASH (#2815).
- DRM:
- Mude o tipo de retorno dos métodos
MediaDrmCallbackdebyte[]para um novo tipoMediaDrmCallback.Response, permitindo o retorno de informações opcionais extras. Essa é uma mudança incompatível na origem, mas as incompatibilidades podem ser resolvidas facilmente encapsulando o valor de retornobyte[]anterior comnew Responseantes de retornar. - Adicione informações importantes da solicitação, como URL e latência, a
AnalyticsListener.onDrmKeysLoaded(#1001). - Mova os dados da solicitação de provisionamento de um parâmetro de URL para o corpo POST.
- Mude o tipo de retorno dos métodos
- Multiplexadores:
- Adicione
MediaMuxerCompat, uma substituição direta para o frameworkMediaMuxer. - Adicione
MuxerUtil.createMotionPhotoFromJpegImageAndBmffVideo()para permitir a criação de fotos em movimento. - Adicione
WebmMuxerpara permitir a multiplexação de fluxos de mídiaOPUS,VORBIS,VP8eVP9em um formato de arquivowebm.
- Adicione
- Extensão de IMA:
- Remoção de regras personalizadas do ProGuard para que os apps possam usar as lançadas no arquivo Android da IMA.
- Adicione
ImaServerSideAdInsertionUriBuilder.setNetworkCode, uma nova API para definir o código de rede do Google Ad Manager para que o SDK do IMA processe identificadores de anúncios conforme especificado nas configurações do Google Ad Manager. Os códigos de rede são opcionais, mas recomendados para solicitações de stream de serviço completo. Para encontrar o código de rede, consulte este artigo. - Aumente a dependência do IMA para 3.37.0, o que exige a ativação da remoção de açúcar da biblioteca principal. Isso também precisa ser ativado pelos apps dependentes. Consulte as observações de configuração da IMA.
- Suporte a opções de interface personalizadas da DAI da IMA no criador de URIs da SSAI. As opções de interface do usuário personalizadas para inserção de anúncios do lado do servidor incluem suporte à renderização de "Pular" e "Sobre este anúncio". No momento, o recurso está disponível para publishers selecionados em uma lista de permissões. Essa mudança também faz upgrade da versão do SDK do IMA para 3.38.0 (notas da versão) para acessar a API de opções de interface personalizada.
- Sessão:
- Adição de um novo parâmetro a
MediaSession.Callback.onPlaybackResumptionpara indicar se a chamada acontece apenas para coletar informações ou para iniciar a reprodução (#1764). - Atualização de
MediaSession.ControllerInfo.isTrustedpara declarar controladores do próprio app como confiáveis (#2542). - Adição de
MediaSessionService.triggerNotificationUpdatepara acionar manualmente uma atualização de notificação (#1833). - Adicione
ProgressListeneraos métodos de comando personalizados. - Mude o valor padrão de
MediaLibrarySession.Builder.setLibraryErrorReplicationModepara não fatal. - Adicione um parâmetro
ContextaMediaButtonReceiver.onForegroundServiceStartNotAllowedException(#2625). - Leia o ID de controle de volume da plataforma
PlaybackInfoem vez de buscar via binder. Isso garante que o tipo de reprodução e o ID de controle de volume sejam lidos de forma atômica e correspondam entre si. - Correção de um bug em que os eventos de tecla
ACTION_UPeram filtrados antes de serem transmitidos para o callback de processamento personalizado. Isso traz paridade com o que media1 fez e a plataforma faz (#2637). - Correção de um bug em que
getCurrentTimeline()era chamado porPlayerWrappermesmo quando o comando não estava disponível (#2665). - Correção de um bug em que uma mensagem era deixada na fila de mensagens do looper principal e causava um vazamento de memória após o encerramento do serviço (#2692).
- Quando conectado a um app de sessão legada com um
MediaBrowser, os comandos personalizados são enviados à sessão somente se a ação personalizada for anunciada como uma ação personalizada emPlaybackStateCompatda sessão legada. Todas as outras ações personalizadas são enviadas ao serviço. - Implementamos
onAudioSessionIdChangedpara notificar os controladores de mídia quando um ID de sessão de áudio é definido pela sessão (#244). - Correção de um bug em que o
KEYCODE_HEADSETHOOKnão iniciava o player quando um evento de tecla de mídiaIntentchegava emonStartCommand(). Isso é corrigido ao processar "KEYCODE_HEADSETHOOK" da mesma forma queKEYCODE_MEDIA_PLAY_PAUSE(#2816). - Correção de um bug em que o tamanho da superfície não era comunicado entre a sessão e o controlador, resultando na falha ao aplicar efeitos de vídeo na sessão de demonstração. Se você estiver usando um controlador, essa poderá ser uma mudança
destrutiva se o player não conseguir processar uma chamada
setVideoSurfaceHolder. - Correção da propagação de valores de metadados
CharSequencenãoString, como strings com estilo de extensão (#2853).
- Adição de um novo parâmetro a
- Interface:
- Adicione a classe
ProgressStateWithTickIntervale o elemento combinávelrememberProgressStateWithTickIntervalcorrespondente ao módulomedia3-ui-compose. Esse holder de estado é usado emdemo-composepara mostrar a posição e a duração atuais em formato de texto. - Adicione
MuteButtonStateaui-composepara processar a desativação do volumePlayer. Esse holder de estado é usado emdemo-composepara mostrar o botão de ativar/desativar o som. - Adicione classes
ProgressStateWithTickCounte o elemento combinávelrememberProgressStateWithTickCountcorrespondente ao módulomedia3-ui-compose. Esse holder de estado é usado emdemo-composepara mostrar o progresso como uma barra de progresso horizontal somente leitura. - Adicione o elemento combinável
ContentFrameaomedia3-ui-compose, que combina o gerenciamento dePlayerSurfacecom o redimensionamento e a cobertura da proporção com um obturador. - Solução alternativa para um bug conhecido da plataforma da API 34 que causa o esticamento/corte de vídeos
ao usar
SurfaceViewem umAndroidViewdo Compose e, portanto, afeta os elementos combináveisContentFrameePlayerSurfacecomSURFACE_TYPE_SURFACE_VIEW(#1237, #2811). - Crie um novo módulo
media3-ui-compose-material3e adicione Composables com tema do Material3 (PlayPauseButton, NextButton, PreviousButton, SeekBackButton, SeekForwardButton, RepeatButton, ShuffleButton, MuteButton) a ele. - Adição de suporte para colocar um botão de roteamento de mídia na
PlayerView.
- Adicione a classe
- Extensão HLS:
- Analisa atributos de pular intersticiais HLS.
- Mapeie os atributos de controle de skip da playlist HLS e do documento da lista de recursos
para o
AdPlaybackStatepara acesso público. - Correção de um bug em que o horário de início da playlist era descartado quando a tag EXT-X-PROGRAM-START-DATE que definia o horário de início era removida de uma playlist (#2760).
- Use a pesquisa binária para encontrar o índice do segmento de uma determinada posição na playlist (#2826).
- Extensão DASH:
- Correção de
UnsupportedOperationExceptionao reproduzir streams DASH com um manifesto de URIdata:não hierárquico (#2688). - Redefina
LiveConfigurationpara o valor fornecido peloMediaItemdoDashMediaSourcequando lançado e quando o item de mídia é atualizado pelo usuário (#2606). - Evita falhas causadas por atualizações inválidas do manifesto que não foram informadas como erros do player (#2805).
- Correção de
- Extensão RTSP:
- Tratamento de erros de pacotes RTP ausentes ao processar unidades NAL fragmentadas para H264 e H265 (#2613).
- Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
- Extensão AV1: o decodificador de software AV1 agora usa a biblioteca
dav1dde alta performance, substituindo a implementaçãolibgav1anterior para melhorar a velocidade de decodificação.
- Extensão AV1: o decodificador de software AV1 agora usa a biblioteca
- Extensão do Google Cast:
- Adicione
CastPlayer.Builder, que permite que oCastPlayerfaça reprodução local e com o Google Cast. Para manter o comportamento antigo deCastPlayer, que oferece suporte apenas à reprodução do Cast, useRemoteCastPlayer. Os construtoresCastPlayerpreexistentes mantêm o comportamento antigo, mas estão descontinuados em favor do uso dos buildersCastPlayerouRemoteCastPlayer. - Parar de aplicar um tipo MIME não nulo em
DefaultMediaItemConverter. - Use
MediaItem.mediaMetadata.mediaTypepara inferir o MEDIA_TYPE do Cast a ser usado emDefaultCastOptionsProvider#toMediaQueueItem, quando disponível. - Ative as transferências remotas para locais no
DefaultCastOptionsProvider. - Adição de suporte para o Cast na demonstração da sessão.
- Adiciona suporte para mostrar um botão de roteamento de mídia em uma interface combinável.
- Adição de compatibilidade para mostrar um botão de roteamento de mídia em um menu da barra de ações.
- Adicione compatibilidade para mostrar um botão de roteamento de mídia como uma interface do usuário de visualização.
- Adicione
- Utilitários de teste:
- Adiciona a diferença máxima de tempo para o comportamento de avanço automático de
FakeClock. O padrão é de 1 segundo, mas pode ser configurado usandoFakeClock.Builder. - Adicione a diferença máxima de tempo entre mensagens para
RobolectricUtil.runMainLooperUntil(erunLooperUntil). O padrão é de 1 segundo, mas pode ser configurado usando novas sobrecargas desses métodos. - Mova
CapturingRenderersFactorydetest-utilsparatest-utils-robolectric.
- Adiciona a diferença máxima de tempo para o comportamento de avanço automático de
- Símbolos descontinuados foram removidos:
- Remoção do construtor
DefaultPreloadManagerdescontinuado. UseDefaultPreloadManager.Builder - Os construtores
EditedMediaItemSequenceobsoletos foram removidos. UseEditedMediaItemSequence.Builder
- Remoção do construtor
Versão 1.8.0
Versão 1.8.0
30 de julho de 2025
A versão 1.8.0 contém estes commits.
- Biblioteca comum:
- Adição de suporte para substituir o player em
ForwardingSimpleBasePlayer.
- Adição de suporte para substituir o player em
- ExoPlayer:
- Adição de um getter para o modo aleatório à interface
ExoPlayer(#2522). - Gere uma exceção mais clara se
DefaultAudioSinkfor acessado de várias linhas de execução. Se isso acontecer devido a uma chamada paraRendererCapabilities.getFormatSupportfora do player, chame esse método na mesma linha de execução que a linha de execução de reprodução do ExoPlayer ou use uma instância diferente da usada para reprodução (#1191). - Correção de um bug em que formatos de áudio não estéreo em TVs podiam ser marcados como
não compatíveis com o
DefaultTrackSelector. - Verifique se o último frame é renderizado corretamente ao usar a flag
DECODE_ONLYdo MediaCodec, que é ativada por padrão no modo de limpeza. - Adicione suporte para usar o ID do dispositivo virtual do
Contexttransmitido paraExoPlayer.Builder. - Ativar a programação dinâmica por padrão no modo de limpeza.
- Evita o recarregamento desnecessário de uma origem ao buscar o final de um item.
- Use
MediaCodec.BUFFER_FLAG_DECODE_ONLYpor padrão no modo de limpeza. - Gerar
IllegalStateExceptionquandoPreloadMediaSourcefor reproduzido por umExoPlayercom uma linha de execução de reprodução diferente da linha de execução de pré-carregamento (#2495). - Adicione
cloneAndMoveaShuffleModecom uma implementação padrão (#2226). - Mude o comportamento padrão de
Renderer.getMinDurationToProgressUspara retornar um valor maior se nenhuma chamada pararenderfor necessária. - Correção de um bug em que o agendamento interno atrasava o último frame ao buscar o
final enquanto estava pausado. Por enquanto, a correção de bug só entra em vigor se
ExoPlayer.Builder.experimentalSetDynamicSchedulingEnabledestiver ativado. - Adicione o método
ExoPlayer.setScrubbingModeEnabled(boolean). Isso otimiza o player para muitas buscas frequentes (por exemplo, quando um usuário arrasta uma barra de limpeza). O comportamento do modo de limpeza pode ser personalizado comsetScrubbingModeParameters(..)emExoPlayereExoPlayer.Builder. - Permite personalizar a tolerância de busca fracionada no modo de limpeza.
- Aumente a taxa de operação do codec no modo de limpeza.
- Correção de um bug em que erros de preparação no conteúdo de
AdsMediaSourcepodem nunca ser informados (#2337). - Correção do vazamento de memória em
MergingMediaSource, por exemplo, usado ao carregar legendas (#2338). - Permita que
CmcdConfiguration.Factoryretornenullpara desativar o registro em log da CMCD em itens de mídia específicos (#2386). - Aumentamos o tamanho padrão do buffer de imagem de 128 KB (erro de copiar e colar de faixas de texto) para 26 MB, o que é grande o suficiente para imagens Ultra HDR de 50 MP (#2417).
- Adicione
PreCacheHelperpara permitir que os apps façam pré-cache de uma única mídia com posição inicial e duração especificadas. - Adiciona suporte para pré-carregamento da posição especificada em
DefaultPreloadManager.
- Adição de um getter para o modo aleatório à interface
- Transformador:
- Adicione
CodecDbLite, que permite otimizações específicas do chipset das configurações de codificação de vídeo. - Adicione a flag
setEnableCodecDbLiteaoDefaultEncoderFactorypara ativar a otimização das configurações do CodecDB Lite. Por padrão, essa flag é definida como "false". - Para preencher uma lacuna inicial (adicionada via
addGap()) com áudio silencioso, agora é necessário definir explicitamenteexperimentalSetForceAudioTrack(true)emEditedMediaItemSequence.Builder. Se a lacuna estiver no meio da sequência, essa flag não será necessária. - Mova a interface
Muxerdemedia3-transformerparamedia3-muxer. - Torne a configuração
MediaItem.Builder().setImageDuration(long)obrigatória para importar um item de mídia como uma imagem. - Adicione
Transformer.Builder().experimentalSetMp4EditListTrimEnabled(boolean)que inclui uma lista de edição MP4 ao cortar para instruir os players a ignorar amostras entre o frame-chave antes do ponto de início do corte e o ponto de início do corte. - Atualize o app de demonstração Composition para usar o Kotlin e o Jetpack Compose, além de adicionar um
VideoCompositorSettingspersonalizado para organizar sequências em um layout 2x2 ou PiP.
- Adicione
- Extratores:
- Análise de metadados de arquivos MP4 fragmentados (#2084).
- JPEG: suporte a fotos com movimento que não têm um segmento Exif no início (#2552).
- Adição de suporte para busca em MP4 fragmentado com vários átomos
sidx. Esse comportamento pode ser ativado usando a flagFLAG_MERGE_FRAGMENTED_SIDXemFragmentedMp4Extractor(#9373). - Ignorar tabelas de busca vazias em arquivos FLAC (incluindo aquelas que contêm apenas pontos de busca de marcador de posição) e usar a busca binária se a duração do arquivo for conhecida (#2327).
- Correção da análise de unidades SEI H.265 para ignorar totalmente tipos SEI não reconhecidos (#2456).
- Atualize
WavExtractorpara usar os dados SubFormat da extensão de cabeçalho para o formato de áudio ao analisar um arquivo do tipoWAVE_FORMAT_EXTENSIBLE. - MP4: adicionado suporte para caixas
ipcmefpcmque definem faixas de áudio PCM bruto (PCM de ponto flutuante de 64 bits não é compatível). - MP4: processa a parte de rotação das matrizes de transformação
tkhdque giram e refletem o vídeo. Isso garante que os vídeos refletidos gravados pela câmera frontal do iPhone sejam exibidos na orientação correta, mas refletidos incorretamente no eixo y (#2012). - MP3: use a duração e o tamanho dos dados de metadados de taxa de bits variável não pesquisáveis do Xing, VBRI e semelhantes ao fazer fallback para a pesquisa de taxa de bits constante devido a
FLAG_ENABLE_CONSTANT_BITRATE_SEEKING(_ALWAYS)(#2194).
- Áudio:
- Correção de um bug em que
AnalyticsListener.onAudioPositionAdvancingnão era chamado quando a reprodução de áudio era iniciada muito perto do final da mídia. - Adição de compatibilidade com todos os formatos de amostra PCM lineares em
ChannelMappingAudioProcessoreTrimmingAudioProcessor. - Adição de suporte para falhas de áudio em
CompositionPlayer. - Remova a chamada espúria para
BaseAudioProcessor#flush()deBaseAudioProcessor#reset(). - Permite o upmixing/downmixing de energia constante em DefaultAudioMixer.
- Tornar
ChannelMappingAudioProcessor,TrimmingAudioProcessoreToFloatPcmAudioProcessorpúblicos (#2339). - Use
AudioTrack#getUnderrunCount()emAudioTrackPositionTrackerpara detectar subexecuções emDefaultAudioSinkem vez de estimativa de melhor esforço. - Melhoramos a suavização do carimbo de data/hora de áudio para desvios inesperados de posição do dispositivo de saída de áudio.
- Correção de um bug em que a sincronização de A/V era interrompida nos primeiros 10 segundos após a retomada da pausa quando conectado a dispositivos Bluetooth.
- Correção de um bug em que
AnalyticsListener.onAudioPositionAdvancingnão informava o horário em que o áudio começou a avançar, mas sim o horário da primeira medição. - Corrigimos a recuperação para áudio multicanal após o fallback para áudio estéreo em alguns dispositivos (#2258).
- Correção de um bug em que
- Vídeo:
- Estender a solução alternativa de superfície separada para dispositivos "lenovo" e "motorola" (#2059).
- Melhoria da liberação suave de frames de vídeo na inicialização quando as amostras de áudio não começam exatamente na posição solicitada.
- Estender a solução alternativa de superfície separada para dispositivos "realme" (#2059).
- Adição da API experimental
ExoPlayerpara incluir a flagMediaCodec.BUFFER_FLAG_DECODE_ONLYao enfileirar buffers de entrada somente de decodificação. Essa flag vai sinalizar para o decodificador pular os buffers somente de decodificação, resultando em uma busca mais rápida. Ative-o comDefaultRenderersFactory.experimentalSetEnableMediaCodecBufferDecodeOnlyFlag. - Melhorar as verificações de desempenho de codec para codecs de vídeo de software. Isso pode fazer com que algumas faixas adicionais sejam marcadas como
EXCEEDS_CAPABILITIES. - Correção de erros de reprodução do Widevine VP9 em alguns dispositivos (#2408).
- Texto:
- Adição de suporte a faixas VobSub em arquivos MP4 (#2510).
- Correção de uma interrupção na reprodução quando um segmento de legenda falha ao carregar inicialmente e depois carrega com sucesso, seguido por vários segmentos de legenda vazios (#2517).
- Correção do SSA e do SubRip para mostrar uma sugestão em andamento ao ativar as legendas (#2309).
- Correção do problema de travamento da reprodução ao alternar de um stream com um erro de legenda para uma transmissão ao vivo com uma faixa de legenda vazia (#2328).
- Correção de legendas CEA-608 ilegíveis ao reproduzir streams H.262 que contêm B-frames (#2372).
- Adicionamos suporte para legendas SSA com
CodecId = S_TEXT/SSAem arquivos Matroska. Antes, oMatroskaExtractorsó era compatível comCodecId = S_TEXT/ASS, que representa a variante "avançada" (v4 ou mais recente) de legendas SubStation Alpha, mas a lógica de análise do ExoPlayer é a mesma para as duas variantes (#2384). - Adicionado suporte à propriedade
layerem arquivos de legendas SubStation Alpha (SSA), que é usada para definir a ordem z de sinais quando mais de um é mostrado na tela ao mesmo tempo (#2124).
- Metadados:
- Adicionamos suporte para recuperar a duração da mídia e
TimelineparaMetadataRetrievere migramos para uma APIAutoCloseablebaseada em instâncias. Use o novoBuilderpara criar uma instância de umMediaIteme chameretrieveTrackGroups(),retrieveTimeline()eretrieveDurationUs()para receberListenableFutures dos metadados. Os métodos estáticos anteriores foram descontinuados (#2462).
- Adicionamos suporte para recuperar a duração da mídia e
- Imagem:
- Limite os bitmaps decodificados ao tamanho da tela em
BitmapFactoryImageDecoderpara evitar que um app falhe comCanvas: trying to draw too large bitmap.dePlayerViewao tentar mostrar imagens muito grandes (por exemplo, 50 MP). - Mude a assinatura de
DefaultRenderersFactory.getImageDecoderFactory()para usar um parâmetroContext. - Alinhe o tamanho máximo de saída de bitmap usado em
CompositionPlayercom o que já é usado emTransformer. Isso significa queCompositionPlayernão considera o tamanho da tela ao decodificar bitmaps, ao contrário deExoPlayer.
- Limite os bitmaps decodificados ao tamanho da tela em
- DRM:
- Adicione uma nova sobrecarga de
OfflineLicenseHelper.newWidevineInstanceaceitando umMediaItem.DrmConfigurationpara que os cabeçalhos de solicitação HTTP possam ser aplicados corretamente (#2169).
- Adicione uma nova sobrecarga de
- Efeito:
- Adicione
Presentation.createForShortSide(int)que cria umPresentationque garante que o lado mais curto sempre corresponda ao valor especificado, independente da orientação da entrada.
- Adicione
- Multiplexadores:
- Correção de um bug em que as flags de amostra corretas não eram definidas para amostras de áudio em MP4 fragmentado.
- A API
writeSampleData()agora usa a classeBufferInfoespecífica do muxer em vez deMediaCodec.BufferInfo. - Adicione
Muxer.Factory#supportsWritingNegativeTimestampsInEditList, que é definido como "false" por padrão.
- Extensão de IMA:
- Correção de um bug em que um erro de carregamento em um anúncio pode invalidar outro grupo de anúncios por engano.
- Correção de um bug em que grupos de anúncios após o fim de uma janela de VOD interrompiam a reprodução.
Os grupos de anúncios com um horário de início posterior à janela não são mais enfileirados no
MediaPeriodQueue(#2215).
- Sessão:
- Correção do bug em que conexões de controladores Media3 não privilegiados de terceiros eram ignoradas.
- Remova a verificação de comandos disponíveis ao enviar comandos personalizados para um
MediaBrowserServiceCompatlegado. Isso está em paridade com o comportamento de controladores/navegadores legados quando conectados a um app legado. - Correção de um bug que fazia com que o primeiro erro de reprodução de um player fosse tratado incorretamente como uma exceção personalizada persistente. Isso impede que o aplicativo se recupere.
- Correção de um bug em que algumas mudanças de controlador não processadas pela
sessão podem causar
IllegalStateExceptions. - Correção de um bug em que ações do controlador que não são processadas pela sessão podem deixar o controlador em um estado inválido.
- Correção do aviso de violação de lançamento não seguro do StrictMode (#2330).
- Correção de um bug em que chamar
setSessionExtrasda linha de execução principal ao executar o player de uma linha de execução de aplicativo diferente da principal causava umIllegalStateException(#2265). - Não mostrar uma notificação automaticamente se um jogador estiver configurado com itens de mídia sem prepará-los ou reproduzi-los
(#2423https://github.com/androidx/media/issues/2423). Esse comportamento
pode ser configurado por
MediaSessionService.setShowNotificationForIdlePlayer. - Adicione
PlaybackExceptionpersonalizados a todos os controladores ou apenas aos selecionados. - Correção de um bug em que a busca em uma transmissão ao vivo em um
MediaControllerpodia causar umIllegalArgumentException. - Para transmissões ao vivo, pare de publicar uma posição de reprodução e a capacidade de buscar no item atual para controladores de mídia da plataforma, evitando artefatos de posição na interface do Android Auto (e outros controladores que usam essas informações da sessão de mídia da plataforma) (#1758).
- Correção de um bug em que a transmissão de um valor nulo para
getLibraryRootde umMediaBrowserconectado a umMediaBrowserServiceCompatlegado produzia umNullPointerException. - Corrigimos um bug em que o envio de ações personalizadas, um resultado da pesquisa ou uma solicitação
getItem fazia o app de sessão legada falhar com um
ClassNotFoundException. - Correção de um bug em que
MediaItem.LocalConfiguration.uriera compartilhado com oMediaMetadatadas sessões da plataforma. Para compartilhar intencionalmente um URI e permitir que os controladores solicitem a mídia novamente, definaMediaItem.RequestMetadata.mediaUri.
- Interface:
- Correção de um bug em que o
PlayerSurfacedentro de componentes reutilizáveis, comoLazyColumn, não funcionava corretamente (#2493). - Foi corrigido um bug do Compose que resultava em uma lacuna entre a definição dos estados iniciais do botão e a observação da mudança de estado (por exemplo, formas de ícone ou ativação). Agora, as mudanças feitas no Player fora do período de observação são capturadas (#2313).
- Adicione titulares de estado e elementos combináveis ao módulo
media3-ui-composeparaSeekBackButtonStateeSeekForwardButtonState. - Adição de suporte ao modo de limpeza do ExoPlayer em
PlayerControlView. Quando ativado, isso coloca o player no modo de limpeza quando o usuário começa a arrastar a barra de limpeza, emite uma chamadaplayer.seekTopara cada movimento e sai do modo de limpeza quando o toque é removido da tela. Essa integração pode ser ativada comtime_bar_scrubbing_enabled = trueem XML ou com o métodosetTimeBarScrubbingEnabled(boolean)em Java/Kotlin. - Faça com que
PlayerSurfaceaceite um argumentoPlayeranulável.
- Correção de um bug em que o
- Downloads:
- Adição de suporte para downloads parciais de transmissões progressivas. Os apps podem preparar um
stream progressivo com
DownloadHelpere solicitar umDownloadRequestdo auxiliar especificando as posições de início e fim da mídia com base no tempo que o download deve abranger. ODownloadRequestretornado carrega o intervalo de bytes resolvido, com o qual umProgressiveDownloaderpode ser criado e fazer o download do conteúdo de acordo. - Adicione
DownloadHelper.Factorycom que os métodos estáticosDownloadHelper.forMediaItem()são substituídos. - Adicione
Factorypara implementações deSegmentDownloader. - Adição de suporte a downloads parciais para streams adaptáveis. Os apps podem preparar um
stream adaptável com
DownloadHelpere solicitar umDownloadRequestdo auxiliar especificando as posições de início e fim da mídia com base no tempo que o download deve abranger. ODownloadRequestretornado contém o período resolvido, com o qual umSegmentDownloaderconcreto pode ser criado e fazer o download do conteúdo correspondente.
- Adição de suporte para downloads parciais de transmissões progressivas. Os apps podem preparar um
stream progressivo com
- Extensão do Cronet:
- Adição do processamento automático de cookies (#5975).
- Extensão HLS:
- Correção de um bug em que
HlsSampleStreamWrappertenta buscar dentro do buffer quando não há partes disponíveis no buffer #2598. - Correção de um bug em que as mudanças na seleção de faixas após o carregamento de partes de baixa latência e dicas de pré-carregamento podem fazer com que a reprodução fique travada ou congelada (#2299).
- Evite recarregamentos excessivos aguardando metade da duração desejada quando
CAN-BLOCK-RELOAD=YESnão é respeitado pelo servidor (#2317). - Correção de um bug em que a reprodução era interrompida ao iniciar um fluxo de intersticiais antes de um mid-roll e a resolução da lista de recursos era tentada para o anúncio errado (#2558).
- Correção da análise de playlists para aceitar
\f(avanço de formulário) em valores de atributos de string entre aspas (#2420). - Suporte à atualização de intersticiais com o mesmo ID (#2427).
- Correção de um bug em que os erros de carregamento da playlist às vezes não eram propagados quando uma transmissão ao vivo ficava sem segmentos para carregar (#2401https://github.com/androidx/media/issues/2401).
- Agrupe as renderizações de legendas usando a tag NAME, assim como as renderizações de áudio já são agrupadas (#1666).
- Suporte a X-ASSET-LIST e transmissões ao vivo com
HlsInterstitialsAdsLoader.
- Correção de um bug em que
- Extensão DASH:
- Correção de um problema em que o conjunto de adaptação de reprodução
trucada era mesclado com o principal para formar um
TrackGroupinválido (#2148). - Foi corrigido um bug em que a redução da duração de um período DASH podia gerar uma exceção quando amostras além da nova duração já tinham sido lidas pelo pipeline de renderização (#2440).
- Correção do bug em que o redirecionamento não era seguido ao usar parâmetros de consulta CMCD (#2475).
- Correção de um problema em que o conjunto de adaptação de reprodução
trucada era mesclado com o principal para formar um
- Extensão RTSP:
- Adição de suporte para pacotes de agregação RTP para H265 de acordo com RFC 7798#4.4.2 (#2413).
- Correção de
RtspClientpara usar o URI de local fornecido ao processar uma resposta HTTP 302 (#2398). - Adicionado suporte à análise de SessionDescriptions que contêm linhas com caracteres de espaço em branco à direita (#2357).
- Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
- O bug em que
DefaultTrackSelector.setAllowInvalidateSelectionsOnRendererCapabilitiesChangenão tem efeito para extensões de decodificador de áudio (#2258) foi corrigido.
- O bug em que
- Extensão do Google Cast:
- Utilitários de teste:
- Adicione
advance(player).untilPositionAtLeasteuntilMediaItemIndexaTestPlayerRunHelperpara avançar o player até que uma posição especificada seja alcançada. Na maioria dos casos, esses métodos são mais confiáveis do que os métodosuntilPositioneuntilStartOfMediaItematuais. - Mova
FakeDownloaderpara o módulotest-utils-robolectricpara reutilização em outros testes. transformer.TestUtil.addAudioDecoders(String...),transformer.TestUtil.addAudioEncoders(String...)etransformer.TestUtil.addAudioEncoders(ShadowMediaCodec.CodecConfig, String...)foram removidos. UseShadowMediaCodecConfigpara configurar codificadores e decodificadores de sombra.- Substituímos o prefixo "exotest" por "media3" nos nomes de codecs informados por
ShadowMediaCodecConfig.
- Adicione
- Símbolos descontinuados foram removidos:
- Remoção do construtor
SegmentDownloaderobsoletoSegmentDownloader(MediaItem, Parser<M>, CacheDataSource.Factory, Executor)e dos construtores correspondentes nas subclassesDashDownloader,HlsDownloadereSsDownloader. - Removemos
Player.hasNext()ePlayer.hasNextWindow(), que estavam descontinuados. UsePlayer.hasNextMediaItem()em vez disso. - Remoção de
Player.next()obsoleta. UsePlayer.seekToNextMediaItem(). - Remoção de
Player.seekToPreviousWindow()obsoleta. UsePlayer.seekToPreviousMediaItem() - Remoção de
Player.seekToNextWindow()obsoleta. UsePlayer.seekToNextMediaItem() - Remoção de
BaseAudioProcessordescontinuado no móduloexoplayer. UseBaseAudioProcessorno módulocommon. - Remoção do construtor
MediaCodecVideoRendererdescontinuadoMediaCodecVideoRenderer(Context, MediaCodecAdapter.Factor, MediaCodecSelector, long, boolean, @Nullable Handler, @Nullable VideoRendererEventListener, int, float, @Nullable VideoSinkProvider).
- Remoção do construtor
Versão 1.8.0-rc02
24 de julho de 2025
Use a versão estável 1.8.0.
Versão 1.8.0-rc01
16 de julho de 2025
Use a versão estável 1.8.0.
Versão 1.8.0-beta01
2 de julho de 2025
Use a versão estável 1.8.0.
Versão 1.8.0-alpha01
19 de maio de 2025
Use a versão estável 1.8.0.
Versão 1.7.0
Versão 1.7.1
16 de maio de 2025
Essa versão tem o mesmo código da 1.6.1 e está sendo lançada para garantir que ela apareça como uma versão "mais recente" do que a 1.7.0, que foi uma versão Alfa marcada acidentalmente como estável (confira abaixo).
Versão 1.7.0
16 de maio de 2025
Essa versão deveria ter sido 1.7.0-alpha01, mas foi marcada acidentalmente como
1.7.0 (ou seja, estável) em maven.google.com. Não use essa versão. Permanecer na versão 1.6.1 ou fazer upgrade para a 1.7.1 (que tem o mesmo código da 1.6.1).
Versão 1.6.0
1.6.1
14 de abril de 2025
Lançamento de androidx.media3:media3-*:1.6.1.
A versão 1.6.1 contém
estes commits.
- Biblioteca comum:
- Adição do método
PlaybackParameters.withPitch(float)para copiar facilmente umPlaybackParameterscom um novo valorpitch(#2257).
- Adição do método
- ExoPlayer:
- Correção de um problema em que a transição de itens de mídia falhava devido a um erro recuperável do renderizador durante a inicialização do próximo item de mídia (#2229).
- Correção de um problema em que
ProgressiveMediaPeriodgerava umIllegalStateExceptionquandoPreloadMediaSourcetentava chamar ogetBufferedDurationUs()antes de ser preparado (#2315). - Correção do envio de
CmcdDataem solicitações de manifesto para DASH, HLS e SmoothStreaming (#2253). - Verifique se
AdPlaybackState.withAdDurationsUs(long[][])pode ser usado depois que os grupos de anúncios forem removidos. O usuário ainda precisa transmitir uma matriz de durações para grupos de anúncios removidos, que pode estar vazia ou nula (#2267).
- Extratores:
- MP4: analisa
alternate_groupda caixatkhde a expõe como uma entradaMp4AlternateGroupDatanoFormat.metadatade cada faixa (#2242).
- MP4: analisa
- Áudio:
- Correção de um problema de descarregamento em que a posição podia ficar travada ao tocar uma playlist de conteúdo curto (#1920).
- Sessão:
- Reduzimos o tempo limite de agregação para callbacks da plataforma
MediaSessionde 500 para 100 milissegundos e adicionamos um setter experimental para permitir que os apps configurem esse valor. - Correção de um problema em que as notificações reapareciam depois de serem dispensadas pelo usuário (#2302).
- Correção de um bug em que a sessão retornava uma linha do tempo de um único item quando o
player encapsulado estava vazio. Isso aconteceu quando o player encapsulado
não tinha
COMMAND_GET_TIMELINEdisponível enquantoCOMMAND_GET_CURRENT_MEDIA_ITEMestava disponível e o player encapsulado estava vazio (#2320). - Correção de um bug em que a chamada de
MediaSessionService.setMediaNotificationProviderera ignorada silenciosamente após outras interações com o serviço, comosetForegroundServiceTimeoutMs(#2305).
- Reduzimos o tempo limite de agregação para callbacks da plataforma
- Interface:
- Ative o
PlayerSurfacepara trabalhar comExoPlayer.setVideoEffectseCompositionPlayer. - Correção de um bug em que não era possível recompor o
PlayerSurfacecom um novoPlayer.
- Ative o
- Extensão HLS:
- Corrigimos o problema em que a duração do bloco não era definida em
CmcdDatapara mídia HLS, causando uma falha de asserção ao processar segmentos de mídia criptografados (#2312).
- Corrigimos o problema em que a duração do bloco não era definida em
- Extensão RTSP:
- Adicione suporte para URI com esquema RTSPT como uma forma de configurar a sessão RTSP para usar TCP (#1484).
- Extensão do Google Cast:
- Adição de suporte aos metadados de playlist (#2235).
1.6.0
26 de março de 2025
Lançamento de androidx.media3:media3-*:1.6.0.
A versão 1.6.0 contém
estes commits.
- Biblioteca comum:
- Adicione
AudioManagerCompateAudioFocusRequestCompatpara substituir as classes equivalentes emandroidx.media. - Faça upgrade do Kotlin da versão 1.9.20 para a 2.0.20 e use o plug-in do Gradle do compilador do Compose. Faça upgrade da biblioteca KotlinX Coroutines da versão 1.8.1 para a 1.9.0.
- Remova o método
Format.toBundle(boolean excludeMetadata)e useFormat.toBundle(). - Correção de um bug no
SimpleBasePlayerem que a definição de um novocurrentMediaItemIndexemStateapóssetPlaylistcomnullMediaMetadatanão reavalia os metadados (#1940). - Mude o acesso de
SimpleBasePlayer.Statede protegido para público para facilitar o processamento de atualizações em outras classes (2128).
- Adicione
- ExoPlayer:
- Adicione
MediaExtractorCompat, uma nova classe que oferece recursos equivalentes à plataformaMediaExtractor. - Adição de suporte experimental de pré-aquecimento do "ExoPlayer" para reprodução usando
MediaCodecVideoRenderer. É possível configurarDefaultRenderersFactorypeloexperimentalSetEnableMediaCodecVideoRendererPrewarmingpara fornecer umMediaCodecVideoRenderersecundário aoExoPlayer. Se ativado, oExoPlayerpré-processa o vídeo de itens de mídia consecutivos durante a reprodução para reduzir a latência de transição entre eles. - Reduza os valores padrão de
bufferForPlaybackMsebufferForPlaybackAfterRebufferMsemDefaultLoadControlpara 1.000 e 2.000 ms, respectivamente. - Inicialize
DeviceInfoe o volume do dispositivo de forma assíncrona (se ativado usandosetDeviceVolumeControlEnabled). Esses valores não ficam disponíveis instantaneamente apósExoPlayer.Builder.build(), ePlayer.Listenernotifica as mudanças poronDeviceInfoChangedeonDeviceVolumeChanged. - O ID da sessão de áudio inicial não fica mais disponível imediatamente após a criação do player. Você pode usar
AnalyticsListener.onAudioSessionIdChangedpara ouvir a atualização inicial, se necessário. - Considere o idioma ao selecionar uma faixa de vídeo. Por padrão, selecione uma faixa de vídeo "principal" que corresponda ao idioma da faixa de áudio selecionada, se disponível. As preferências explícitas de idioma do vídeo podem ser
expressas com
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s). - Adicione o parâmetro
selectedAudioLanguageao métodoDefaultTrackSelector.selectVideoTrack(). - Adicione o parâmetro
retryCountaMediaSourceEventListener.onLoadStartede aos métodosMediaSourceEventListener.EventDispatchercorrespondentes. - Correção de um bug em que itens de playlist ou períodos em streams DASH de vários períodos com durações que não correspondem ao conteúdo real podiam causar travamentos de frames no final do item (#1698).
- Mova
BasePreloadManager.Listenerpara umPreloadManagerListenerde nível superior. - O
RenderersFactory.createSecondaryRendererpode ser implementado para fornecer renderizadores secundários para pré-aquecimento. O pré-aquecimento permite transições mais rápidas de itens de mídia durante a reprodução. - Ative o envio de
CmcdDatapara solicitações de manifesto em formatos de streaming adaptável DASH, HLS e SmoothStreaming (#1951). - Informe
MediaCodecInfodo codec que será inicializado emMediaCodecRenderer.onReadyToInitializeCodec(#1963). - Mude
AdsMediaSourcepara permitir queAdPlaybackStatescresça anexando grupos de anúncios. Modificações inválidas são detectadas e geram uma exceção. - Corrigimos um problema em que outros frames somente de decodificação podiam ser mostrados em rápida sucessão ao fazer a transição para a mídia de conteúdo após um anúncio intermediário.
- Faça com que
DefaultRenderersFactoryadicione duas instânciasMetadataRendererpara permitir que os apps recebam dois esquemas diferentes de metadados por padrão. - Reavalie se o carregamento contínuo de um trecho deve ser cancelado quando a reprodução é pausada (#1785).
- Adicione a opção
ClippingMediaSourcepara permitir o corte em mídia não pesquisável. - Correção de um bug em que a busca com pré-aquecimento podia bloquear a transição do item de mídia seguinte.
- Correção de um bug em que
ExoPlayer.isLoading()permaneciatrueenquanto fazia a transição paraSTATE_IDLEouSTATE_ENDED(#2133). - Adição de
lastRebufferRealtimeMsaLoadControl.Parameter(#2113).
- Adicione
- Transformador:
- Adição de suporte à transmuxação em formatos alternativos compatíveis com versões anteriores.
- Adição de suporte à transcodificação e transmuxing do formato Dolby Vision (perfil 8).
- Atualize os parâmetros de
VideoFrameProcessor.registerInputStreameVideoFrameProcessor.Listener.onInputStreamRegisteredpara usarFormat. - Gere metadados estáticos de HDR ao usar
DefaultEncoderFactory. - Suporte adicionado ao diagnóstico da plataforma Android usando
MediaMetricsManager. O Transformer encaminha eventos de edição e dados de desempenho para a plataforma, o que ajuda a fornecer informações de desempenho e depuração do sistema no dispositivo. Esses dados também poderão ser coletados pelo Google se o compartilhamento de dados de uso e diagnóstico for ativado pelo usuário do dispositivo. Os apps podem desativar a contribuição de diagnósticos da plataforma para o Transformer comTransformer.Builder.setUsePlatformDiagnostics(false). - Divida
InAppMuxeremInAppMp4MuxereInAppFragmentedMp4Muxer. Você usaInAppMp4Muxerpara produzir um arquivo MP4 não fragmentado, enquantoInAppFragmentedMp4Muxeré para produzir um arquivo MP4 fragmentado. - Mova a interface
Muxerdemedia3-muxerparamedia3-transformer. - Adicione
MediaProjectionAssetLoader, que fornece mídia de umMediaProjectionpara gravação de tela, e adicione suporte para gravação de tela ao app de demonstração do Transformer. - Adicione
#getInputFormat()à interfaceCodec. - Transfira a responsabilidade de liberar o
GlObjectsProviderpara o chamador emDefaultVideoFrameProcessoreDefaultVideoCompositorquando possível.
- Extratores:
- AVI: correção do processamento de arquivos com áudio compactado de taxa de bits constante em que o cabeçalho do stream armazena o número de bytes em vez do número de partes.
- Correção do processamento de unidades NAL com comprimentos expressos em 1 ou 2 bytes (em vez de 4).
- Correção de
ArrayIndexOutOfBoundsExceptionem listas de edição MP4 quando a lista de edição começa em um frame sem sincronização e sem um frame de sincronização anterior (#2062). - Correção de um problema em que os fluxos TS podiam ficar travados em alguns dispositivos (#2069).
- FLAC: adicionado suporte para arquivos FLAC de 32 bits. Antes, eles não eram reproduzidos com
IllegalStateException: Playback stuck buffering and not loading(#2197).
- Áudio:
- Corrigimos
onAudioPositionAdvancingpara que ele seja chamado quando a reprodução for retomada (antes, ele era chamado quando a reprodução era pausada). - Não ignore
SonicAudioProcessorquandoSpeedChangingAudioProcessorfor configurado com parâmetros padrão. - Correção de um problema de underflow em
Sonic#getOutputSize()que poderia causarDefaultAudioSink. - Corrija
MediaCodecAudioRenderer.getDurationToProgressUs()eDecoderAudioRenderer.getDurationToProgressUs()para que as buscas redefinam corretamente as durações fornecidas. androidx.media3.common.audio.SonicAudioProcessorfoi finalizado.- Adição de suporte para PCM de ponto flutuante a
ChannelMappingAudioProcessoreTrimmingAudioProcessor.
- Corrigimos
- Vídeo:
- Mude
MediaCodecVideoRenderer.shouldUsePlaceholderSurfacepara protected para que os aplicativos possam substituir e bloquear o uso de superfícies de marcador de posição (#1905). - Adição da análise de dependência de amostra AV1
ExoPlayerexperimental para acelerar a busca. Ative-o com a nova APIDefaultRenderersFactory.experimentalSetParseAv1SampleDependencies. - Adição da API experimental
ExoPlayerpara descartar buffers de entrada do decodificadorMediaCodecVideoRendereratrasados que não são dependentes. Ative-o comDefaultRenderersFactory.experimentalSetLateThresholdToDropDecoderInputUs. - Correção de um problema em que um player sem uma superfície ficava pronto imediatamente e decodificava muito lentamente os frames pendentes (#1973, link em inglês).
- Exclua dispositivos Xiaomi e OPPO do modo de superfície separada para evitar oscilação da tela (#2059).
- Mude
- Texto:
- Adição de suporte a legendas VobSub (#8260).
- Pare de carregar todos os arquivos de legenda configurados com
MediaItem.Builder.setSubtitleConfigurationse, em vez disso, carregue apenas um se ele for selecionado pela seleção de faixa (#1721). - TTML: foi adicionado suporte para referenciar
tts:originetts:extentusandostyle(#2953). - Restrinja os carimbos de data/hora WebVTT e SubRip a exatamente três casas decimais. Antes, analisávamos incorretamente qualquer número de casas decimais, mas sempre presumíamos que o valor estava em milissegundos, o que levava a carimbos de data/hora incorretos (#1997).
- Correção da interrupção da reprodução quando uma playlist contém itens cortados com legendas CEA-608 ou CEA-708.
- Correção de
IllegalStateExceptionquando um arquivo SSA contém uma sugestão com duração zero (horários de início e término iguais) (#2052). - Suprimir (e registrar) erros de análise de legendas quando elas são multiplexadas no mesmo contêiner de áudio e vídeo (#2052).
- Foi corrigido o processamento de caracteres UTF-8 multibyte em arquivos WebVTT usando finais de linha CR (#2167).
- DRM:
- Correção do erro
MediaCodec$CryptoException: Operation not supported in this configurationao reproduzir conteúdo do ClearKey em dispositivos com API < 27 (#1732).
- Correção do erro
- Efeito:
- A funcionalidade de
OverlaySettingsfoi movida paraStaticOverlaySettings.OverlaySettingspode ser subclassificado para permitir configurações de sobreposição dinâmica.
- A funcionalidade de
- Multiplexadores:
- Movemos
MuxerExceptionda interfaceMuxerpara evitar um nome totalmente qualificado muito longo. - O método
setSampleCopyEnabled()foi renomeado comosetSampleCopyingEnabled()emMp4Muxer.BuildereFragmentedMp4Muxer.Builder. Mp4Muxer.addTrack()eFragmentedMp4Muxer.addTrack()agora retornam um ID de faixaintem vez de umTrackToken.Mp4MuxereFragmentedMp4Muxernão implementam mais a interfaceMuxer.- Desativa o agrupamento e a cópia de amostras
Mp4Muxerpor padrão. - Foi corrigido um bug em
FragmentedMp4Muxerque cria muitos fragmentos quando apenas a faixa de áudio é gravada.
- Movemos
- Sessão:
- Manter o estado do serviço em primeiro plano por mais 10 minutos quando a reprodução
for pausada, interrompida ou falhar. Isso permite que os usuários retomem a reprodução dentro desse
tempo limite sem correr o risco de restrições de serviço em primeiro plano em vários
dispositivos. Chamar apenas
player.pause()não pode mais ser usado para interromper o serviço em primeiro plano antes destopSelf()ao substituironTaskRemoved. UseMediaSessionService.pauseAllPlayersAndStopSelf()em vez disso. - Mantenha a notificação visível quando a reprodução entrar em um estado de erro ou parada. A notificação só é removida se a playlist for limpa ou o player for liberado.
- Melhoramos o processamento das ações ACTION_PLAY e ACTION_PAUSE da MediaSession da plataforma Android para definir apenas uma delas de acordo com os comandos disponíveis e também aceitar se apenas uma delas estiver definida.
- Adicione
Contextcomo um parâmetro aMediaButtonReceiver.shouldStartForegroundService(#1887). - Correção de um bug em que chamar um método
Playerem umMediaControllerconectado a uma sessão legada descartava mudanças de uma atualização pendente. - Fazer
MediaSession.setSessionActivity(PendingIntent)aceitar nulo (#2109). - Correção de um bug em que uma notificação desatualizada permanecia visível quando a playlist era limpa (#2211).
- Manter o estado do serviço em primeiro plano por mais 10 minutos quando a reprodução
for pausada, interrompida ou falhar. Isso permite que os usuários retomem a reprodução dentro desse
tempo limite sem correr o risco de restrições de serviço em primeiro plano em vários
dispositivos. Chamar apenas
- Interface:
- Adicione elementos combináveis e de manutenção de estado ao módulo
media3-ui-composeparaPlayerSurface,PresentationState,PlayPauseButtonState,NextButtonState,PreviousButtonState,RepeatButtonState,ShuffleButtonStateePlaybackSpeedState.
- Adicione elementos combináveis e de manutenção de estado ao módulo
- Downloads:
- Correção de um bug no
CacheWriterque deixa as fontes de dados abertas e as áreas de cache bloqueadas caso a fonte de dados gere umExceptiondiferente deIOException(#9760).
- Correção de um bug no
- Extensão HLS:
- Adicione uma primeira versão de
HlsInterstitialsAdsLoader. O carregador de anúncios lê os intersticiais HLS de uma playlist de mídia HLS e os mapeia para oAdPlaybackStatetransmitido aoAdsMediaSource. Essa versão inicial só é compatível com streams de VOD HLS com atributosX-ASSET-URI. - Adição do
HlsInterstitialsAdsLoader.AdsMediaSourceFactory. Os apps podem usar essa API para criar instânciasAdsMediaSourceque usam umHlsInterstitialsAdsLoaderde maneira conveniente e segura. - Analise a tag
SUPPLEMENTAL-CODECSda playlist HLS para detectar formatos Dolby Vision (#1785). - Redução da condição para buscar posições de sincronização em uma transmissão HLS (#2209).
- Adicione uma primeira versão de
- Extensão DASH:
- Adição de suporte ao formato AC-4 Nível 4 para DASH (#1898).
- Correção de um problema ao calcular o intervalo de atualização para inserção de anúncios em transmissões ao vivo de vários períodos (#1698).
- Analisar o atributo
scte214:supplementalCodecsdo manifesto DASH para detectar formatos Dolby Vision (#1785). - Melhoramos o processamento de transições de período em transmissões ao vivo em que o período contém amostras de mídia além da duração declarada (#1698).
- Corrigimos um problema em que conjuntos de adaptação marcados com
adaptation-set-switching, mas com idiomas ou flags de função diferentes, eram mesclados (#2222).
- Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
- Adicione o módulo decodificador MPEG-H, que usa o decodificador MPEG-H integrado para decodificar áudio MPEG-H (#1826).
- Extensão MIDI:
- Conecte instâncias personalizadas de
AudioSinkeAudioRendererEventListeneraMidiRenderer.
- Conecte instâncias personalizadas de
- Extensão do Google Cast:
- Aumente a dependência
play-services-cast-frameworkpara 21.5.0 e corrija uma falha deFLAG_MUTABLEem apps destinados à API 34 ou mais recente em dispositivos com o Google Play Services instalado, mas desativado (#2178).
- Aumente a dependência
- App de demonstração:
- Estenda
demo-composecom botões extras e melhore a integração doPlayerSurfacecom suporte a dimensionamento e obturador.
- Estenda
- Símbolos descontinuados foram removidos:
- Remoção do método
AudioMixer.create()descontinuado. UseDefaultAudioMixer.Factory().create() - Remova os seguintes métodos
Transformer.Builderdescontinuados:setTransformationRequest(), usesetAudioMimeType(),setVideoMimeType()esetHdrMode().setAudioProcessors(), defina o processador de áudio em umEditedMediaItem.Builder.setEffects()e transmita paraTransformer.start().setVideoEffects(), defina o efeito de vídeo em umEditedMediaItem.Builder.setEffects()e transmita paraTransformer.start().setRemoveAudio(), useEditedMediaItem.Builder.setRemoveAudio()para remover o áudio doEditedMediaItemtransmitido paraTransformer.start().setRemoveVideo(), useEditedMediaItem.Builder.setRemoveVideo()para remover o vídeo doEditedMediaItemtransmitido paraTransformer.start().setFlattenForSlowMotion(), useEditedMediaItem.Builder.setFlattenForSlowMotion()para simplificar oEditedMediaItemtransmitido paraTransformer.start().setListener(), useaddListener(),removeListener()ouremoveAllListeners().
- Remova os seguintes métodos
Transformer.Listenerdescontinuados:onTransformationCompleted(MediaItem), useonCompleted(Composition, ExportResult).onTransformationCompleted(MediaItem, TransformationResult), useonCompleted(Composition, ExportResult).onTransformationError(MediaItem, Exception), useonError(Composition, ExportResult, ExportException).onTransformationError(MediaItem, TransformationException), useonError(Composition, ExportResult, ExportException).onTransformationError(MediaItem, TransformationResult, TransformationException), useonError(Composition, ExportResult, ExportException).onFallbackApplied(MediaItem, TransformationRequest, TransformationRequest), useonFallbackApplied(Composition, TransformationRequest, TransformationRequest).
- Remova a classe
TransformationResultdescontinuada. UseExportResult. - Remova a classe
TransformationExceptiondescontinuada. UseExportException. - A função
Transformer.PROGRESS_STATE_NO_TRANSFORMATIONdescontinuada foi removida. UseTransformer.PROGRESS_STATE_NOT_STARTED - A função
Transformer.setListener()descontinuada foi removida. UseTransformer.addListener(),Transformer.removeListener()ouTransformer.removeAllListeners(). - A função
Transformer.startTransformation()descontinuada foi removida. UseTransformer.start(MediaItem, String) - A função
SingleFrameGlShaderProgramdescontinuada foi removida. UseBaseGlShaderProgram - O
Transformer.flattenForSlowMotionfoi removido. UseEditedMediaItem.flattenForSlowMotion ExoPlayer.VideoComponent,ExoPlayer.AudioComponent,ExoPlayer.TextComponenteExoPlayer.DeviceComponentforam removidos.androidx.media3.exoplayer.audio.SonicAudioProcessorfoi removido.- Os seguintes métodos
DownloadHelperdescontinuados foram removidos:- Construtor
DownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilities[]), useDownloadHelper(MediaItem, @Nullable MediaSource, TrackSelectionParameters, RendererCapabilitiesList). getRendererCapabilities(RenderersFactory), uma funcionalidade equivalente pode ser alcançada criando umDefaultRendererCapabilitiesListcom umRenderersFactorye chamandoDefaultRendererCapabilitiesList.getRendererCapabilities().
- Construtor
- O método
PlayerNotificationManager.setMediaSessionToken(MediaSessionCompat)foi removido. UsePlayerNotificationManager.setMediaSessionToken(MediaSession.Token)e transmita(MediaSession.Token) compatToken.getToken().
- Remoção do método
1.6.0-rc02
19 de março de 2025
Use a versão estável 1.6.0.
1.6.0-rc01
12 de março de 2025
Use a versão estável 1.6.0.
1.6.0-beta01
26 de fevereiro de 2025
Use a versão estável 1.6.0.
Versão 1.6.0-alpha03
6 de fevereiro de 2025
Use a versão estável 1.6.0.
Versão 1.6.0-alpha02
30 de janeiro de 2025
Use a versão estável 1.6.0.
Versão 1.6.0-alpha01
20 de dezembro de 2024
Use a versão estável 1.6.0.
Versão 1.5
Versão 1.5.1
19 de dezembro de 2024
Lançamento de androidx.media3:media3-*:1.5.1.
A versão 1.5.1 contém estes commits.
- ExoPlayer:
- Desativa o uso da descriptografia assíncrona no MediaCodec para evitar problemas de tempo limite do codec relatados com essa API da plataforma (#1641).
- Extratores:
- MP3: não interrompa a reprodução antes do tempo quando o sumário de um frame
VBRInão cobrir todos os dados de MP3 em um arquivo (#1904).
- MP3: não interrompa a reprodução antes do tempo quando o sumário de um frame
- Vídeo:
- Reversão do uso de valores de proporção de pixels
MediaCodecAdapterfornecidos ao processaronOutputFormatChanged(#1371).
- Reversão do uso de valores de proporção de pixels
- Texto:
- Correção de um bug no
ReplacingCuesResolver.discardCuesBeforeTimeUsem que a dica ativa emtimeUs(iniciada antes, mas ainda não concluída) era descartada incorretamente (#1939).
- Correção de um bug no
- Metadados:
- Extraia a numeração do disco/faixa e o gênero dos comentários do Vorbis para
MediaMetadata(#1958).
- Extraia a numeração do disco/faixa e o gênero dos comentários do Vorbis para
Versão 1.5.0
27 de novembro de 2024
Lançamento de androidx.media3:media3-*:1.5.0.
A versão 1.5.0 contém estes commits.
- Biblioteca comum:
- Adição de
ForwardingSimpleBasePlayer, que permite encaminhar para outro player com pequenos ajustes, garantindo consistência total e processamento de listeners (#1183). - Substitua
SimpleBasePlayer.State.playlistpelo métodogetPlaylist(). - Adicione uma substituição para
SimpleBasePlayer.State.Builder.setPlaylist()para especificar diretamente umTimelinee osTrackseMetadataatuais em vez de criar uma estrutura de playlist. - Aumente
minSdkpara 21 (Android Lollipop). Isso está alinhado com todas as outras bibliotecas do AndroidX. - Adição do artefato
androidx.media3:media3-common-ktx, que oferece funcionalidade específica do Kotlin criada com base na biblioteca Common - Adicione a função de extensão de suspensão
Player.listenpara girar uma corrotina e ouvirPlayer.Eventsna bibliotecamedia3-common-ktx. - Remova as anotações
@DoNotInlinedas classes internas manualmente desalinhadas, projetadas para evitar falhas de verificação de classe em tempo de execução. As versões recentes do R8 agora fazem automaticamente a remoção de chamadas fora da linha como essas para evitar falhas de tempo de execução. Assim, a remoção manual não é mais necessária. Todos os usuários do Gradle da biblioteca já precisam usar uma versão do Plug-in do Android para Gradle que use uma versão do R8 que faça isso, devido acompileSdk = 35. Os usuários da biblioteca com sistemas de build não Gradle precisam garantir que a etapa de redução/ofuscação equivalente ao R8 faça um processo automático de remoção de linhas semelhante para evitar falhas de verificação de classe em tempo de execução. Essa mudança já foi feita em outras bibliotecas do AndroidX.
- Adição de
- ExoPlayer:
- Agora,
MediaCodecRenderer.onProcessedStreamChange()pode ser chamado para cada item de mídia. Antes, ele não era chamado para o primeiro. UseMediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()para ativar. - Adição de
PreloadMediaSource.PreloadControl.onPreloadErrorpara permitir que implementações dePreloadMediaSource.PreloadControlrealizem ações quando um erro ocorrer. - Adicione
BasePreloadManager.Listenerpara propagar eventos de pré-carregamento aos apps. - Permitir a mudança do tempo limite do cliente SNTP e tentar endereços alternativos em tempo limite (#1540).
- Remova
MediaCodecAdapter.Configuration.flagsporque o campo sempre foi zero. - Permite que o usuário selecione o alto-falante integrado para reprodução no Wear OS API 35 ou mais recente (quando o dispositivo anuncia suporte para isso).
- Adie a chamada de bloqueio para
Context.getSystemService(Context.AUDIO_SERVICE)até que o processamento do foco de áudio seja ativado. Isso garante que a chamada de bloqueio não seja feita se o processamento do foco de áudio não estiver ativado (#1616). - Permitir a reprodução independente da duração armazenada em buffer quando o carregamento falha (#1571).
- Adicione
AnalyticsListener.onRendererReadyChanged()para sinalizar quando renderizadores individuais permitem que a reprodução fique pronta. - Correção do problema em que
MediaCodec.CryptoExceptionàs vezes era relatado como um "erro inesperado de tempo de execução" quandoMediaCodecera operado no modo assíncrono (comportamento padrão na API 31 e versões mais recentes). - Transmita
bufferedDurationUsem vez debufferedPositionUscomPreloadMediaSource.PreloadControl.onContinueLoadingRequested(). Também mudaDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MSparaDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS. Os apps precisam transmitir um valor que represente uma duração específica da posição inicial padrão para que a fonte de mídia correspondente seja pré-carregada com esse IntDef, em vez de uma posição. - Adicione a implementação de
ForwardingRendererque encaminha todas as chamadas de método para outro renderizador (1703). - Adiciona a pré-carga da playlist para o próximo item. Os apps podem
ativar o pré-carregamento chamando
ExoPlayer.setPreloadConfiguration(PreloadConfiguration). Por padrão, o pré-carregamento fica desativado. Quando ativada e para não interferir na reprodução, aDefaultLoadControlrestringe o pré-carregamento para iniciar e continuar somente quando o player não estiver carregando para a reprodução. Os apps podem mudar esse comportamento implementandoLoadControl.shouldContinuePreloading()de acordo (como ao substituir esse método emDefaultLoadControl). A implementação padrão deLoadControldesativa o pré-carregamento caso um app esteja usando uma implementação personalizada deLoadControl. - Adicione o método
MediaSourceEventListener.EventDispatcher.dispatchEvent()para permitir a invocação de eventos de listeners de subclasses (1736). - Adicione
DefaultPreloadManager.Builderque cria as instânciasDefaultPreloadManagereExoPlayercom configurações compartilhadas de forma consistente. - Remova o parâmetro
Renderer[]deLoadControl.onTracksSelected()porque a implementação deDefaultLoadControlpode recuperar os tipos de stream deExoTrackSelection[]. - O método
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])foi suspenso e marcado como final para evitar substituições. Use o novoDefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[]). - Informar eventos
MediaSourceEventListenerde fontes secundárias emMergingMediaSource. Isso vai resultar em eventos de início/erro/cancelamento/conclusão de carregamento sendo informados para legendas transferidas por sideload (aquelas adicionadas comMediaItem.LocalConfiguration.subtitleConfigurations), que podem aparecer como eventos de carregamento duplicados emitidos deAnalyticsListener. - Evitar que erros de legenda e metadados interrompam completamente a reprodução.
Em vez disso, a faixa problemática é desativada, e a reprodução das faixas restantes continua
(#1722).
- No novo tratamento de legendas (durante a extração), os erros de análise (por exemplo, dados de legendas inválidos) e de carregamento (por exemplo, HTTP 404) associados são emitidos por callbacks
onLoadError. - No processamento de legendas legadas (durante a renderização), apenas erros de carregamento associados são emitidos por callbacks
onLoadError, enquanto erros de análise são ignorados silenciosamente (esse é um comportamento preexistente).
- No novo tratamento de legendas (durante a extração), os erros de análise (por exemplo, dados de legendas inválidos) e de carregamento (por exemplo, HTTP 404) associados são emitidos por callbacks
- Correção de um bug em que itens de playlist ou períodos em streams DASH de vários períodos com durações que não correspondem ao conteúdo real podiam causar travamentos de frames no final do item (#1698).
- Adição de um setter a
SntpClientpara definir o tempo máximo decorrido desde a última atualização após a qual o cliente é reinicializado (#1794).
- Agora,
- Transformador:
- Adicione
SurfaceAssetLoader, que oferece suporte ao enfileiramento de dados de vídeo para o Transformer usando umSurface. ImageAssetLoaderinforma entradas não compatíveis viaAssetLoader.onErrorem vez de gerar umIllegalStateException.- Torne obrigatório o ajuste da duração da imagem usando
MediaItem.Builder.setImageDurationMspara exportação de imagens. - Adição de suporte à exportação de lacunas em sequências de EditedMediaItems de áudio.
- Adicione
- Seleção de faixas:
DefaultTrackSelector: prefira áudio baseado em objetos em vez de áudio baseado em canais quando outros fatores forem iguais.
- Extratores:
- Permitir que
Mp4ExtractoreFragmentedMp4Extractoridentifiquem amostras H264 que não são usadas como referência por amostras subsequentes. - Adicionada a opção de ativar a busca com base em índice no
AmrExtractor. - Trate arquivos MP3 com mais de 128 kB entre frames válidos como truncados (em vez de inválidos). Isso significa que arquivos com dados não MP3 no final, sem outros metadados para indicar o comprimento dos bytes MP3, agora param a reprodução no final dos dados MP3 em vez de falhar com
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}(#1563). - Correção do processamento de amostras de pré-roll para posições de início de mídia que não são de keyframe ao processar listas de edição em arquivos MP4 (#1659).
- Melhoramos o cálculo da taxa de frames usando a duração da mídia na caixa
mdhdemMp4ExtractoreFragmentedMp4Extractor(#1531). - Correção do dimensionamento incorreto de
media_timenas listas de edição de MP4. Emborasegment_durationjá fosse dimensionado corretamente usando a escala de tempo do filme,media_timeagora é dimensionado corretamente usando a escala de tempo da faixa, conforme especificado pelo padrão de formato MP4 (#1792). - Processar frames fora de ordem no cálculo de
endIndicespara MP4 com lista de edição (#1797). - Correção da análise da duração da mídia na caixa
mdhdde arquivos MP4 para processar valores-1(#1819). - Adição de suporte para identificar a caixa
h263em arquivos MP4 para vídeo H.263 (#1821). - Adição de suporte ao formato de arquivo de mídia de base ISO AC-4 nível 4 (#1265).
- Permitir que
- DataSource:
- Atualize
HttpEngineDataSourcepara permitir o uso a partir da extensão S 7 em vez do nível 34 da API (#1262). DataSourceContractTest: asserção de queDataSource.getUri()retorna o URI resolvido (conforme documentado). Quando isso é diferente do URI solicitado, os testes podem indicar isso usando o novo métodoDataSourceContractTest.TestResource.Builder.setResolvedUri().DataSourceContractTest: asserção de queDataSource.getUri()egetResponseHeaders()retornam o valor "open" após uma chamada com falha paraopen()(devido a um recurso "não encontrado") e antes de uma chamadaclose()subsequente.- A substituição de
DataSourceContractTest.getNotFoundResources()permite que subclasses de teste forneçam vários recursos "não encontrados" e também forneçam os cabeçalhos esperados. Isso permite distinguir entre HTTP 404 (com cabeçalhos) e "servidor não encontrado" (sem cabeçalhos).
- A substituição de
- Atualize
- Áudio:
- Configura automaticamente os metadados de intensidade sonora CTA-2075 no codec, se presentes na mídia.
- Garantir uma redução suave do volume ao buscar.
- Correção de estalos que podem ocorrer durante as buscas.
- Correção do acúmulo de erros de truncamento no algoritmo de mudança de tempo/altura do Sonic.
- Correção do bug em
SpeedChangingAudioProcessorque causa a queda de frames de saída.
- Vídeo:
- O
MediaCodecVideoRendererevita decodificar amostras que não são renderizadas nem usadas como referência por outras amostras. - Na API 35 e em versões mais recentes,
MediaCodecAdapteragora pode receber umnullSurfaceemconfiguree chamadas para um novo métododetachOutputSurfacepara remover umSurfacedefinido anteriormente se o codec for compatível com isso (MediaCodecInfo.detachedSurfaceSupported). - Use os valores de proporção de pixels
MediaCodecAdapterfornecidos, se disponíveis, ao processaronOutputFormatChanged(#1371). - Adição de uma solução alternativa para um problema do dispositivo no Galaxy Tab S7 FE que faz com que streams H264 seguros de 60 fps sejam marcados como não compatíveis (#1619).
- Adicione uma solução alternativa para codecs que ficam presos após a última amostra sem retornar um sinal de fim de stream.
- O
- Texto:
- Adicione um
VoiceSpanpersonalizado e preencha-o para intervalos de voz WebVTT (#1632). - Garantir que o WebVTT em HLS com timestamps de legendas muito grandes (que excedem um
longde 64 bits quando representados como microssegundos e multiplicados pela base de tempo90,000MPEG) sejam exibidos (#1763). - Suporte a legendas CEA-608 em conteúdo Dolby Vision (#1820).
- Correção da suspensão da reprodução em transmissões DASH de vários períodos quando as legendas CEA-608 estão ativadas (#1863).
- Adicione um
- Metadados:
- Atribua o tipo
C.TRACK_TYPE_METADATAa faixas com conteúdo icy ou vnd.dvb.ait.
- Atribua o tipo
- Imagem:
- Adicione
ExternallyLoadedImageDecoderpara simplificar a integração com bibliotecas externas de carregamento de imagens, como Glide ou Coil.
- Adicione
- DataSource:
- Adição de
FileDescriptorDataSource, um novoDataSourceque pode ser usado para ler de umFileDescriptor(#3757).
- Adição de
- Efeito:
- Adição de uma solução alternativa
DefaultVideoFrameProcessorpara escalonamentoSurfaceTexturede menor importância.SurfaceTexturepode incluir um pequeno dimensionamento que corta uma borda de 1 texel ao redor da borda de um buffer cortado. Agora isso é processado para que a saída fique mais próxima do esperado. - Acelere
DefaultVideoFrameProcessor.queueInputBitmap(). Como resultado, a exportação de imagens para vídeos comTransformeré mais rápida.
- Adição de uma solução alternativa
- Extensão de IMA:
- Correção de um bug em que limpar a playlist podia causar um
ArrayIndexOutOfBoundsExceptionemImaServerSideAdInsertionMediaSource. - Correção do bug em que streams de DAI inseridos do lado do servidor sem um pré-roll podem
resultar em um
ArrayIndexOutOfBoundsExceptionao reproduzir após o último anúncio intermediário (#1741).
- Correção de um bug em que limpar a playlist podia causar um
- Sessão:
- Adicione
MediaButtonReceiver.shouldStartForegroundService(Intent)para permitir que apps suprimam um comando de reprodução para retomada substituindo esse método. Por padrão, o serviço é sempre iniciado, e a reprodução não pode ser suprimida sem que o sistema falhe o serviço com umForegroundServiceDidNotStartInTimeException(#1528). - Correção de um bug que fazia com que comandos personalizados enviados de um
MediaBrowserfossem despachados para oMediaSessionCompat.Callbackem vez da varianteMediaBrowserServiceCompatdo método quando conectados a um serviço legado. Isso impedia que oMediaBrowserrecebesse o valor de retorno real enviado pelo serviço legado (#1474). - Processamento de
IllegalArgumentExceptiongerado 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 actionscom a biblioteca legada comMediaBrowserCompat. Com o Media3, os botões de comando para itens de mídia estão disponíveis paraMediaBrowsereMediaController. Consulte Implementar ações de navegação personalizadas. - Correção de um bug em que um controlador do Media3 às vezes não permitia que um app de
sessão iniciasse um serviço em primeiro plano após solicitar
play(). - Restrinja
CommandButton.Builder.setIconUripara aceitar apenas URIs de conteúdo. - Transmita dicas de conexão de um navegador Media3 para o
MediaBrowserCompatinicial ao se conectar a umMediaBrowserCompatlegado. O serviço pode receber as dicas de conexão transmitidas como dicas de raiz com a primeira chamada paraonGetRoot(). - Correção de um bug em que um
MediaBrowserconectado a um serviço de navegador legado não recebia um erro enviado pelo serviço depois que o navegador se inscrevia em umparentid. - Melhorar o comportamento de interoperabilidade para que um navegador Media3 conectado a um
MediaBrowserServicelegado não solicite os filhos de umparentIdduas vezes ao se inscrever em um pai.
- Adicione
- Interface:
- Ative a solução alternativa de vídeo esticado/cortado em
PlayerView-in-Compose-AndroidViewdevido a problemas com transições compartilhadas baseadas em XML. Os apps que usamPlayerViewemAndroidViewprecisam chamarPlayerView.setEnableComposeSurfaceSyncWorkaroundpara ativar (#1237, #1594). - Adicione
setFullscreenButtonStateaPlayerViewpara permitir atualizações do ícone do botão de tela cheia sob demanda, ou seja, fora da banda e não de forma reativa a uma interação de clique (#1590, #184). - Correção de um bug em que a opção "Nenhum" na seleção de texto não funciona se houver preferências de seleção de faixa de texto definidas pelo app.
- Ative a solução alternativa de vídeo esticado/cortado em
- Extensão DASH:
- Adição de suporte para períodos que começam no meio de um segmento (#1440).
- Extensão do Smooth Streaming:
- Correção de um erro
Bad magic number for Bundleao reproduzir streams SmoothStreaming com faixas de texto (#1779).
- Correção de um erro
- Extensão RTSP:
- Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
- Adicione o módulo decodificador IAMF, que oferece suporte à reprodução de arquivos MP4
que contêm faixas IAMF usando a biblioteca nativa libiamf para
sintetizar áudio.
- A reprodução é ativada com um layout estéreo e 5.1 com espacialização, além do rastreamento da cabeça opcional. No entanto, a compatibilidade com reprodução binaural não está disponível no momento.
- Adicionamos suporte a páginas de 16 KB para extensões de decodificador no Android 15 (#1685).
- Adicione o módulo decodificador IAMF, que oferece suporte à reprodução de arquivos MP4
que contêm faixas IAMF usando a biblioteca nativa libiamf para
sintetizar áudio.
- Extensão do Google Cast:
- Pare de limpar a linha do tempo depois que o CastSession for desconectado, o que permite que o app remetente retome a reprodução localmente após uma desconexão.
- Preencha o
DeviceInfodo CastPlayer quando umContextfor fornecido. Isso permite vincular oMediaSessiona umRoutingSession, o que é necessário para integrar o seletor de saída (#1056).
- Utilitários de teste:
- O
DataSourceContractTestagora inclui testes para verificar:- O stream de entrada
read positionfoi atualizado. - O buffer de saída
offseté aplicado corretamente.
- O stream de entrada
- O
- App de demonstração
- Correção dos vazamentos de memória no app de demonstração de formato curto (#1839).
- Símbolos descontinuados foram removidos:
- Remoção de
Player.hasPreviousePlayer.hasPreviousWindow()descontinuados. UsePlayer.hasPreviousMediaItem(). - Remoção do método
Player.previous()descontinuado. UsePlayer.seekToPreviousMediaItem() - Remoção do método
DrmSessionEventListener.onDrmSessionAcquireddescontinuado. - Remoção de construtores
DefaultEncoderFactoryobsoletos. UseDefaultEncoderFactory.Builder
- Remoção de
Versão 1.5.0-rc02
19 de novembro de 2024
Use a versão estável 1.5.0.
Versão 1.5.0-rc01
13 de novembro de 2024
Use a versão estável 1.5.0.
Versão 1.5.0-beta01
30 de outubro de 2024
Use a versão estável 1.5.0.
Versão 1.5.0-alpha01
10 de setembro de 2024
Use a versão estável 1.5.0.
Versão 1.4.0
Versão 1.4.1
27 de agosto de 2024
Lançamento de androidx.media3:media3-*:1.4.1.
A versão 1.4.1 contém estes commits.
- ExoPlayer:
- Extratores:
- MP3: correção do erro
Searched too many bytesao ignorar corretamente dados não MP3 finais com base no campo de comprimento em um frameInfo(#1480).
- MP3: correção do erro
- Texto:
- TTML: correção do processamento de valores de porcentagem
tts:fontSizepara garantir que eles sejam herdados corretamente de nós principais com valores de porcentagemtts:fontSize. - Correção de
IndexOutOfBoundsExceptionemLegacySubtitleUtildevido ao processamento incorreto do caso em que o horário de início da saída solicitada é maior ou igual ao horário do evento final noSubtitle(#1516).
- TTML: correção do processamento de valores de porcentagem
- DRM:
- Correção do erro
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLEem dispositivos com API 31 ou mais recente ao reproduzir conteúdo Widevine L1. Esse erro é causado por uma implementação incompleta do métodoMediaDrm.requiresSecureDecoderdo framework (#1603).
- Correção do erro
- Efeito:
- Adicione um método
release()aGlObjectsProvider.
- Adicione um método
- Sessão:
- Transforme um toque duplo em
KEYCODE_HEADSETHOOKem uma ação de "ir para o próximo", conforme documentado (#1493). - Processe
KEYCODE_HEADSETHOOKcomo um comando "play" emMediaButtonReceiverao decidir se é necessário ignorá-lo para evitar umForegroundServiceDidNotStartInTimeException(#1581).
- Transforme um toque duplo em
- Extensão RTSP:
- Ignorar descrições de mídia inválidas na análise do SDP (#1087).
Versão 1.4.0
25 de julho de 2024
Lançamento de androidx.media3:media3-*:1.4.0.
A versão 1.4.0 contém estes commits.
- Biblioteca comum:
- Encaminhe chamadas de busca presumidas sem operação para os métodos protegidos
BasePlayer.seekTo()eSimpleBasePlayer.handleSeek()em vez de ignorá-las. Se você estiver implementando esses métodos em um player personalizado, talvez seja necessário processar essas chamadas adicionais commediaItemIndex == C.INDEX_UNSET. - Remova a dependência de compilação da dessugarização aprimorada do Java 8 (#1312).
- Verifique se a duração transmitida para
MediaItem.Builder.setImageDurationMs()é ignorada para umMediaItemque não é de imagem (conforme documentado). - Adicione
Format.customDatapara armazenar informações personalizadas fornecidas pelo app sobre instâncias deFormat.
- Encaminhe chamadas de busca presumidas sem operação para os métodos protegidos
- ExoPlayer:
- Adicione
BasePreloadManager, que coordena o pré-carregamento de várias origens com base nas prioridades definidas pelorankingData. É possível personalizar estendendo essa classe. AdicioneDefaultPreloadManager, que usaPreloadMediaSourcepara pré-carregar amostras de mídia das fontes na memória e usa um número inteirorankingDataque indica o índice de um item na interface. - Adicione
PlayerIdà maioria dos métodos deLoadControlpara permitir que as implementações deLoadControlsejam compatíveis com vários jogadores. Buffer.isDecodeOnly()eC.BUFFER_FLAG_DECODE_ONLYforam removidos. Não é necessário definir essa flag, porque renderizadores e decodificadores decidem pular buffers com base no carimbo de data/hora. As implementações personalizadas deRendererprecisam verificar se o tempo de buffer é de pelo menosBaseRenderer.getLastResetPositionUs()para decidir se uma amostra deve ser mostrada. Implementações personalizadas deSimpleDecoderpodem verificarisAtLeastOutputStartTimeUs(), se necessário, ou marcar outros buffers comDecoderOutputBuffer.shouldBeSkippedpara ignorá-los.- Permite que um valor nulo seja retornado por
TargetPreloadStatusControl.getTargetPreloadStatus(T)para indicar que não é necessário pré-carregar umMediaSourcecom orankingDataespecificado. remove(MediaSource)foi adicionada aBasePreloadManager.- Adicione
reset()aBasePreloadManagerpara liberar todas as origens de retenção e manter a instância do gerenciador de pré-carregamento. - Adicione
ExoPlayer.setPriority()(eBuilder.setPriority()) para definir o valor de prioridade usado emPriorityTaskManagere para a importância do MediaCodec a partir da API 35. - Correção de um problema com a atualização do último tempo de rebuffer, que resultava em
chave
bs(falta de buffer) incorreta na CMCD (#1124). - Adicione
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)para indicar que a origem foi carregada até o fim. Isso permite que oDefaultPreloadManagere as implementações personalizadas dePreloadMediaSource.PreloadControlpré-carreguem a próxima origem ou realizem outras ações. - Correção de um bug em que o pulo de silêncio no final dos itens podia acionar uma exceção de reprodução.
- Adicione
clearaPreloadMediaSourcepara descartar o período de pré-carregamento. - Adicione o novo código de erro
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED, que é usado quando os recursos de codec são recuperados para tarefas de maior prioridade. - Permitir que o
AdsMediaSourcecarregue anúncios precedentes antes que a preparação inicial da mídia de conteúdo seja concluída (#1358). - Correção de um bug em que a reprodução era movida para
STATE_ENDEDao preparar novamente uma transmissão ao vivo DASH de vários períodos depois que o período original já havia sido removido do manifesto. onTimelineRefreshed()foi renomeado comoonSourcePrepared(), eonPrepared()foi renomeado comoonTracksSelected()emPreloadMediaSource.PreloadControl. Renomeie também os IntDefs emDefaultPreloadManager.Stage.- Adição de suporte experimental para programação dinâmica, a fim de alinhar melhor o trabalho
com ciclos de ativação da CPU e atrasar a ativação até que os renderizadores possam progredir.
É possível ativar isso usando
experimentalSetDynamicSchedulingEnabled()ao configurar sua instância do ExoPlayer. - Adição do
Renderer.getDurationToProgressUs(). UmRendererpode implementar esse método para retornar ao ExoPlayer a duração que a reprodução precisa avançar para que o renderizador progrida. SeExoPlayerfor definido comexperimentalSetDynamicSchedulingEnabled(),ExoPlayervai chamar esse método ao calcular o tempo para programar a tarefa de trabalho. - Adicione
MediaCodecAdapter#OnBufferAvailableListenerpara alertar quando os buffers de entrada e saída estiverem disponíveis para uso porMediaCodecRenderer. OMediaCodecRenderervai sinalizar oExoPlayerao receber esses callbacks. Se oExoPlayerestiver definido comexperimentalSetDynamicSchedulingEnabled(), ele vai programar o loop de trabalho à medida que os renderizadores avançam.ExoPlayer - Use a classe de dados para métodos
LoadControlem vez de parâmetros individuais. - Adicione
ExoPlayer.isReleased()para verificar seExoplayer.release()foi chamado. - Adicione
ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()para configurar a posição máxima em queseekToPrevious()busca o item anterior (#1425). - Correção de algumas inconsistências de foco de áudio, por exemplo, não informar perda de foco total ou temporária enquanto o player está pausado (#1436).
- Correção de um possível
IndexOutOfBoundsExceptioncausado por extratores que informam faixas adicionais após a etapa de preparação inicial (#1476). EffectsemExoPlayer.setVideoEffect()vai receber os carimbos de data/hora com o ajuste do renderizador removido (#1098).- Correção de um possível
IllegalArgumentExceptionao processar um erro do player que ocorreu durante a leitura antecipada de outro item da playlist (#1483).
- Adicione
- Transformador:
- Adicione
audioConversionProcessevideoConversionProcessaExportResult, indicando como a faixa respectiva no arquivo de saída foi criada. - Relaxar as verificações de nível H.264 de otimização de corte.
- Adição de suporte para alternar entre mídia de entrada SDR e HDR em uma sequência.
- Adição de suporte para efeitos de áudio no nível da composição.
- Adição de suporte para transcodificação de imagens Ultra HDR em vídeos HDR.
- Correção de um problema em que o
DefaultAudioMixernão gerava a quantidade correta de bytes após ser redefinido e reutilizado. - Solução alternativa para um bug do decodificador em que o número de canais de áudio era limitado ao estéreo ao processar entrada PCM.
- Ao selecionar faixas em
ExoPlayerAssetLoader, ignore as restrições de contagem de canais de áudio, já que elas só se aplicam à reprodução. - Substitua a interface
androidx.media3.transformer.Muxerporandroidx.media3.muxer.Muxere removaandroidx.media3.transformer.Muxer. - Correção do carregamento de imagens HEIC de esquemas de URI de conteúdo. (#1373).
- Ajuste a duração da faixa de áudio em
AudioGraphInputpara melhorar a sincronização AV. - Remova o campo
ExportResult.processedInputs. Se você usar esse campo para detalhes do codec, useDefaultDecoderFactory.listener. Em caso de uma exceção de codec, os detalhes do codec estarão disponíveis noExportException.codecInfo.
- Adicione
- Extratores:
- MPEG-TS: faça o roll forward da mudança para garantir que o último frame seja renderizado transmitindo a última unidade de acesso de um fluxo para a fila de amostras (#7909). Incorporação de correções para resolver os problemas que surgiram em streams HLS somente de frame I(#1150) e H.262 HLS (#1126).
- MP3: prefira o tamanho dos dados de um frame
Infoem vez do tamanho informado pelo fluxo subjacente (por exemplo, tamanho do arquivo ou cabeçalho HTTPContent-Length). Isso ajuda a excluir dados de trailers não reproduzíveis (por exemplo, arte da capa do álbum) dos cálculos de busca de taxa de bits constante, tornando as buscas mais precisas (#1376). - MP3: use a contagem de frames e outros dados em um frame
Info(se houver) para calcular uma taxa de bits média para busca de taxa de bits constante, em vez de extrapolar da taxa de bits do frame após o frameInfo, que pode ser artificialmente pequena, por exemplo, framePCUT(#1376). - Correção da extração do formato de áudio PCM em contêineres AVI.
- Áudio:
- Correção dos atributos de codificação do DTS:X Profile 2 para reprodução direta (#1299).
- Para a reprodução descarregada, redefina o campo de rastreamento para conclusão do stream
em
DefaultAudioSinkantes de chamarAudioTrack.stop()para queAudioTrack.StreamEventCallback#onPresentationEndedidentifique corretamente quando todos os dados pendentes foram reproduzidos. - Correção de um bug no
SilenceSkippingAudioProcessorem 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 agende dinamicamente o loop de trabalho principal para quando o MediaCodecAudioRenderer puder avançar.
- Vídeo:
- Correção do problema em que
Listener.onRenderedFirstFrame()chega muito cedo ao trocar de plataforma durante a reprodução. - A lógica de substituição do decodificador para Dolby Vision foi corrigida a fim de usar um decodificador AV1 compatível, se necessário (#1389).
- Corrigimos uma exceção de codec que pode ser causada pela ativação de um renderizador de vídeo durante a reprodução.
- Correção do problema em que
- Texto:
- Foi corrigido um problema em que legendas iniciadas antes de uma posição de busca eram ignoradas. Esse problema foi introduzido apenas na Media3 1.4.0-alpha01.
- Mude o comportamento padrão de análise de legendas para que ele ocorra durante a extração
em vez de durante a renderização. Consulte o
diagrama de arquitetura do ExoPlayer
para saber a diferença entre extração e renderização.
- Essa mudança pode ser substituída chamando both
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)eTextRenderer.experimentalSetLegacyDecodingEnabled(true). Consulte a documentação sobre personalização para saber como integrar esses componentes a uma instânciaExoPlayer. Esses métodos (e todo o suporte à decodificação de legendas legadas) serão removidos em uma versão futura. - Os apps com implementações personalizadas de
SubtitleDecoderprecisam ser atualizados para implementarSubtitleParser(eSubtitleParser.Factoryem vez deSubtitleDecoderFactory).
- Essa mudança pode ser substituída chamando both
- PGS: corrige a decodificação de extensão para resolver
0como um índice de cor, em vez de um valor literal de cor (#1367). - CEA-708: ignora o valor
rowLock. A especificação CEA-708-E S-2023 afirma querowLockecolumnLockdevem ser considerados verdadeiros, independente dos valores presentes no stream. Como o suporte acolumnLocknão é implementado, ele é considerado sempre falso.- Isso foi incluído originalmente nas notas da versão
1.3.0-alpha01, mas a mudança foi revertida por engano antes da versão1.3.0-rc01. Isso já foi corrigido, então a mudança está presente novamente.
- Isso foi incluído originalmente nas notas da versão
- CEA-708: evite que novas linhas duplicadas sejam adicionadas pelo processamento ingênuo do comando "definir local da caneta" do ExoPlayer (#1315).
- Correção de um
IllegalArgumentExceptiondeLegacySubtitleUtilquando uma amostra de legenda WebVTT não contém dicas, por exemplo, como parte de uma transmissão DASH (#1516).
- Metadados:
- Correção do mapeamento de MP4 para tags de classificação ID3. Antes, as tags MP4 "album sort" (
soal), "artist sort" (soar) e "album artist sort" (soaa) eram mapeadas incorretamente para as tags ID3TSO2,TSOAeTSOP(#1302). - Correção da leitura de tags numéricas
gnre(gênero) etmpo(tempo) de MP4 (/iTunes) quando o valor tem mais de um byte. - Propague o frame ID3
TCONparaMediaMetadata.genre(#1305).
- Correção do mapeamento de MP4 para tags de classificação ID3. Antes, as tags MP4 "album sort" (
- Imagem:
- Adição de suporte a grades de miniaturas DASH não quadradas (#1300).
- Adição de suporte a AVIF para API 34 e versões mais recentes.
- Permita
nullcomo parâmetro paraExoPlayer.setImageOutput()limpar umImageOutputdefinido anteriormente.
- DataSource:
- Implemente a compatibilidade com URIs de recursos brutos
android.resource://package/idem quepackageé diferente do pacote do aplicativo atual. Antes, isso não era documentado como uma forma de funcionar, mas é uma maneira mais eficiente de acessar recursos em outro pacote do que por nome. - Verifique se
urlnão é nulo nos construtoresDataSpec. Esse parâmetro já foi anotado como não nulo. - Permita que
ByteArrayDataSourceresolva um URI para uma matriz de bytes duranteopen(), em vez de ser codificado permanentemente na construção (#1405).
- Implemente a compatibilidade com URIs de recursos brutos
- DRM:
- Permite definir um
LoadErrorHandlingPolicyemDefaultDrmSessionManagerProvider(#1271).
- Permite definir um
- Efeito:
- Suporte a várias mudanças de velocidade no mesmo
EditedMediaItemouCompositionemSpeedChangeEffect. - Suporte para saída HLG e PQ de entrada de bitmap ultra HDR.
- Adição de suporte para EGL_GL_COLORSPACE_BT2020_HLG_EXT, que melhora a saída de superfície HLG em ExoPlayer.setVideoEffect e Debug SurfaceView do Transformer.
- Atualize a implementação da matriz de sobreposição para que ela fique consistente com a
documentação invertendo os valores de x e y aplicados em
setOverlayFrameAnchor(). Se estiver usandoOverlaySettings.Builder.setOverlayFrameAnchor(), inverta os valores x e y multiplicando-os por-1. - Correção do bug em que
TimestampWrapperfalhava quando usado comExoPlayer#setVideoEffects(#821). - Mude o espaço de trabalho de cores SDR padrão de cores lineares para vídeo SDR BT 709 elétrico. Também ofereça uma terceira opção para manter o espaço de cores original.
- Permite definir a ordem Z indeterminada de EditedMediaItemSequences (#1055).
- Mantenha um intervalo de luminância consistente em diferentes partes do conteúdo HDR (usa o intervalo HLG).
- Adição de suporte para sobreposições Ultra HDR (bitmap) em conteúdo HDR.
- Permite que os efeitos
SeparableConvolutionsejam usados antes da API 26. - Remova o
OverlaySettings.useHdrnão usado, já que o intervalo dinâmico da sobreposição e do frame precisam corresponder. - Adição de compatibilidade com HDR para
TextOverlay. A luminância da sobreposição de texto pode ser ajustada comOverlaySettings.Builder.setHdrLuminanceMultiplier().
- Suporte a várias mudanças de velocidade no mesmo
- Extensão de IMA:
- Promova a API necessária para que os apps reproduzam streams de anúncios da DAI para estável.
- Adicione
replaceAdTagParameters(Map <String, String>)aImaServerSideAdInsertionMediaSource.AdLoader, o que permite substituir parâmetros de tag de anúncio no tempo de execução. - Foi corrigido um bug em que
VideoAdPlayer.VideoAdPlayerCallback.onError()não era chamado quando um erro do player acontecia durante a reprodução de um anúncio (#1334). - A versão do SDK do IMA foi movida para 3.33.0 para corrigir um
NullPointerExceptionao usar URIs de tag de anúnciodata://(#700).
- Sessão:
- Mude o padrão de
CommandButton.enabledparatruee garanta que o valor possa permanecer falso para controladores mesmo que o comando associado esteja disponível. - Adicione constantes de ícone para
CommandButtonque devem ser usadas em vez de recursos de ícone personalizados. - Adicione
MediaSessionService.isPlaybackOngoing()para permitir que os apps consultem se o serviço precisa ser interrompido emonTaskRemoved()(#1219). - Adicione
MediaSessionService.pauseAllPlayersAndStopSelf(), que permite pausar a reprodução de todas as sessões e chamarstopSelf()para encerrar o ciclo de vida doMediaSessionService. - Substitua
MediaSessionService.onTaskRemoved(Intent)para fornecer uma implementação padrão segura que mantenha o serviço em execução em primeiro plano se a reprodução estiver em andamento ou interrompa o serviço caso contrário. - Ocultar a barra de busca na notificação de mídia para transmissões ao vivo sem definir a duração nos metadados da sessão da plataforma (#1256).
- Alinhe a conversão de
MediaMetadataparaMediaDescriptionCompat, para usar a mesma ordem e lógica preferenciais ao selecionar propriedades de metadados como em media1. - Adicione
MediaSession.sendError()para permitir o envio de erros não fatais ao controlador Media3. Ao usar o controlador de notificações (consulteMediaSession.getMediaNotificationControllerInfo()), o erro personalizado é usado para atualizar oPlaybackStateda sessão da plataforma para um estado de erro com as informações de erro fornecidas (#543). - Adicione
MediaSession.Callback.onPlayerInteractionFinished()para informar as sessões quando uma série de interações do player de um controle específico terminar. - Adicione
SessionErrore use emSessionResulteLibraryResultem vez do código de erro para fornecer mais informações sobre o erro e como resolvê-lo, se possível. - Publicar o código do app de teste do controlador media3 que pode ser usado para testar interações com apps que publicam uma sessão de mídia.
- Propaga os extras transmitidos para
MediaSession[Builder].setSessionExtras()do media3 paraPlaybackStateCompat.getExtras()de um 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 doPlaybackStateCompat. UmSessionErrorenviado ao controlador de notificação de mídia comMediaSession.sendError(ControllerInfo, SessionError)é mapeado para um erro não fatal emPlaybackStateCompat. Isso significa que o código e a mensagem de erro são definidos, mas o estado da sessão da plataforma permanece diferente deSTATE_ERROR. - Permite que a atividade da sessão seja definida por controlador para substituir a atividade global. A atividade da sessão pode ser definida para um
controlador no momento da conexão criando um
ConnectionResultcomAcceptedResultBuilder.setSessionActivivty(PendingIntent). Depois de conectada, a atividade da sessão pode ser atualizada comMediaSession.setSessionActivity(ControllerInfo, PendingIntent). - Melhoria na replicação de erros de chamadas para
MediaLibrarySession.Callback. Agora é possível configurar a replicação de erros usandoMediaLibrarySession.Builder.setLibraryErrorReplicationMode()para escolher o tipo de erro ou desativar a replicação de erros, que fica ativada por padrão.
- Mude o padrão de
- Interface:
- Adição de suporte à exibição de imagens ao
PlayerViewquando conectado a umExoPlayer(#1144). - Adicionada a personalização de vários ícones em
PlayerControlViewusando atributos xml para permitir diferentes elementos gráficos por instânciaPlayerView, em vez de substituições globais (#1200). - Solução alternativa para um bug da plataforma que causa esticamento/corte de vídeo ao usar
SurfaceViewem umAndroidViewdo Compose na API 34 (#1237).
- Adição de suporte à exibição de imagens ao
- Downloads:
- Verifique se
DownloadHelpernão vaza instânciasRenderernão lançadas, o que pode resultar em uma falha do app comIllegalStateException: Too many receivers, total of 1000, registered for pid(#1224).
- Verifique se
- Extensão Cronet:
- Correção de
SocketTimeoutExceptionemCronetDataSource. Em algumas versões do Cronet, a solicitação fornecida pelo callback nem sempre é a mesma. Isso faz com que o callback não seja concluído e a solicitação atinja o tempo limite (https://issuetracker.google.com/328442628).
- Correção de
- Extensão HLS:
- Correção de um bug em que amostras EMSG pendentes aguardando uma descontinuidade eram
delegadas em
HlsSampleStreamWrappercom um deslocamento incorreto, causando umIndexOutOfBoundsExceptionou umIllegalArgumentException(#1002). - Correção de um bug em que as playlists não principais eram recarregadas continuamente para streams LL-HLS (#1240).
- Correção de um bug em que a ativação do CMCD para HLS com segmentos de inicialização
resultava em
Source ErroreIllegalArgumentException. - Correção do bug em que as playlists não principais não eram atualizadas durante a reprodução ao vivo (#1240).
- Correção de um bug em que a ativação do CMCD para transmissões ao vivo HLS causava
ArrayIndexOutOfBoundsException(#1395).
- Correção de um bug em que amostras EMSG pendentes aguardando uma descontinuidade eram
delegadas em
- Extensão DASH:
- Extensão do Google Cast:
- Correção de um bug que convertia o título do álbum do
MediaQueueItempara o artista no item de mídia do Media3 (#1255).
- Correção de um bug que convertia o título do álbum do
- Utilitários de teste:
- Implemente
onInit()eonRelease()emFakeRenderer. - Mude os métodos
TestPlayerRunHelper.runUntil()/playUntil()para falhar em erros não fatais (por exemplo, aqueles informados aAnalyticsListener.onVideoCodecError()). Use a nova cadeia de métodosTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()para desativar esse comportamento.
- Implemente
- App de demonstração:
- Use
DefaultPreloadManagerno app de demonstração de formato curto. - Permite definir o modo de repetição com argumentos
Intentda linha de comando (#1266). - Use
HttpEngineDataSourcecomoHttpDataSourcequando compatível com o dispositivo.
- Use
- Símbolos descontinuados foram removidos:
- Remoção de
CronetDataSourceFactory. UseCronetDataSource.Factory. - Remoção de alguns construtores
DataSpec. UseDataSpec.Builder. - O método
setContentTypePredicate(Predicate)foi removido deDefaultHttpDataSource,OkHttpDataSourceeCronetDataSource. Em vez disso, use o método equivalente em cadaXXXDataSource.Factory. - Os construtores
OkHttpDataSourceeOkHttpDataSourceFactoryforam removidos. UseOkHttpDataSource.Factory. - O
PlayerMessage.setHandler(Handler)foi removido. UsesetLooper(Looper). - Remova o campo
Timeline.Window.isLive. Em vez disso, use o métodoisLive(). - Os construtores
DefaultHttpDataSourceforam removidos. UseDefaultHttpDataSource.Factory - O
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MSfoi removido. UseDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS - O
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)foi removido. UseMediaCodecInfo.canReuseCodec(Format, Format). - Remoção dos métodos
DrmSessionManager.DUMMYegetDummyDrmSessionManager(). UseDrmSessionManager.DRM_UNSUPPORTED. - Remova
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format),AnalyticsListener.onVideoInputFormatChanged(EventTime, Format),AudioRendererEventListener.onAudioInputFormatChanged(Format),VideoRendererEventListener.onVideoInputFormatChanged(Format). Use as sobrecargas que aceitam umDecoderReuseEvaluation. - Remova a IntDef
RendererSupport.FormatSupporte as constantesFORMAT_HANDLED,FORMAT_EXCEEDS_CAPABILITIES,FORMAT_UNSUPPORTED_DRM,FORMAT_UNSUPPORTED_SUBTYPEeFORMAT_UNSUPPORTED_TYPE. Use o IntDef e as constantes equivalentes emandroidx.media3.common.Cem vez disso (por exemplo,C.FORMAT_HANDLED). - Remova a interface
Bundleable. Isso inclui a remoção de todos os campos constantes deBundleable.Creator<Foo> CREATOR. Os chamadores precisam usar os métodosBundle toBundle()estatic Foo fromBundle(Bundle)em cada tipo.
- Remoção de
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 estes commits.
- Biblioteca comum:
- Adicione
Format.labelspara permitir rótulos localizados ou alternativos.
- Adicione
- ExoPlayer:
- Correção de um problema em que o
PreloadMediaPeriodnão podia reter os fluxos quando era pré-carregado novamente. - Aplique o
TrackSelectionResultcorrespondente correto ao período de reprodução na nova seleção de faixas. - Inicie renderizadores ativados antecipadamente somente depois de avançar o período de reprodução ao fazer a transição entre itens de mídia (#1017).
- Adição do tipo de retorno ausente à regra
-keepclasseswithmembersdo ProGuard paraDefaultVideoFrameProcessor.Factory.Builder.build()(#1187).
- Correção de um problema em que o
- Transformador:
- Adicione uma solução alternativa para a exceção gerada porque
MediaMuxernão oferece suporte a carimbos de data/hora de apresentação negativos antes da API 30.
- Adicione uma solução alternativa para a exceção gerada porque
- Seleção de faixas:
DefaultTrackSelector: prefira faixas de vídeo com uma taxa de frames "razoável" (>=10fps) em vez daquelas com uma taxa de frames mais baixa ou não definida. Isso garante que o player selecione a faixa de vídeo "real" em MP4s extraídos de fotos em movimento que podem conter duas faixas HEVC, em que uma tem uma resolução maior, mas um número muito pequeno de frames (#1051).
- Extratores:
- Correção de um problema em que o padding não era ignorado ao ler partes de tamanho ímpar de arquivos WAV (#1117).
- MP3: preencha
Format.averageBitratecom frames de metadados, comoXINGeVBRI. - MPEG-TS: revertemos uma mudança que visava garantir a renderização do último frame transmitindo a última unidade de acesso de um stream para a fila de amostras (#7909). Isso ocorre porque a mudança causa novos problemas com streams HLS somente de frame I (#1150) e streams HLS H.262 (#1126).
- Áudio:
- Permite a recuperação do renderizador desativando o descarregamento se a faixa de áudio não inicializar no modo de descarregamento.
- Vídeo:
- Adicionamos uma solução alternativa para um problema de dispositivo no Galaxy Tab S7 FE, Chromecast com Google TV e Lenovo M10 FHD Plus que faz com que streams H265 de 60 fps sejam marcados como não compatíveis.
- Adicione uma solução alternativa que garante que o primeiro frame seja sempre renderizado durante o tunelamento, mesmo que o dispositivo não faça isso automaticamente, conforme exigido pela API (#1169). (#966).
- Foi corrigido um problema em que o processamento de informações de cores HDR causava um comportamento inadequado do codec e impedia a troca de formato adaptável para faixas de vídeo SDR (#1158).
- Texto:
- WebVTT: impede que dicas consecutivas criem instâncias
CuesWithTimingadicionais espúrias deWebvttParser.parse(#1177).
- WebVTT: impede que dicas consecutivas criem instâncias
- DRM:
- Solução alternativa para um
NoSuchMethodErrorque pode ser gerado pelo frameworkMediaDrmem vez deResourceBusyExceptionouNotProvisionedExceptionem alguns dispositivos Android 14 (#1145).
- Solução alternativa para um
- Efeito:
- Melhoria do mapeamento de tons PQ para SDR com a conversão de espaços de cores.
- Sessão:
- Interface:
- O nome do idioma da faixa de áudio é incluído se
Localenão conseguir identificar um nome de exibição (#988).
- O nome do idioma da faixa de áudio é incluído se
- Extensão DASH:
- Preencha todos os elementos
Labeldo manifesto emFormat.labels(#1054).
- Preencha todos os elementos
- Extensão RTSP:
- Ignorar valores vazios de informações da sessão (i-tags) na análise do SDP (#1087).
- Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
- Desative a extensão MIDI como uma dependência local por padrão porque ela exige a configuração de um repositório Maven adicional. Os usuários que precisam desse módulo de uma dependência local podem reativá-lo.
Versão 1.3.0
6 de março de 2024
Lançamento de androidx.media3:media3-*:1.3.0.
A versão 1.3.0 contém estes commits.
- Biblioteca comum:
- Implemente a compatibilidade com URIs de recursos brutos
android.resource://package/[type/]nameem quepackageé diferente do pacote do aplicativo atual. Isso sempre foi documentado para funcionar, mas não foi implementado corretamente até agora. - Normaliza os tipos MIME definidos pelo código do app ou lidos da mídia para serem totalmente minúsculos.
- Defina anúncios com um
MediaItemcompleto em vez de um únicoUriemAdPlaybackState. - Aumente
minSdkpara 19 (Android KitKat). Isso está alinhado com todas as outras bibliotecas AndroidX e é necessário para que possamos fazer upgrade para as versões mais recentes das nossas dependências do AndroidX. - Preencha
artworkUrieartworkDataemMediaMetadata.Builder.populate(MediaMetadata)quando pelo menos um deles não for nulo (#964).
- Implemente a compatibilidade com URIs de recursos brutos
- ExoPlayer:
- Adicione
PreloadMediaSourceePreloadMediaPeriodpara permitir que os apps pré-carreguem uma origem de mídia de conteúdo em uma posição inicial específica antes da reprodução. OPreloadMediaSourcecuida da preparação da fonte de mídia de conteúdo para receber oTimeline, preparando e armazenando em cache o período na posição inicial especificada, selecionando faixas e carregando dados de mídia para o período. Os apps controlam o progresso do pré-carregamento implementandoPreloadMediaSource.PreloadControle definem a origem pré-carregada para o player para reprodução. - Adicione
ExoPlayer.setImageOutputque permite que os apps definamImageRenderer.ImageOutput. - Agora,
DefaultRenderersFactoryfornece umImageRendererao player por padrão comImageOutputeImageDecoder.Factory.DEFAULTnulos. - Emita o evento
Player.Listener.onPositionDiscontinuityquando o silêncio for ignorado (#765). - Adição de suporte experimental para analisar legendas durante a extração. É possível ativar isso usando
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(). - Compatibilidade com fontes de mídia adaptáveis usando
PreloadMediaSource. - Implemente
HttpEngineDataSource, umHttpDataSourceusando a API HttpEngine. - Impeça a criação de subclasses
CompositeSequenceableLoader. Esse componente foi anteriormente extensível mas nunca foi subclasseado na biblioteca. As personalizações podem ser feitas encapsulando uma instância usando o padrão de decorador e implementando umCompositeSequenceableLoaderFactorypersonalizado. - Correção de um problema em que a repetição do mesmo horário fazia com que os metadados do item fossem limpos (#1007).
- Renomeie os métodos
experimentalSetSubtitleParserFactoryemBundledChunkExtractor.FactoryeDefaultHlsExtractorFactoryparasetSubtitleParserFactorye não permita a transmissão denull. Use os novos métodosexperimentalParseSubtitlesDuringExtraction(boolean)para controlar o comportamento de análise. - Adicionamos suporte para personalizar o
SubtitleParser.Factoryusado durante a extração. Isso pode ser feito comMediaSource.Factory.setSubtitleParserFactory(). - Adicione o prefixo de origem a todos os campos
Format.idgerados deMergingMediaSource. Isso ajuda a identificar qual fonte produziu umFormat(#883). - Correção da regex usada para validar nomes de chaves de dados comuns do cliente de mídia (CMCD) personalizados. Para isso, ela foi modificada para verificar apenas o hífen (#1028).
- Parar a codificação dupla de parâmetros de consulta CMCD (#1075).
- Adicione
- Transformador:
- Adicionamos suporte para reduzir vídeos em câmera lenta SEF H.265/HEVC.
- Aumentamos a velocidade de transmuxing, principalmente para edições de "remover vídeo".
- Adição de API para garantir que o arquivo de saída comece em um frame de vídeo. Isso pode tornar a saída das operações de corte mais compatível com implementações de player que não mostram o primeiro frame do vídeo até que o carimbo de data/hora de apresentação (#829) seja exibido.
- Adição de suporte para otimizar operações de corte de MP4 de um único recurso.
- Adiciona suporte para garantir que um frame de vídeo tenha o primeiro carimbo de data/hora no arquivo de saída. Correção de arquivos de saída que começam com um frame preto em players baseados em iOS (#829).
- Seleção de faixas:
- Adicione
DefaultTrackSelector.selectImageTrackpara ativar a seleção de faixas de imagem. - Adicione
TrackSelectionParameters.isPrioritizeImageOverVideoEnabledpara determinar se uma faixa de imagem será selecionada se uma faixa de imagem e uma de vídeo estiverem disponíveis. O valor padrão éfalse, o que significa que a seleção de uma faixa de vídeo é priorizada.
- Adicione
- Extratores:
- Adição de análise AV1C ao extrator MP4 para recuperar valores de
ColorInfo.colorSpace,ColorInfo.colorTransfereColorInfo.colorRange(#692). - MP3: use a busca de taxa de bits constante (CBR) para arquivos com um cabeçalho
Info(o equivalente CBR do cabeçalhoXing). Antes, usávamos a tabela de busca do cabeçalhoInfo, mas isso resulta em uma busca menos precisa do que se ignorarmos e presumirmos que o arquivo é CBR. - MPEG2-TS: adicionado suporte a DTS, DTS-LBR e DTS:X Profile2 (#275).
- Extraia tipos de áudio de descritores TS e mapeie-os para flags de função, permitindo que os usuários façam seleções de faixa de áudio mais bem informadas (#973).
- Adição de análise AV1C ao extrator MP4 para recuperar valores de
- Áudio:
- Vídeo:
- Mude o construtor
MediaCodecVideoRendererque usa um argumentoVideoFrameProcessor.Factorye substitua-o por um construtor que usa um argumentoVideoSinkProvider. Os apps que querem injetar umVideoFrameProcessor.Factorypersonalizado podem instanciar umCompositingVideoSinkProviderque usa oVideoFrameProcessor.Factorypersonalizado e transmitir o provedor de coletor de vídeo paraMediaCodecVideoRenderer.
- Mude o construtor
- Texto:
- Correção da serialização de dicas de bitmap para resolver o erro
Tried to marshall a Parcel that contained Binder objectsao usarDefaultExtractorsFactory.setTextTrackTranscodingEnabled(#836). - CEA-708: ignora o valor
rowLock. A especificação CEA-708-E S-2023 afirma querowLockecolumnLockdevem ser considerados verdadeiros, independente dos valores presentes no stream. Como o suporte acolumnLocknão é implementado, ele é considerado sempre falso.
- Correção da serialização de dicas de bitmap para resolver o erro
- Imagem:
- Adição de suporte a miniaturas DASH. As imagens em grade são cortadas, e miniaturas individuais são fornecidas para
ImageOutputperto dos horários de apresentação.
- Adição de suporte a miniaturas DASH. As imagens em grade são cortadas, e miniaturas individuais são fornecidas para
- DRM:
- Reproduza imediatamente amostras não criptografadas de "liderança clara" em conteúdo DRM por
padrão, mesmo que as chaves das amostras criptografadas posteriores ainda não estejam prontas. Isso pode causar interrupções no meio da reprodução se as chaves ainda não estiverem prontas
quando a posição de reprodução atingir as amostras criptografadas (mas antes
a reprodução não teria começado até esse ponto). Esse comportamento pode
ser desativado com
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKeyouDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys.
- Reproduza imediatamente amostras não criptografadas de "liderança clara" em conteúdo DRM por
padrão, mesmo que as chaves das amostras criptografadas posteriores ainda não estejam prontas. Isso pode causar interrupções no meio da reprodução se as chaves ainda não estiverem prontas
quando a posição de reprodução atingir as amostras criptografadas (mas antes
a reprodução não teria começado até esse ponto). Esse comportamento pode
ser desativado com
- Extensão de IMA:
- Correção de um problema em que anúncios DASH e HLS sem a extensão de arquivo adequada não podiam ser reproduzidos.
- Sessão:
- A detecção de clique duplo para apps de TV foi desativada (962, link em inglês).
- Correção de um problema em que
MediaItem.RequestMetadatacom apenas extras não nulos não era transmitido entre controladores e sessões de mídia. - Adicione um construtor ao
MediaLibrarySession.Builderque usa apenas umContextem vez de umMediaLibraryService.
- Extensão HLS:
- Reduza
HlsMediaPeriodpara visibilidade privada do pacote. Esse tipo não deve ser usado diretamente de fora do pacote HLS. - As buscas para o início de um segmento são resolvidas com mais eficiência (#1031).
- Reduza
- Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
- Decodificador MIDI: ignorar mensagens de eventos SysEx (#710).
- Utilitários de teste:
- Não pause a reprodução em
TestPlayerRunHelper.playUntilPosition. O teste mantém a reprodução em um estado de execução, mas suspende o progresso até que o teste possa adicionar asserções e outras ações.
- Não pause a reprodução em
- App de demonstração:
- Adicione um módulo de demonstração de formato curto para demonstrar o uso de
PreloadMediaSourcecom o caso de uso de conteúdo de formato curto.
- Adicione um módulo de demonstração de formato curto para demonstrar o uso de
Versão 1.3.0-rc01
22 de fevereiro de 2024
Use a versão estável 1.3.0.
Versão 1.3.0-beta01
7 de fevereiro de 2024
Use a versão estável 1.3.0.
Versão 1.3.0-alpha01
15 de janeiro de 2024
Use a versão estável 1.3.0.
Versão 1.2.0
Versão 1.2.1
9 de janeiro de 2024
- ExoPlayer:
- Correção de um problema em que buscas manuais fora do intervalo
LiveConfiguration.min/maxOffsetcontinuavam ajustando o deslocamento de volta paramin/maxOffset. - Correção de um problema em que os layouts de canais OPUS e VORBIS estavam incorretos para 3, 5, 6, 7 e 8 canais (#8396).
- Foi corrigido um problema em que as seleções de faixa após a busca por zero em uma transmissão ao vivo permitiam incorretamente que a transmissão começasse na posição padrão (#9347).
- Correção do problema em que novas instâncias de
CmcdData.Factoryestavam recebendo valores negativos parabufferedDurationUsde fontes de partes, resultando em umIllegalArgumentException(#888).
- Correção de um problema em que buscas manuais fora do intervalo
- Transformador:
- Contornar um problema em que o codificador gerava um erro no momento da configuração devido à definição de uma taxa de operação alta.
- Extratores:
- Marque as faixas HEVC secundárias (não reproduzíveis) em fotos dinâmicas JPEG como
ROLE_FLAG_ALTERNATEpara evitar que elas sejam selecionadas automaticamente para reprodução devido à resolução mais alta. - Correção da detecção incorreta de frame-chave para transmissões TS H264 (#864).
- Correção da estimativa de duração de streams TS com mais de 47.721 segundos (#855).
- Marque as faixas HEVC secundárias (não reproduzíveis) em fotos dinâmicas JPEG como
- Áudio:
- Correção do processamento de EOS para
SilenceSkippingAudioProcessorquando chamado várias vezes (#712).
- Correção do processamento de EOS para
- Vídeo:
- Adicionamos uma solução alternativa para um problema de dispositivo no Galaxy Tab S7 FE, no Chromecast com Google TV e no Lenovo M10 FHD Plus que faz com que streams AVC de 60 fps sejam marcados como não compatíveis (#693).
- Metadados:
- Correção do bug em que
MediaMetadataera preenchido apenas com comentários do Vorbis com chaves em maiúsculas (#876). - Captura
OutOfMemoryErrorao analisar frames ID3 muito grandes, o que significa que a reprodução pode continuar sem as informações da tag em vez de falhar completamente.
- Correção do bug em que
- DRM:
- Estender a solução alternativa para URL de licença
https://default.urlClearKey espúrio para API 33 e versões mais recentes. Antes, a solução alternativa era aplicada apenas na API 33 (#837). - Correção do
ERROR_DRM_SESSION_NOT_OPENEDao alternar de conteúdo criptografado para não criptografado sem uma superfície anexada ao player. O erro ocorreu devido ao uso incorreto de um decodificador seguro para abrir o conteúdo sem proteção.
- Estender a solução alternativa para URL de licença
- Sessão:
- Coloque as chaves e os valores personalizados em
MediaMetadataCompatparaMediaMetadata.extraseMediaMetadata.extrasparaMediaMetadataCompat(#756, #802). - Correção da transmissão de
notifyChildrenChangedpara controladores legados (#644). - Correção de um bug em que definir um tempo negativo para um timer
setWhendesativado da notificação causava uma falha em alguns dispositivos (#903). - Correção de
IllegalStateExceptionquando o controlador de notificação de mídia não concluiu a conexão quando a primeira atualização de notificação é solicitada (#917).
- Coloque as chaves e os valores personalizados em
- Interface:
- Extensão DASH:
- Análise de "f800" como contagem de canais de 5 para Dolby no manifesto DASH (#688).
- Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
- Extensão do Google Cast:
- A criação de um
Timelinefoi higienizada para não falhar o app quando o carregamento de mídia falha no dispositivo de transmissão (#708).
- A criação de um
Versão 1.2.0
15 de novembro de 2023
- Biblioteca comum:
- Adicione um parâmetro
@Nullable Throwableaos métodos na interfaceLog.Logger. O parâmetromessagedesses métodos não contém mais informações sobre oThrowabletransmitido aos métodosLog.{d,i,w,e}(). Portanto, as implementações precisam anexar manualmente essas informações, se necessário (possivelmente usandoLogger.appendThrowableString(String, Throwable)). - Correção de um problema de compatibilidade do Kotlin em que parâmetros de tipo genérico anuláveis
e tipos de elementos de matriz anuláveis não eram detectados como anuláveis. Exemplos
são os parâmetros de método
TrackSelectorResulteSimpleDecoder(#6792). - Mude o comportamento padrão da interface e das notificações em
Util.shouldShowPlayButtonpara mostrar um botão "Reproduzir" enquanto a reprodução está temporariamente suprimida (por exemplo, devido a uma perda temporária de seleção de áudio). O comportamento legado pode ser mantido usandoPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)ouMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)(#11213). - Faça upgrade do
androidx.annotation:annotation-experimentalpara o1.3.1para corrigir https://issuetracker.google.com/251172715. - Mova
ExoPlayer.setAudioAttributespara a interfacePlayer.
- Adicione um parâmetro
- ExoPlayer:
- Correção de problemas de busca em fluxos AC4 causados pela identificação incorreta de amostras somente de decodificação (#11000).
- Adicione a supressão da reprodução em dispositivos de saída de áudio inadequados (por exemplo, o alto-falante integrado em dispositivos Wear OS) quando esse recurso estiver ativado em
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput. O motivo da supressão da reprodução será atualizado comoPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUTse a reprodução for tentada quando não houver saídas de áudio adequadas disponíveis ou se todas as saídas adequadas forem desconectadas durante a reprodução. O motivo da supressão será removido quando uma saída adequada for conectada. - Adicione
MediaSource.canUpdateMediaItemeMediaSource.updateMediaItempara aceitar atualizações deMediaItemapós a criação viaPlayer.replaceMediaItem(s). - Permitir atualizações de
MediaItempara todas as classesMediaSourcefornecidas pela biblioteca viaPlayer.replaceMediaItem(s)(#33, #9978). - O
MimeTypes.TEXT_EXOPLAYER_CUESfoi renomeado comoMimeTypes.APPLICATION_MEDIA3_CUES. - Adicione
PngExtractorque envia e lê um arquivo PNG inteiro para oTrackOutputcomo uma amostra. - Melhore o método
SequenceableLoader.continueLoading(long)na interfaceSequenceableLoaderparaSequenceableLoader.continueLoading(LoadingInfo loadingInfo).LoadingInfocontém outros parâmetros, incluindoplaybackSpeedelastRebufferRealtimeMs, além doplaybackPositionUsatual. - Melhore o método
ChunkSource.getNextChunk(long, long, List, ChunkHolder)na interfaceChunkSourceparaChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder). - Adicione outros campos ao registro de dados comuns do cliente de mídia (CMCD): falta de buffer (
bs), prazo (dl), taxa de reprodução (pr) e inicialização (su) (#8699). - Adição de bitdepth de luma e croma a
ColorInfo(#491). - Adicione outros campos ao registro de dados comuns do cliente de mídia (CMCD): próxima
solicitação de objeto (
nor) e próxima solicitação de intervalo (nrr) (#8699). - Adicionamos a funcionalidade de transmitir dados comuns do cliente de mídia (CMCD) usando parâmetros de consulta (#553).
- Correção de
ConcurrentModificationExceptionemExperimentalBandwidthMeter(#612). - Adicione o parâmetro
MediaPeriodIdaCompositeMediaSource.getMediaTimeForChildMediaTime. - Suporte a
ClippingMediaSource(e outras fontes com períodos/janelas de tempo de compensação) emConcatenatingMediaSource2(#11226). - Mude
BaseRenderer.onStreamChanged()para também receber um argumentoMediaPeriodId.
- Transformador:
- Analisar dados de rotação EXIF para entradas de imagem.
- Remova o tipo de anotação
TransformationRequest.HdrModee as constantes associadas. UseComposition.HdrModee as constantes associadas. - Simplifique o
OverlaySettingspara corrigir problemas de rotação. - Mudança dos parâmetros
frameRateedurationUsdeSampleConsumer.queueInputBitmapparaTimestampIterator.
- Seleção de faixas:
- Adicione
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptivenesspara permitir ou não explicitamente a adaptação não contínua. O padrão permanece no comportamento atual detrue.
- Adicione
- Extratores:
- MPEG-TS: garanta que o último frame seja renderizado transmitindo a última unidade de acesso de um fluxo para a fila de amostras (#7909).
- Correção de erro de digitação ao determinar
rotationDegrees. Mudança deprojectionPosePitchparaprojectionPoseRoll(#461). - Remova a proposição de que as instâncias
Extractorpodem ser inspecionadas diretamente cominstanceof. Se você quiser acesso em tempo de execução aos detalhes de implementação de umExtractor, primeiro chameExtractor.getUnderlyingInstance. - Adição do
BmpExtractor. - Adição do
WebpExtractor. - Adição do
HeifExtractor. - Adicione suporte ao QuickTime clássico ao
Mp4Extractor.
- Áudio:
- Adição de suporte para PCM big-endian de 24/32 bits em MP4 e Matroska, além de análise
da codificação PCM para
lpcmem MP4. - Adição de suporte para extrair áudio Vorbis em MP4.
- Adicione
AudioSink.getFormatOffloadSupport(Format), que recupera o nível de suporte de descarga que o coletor pode oferecer para o formato usando umDefaultAudioOffloadSupportProvider. Ele retorna o novoAudioOffloadSupportque contémisFormatSupported,isGaplessSupportedeisSpeedChangeSupported. - Adicione
AudioSink.setOffloadMode(), em que a configuração de descarga no coletor de áudio é definida. O padrão éAudioSink.OFFLOAD_MODE_DISABLED. - O descarregamento pode ser ativado em
setAudioOffloadPreference, emTrackSelectionParameters. Se a preferência definida for ativar, o dispositivo vai oferecer suporte ao descarregamento para o formato, e a seleção de faixa será uma única faixa de áudio. - Se
audioOffloadModePreferenceestiver definido comoAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED, oDefaultTrackSelectorsó vai selecionar uma faixa de áudio se o formato dela for compatível com o descarregamento. Se nenhuma faixa de áudio for compatível com o descarregamento, nenhuma faixa será selecionada. - Desativação do suporte sem interrupções para descarregamento antes do nível 33 da API devido a um problema de posição de reprodução após a transição da faixa.
- Remova o parâmetro
enableOffloadda assinatura do métodoDefaultRenderersFactory.buildAudioSink. - Remova o método
DefaultAudioSink.Builder.setOffloadMode. - Remova o valor intdef
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED. - Adição de suporte para metadados sem lacunas do Opus durante a reprodução de descarga.
- Permitir a recuperação do renderizador desativando o descarregamento se a primeira gravação falhar (#627).
- Ativar o agendamento de descarga por padrão para reprodução descarregada somente de áudio.
- Exclua
ExoPlayer.experimentalSetOffloadSchedulingEnabledeAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged. onExperimentalSleepingForOffloadChangedfoi renomeado comoonSleepingForOffloadChangedeonExperimentalOffloadedPlaybackcomoonOffloadedPlayback.- Mova as interfaces e definições
TrackSelectionParametersrelacionadas ao modo de descarregamento de áudio para uma classeAudioOffloadPreferencesinterna. - Adicione callbacks
onAudioTrackInitializedeonAudioTrackReleasedaAnalyticsListener,AudioRendererEventListenereAudioSink.Listener. - Correção do problema de estouro negativo do buffer de áudio DTS Express (#650).
- Correção de um bug em que a verificação de recursos para E-AC3-JOC gerava um
IllegalArgumentException(#677).
- Adição de suporte para PCM big-endian de 24/32 bits em MP4 e Matroska, além de análise
da codificação PCM para
- Vídeo:
- Permitir que o
MediaCodecVideoRendereruse umVideoFrameProcessor.Factorypersonalizado. - 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).
- Permitir que o
- Texto:
- O
ExoplayerCuesDecoderfoi removido. As faixas de texto comsampleMimeType = application/x-media3-cuesagora são processadas diretamente peloTextRenderersem precisar de uma instânciaSubtitleDecoder.
- O
- Metadados:
MetadataDecoder.decodenão será mais chamado para amostras "somente decodificação", já que a implementação precisa retornar nulo de qualquer maneira.
- Efeito:
- Adicione a entrada de bitmap de enfileiramento
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)por carimbo de data/hora. - Mude
VideoFrameProcessor.registerInputStream()para não bloqueio. Os apps precisam implementarVideoFrameProcessor.Listener#onInputStreamRegistered(). - Mudança dos parâmetros
frameRateedurationUsdeVideoFrameProcessor.queueInputBitmapparaTimestampIterator.
- Adicione a entrada de bitmap de enfileiramento
- Extensão de IMA:
- Correção de um bug em que uma transmissão ao vivo DASH de vários períodos que não é o primeiro item em uma playlist pode gerar uma exceção (#571).
- Libere o StreamManager antes de chamar
AdsLoader.destroy() - O SDK do IMA foi movido para a versão 3.31.0.
- Sessão:
- Defina o comportamento do serviço em primeiro plano de notificações como
FOREGROUND_SERVICE_IMMEDIATEemDefaultMediaNotificationProvider(#167). - Use apenas
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()acima da API 31 para evitar problemas com a API descontinuada em dispositivos Samsung (#167). - Use o controlador de notificações de mídia como proxy para definir comandos disponíveis e o layout personalizado usado para preencher a notificação e a sessão da plataforma.
- Converta eventos de botões de mídia recebidos por
MediaSessionService.onStartCommand()na Media3 em vez de encaminhá-los para a sessão da plataforma e de volta para a Media3. Assim, o controlador de chamadas é sempre o controlador de notificações de mídia, e os apps podem reconhecer facilmente as chamadas vindas da notificação da mesma forma em todos os níveis de API compatíveis. - Correção de um bug em que o
MediaController.getCurrentPosition()não avança quando conectado a umMediaSessionCompatlegado. - Adicione
MediaLibrarySession.getSubscribedControllers(mediaId)para facilidade. - Substitua
MediaLibrarySession.Callback.onSubscribe()para confirmar a disponibilidade do ID principal a que o controlador se inscreve. Se a assinatura for aceita,notifyChildrenChanged()será chamado imediatamente para informar o navegador (#561). - Adicione o módulo de demonstração de sessão para o Automotive OS e ative a demonstração de sessão para o Android Auto.
- Não defina a fila da sessão do framework quando
COMMAND_GET_TIMELINEnão estiver disponível para o controlador de notificações de mídia. Com o Android Auto como o controlador cliente que lê da sessão do framework, o botãoqueuena interface do Android Auto não é exibido (#339). - Use
DataSourceBitmapLoaderpor padrão em vez deSimpleBitmapLoader(#271, #327). - Adição de
MediaSession.Callback.onMediaButtonEvent(Intent)que permite que os apps substituam o processamento de eventos padrão do botão de mídia.
- Defina o comportamento do serviço em primeiro plano de notificações como
- Interface:
- Adicione uma implementação
Player.Listenerpara dispositivos Wear OS que lide com a supressão da reprodução devido aPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUTao iniciar uma caixa de diálogo do sistema para permitir que um usuário conecte uma saída de áudio adequada (por exemplo, fones de ouvido Bluetooth). O listener vai retomar a reprodução automaticamente se um dispositivo adequado for conectado dentro de um tempo limite configurável (o padrão é de 5 minutos).
- Adicione uma implementação
- Downloads:
- Declare o tipo de serviço em primeiro plano "sincronização de dados" para
DownloadServicepara compatibilidade com o Android 14. Ao usar esse serviço, o app também precisa adicionardataSynccomoforegroundServiceTypeno manifesto e adicionar a permissãoFOREGROUND_SERVICE_DATA_SYNC(#11239).
- Declare o tipo de serviço em primeiro plano "sincronização de dados" para
- Extensão HLS:
- Atualize a playlist ao vivo HLS com um intervalo calculado com base no último horário de início do carregamento, e não no último horário de conclusão do carregamento (#663).
- Extensão DASH:
- Permitir vários identificadores DASH iguais no URL do modelo de segmento.
- Adição de suporte experimental para analisar legendas durante a extração. Isso melhora a compatibilidade com a fusão de legendas sobrepostas, incluindo a resolução de tremulação ao fazer a transição entre segmentos de legenda. É possível ativar essa opção usando
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()(#288).
- Extensão RTSP:
- Correção de uma disputa que poderia levar a
IndexOutOfBoundsExceptionao reverter para TCP ou a reprodução travar em algumas situações. - Verifique o estado na configuração do RTSP ao retornar o estado de carregamento de
RtspMediaPeriod(#577). - Ignorar métodos de solicitação Rtsp personalizados no cabeçalho público de resposta de opções (#613).
- Use o valor de tempo limite da resposta de configuração RTSP no intervalo de tempo do envio de solicitações de opções RTSP de manutenção (#662).
- Correção de uma disputa que poderia levar a
- Extensões de decodificador (FFmpeg, VP9, AV1, MIDI etc.):
- Lançamento do módulo de decodificador MIDI, que oferece suporte à reprodução de arquivos MIDI padrão usando a biblioteca Jsyn para sintetizar áudio.
- Adicione
DecoderOutputBuffer.shouldBeSkippedpara marcar diretamente buffers de saída que não precisam ser apresentados. Essa é a opção preferencial em vez deC.BUFFER_FLAG_DECODE_ONLY, que será descontinuada. - Adicione
Decoder.setOutputStartTimeUseSimpleDecoder.isAtLeastOutputStartTimeUspara permitir que os decodificadores descartem amostras somente de decodificação antes do horário de início. Isso é preferível aBuffer.isDecodeOnly, que será descontinuado. - Correção de um bug na publicação do artefato do decodificador MIDI no repositório Maven. O
artefato foi renomeado como
media3-exoplayer-midi(#734).
- Extensão do Leanback:
- Correção de um bug em que a desativação de uma superfície podia causar um
ArithmeticExceptionno código do Leanback (#617).
- Correção de um bug em que a desativação de uma superfície podia causar um
- Utilitários de teste:
- Tornar
TestExoPlayerBuildereFakeClockcompatíveis com testes de interface do Espresso e do Compose. Isso corrige um bug em que a reprodução avança de maneira não determinística durante as interações de visualização do Espresso ou do Compose.
- Tornar
- Símbolos descontinuados foram removidos:
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)eTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)foram removidos. UseComposition.Builder.setHdrMode(int)e transmita oCompositionparaTransformer.start(Composition, String).- Remova o método
DownloadNotificationHelper.buildProgressNotificationobsoleto e use um método não obsoleto que receba um parâmetronotMetRequirements.
Versão 1.2.0-rc01
1º de novembro de 2023
Use a versão estável 1.2.0.
Versão 1.2.0-beta01
19 de outubro de 2023
Use a versão estável 1.2.0.
Versão 1.2.0-alpha02
29 de setembro de 2023
Use a versão estável 1.2.0.
Versão 1.2.0-alpha01
17 de agosto de 2023
Use a versão estável 1.2.0.
Versão 1.1.0
Versão 1.1.1
16 de agosto de 2023
- Biblioteca comum:
- Remoção da dependência
multidexadicionada por engano de todos os módulos (#499).
- Remoção da dependência
- ExoPlayer:
- Correção de um problema em
PlaybackStatsListenerem quePlaybackStatsespúrios eram criados depois que a playlist era limpa. - Adição de mais campos ao registro de dados comuns do cliente de mídia (CMCD): formato de streaming (sf), tipo de stream (st), versão (v), taxa de bits máxima (tb), duração do objeto (d), taxa de transferência medida (mtp) e tipo de objeto (ot) (#8699).
- Correção de um problema em
- Áudio:
- Correção de um bug em que
Player.getState()nunca fazia a transição paraSTATE_ENDEDao reproduzir arquivos muito curtos (#538).
- Correção de um bug em que
- Descarregamento de áudio:
- Adiciona cabeçalhos de ID e de comentários Ogg ao fluxo de bits para reprodução de Opus descarregada de acordo com a RFC 7845.
- Vídeo:
- H.265/HEVC: correção da análise de informações de imagens de referência de curto e longo prazo do SPS.
- Texto:
- CEA-608: mude a lógica de truncamento de sugestões para considerar apenas o texto visível. Antes, o recuo e o deslocamento da tabulação eram incluídos ao limitar o comprimento da dica a 32 caracteres (o que estava tecnicamente correto de acordo com a especificação) (#11019).
- Extensão de IMA:
- O SDK do IMA foi movido para a versão 3.30.3.
- Sessão:
- Adicione um layout personalizado ao estado do controlador e forneça um getter para
acessá-lo. Quando o layout personalizado muda,
MediaController.Listener.onCustomLayoutChangedé chamado. Os apps que quiserem enviar layouts personalizados diferentes para controladores Media3 diferentes podem fazer isso emMediaSession.Callback.onConnectusando umAcceptedResultBuilderpara garantir que o layout personalizado esteja disponível para o controlador quando a conexão for concluída. - Correção de casos em que
MediaLibraryServiceLegacyStubenviava um erro para umResultque não oferecia suporte a isso, o que produzia umUnsupportedOperationException(#78). - Corrigimos a maneira como
PlayerWrappercria umVolumeProviderCompatdeterminandovolumeControlTypeusando comandos legados (COMMAND_ADJUST_DEVICE_VOLUMEeCOMMAND_SET_DEVICE_VOLUME) e novos comandos (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGSeCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS) (#554).
- Adicione um layout personalizado ao estado do controlador e forneça um getter para
acessá-lo. Quando o layout personalizado muda,
Versão 1.1.0
5 de julho de 2023
- Biblioteca comum:
- Adicione o motivo da supressão para uma rota de áudio inadequada e toque quando estiver pronto mude o motivo da supressão por tempo excessivo. (#15).
- Adicione comandos ao player:
COMMAND_GET_METADATACOMMAND_SET_PLAYLIST_METADATACOMMAND_SET_DEVICE_VOLUME_WITH_FLAGSCOMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- Adicione métodos sobrecarregados ao Player que permitem aos usuários especificar flags de volume:
void setDeviceVolume(int, int)void increaseDeviceVolume(int)void decreaseDeviceVolume(int)void setDeviceMuted(boolean, int)
- Adicione
BuilderparaDeviceInfoe descontinue o construtor atual. - Adicione
DeviceInfo.routingControllerIdpara especificar o ID do controlador de roteamento para reproduções remotas. - Adicione
Player.replaceMediaItem(s)como um atalho para adicionar e remover itens na mesma posição (#8046).
- ExoPlayer:
- Permitir que o ExoPlayer controle os métodos de volume do dispositivo somente se
a opção for ativada explicitamente. Use
ExoPlayer.Builder.setDeviceVolumeControlEnabledpara ter acesso a:getDeviceVolume()isDeviceMuted()setDeviceVolume(int)esetDeviceVolume(int, int)increaseDeviceVolume(int)eincreaseDeviceVolume(int, int)decreaseDeviceVolume(int)edecreaseDeviceVolume(int, int)
- Adicione
FilteringMediaSource, que permite filtrar os tipos de faixa disponíveis de umMediaSource. - Adição de suporte para incluir dados comuns do cliente de mídia (CMCD) nas solicitações
de saída dos formatos de streaming adaptável DASH, HLS e
SmoothStreaming. Os campos a seguir,
br,bl,cid,rtpesid, foram incorporados (#8699). Estrutura e métodos da API:- A geração de registros da CMCD está desativada por padrão. Use
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)para ativar. - Todas as chaves são ativadas por padrão. Substitua
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)para filtrar quais chaves são registradas. - Substitua
CmcdConfiguration.RequestConfig.getCustomData()para ativar a geração de registros de chaves personalizadas.
- A geração de registros da CMCD está desativada por padrão. Use
- Adicione outra ação ao manifesto da demonstração principal para facilitar
o início do app de demonstração com um arquivo
*.exolist.jsonpersonalizado (#439). - Adicione
ExoPlayer.setVideoEffects()para usarEffectdurante a reprodução de vídeo. - Atualize
SampleQueuepara armazenarsourceIdcomo umlongem vez de umint. Isso muda as assinaturas dos métodos públicosSampleQueue.sourceIdeSampleQueue.peekSourceId. - Adicione parâmetros aos métodos
shouldStartPlaybackeonTracksSelecteddeLoadControlque permitem associar esses métodos aoMediaPeriodrelevante. - Mude a assinatura de
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)adicionando um parâmetro de linha do tempo que contenha os períodos com os UIDs usados como chaves no mapa. Isso é necessário para evitar problemas de simultaneidade com transmissões ao vivo de vários períodos. - O uso de
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)eBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)foi descontinuado. Em vez disso, é possível chamar a variante dos métodos sem omediaTimeOffsetUs. Mesmo para as variantes descontinuadas, o deslocamento não é mais adicionado astartTimeUseendTimeUsdos objetosMediaLoadDataenviados pelo dispatcher. ExoTrackSelection.blacklistfoi renomeado comoexcludeTrack, eisBlacklistedfoi renomeado comoisTrackExcluded.- Correção do comportamento inconsistente entre
ExoPlayer.setMediaItem(s)eaddMediaItem(s)quando chamados em uma playlist vazia.
- Permitir que o ExoPlayer controle os métodos de volume do dispositivo somente se
a opção for ativada explicitamente. Use
- Transformador:
- O
Transformer.Builder.setMediaSourceFactory(MediaSource.Factory)foi removido. UseExoPlayerAssetLoader.Factory(MediaSource.Factory)eTransformer.Builder.setAssetLoaderFactory(AssetLoader.Factory). - O
Transformer.startTransformation(MediaItem, ParcelFileDescriptor)foi removido. - Correção de um bug em que a transformação podia ficar travada (resultando em um tempo limite do muxer) se o final do fluxo de vídeo fosse sinalizado no momento em que um frame de entrada estava pendente de processamento.
- Consulte codecs usando
MediaCodecListem vez de utilitáriosfindDecoder/EncoderForFormatpara ampliar o suporte. - Remova a configuração de frame B em
DefaultEncoderFactoryporque ela não funciona em alguns dispositivos.
- O
- Seleção de faixas:
- Adicionado
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange, que é desativado por padrão. Quando ativado, oDefaultTrackSelectoraciona uma nova seleção de faixa quando as funcionalidades do renderizador mudam.
- Adicionado
- Extratores:
- Áudio:
- Correção de um bug em que algumas reproduções falhavam quando o tunelamento estava ativado e
AudioProcessorsestavam ativos, por exemplo, para corte sem intervalos (#10847). - Encapsular frames Opus em pacotes Ogg em reproduções diretas (descarregamento).
- Extrapolar a posição atual durante o sono com programação de descarga.
- Adicione
Renderer.release()eAudioSink.release()para liberar os recursos no final do ciclo de vida do player. - Detectar mudanças nas funcionalidades de áudio em
DefaultAudioSink. Adicione um parâmetro obrigatóriocontextno construtor deDefaultAudioSink, com o qual oDefaultAudioSinkvai se registrar como listener doAudioCapabilitiesReceivere atualizar a propriedadeaudioCapabilitiesquando informado sobre uma mudança de recursos. - Propague as mudanças de recursos de áudio usando um novo evento
onAudioCapabilitiesChangedna interfaceAudioSink.Listenere uma nova interfaceRendererCapabilities.Listenerque aciona eventosonRendererCapabilitiesChanged. - Adicione
ChannelMixingAudioProcessorpara aplicar escalonamento/mixagem a canais de áudio. - Adicione o novo valor int
DISCARD_REASON_AUDIO_BYPASS_POSSIBLEaDecoderDiscardReasonspara descartar o decodificador de áudio quando o modo de bypass for possível após a mudança nas funcionalidades de áudio. - Adição de suporte à reprodução direta para DTS Express e DTS:X (#335).
- Correção de um bug em que algumas reproduções falhavam quando o tunelamento estava ativado e
- Vídeo:
- Faça o
MediaCodecVideoRendererinformar umVideoSizecom largura e altura 0 quando o renderizador estiver desativado.Player.Listener.onVideoSizeChangedé chamado de acordo quandoPlayer.getVideoSize()muda. Com essa mudança, o tamanho do vídeo do ExoPlayer comMediaCodecVideoRenderertem largura e altura 0 quandoPlayer.getCurrentTracksnão oferece suporte a vídeo ou o tamanho da faixa de vídeo compatível ainda não foi determinado.
- Faça o
- DRM:
- Reduzimos a visibilidade de vários métodos somente internos em
DefaultDrmSessionque não devem ser chamados de fora do pacote DRM:void onMediaDrmEvent(int)void provision()void onProvisionCompleted()onProvisionError(Exception, boolean)
- Reduzimos a visibilidade de vários métodos somente internos em
- Muxer:
- Adicione uma nova biblioteca de muxer que pode ser usada para criar um arquivo de contêiner MP4.
- Extensão de IMA:
- Ative transmissões DASH ao vivo de vários períodos para a DAI. A implementação atual ainda não permite buscar em transmissões ao vivo (#10912).
- Correção de um bug em que um novo grupo de anúncios é inserido em transmissões ao vivo porque a posição calculada do conteúdo em linhas do tempo consecutivas varia um pouco.
- Sessão:
- Adicione o método auxiliar
MediaSession.getControllerForCurrentRequestpara receber informações sobre o controlador que está chamando um métodoPlayer. - Adicione
androidx.media3.session.MediaButtonReceiverpara permitir que os apps implementem a retomada da reprodução com eventos de botão de mídia enviados por, por exemplo, um fone de ouvido Bluetooth (#167). - Adicione a implementação padrão a
MediaSession.Callback.onAddMediaItemspara permitir que oMediaItemssolicitado seja transmitido paraPlayerse tiverLocalConfiguration(por exemplo, URI) (#282). - Adição dos botões de comando "Ir para o anterior" e "Ir para o próximo" na visualização compacta de notificação de mídia por padrão para o Android 12 e versões anteriores (#410).
- Adicione a implementação padrão a
MediaSession.Callback.onAddMediaItemspara permitir que oMediaItemssolicitado seja transmitido paraPlayerse tiverLocalConfiguration(por exemplo, URI) (#282). - Adição dos botões de comando "Ir para o anterior" e "Ir para o próximo" na visualização compacta de notificação de mídia por padrão para o Android 12 e versões anteriores (#410).
- Adicione o método auxiliar
- Interface:
- Adicione os métodos Util
shouldShowPlayButtonehandlePlayPauseButtonActionpara gravar elementos de interface personalizados com um botão de reproduzir/pausar.
- Adicione os métodos Util
- Extensão RTSP:
- Extensão DASH:
- Remova o ajuste de tempo da mídia de
MediaLoadData.startTimeMseMediaLoadData.endTimeMspara transmissões DASH de vários períodos. - Foi corrigido um bug em que o reparo de uma fonte de mídia Dash ao vivo de vários períodos
produzia um
IndexOutOfBoundsException(#10838).
- Remova o ajuste de tempo da mídia de
- Extensão HLS:
- Adicione
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)para definir um tempo limite para a espera da thread de carregamento pela inicialização doTimestampAdjuster. Se a inicialização não for concluída antes do tempo limite, umaPlaybackExceptionserá gerada para evitar que a reprodução fique travada indefinidamente. O tempo limite é definido como zero por padrão (#323).
- Adicione
- Utilitários de teste:
- Verifique se o esquema de URI não diferencia maiúsculas de minúsculas em
DataSourceContractTest.
- Verifique se o esquema de URI não diferencia maiúsculas de minúsculas em
- Símbolos descontinuados foram removidos:
- Os construtores
DefaultAudioSinkforam removidos. UseDefaultAudioSink.Builderem vez disso. - Remova
HlsMasterPlayliste useHlsMultivariantPlaylist. - O
Player.stop(boolean)foi removido. UsePlayer.stop()ePlayer.clearMediaItems()(seresetfortrue). - Remova dois construtores
SimpleCachedescontinuados e use um construtor não descontinuado que receba umDatabaseProviderpara melhorar o desempenho. - O construtor
DefaultBandwidthMeterfoi removido. UseDefaultBandwidthMeter.Builder. - Os construtores
DefaultDrmSessionManagerforam removidos. UseDefaultDrmSessionManager.Builder. - Remova dois construtores
HttpDataSource.InvalidResponseCodeExceptionobsoletos e use um construtor não obsoleto que aceite campos adicionais(cause,responseBody) para melhorar o registro de erros. - Remova
DownloadHelper.forProgressive,DownloadHelper.forHls,DownloadHelper.forDasheDownloadHelper.forSmoothStreaming. UseDownloadHelper.forMediaItem. - Remova o construtor
DownloadServicesuspenso e use um construtor não suspenso que inclua a opção de fornecer um parâmetrochannelDescriptionResourceId. - Remova as constantes de string descontinuadas para Charsets (
ASCII_NAME,UTF8_NAME,ISO88591_NAME,UTF16_NAMEeUTF16LE_NAME). Use os Charsets do Kotlin do pacotekotlin.text,java.nio.charset.StandardCharsetsoucom.google.common.base.Charsets. - Remova o construtor
WorkManagerSchedulerdescontinuado e use um construtor não descontinuado que inclua a opção de fornecer um parâmetroContext. - Remova os métodos obsoletos
createVideoSampleFormat,createAudioSampleFormat,createContainerFormatecreateSampleFormat, que eram usados para instanciar a classeFormat. Em vez disso, useFormat.Builderpara criar instâncias deFormat. - Remova os métodos obsoletos
copyWithMaxInputSize,copyWithSubsampleOffsetUs,copyWithLabel,copyWithManifestFormatInfo,copyWithGaplessInfo,copyWithFrameRate,copyWithDrmInitData,copyWithMetadata,copyWithBitrateecopyWithVideoSize. UseFormat.buildUpon()e métodos setter. - Remoção do obsoleto
ExoPlayer.retry(). Useprepare() - Remoção do construtor
DefaultTrackSelectorde zero argumentos obsoleto. UseDefaultTrackSelector(Context). - Remoção do construtor
OfflineLicenseHelperobsoleto. UseOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher). - Remova o construtor
DownloadManagerdescontinuado e use o construtor que usa umExecutor. - Remoção dos construtores
Cueobsoletos. UseCue.Builder. - Remoção do construtor
OfflineLicenseHelperobsoleto. UseOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher). - Remoção de quatro métodos
AnalyticsListenerdescontinuados:onDecoderEnabled, useonAudioEnablede/ouonVideoEnabled.onDecoderInitialized, useonAudioDecoderInitializede/ouonVideoDecoderInitialized.onDecoderInputFormatChanged, useonAudioInputFormatChangede/ouonVideoInputFormatChanged.onDecoderDisabled, useonAudioDisablede/ouonVideoDisabled.
- Remova os obsoletos
Player.Listener.onSeekProcessedeAnalyticsListener.onSeekProcessed. UseonPositionDiscontinuitycomDISCONTINUITY_REASON_SEEK. - Remova
ExoPlayer.setHandleWakeLock(boolean)e usesetWakeMode(int)em vez disso. - Remoção do obsoleto
DefaultLoadControl.Builder.createDefaultLoadControl(). Usebuild() - Remoção do obsoleto
MediaItem.PlaybackProperties. UseMediaItem.LocalConfiguration. O campo descontinuadoMediaItem.playbackPropertiesagora é do tipoMediaItem.LocalConfiguration.
- Os construtores
Versão 1.1.0-rc01
21 de junho de 2023
Use a versão estável 1.1.0.
Versão 1.1.0-beta01
7 de junho de 2023
Use a versão estável 1.1.0.
Versão 1.1.0-alpha01
10 de maio de 2023
Use a versão estável 1.1.0.
Versão 1.0.0
Versão 1.0.2
18 de maio de 2023
Lançamento de androidx.media3:media3-*:1.0.2.
A versão 1.2.0 contém estas confirmações.
Ela corresponde à versão do ExoPlayer 2.18.7.
Esta versão contém as seguintes mudanças desde a versão 1.0.1:
- Biblioteca principal:
- Adicione
Buffer.isLastSample()que indica seBuffercontém a flagC.BUFFER_FLAG_LAST_SAMPLE. - Correção do problema em que o último frame não era renderizado se a última amostra com frames fosse removida da fila sem ler a amostra de "fim do fluxo". (#11079).
- Adicione
- Extratores:
- Correção da análise de H.265 SPS em arquivos MPEG-TS reutilizando a lógica de análise já usada pelos extratores RTSP e MP4 (#303).
- Texto:
- SSA: foi adicionado suporte para arquivos UTF-16 que começarem com uma marca de ordem de byte (#319).
- Sessão:
- Correção de um problema em que o
MediaControllernão atualiza os comandos disponíveis quando conectado a umMediaSessionCompatlegado que atualiza as ações. - Correção de um bug que impedia o
MediaLibraryServicede retornar nulo para uma chamada da interface do sistema paraCallback.onGetLibraryRootcomparams.isRecent == truena API 30 (#355). - Correção do vazamento de memória de
MediaSessionServiceouMediaLibraryService(#346). - Correção de um bug em que uma atualização combinada de
Timelinee posição em umMediaSessionpode fazer com que umMediaControllergere umIllegalStateException.
- Correção de um problema em que o
Versão 1.0.1
18 de abril de 2023
Lançamento de androidx.media3:media3-*:1.0.1.
A versão 1.0.1 contém estas confirmações.
Ela corresponde à versão do ExoPlayer 2.18.6.
- Biblioteca principal:
- A substituição da transmissão ao vivo de destino é redefinida ao buscar a posição padrão (#11051).
- Correção de um bug em que fluxos de amostra vazios na mídia podiam travar a reprodução.
- Sessão:
- Foi corrigido um bug em que vários itens de fila idênticos publicados por um
MediaSessionCompatlegado resultavam em uma exceção emMediaController(#290). - Adição do encaminhamento ausente de
MediaSession.broadcastCustomCommandpara oMediaControllerCompat.Callback.onSessionEventlegado (#293). - Correção de um bug em que a chamada de
MediaSession.setPlayernão atualizava os comandos disponíveis. - Correção de um problema em que as instâncias
TrackSelectionOverrideenviadas de umMediaControllereram ignoradas se fizessem referência a um grupo comFormat.metadata(#296). - Correção de um problema em que
Player.COMMAND_GET_CURRENT_MEDIA_ITEMprecisa estar disponível para acessar metadados usando oMediaSessionCompatlegado. - Correção de um problema em que instâncias de
MediaSessionem uma linha de execução em segundo plano causavam falhas quando usadas emMediaSessionService(#318). - Correção de um problema em que um receptor de botão de mídia era declarado pela biblioteca sem que o app tivesse essa intenção (#314, link em inglês).
- Foi corrigido um bug em que vários itens de fila idênticos publicados por um
- DASH:
- Correção do processamento de linhas do tempo de segmentos vazias (#11014).
- RTSP:
- Tente novamente com TCP se a configuração do RTSP com UDP falhar com o erro 461 UnsupportedTransport (#11069).
Versão 1.0.0
22 de março de 2023
Lançamento de androidx.media3:media3-*:1.0.0.
A versão 1.0.0 contém estas confirmações.
Ela corresponde à versão do ExoPlayer 2.18.5.
Não há mudanças desde a versão 1.0.0-rc02.
Versão 1.0.0-rc02
2 de março de 2023
Lançamento de androidx.media3:media3-*:1.0.0-rc02.
A versão 1.0.0-rc02 contém estas confirmações.
Ela corresponde à versão do ExoPlayer 2.18.4.
- Biblioteca principal:
- Downloads:
- Configure a diferença máxima do horário de início de dois segmentos a serem
mesclados em
SegmentDownloadere subclasses (#248).
- Configure a diferença máxima do horário de início de dois segmentos a serem
mesclados em
- Áudio:
- Vídeo:
- Mapeie o formato HEVC HDR10 para
HEVCProfileMain10HDR10em vez deHEVCProfileMain10. - Adicionamos uma solução alternativa para um problema de dispositivo no Chromecast com Google TV e no Lenovo M10 FHD Plus que faz com que streams AVC de 60 fps sejam marcados como não compatíveis (#10898).
- Correção de problemas de desempenho de liberação de frames ao reproduzir mídia com uma taxa muito maior do que a taxa de atualização da tela.
- Mapeie o formato HEVC HDR10 para
- Transmitir:
- Correção do
STATE_IDLEtransitório ao fazer a transição entre itens de mídia (#245).
- Correção do
- RTSP:
- Captura a IllegalArgumentException gerada na análise de RTSP inválido Descreve mensagens de resposta (#10971).
- Sessão:
- Correção de um bug em que o botão de reprodução/pausa da notificação não era atualizado com o estado do player (#192).
- Extensão de IMA:
- Correção de um bug que impedia o início de streams da DAI sem anúncios porque o primeiro (e, no caso sem anúncios, o único) evento
LOADEDnão era recebido.
- Correção de um bug que impedia o início de streams da DAI sem anúncios porque o primeiro (e, no caso sem anúncios, o único) evento
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.seekTopara 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).
ConcatenatingMediaSource2foi adicionado, o que permite combinar vários itens de mídia em uma única janela (247, link em inglês).
- Ajustar a lógica de ordem do decodificador do renderizador para manter as
preferências do
- Extratores:
- Uma
ParserExceptioné gerada em vez deNullPointerExceptionse 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).
- Uma
- Áudio:
- Use a taxa de bits do formato de áudio compactado para calcular o tamanho mínimo do buffer
para
AudioTrackem reproduções diretas (passagem).
- Use a taxa de bits do formato de áudio compactado para calcular o tamanho mínimo do buffer
para
- Texto:
- O
TextRenderer, que transmitia um índice inválido (negativo) paraSubtitle.getEventTimese 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.
- O
- Metadados:
- Análise de diversos valores separados por nulo de frames ID3, conforme permitido pelo ID3 v2.4.
MediaMetadata.mediaTypefoi adicionado para indicar o tipo de conteúdo ou de pasta descrito pelos metadados.MediaMetadata.folderTypefoi substituído porMediaMetadata.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
PlayerViewao usar um layout da direita para a esquerda (RTL, na sigla em inglês) (227, link em inglês).
- O
- Sessão:
- O abstrato
SimpleBasePlayerfoi adicionado para ajudar a implementar a interfacePlayerpara players personalizados. - O método auxiliar
SessionTokenfoi adicionado para converter o token de sessão da plataforma em Media3 (171, link em inglês). - Uso de
onMediaMetadataChangedpara 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()doDefaultMediaNotificationProvidere usa listas imutáveis para maior clareza (216, link em inglês). - O listener de callback
onSetMediaItemsfoi adicionado para fornecer meios de modificar/definir a listaMediaItem, 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).
- O abstrato
- Metadados:
- Análise de diversos valores separados por nulo de frames ID3, conforme permitido pelo ID3 v2.4.
MediaMetadata.mediaTypefoi adicionado para indicar o tipo de conteúdo ou de pasta descrito pelos metadados.MediaMetadata.folderTypefoi substituído porMediaMetadata.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
ImaServerSideAdInsertionMediaSourcena linha de execução do app para evitar problemas. - Foi adicionada uma propriedade
focusSkipButtonWhenAvailableaoImaServerSideAdInsertionMediaSource.AdsLoader.Builderpara 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()aoImaServerSideAdInsertionMediaSource.AdsLoaderpara solicitar de maneira programática o foco no botão "Pular". - O SDK do IMA foi movido para a versão 3.29.0.
- O listener do player foi removido do
- 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.isTunnelingEnabledfoi adicionado para verificar se o encapsulamento está ativado para as faixas selecionadas no momento (#2518). - O
WrappingMediaSourcefoi adicionado para simplificar o encapsulamento de um únicoMediaSource(#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
onMediaItemTransitionausente é enviado ao chamarseekToNextouseekToPreviousem 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.
- O
- Build:
- O
compileSdkVersionmínimo foi aplicado para evitar erros de compilação (#10684). - Evite publicar o bloco quando estiver incluído em outro build do Gradle.
- O
- 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
ProgressiveDownloadercausado por download e reprodução simultâneos com o mesmoPriorityTaskManager(#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).
- Correção de um possível loop infinito em
- Vídeo:
- Caso não haja suporte para a tela, um decodificador alternativo para o Dolby Vision será utilizado (#9794).
- Áudio:
SingleThreadExecutorserá usado para liberar instâncias deAudioTracke evitar erros de OutOfMemory ao liberar vários reprodutores ao mesmo tempo (#10057).- Novo
AudioOffloadListener.onExperimentalOffloadedPlaybackpara o estado de descarga do AudioTrack (#134). - O
AudioTrackBufferSizeProviderfoi transformado em uma interface pública. - Novo
ExoPlayer.setPreferredAudioDevicepara definir o dispositivo de saída de áudio preferencial (#135). - O
androidx.media3.exoplayer.audio.AudioProcessorfoi renomeado comoandroidx.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,
MetadataRendererpode ser configurado para renderizar metadados assim que eles estiverem disponíveis. Foi criada uma instância comMetadataRenderer(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.
- Agora,
- 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 openedao 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.presentationTimeOffsetdos manifestos (#10460).
- Análise de
- Interface:
- Uso de substituições atuais do reprodutor como predefinição em
TrackSelectionDialogBuilder(#10429).
- Uso de substituições atuais do reprodutor como predefinição em
- Sessão:
- Os comandos serão sempre executados na ordem correta, mesmo se alguns precisarem de resolução assíncrona (#85).
DefaultMediaNotificationProvider.Builderfoi adicionado para criar instâncias deDefaultMediaNotificationProvider. 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étodoDefaultMediaNotificationProvider.setSmallIcon(int)para definir o ícone pequeno de notificações (#104).- Comandos enviados antes de
MediaController.release()não são descartados (#99). SimpleBitmapLoaderpode carregar bitmaps de URIsfile://(#108).- A declaração que impede que
MediaControllerbusque 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
DefaultNotificationProviderfoi 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:
- 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 identificarCastPlayerao controlar a reprodução com umMediaController(#142).
- Implementação de
- Transformador:
- Novo timer de watchdog do multiplexador para detectar quando a geração de uma amostra de saída é muito lenta.
- Símbolos descontinuados foram removidos:
- O
Transformer.Builder.setOutputMimeType(String)foi removido. Esse recurso foi removido. O tipo MIME sempre será MP4 quando o multiplexador padrão for usado.
- O
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
ShuffleOrdercomExoPlayer.setShuffleOrderresulta em uma chamada paraPlayer.Listener#onTimelineChangedcomreason=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
setDataSourceFactoryemDefaultMediaSourceFactory, que não funcionava em alguns casos (#116).
- Garanta que mudar a
- Extratores:
- 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
playWhenReadyemLeanbackAdapter(10420).
- Detecte mudanças no
- Transmitir:
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 comExoPlayer.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.
nulleMediaSource.Factory.setDrmSessionManagerProviderforam renomeados comoMediaSource.Factory.setLoadErrorHandlingPolicy. As instâncias deDefaultDrmSessionManagerProvidereDefaultLoadErrorHandlingPolicypodem ser explicitamente transmitidas, se necessário.MediaItem.RequestMetadatafoi adicionado para representar os metadados necessários para reproduzir a mídia quandoLocalConfigurationnão for conhecido.MediaMetadata.mediaUrltambém foi removido, porque agora ele está incluído emRequestMetadata.- Adicionamos
Player.Command.COMMAND_SET_MEDIA_ITEMpara que os jogadores possam permitir a configuração de um único item.
- Suporte adicionado ao diagnóstico da plataforma Android pelo
- Seleção de faixas:
- A classe
TrackSelectionOverridesfoi nivelada emTrackSelectionParameters, eTrackSelectionOverridefoi promovida para uma classe de nível superior. TracksInfofoi renomeado comoTracks, eTracksInfo.TrackGroupInfofoi renomeado comoTracks.Group.Player.getCurrentTracksInfoePlayer.Listener.onTracksInfoChangedtambém foram renomeados comoPlayer.getCurrentTracksePlayer.Listener.onTracksChanged. Isso inclui o "cancelamento da descontinuação" do nome do métodoPlayer.Listener.onTracksChanged, mas com diferentes tipos de parâmetro.DefaultTrackSelector.buildUponParameterseDefaultTrackSelector.Parameters.buildUponforam alterados para retornarDefaultTrackSelector.Parameters.Builderem vez doDefaultTrackSelector.ParametersBuilderdescontinuado.- Adicionado
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities, que é ativado por padrão. Quando ativado, oDefaultTrackSelectorprefere faixas de áudio cuja contagem de canais não exceda aos recursos de saída do dispositivo. Em dispositivos portáteis, oDefaultTrackSelectortem 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, oDefaultTrackSelectormonitora as mudanças nas propriedades Spatializer e aciona uma nova seleção de faixas. Dispositivos com um Modo de interface detelevisionnão têm essas restrições, e o formato com a maior contagem de canais vai ter preferência.televisionPara ativar esse recurso, a instânciaDefaultTrackSelectorprecisa ser criada com umContext.
- A classe
- Vídeo:
DummySurfacefoi renomeado comoPlaceholderSurface.- 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 deandroid.media.AudioAttributespara uma nova classe wrapperAudioAttributesV21. 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
AudioTrackcom a máscara de canalAudioFormat.CHANNEL_OUT_7POINT1POINT4se 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 retornarCueGroupem vez deList<Cue>.- SSA: adicionado suporte à configuração de estilo
OutlineColourquandoBorderStyle == 3, ou seja, aOutlineColourdefine 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
RawCcExtractorfoi removido. Ele era usado apenas para processar um formato de legenda interno do Google.
- Extratores:
- Interface:
- Corrigida a entrega de eventos para os
OnClickListeners definidos emPlayerViewcasouseController=false(#9605). Também foi corrigida a entrega de eventos aoOnLongClickListenerpara todas as configurações de visualização. - Corrigido tratamento incorreto de uma sequência de eventos de toque que saem dos limites da
PlayerViewantes daACTION_UPcomo um clique (#9861). - Corrigido problema de acessibilidade da
PlayerViewem que o toque podia alternar a reprodução em vez de ocultar os controles (#8627). TrackSelectionVieweTrackSelectionDialogBuilderforam reescritos para trabalhar com a interfacePlayerem vez deExoPlayer. Isso permite que as visualizações sejam usadas com outras implementações doPlayere 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
PlayerViewe mantenha uma faixa de texto forçada adequada selecionada, se a opção "None" estiver selecionada (#9432).
- Corrigida a entrega de eventos para os
- DASH:
- Analisada contagem de canais dos elementos de
AudioChannelConfigurationdo DTS. Isso reativa a passagem de áudio para fluxos do DTS (#10159). - A transmissão de
nullparaDashMediaSource.Factory.setCompositeSequenceableLoaderFactoryfoi desativada. As instâncias deDefaultCompositeSequenceableLoaderFactorypodem ser transmitidas explicitamente, se necessário.
- Analisada contagem de canais dos elementos de
- 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
nullparaHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory,HlsMediaSource.Factory.setPlaylistParserFactoryeHlsMediaSource.Factory.setPlaylistTrackerFactoryfoi desativada. Instâncias deDefaultCompositeSequenceableLoaderFactoryeDefaultHlsPlaylistParserFactoryou uma referência aDefaultHlsPlaylistTracker.FACTORYpodem ser transmitidas explicitamente, se necessário.
- Smooth Streaming:
- A transmissão de
nullparaSsMediaSource.Factory.setCompositeSequenceableLoaderFactoryfoi desativada. As instâncias deDefaultCompositeSequenceableLoaderFactorypodem ser transmitidas explicitamente, se necessário.
- A transmissão de
- 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:
DummyDataSourcefoi renomeado comoPlaceholderDataSource.- Foi criada uma solução alternativa de processamento para a interrupção OkHttp.
- Sessão:
MediaSession.MediaItemFillerfoi substituído porMediaSession.Callback.onAddMediaItemspara permitir a resolução assíncrona de solicitações.- Suporte aos métodos
setMediaItems(s)quando oMediaControllerse conecta a uma sessão de mídia legada. MediaController.setMediaUrieMediaSession.Callback.onSetMediaUriforam removidos. A mesma funcionalidade pode ser encontrada emMediaController.setMediaItemeMediaSession.Callback.onAddMediaItems.- Encaminhamento de chamadas do
MediaControllerlegadas para reproduzir mídia paraMediaSession.Callback.onAddMediaItemsem vez deonSetMediaUri. MediaNotification.ProvidereDefaultMediaNotificationProviderforam adicionados para fornecer personalização das notificações.BitmapLoadereSimpleBitmapLoaderforam 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.MediaSessionCallbackfoi renomeado comoMediaSession.Callback,MediaLibrarySession.MediaLibrarySessionCallbackcomoMediaLibrarySession.Callback, eMediaSession.Builder.setSessionCallbackcomosetCallback.- 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
MediaControllerImplBaseapó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).
- Atualizada versão do CMake para
- Símbolos descontinuados foram removidos:
- Remoção de
Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray). UsePlayer.Listener.onTracksChanged(Tracks). - REmoção de
Player.getCurrentTrackGroupsePlayer.getCurrentTrackSelections. UsePlayer.getCurrentTracks. Também é possível continuar usandoExoPlayer.getCurrentTrackGroupseExoPlayer.getCurrentTrackSelections, embora esses métodos permaneçam descontinuados. - As constantes
DownloadHelper,DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORTeDEFAULT_TRACK_SELECTOR_PARAMETERSforam removidas. UsegetDefaultTrackSelectorParameters(Context)quando possível. Caso contrário, useDEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_CONTEXT. - Construtor
DefaultTrackSelector(ExoTrackSelection.Factory)foi removido. UseDefaultTrackSelector(Context, ExoTrackSelection.Factory). Transformer.Builder.setContextfoi removido. OContextprecisa ser transmitido para o construtorTransformer.Builder.
- Remoção de
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.setTrackIdeMediaItem.SubtitleConfiguration.Builder.setIdfoi corrigida para priorizar o campoSubtitleConfiguratione voltar ao valor daFactoryse o campo não estiver definido (#10016, link em inglês).
- A interação de
- 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 daDefaultRenderersFactoryque substituem os métodosbuildVideoRenderers()oubuildAudioRenderers()possam acessar a fábrica do adaptador de codec e a transmitir para instânciasMediaCodecRendererque eles criam. - Propague os campos de cabeçalho ICY
nameegenreparaMediaMetadata.stationeMediaMetadata.genre, respectivamente. Assim, eles chegam ao app viaPlayer.Listener.onMediaMetadataChanged()(#9677, link em inglês). - As chaves nulas foram removidas de
DefaultHttpDataSource#getResponseHeaders. - Quando a criação de uma instância do
MediaCodecfalhar, 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 doMediaCodec(#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#inputBufferCountfoi renomeado comoqueuedInputBufferCount.- Os
SimpleExoPlayer.renderersagora são particulares. Os renderizadores podem ser acessados usando oExoPlayer.getRenderer. - Atualização de alguns valores constantes das
AnalyticsListener.EventFlagspara corresponder aos valores nasPlayer.EventFlags. - O
AnalyticsCollectorfoi dividido em uma interface e implementação padrão para permitir que ele seja removido pelo R8 se um app não precisar dele.
- Adicione o método protegido
- 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 umaTrackGroupArray. OsTrackGroups sempre podem ser distinguíveis definindo umidno construtor doTrackGroup. 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
AdaptiveTrackSelectionmudou 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
AudioCapabilitiesforam alteradas para exigir a transmissão explícita deAudioCapabilities.DEFAULT_AUDIO_CAPABILITIESem vez denull. - A personalização do cálculo do tamanho do buffer da
AudioTrackagora pode ser feita injetando umAudioTrackBufferSizeProvidernoDefaultAudioSink(8891, link em inglês). - Tente criar a
AudioTracknovamente se o tamanho do buffer solicitado for > 1 MB (9712, link em inglês).
- Extratores:
- Texto:
- Um campo
MediaItem.SubtitleConfiguration.id, que é propagado para o campoFormat.idda 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
Cea708Decodernão pode ler mais do que o tamanho declarado de um bloco de serviços.
- Um campo
- DRM:
- O
playbackLooperfoi removido deDrmSessionManager.(pre)acquireSessionQuando umDrmSessionManageré usado por um app em umaMediaSourcepersonalizada, oplaybackLooperprecisa ser transmitido paraDrmSessionManager.setPlayer.
- O
- 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
AdPlaybackStatepara 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:
- 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
mainnão é mais interpretado comoC.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.Locationrelativos (#9939, link em inglês).
- As propriedades essenciais e complementares analisadas foram adicionadas ao arquivo
- 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).
- O
- RTSP:
- Uma API cliente é oferecida para substituir a
SocketFactoryusada 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).
- Uma API cliente é oferecida para substituir a
- Transformador:
- A versão mínima necessária da API aumentou para 21.
- A
TransformationExceptionagora é usada para descrever erros que ocorrem durante uma transformação. - A
TransformationRequestfoi 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.getProgressao 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
MediaSessionConnectoragora limpa a playlist ao parar. Os apps que querem manter a playlist retida podem chamarsetClearMediaItemsOnStop(false)no conector.
- Por padrão, o
- Extensão do Google Cast:
- Extensão FFmpeg:
- O
build_ffmpeg.shagora depende dos utilitários de agrupamento do LLVM em vez dos utilitários do GNU (#9933, link em inglês).
- O
- 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 doplay-services-cast-frameworknão são compatíveis com apps destinados ao Android 12 e vão falhar com umaIllegalArgumentExceptionao criarPendingIntents (#9528, link em inglês).
- Upgrade da extensão do Google Cast para depender do
- Símbolos descontinuados foram removidos:
- O
Player.EventListenerfoi removido. UsePlayer.Listener. MediaSourceFactory#setDrmSessionManager,MediaSourceFactory#setDrmHttpDataSourceFactoryeMediaSourceFactory#setDrmUserAgentforam removidos. UseMediaSourceFactory#setDrmSessionManagerProvider.- O
MediaSourceFactory#setStreamKeysfoi removido. UseMediaItem.Builder#setStreamKeys - O
MediaSourceFactory#createMediaSource(Uri)foi removido. UseMediaSourceFactory#createMediaSource(MediaItem) - O
setTagfoi removido deDashMediaSource,HlsMediaSourceeSsMediaSource. UseMediaItem.Builder#setTag. - O
DashMediaSource#setLivePresentationDelayMs(long, boolean)foi removido. UseMediaItem.Builder#setLiveConfigurationeMediaItem.LiveConfiguration.Builder#setTargetOffsetMspara substituir o manifesto ouDashMediaSource#setFallbackTargetLiveOffsetMspara fornecer um valor de substituição. - O
(Simple)ExoPlayer.setThrowsWhenUsingWrongThreadfoi removido. Não é mais possível desativar a aplicação da linha de execução. ActionFileeActionFileUpgradeUtilforam removidos. Use o ExoPlayer 2.16.1 ou anterior para usarActionFileUpgradeUtila fim de mesclar arquivos de ações legadas noDefaultDownloadIndex.- A
ProgressiveMediaSource#setExtractorsFactoryfoi removida. Use o construtorProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory). ProgressiveMediaSource.Factory#setTageProgressiveMediaSource.Factory#setCustomCacheKeyforam removidos. UseMediaItem.Builder#setTageMediaItem.Builder#setCustomCacheKey.- Os construtores
DefaultRenderersFactory(Context, @ExtensionRendererMode int)eDefaultRenderersFactory(Context, @ExtensionRendererMode int, long)foram removidos. Use os construtoresDefaultRenderersFactory(Context),DefaultRenderersFactory#setExtensionRendererModeeDefaultRenderersFactory#setAllowedVideoJoiningTimeMs. - Todos os construtores
CronetDataSourcepúblicos foram removidos. UseCronetDataSource.Factory
- O
- Mude o
IntDefspara 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 pacotecom.google.android.exoplayer2.ext.flac)@FlacExtractor.Flags(no pacotecom.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
Playerque 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.