Media3
Atualização mais recente | Versão estável | Versão candidata a lançamento | Versão Beta | Versão Alfa |
---|---|---|---|---|
20 de dezembro de 2024 | 1.5.1 | - | - | 1.6.0-alpha01 |
Declarar dependências
Para adicionar uma dependência da Media3, adicione o repositório Maven do Google ao seu projeto. Leia Repositório Maven do Google para ver mais informações.
Adicione as dependências dos artefatos necessários no arquivo build.gradle
para
seu app ou módulo:
Groovy
dependencies { def media3_version = "1.4.1" // For media playback using ExoPlayer implementation "androidx.media3:media3-exoplayer:$media3_version" // For DASH playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-dash:$media3_version" // For HLS playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-hls:$media3_version" // For SmoothStreaming playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-smoothstreaming:$media3_version" // For RTSP playback support with ExoPlayer implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version" // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation "androidx.media3:media3-exoplayer-midi:$media3_version" // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation "androidx.media3:media3-exoplayer-ima:$media3_version" // For loading data using the Cronet network stack implementation "androidx.media3:media3-datasource-cronet:$media3_version" // For loading data using the OkHttp network stack implementation "androidx.media3:media3-datasource-okhttp:$media3_version" // For loading data using librtmp implementation "androidx.media3:media3-datasource-rtmp:$media3_version" // For building media playback UIs implementation "androidx.media3:media3-ui:$media3_version" // For building media playback UIs for Android TV using the Jetpack Leanback library implementation "androidx.media3:media3-ui-leanback:$media3_version" // For exposing and controlling media sessions implementation "androidx.media3:media3-session:$media3_version" // For extracting data from media containers implementation "androidx.media3:media3-extractor:$media3_version" // For integrating with Cast implementation "androidx.media3:media3-cast:$media3_version" // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation "androidx.media3:media3-exoplayer-workmanager:$media3_version" // For transforming media files implementation "androidx.media3:media3-transformer:$media3_version" // For applying effects on video frames implementation "androidx.media3:media3-effect:$media3_version" // For muxing media files implementation "androidx.media3:media3-muxer:$media3_version" // Utilities for testing media components (including ExoPlayer components) implementation "androidx.media3:media3-test-utils:$media3_version" // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation "androidx.media3:media3-test-utils-robolectric:$media3_version" // Common functionality for reading and writing media containers implementation "androidx.media3:media3-container:$media3_version" // Common functionality for media database components implementation "androidx.media3:media3-database:$media3_version" // Common functionality for media decoders implementation "androidx.media3:media3-decoder:$media3_version" // Common functionality for loading data implementation "androidx.media3:media3-datasource:$media3_version" // Common functionality used across multiple media libraries implementation "androidx.media3:media3-common:$media3_version" // Common Kotlin-specific functionality implementation "androidx.media3:media3-common-ktx:$media3_version" }
Kotlin
dependencies { val media3_version = "1.4.1" // For media playback using ExoPlayer implementation("androidx.media3:media3-exoplayer:$media3_version") // For DASH playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-dash:$media3_version") // For HLS playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-hls:$media3_version") // For SmoothStreaming playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-smoothstreaming:$media3_version") // For RTSP playback support with ExoPlayer implementation("androidx.media3:media3-exoplayer-rtsp:$media3_version") // For MIDI playback support with ExoPlayer (see additional dependency requirements in // https://github.com/androidx/media/blob/release/libraries/decoder_midi/README.md) implementation("androidx.media3:media3-exoplayer-midi:$media3_version") // For ad insertion using the Interactive Media Ads SDK with ExoPlayer implementation("androidx.media3:media3-exoplayer-ima:$media3_version") // For loading data using the Cronet network stack implementation("androidx.media3:media3-datasource-cronet:$media3_version") // For loading data using the OkHttp network stack implementation("androidx.media3:media3-datasource-okhttp:$media3_version") // For loading data using librtmp implementation("androidx.media3:media3-datasource-rtmp:$media3_version") // For building media playback UIs implementation("androidx.media3:media3-ui:$media3_version") // For building media playback UIs for Android TV using the Jetpack Leanback library implementation("androidx.media3:media3-ui-leanback:$media3_version") // For exposing and controlling media sessions implementation("androidx.media3:media3-session:$media3_version") // For extracting data from media containers implementation("androidx.media3:media3-extractor:$media3_version") // For integrating with Cast implementation("androidx.media3:media3-cast:$media3_version") // For scheduling background operations using Jetpack Work's WorkManager with ExoPlayer implementation("androidx.media3:media3-exoplayer-workmanager:$media3_version") // For transforming media files implementation("androidx.media3:media3-transformer:$media3_version") // For applying effects on video frames implementation("androidx.media3:media3-effect:$media3_version") // For muxing media files implementation("androidx.media3:media3-muxer:$media3_version") // Utilities for testing media components (including ExoPlayer components) implementation("androidx.media3:media3-test-utils:$media3_version") // Utilities for testing media components (including ExoPlayer components) via Robolectric implementation("androidx.media3:media3-test-utils-robolectric:$media3_version") // Common functionality for reading and writing media containers implementation("androidx.media3:media3-container:$media3_version") // Common functionality for media database components implementation("androidx.media3:media3-database:$media3_version") // Common functionality for media decoders implementation("androidx.media3:media3-decoder:$media3_version") // Common functionality for loading data implementation("androidx.media3:media3-datasource:$media3_version") // Common functionality used across multiple media libraries implementation("androidx.media3:media3-common:$media3_version") // Common Kotlin-specific functionality implementation("androidx.media3:media3-common-ktx:$media3_version") }
Para ver mais informações sobre dependências, consulte Adicionar dependências de build.
Feedback
Seu feedback ajuda a melhorar o Jetpack. Você pode usar o Issue Tracker da Media3 (link em inglês) para ver respostas a perguntas, problemas conhecidos e solicitações de recursos e relatar novos problemas.
Versão 1.6.0
Versão 1.6.0-alpha01
20 de dezembro de 2024
Lançamento de androidx.media3:media3-*:1.6.0-alpha01
.
A versão 1.6.0-alpha01 contém estas confirmações.
- Biblioteca comum:
- O método
Format.toBundle(boolean excludeMetadata)
foi removido. UseFormat.toBundle()
. - Adicione
AudioManagerCompat
eAudioFocusRequestCompat
para substituir as classes equivalentes emandroidx.media
.
- O método
- ExoPlayer:
- 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 de idioma explícito do vídeo podem ser
expressas com
TrackSelectionParameters.Builder.setPreferredVideoLanguage(s)
. - Adição do parâmetro
selectedAudioLanguage
ao métodoDefaultTrackSelector.selectVideoTrack()
. - O parâmetro
retryCount
foi adicionado aMediaSourceEventListener.onLoadStarted
e aos métodosMediaSourceEventListener.EventDispatcher
correspondentes. - Correção de um bug em que itens de playlist ou períodos em transmissões 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).
- Reduza os valores padrão de
bufferForPlaybackMs
ebufferForPlaybackAfterRebufferMs
emDefaultLoadControl
para 1.000 e 2.000 ms, respectivamente. - Adicione
MediaExtractorCompat
, uma nova classe que oferece recursos equivalentes à plataformaMediaExtractor
. - Mova
BasePreloadManager.Listener
para umPreloadManagerListener
de nível superior. - O
RenderersFactory.createSecondaryRenderer
pode ser implementado para fornecer renderizadores secundários para pré-aquecimento. O pré-aquecimento permite transições de itens de mídia mais rápidas durante a reprodução. - Foi ativado o envio de
CmcdData
para solicitações de manifesto nos formatos de streaming adaptativo DASH, HLS e SmoothStreaming (#1951). - Forneça
MediaCodecInfo
do codec que será inicializado emMediaCodecRenderer.onReadyToInitializeCodec
(#1963). - Mude
AdsMediaSource
para permitir que oAdPlaybackStates
cresça adicionando grupos de anúncios. Modificações inválidas são detectadas e geram uma exceção.
- 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 de idioma explícito do vídeo podem ser
expressas com
- Transformador:
- Atualize os parâmetros de
VideoFrameProcessor.registerInputStream
eVideoFrameProcessor.Listener.onInputStreamRegistered
para usarFormat
. - Adição de suporte a transmuxing em formatos alternativos compatíveis com versões anteriores.
- Gerar metadados estáticos HDR ao usar
DefaultEncoderFactory
.
- Atualize os parâmetros de
- Extratores:
- AVI: correção do processamento de arquivos com áudio compactado de bitrate constante em que o cabeçalho do stream armazena o número de bytes em vez do número de fragmentos.
- Áudio:
- Correção de
onAudioPositionAdvancing
para ser chamado quando a reprodução for retomada (antes era chamado quando a reprodução estava pausada).
- Correção de
- Vídeo:
- Correção de
MediaCodecVideoRenderer
para que, quando não houver umSurface
, o renderizador ignore frames iniciais apenas se oVideoFrameReleaseControl.getFrameReleaseAction
não forFRAME_RELEASE_TRY_AGAIN_LATER
.
- Correção de
- Texto:
- O carregamento apressado de todos os arquivos de legenda configurados com
MediaItem.Builder.setSubtitleConfigurations
foi interrompido. Agora, apenas um arquivo é carregado se for selecionado pela seleção de faixa (#1721).
- O carregamento apressado de todos os arquivos de legenda configurados com
- Efeito:
- A funcionalidade de
OverlaySettings
foi movida paraStaticOverlaySettings
.OverlaySettings
pode ser subclassificado para permitir configurações de sobreposição dinâmica.
- A funcionalidade de
- Muxadores:
MuxerException
foi removido da interfaceMuxer
para evitar um nome totalmente qualificado muito longo.
- Sessão:
- O "Context" foi adicionado como um parâmetro a "MediaButtonReceiver.shouldStartForegroundService" (1887, link em inglês).
- Interface:
- Adição do elemento combinável
PlayerSurface
ao módulomedia3-ui-compose
. - Adição de classes
PlayPauseButtonState
,NextButtonState
,PreviousButtonState
,RepeatButtonState
eShuffleButtonState
e dos elementos combináveisrememberPlayPauseButtonState
,rememberNextButtonState
,rememberPreviousButtonState
,rememberRepeatButtonState
erememberShuffleButtonState
correspondentes ao módulomedia3-ui-compose
.
- Adição do elemento combinável
- 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 oAdPlaybackState
transmitido para oAdsMediaSource
. Essa versão inicial só oferece suporte a transmissões de VOD do HLS com atributosX-ASSET-URI
. - Adição do
HlsInterstitialsAdsLoader.AdsMediaSourceFactory
. Os apps podem usá-lo para criar instâncias deAdsMediaSource
que usam umHlsInterstitialsAdsLoader
de maneira conveniente e segura.
- Adicione uma primeira versão de
- Extensão DASH:
- Adição de suporte ao formato AC-4 nível 4 para DASH (#1898).
- Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
- O módulo de decodificador MPEG-H foi adicionado. Ele usa o módulo de decodificador MPEG-H nativo para decodificar áudio MPEG-H (#1826).
- App de demonstração:
- Foram adicionados elementos de interface combináveis
MinimalControls
(PlayPauseButton
,NextButton
,PreviousButton
) eExtraControls
(RepeatButton
,ShuffleButton
) aodemo-compose
usandoPlayPauseButtonState
,NextButtonState
,PreviousButtonState
,RepeatButtonState
,ShuffleButtonState
.
- Foram adicionados elementos de interface combináveis
- Símbolos descontinuados foram removidos:
- O método
AudioMixer.create()
descontinuado foi removido. UseDefaultAudioMixer.Factory().create()
- Os seguintes métodos
Transformer.Builder
foram descontinuados:setTransformationRequest()
, usesetAudioMimeType()
,setVideoMimeType()
esetHdrMode()
.setAudioProcessors()
, defina o processador de áudio em umEditedMediaItem.Builder.setEffects()
e transmita-o paraTransformer.start()
.setVideoEffects()
, defina o efeito de vídeo em umEditedMediaItem.Builder.setEffects()
e transmita-o paraTransformer.start()
.setRemoveAudio()
, useEditedMediaItem.Builder.setRemoveAudio()
para remover o áudio doEditedMediaItem
transmitido paraTransformer.start()
.setRemoveVideo()
, useEditedMediaItem.Builder.setRemoveVideo()
para remover o vídeo doEditedMediaItem
transmitido paraTransformer.start()
.setFlattenForSlowMotion()
, useEditedMediaItem.Builder.setFlattenForSlowMotion()
para achatar oEditedMediaItem
transmitido paraTransformer.start()
.setListener()
, useaddListener()
,removeListener()
ouremoveAllListeners()
.
- Os seguintes métodos
Transformer.Listener
foram descontinuados: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)
.
- A classe
TransformationResult
foi removida. UseExportResult
. - A classe
TransformationException
foi removida. UseExportException
. - O
Transformer.PROGRESS_STATE_NO_TRANSFORMATION
foi descontinuado. UseTransformer.PROGRESS_STATE_NOT_STARTED
- O
Transformer.setListener()
foi descontinuado. UseTransformer.addListener()
,Transformer.removeListener()
ouTransformer.removeAllListeners()
. - O
Transformer.startTransformation()
foi descontinuado. UseTransformer.start(MediaItem, String)
- O
SingleFrameGlShaderProgram
foi descontinuado. UseBaseGlShaderProgram
- O
Transformer.flattenForSlowMotion
foi removido. UseEditedMediaItem.flattenForSlowMotion
- O método
Versão 1.5
Versão 1.5.1
19 de dezembro de 2024
Lançamento de androidx.media3:media3-*:1.5.1
.
A versão 1.5.1 contém estas confirmações.
- ExoPlayer:
- O uso de descriptografia assíncrona foi desativado no MediaCodec para evitar problemas de tempo limite de codec relatados com essa API da plataforma (1641, link em inglês).
- Extratores:
- MP3: a reprodução não é interrompida prematuramente quando a tabela de conteúdo de um frame
VBRI
não abrange todos os dados de MP3 em um arquivo (#1904).
- MP3: a reprodução não é interrompida prematuramente quando a tabela de conteúdo de um frame
- Vídeo:
- Reversão do uso de valores de proporção de pixels fornecidos por
MediaCodecAdapter
quando fornecidos durante o processamento deonOutputFormatChanged
(#1371).
- Reversão do uso de valores de proporção de pixels fornecidos por
- Texto:
- Correção de um bug em
ReplacingCuesResolver.discardCuesBeforeTimeUs
em que a fila ativa emtimeUs
(iniciada antes, mas ainda não encerrada) era descartada incorretamente (#1939).
- Correção de um bug em
- Metadados:
- Extração da numeração e do gênero do disco/faixa dos comentários do Vorbis em
MediaMetadata
(#1958).
- Extração da numeração e do gênero do disco/faixa dos comentários do Vorbis em
Versão 1.5.0
27 de novembro de 2024
Lançamento de androidx.media3:media3-*:1.5.0
.
A versão 1.5.0 contém estas confirmações.
- Biblioteca comum:
- Foi adicionado
ForwardingSimpleBasePlayer
, que permite o encaminhamento para outro player com pequenos ajustes, garantindo a consistência total e o tratamento do listener (1183, link em inglês). - Substitua
SimpleBasePlayer.State.playlist
pelo métodogetPlaylist()
. - Adição de substituição para
SimpleBasePlayer.State.Builder.setPlaylist()
para especificar diretamente umTimeline
eTracks
eMetadata
atuais em vez de criar uma estrutura de playlist. - Aumento de
minSdk
para 21 (Android Lollipop). Isso está alinhado com todas as outras bibliotecas do AndroidX. - Adição do artefato
androidx.media3:media3-common-ktx
, que oferece funcionalidade específica do Kotlin criada com base na biblioteca Common - A função de extensão de suspensão
Player.listen
foi adicionada para girar uma corrotina e ouvirPlayer.Events
na bibliotecamedia3-common-ktx
. - As anotações
@DoNotInline
foram removidas de classes internas fora da linha criadas manualmente para evitar falhas de verificação de classe no momento de execução. As versões recentes do R8 agora fazem chamadas off-line automaticamente, como essas, para evitar falhas de execução. Portanto, a saída manual não é mais necessária. Todos os usuários do Gradle da biblioteca já precisam estar usando uma versão do Plug-in do Android para Gradle que use uma versão do R8 que faça isso, devido aocompileSdk = 35
. Os usuários da biblioteca com sistemas de build que não são do Gradle precisam garantir que a etapa de redução/obfuscação equivalente ao R8 faça um processo de saída automática semelhante para evitar falhas de verificação de classe no tempo de execução. Essa mudança já foi feita em outras bibliotecas do AndroidX.
- Foi adicionado
- ExoPlayer:
- Agora,
MediaCodecRenderer.onProcessedStreamChange()
pode ser chamado para todos os itens de mídia. Anteriormente, ele não era chamado para o primeiro. UseMediaCodecRenderer.experimentalEnableProcessedStreamChangedAtStart()
para ativar. PreloadMediaSource.PreloadControl.onPreloadError
foi adicionado para permitir que implementações dePreloadMediaSource.PreloadControl
realizem ações quando ocorre um erro.- Adição de
BasePreloadManager.Listener
para propagar eventos de pré-carregamento para apps. - Foi permitido mudar o tempo limite do cliente SNTP e tentar novamente endereços alternativos no tempo limite (#1540).
- Remova
MediaCodecAdapter.Configuration.flags
, porque o campo sempre era zero. - Permitir que o usuário selecione o alto-falante integrado para reprodução na API 35+ do Wear OS, em que o dispositivo oferece suporte a isso.
- Adiar a chamada de bloqueio para
Context.getSystemService(Context.AUDIO_SERVICE)
até que o processamento do foco de áudio seja ativado. Isso garante que a chamada de bloqueio não seja feita se o processamento de foco de áudio não estiver ativado (#1616). - A reprodução é permitida independentemente da duração em buffer quando o carregamento falha (#1571).
- Adição de
AnalyticsListener.onRendererReadyChanged()
para sinalizar quando renderizadores individuais permitem que a reprodução esteja pronta. - Correção de
MediaCodec.CryptoException
, que às vezes era relatado como um "erro inesperado de execução" quandoMediaCodec
era operado no modo assíncrono (comportamento padrão na API 31 ou mais recente). - Transmita
bufferedDurationUs
em vez debufferedPositionUs
comPreloadMediaSource.PreloadControl.onContinueLoadingRequested()
. Também mudaDefaultPreloadManager.Status.STAGE_LOADED_TO_POSITION_MS
paraDefaultPreloadManager.Status.STAGE_LOADED_FOR_DURATION_MS
. Os apps precisam transmitir um valor que represente uma duração específica da posição de início padrão para a qual a fonte de mídia correspondente precisa ser pré-carregada com essa IntDef, em vez de uma posição. - Adição de uma implementação
ForwardingRenderer
que encaminha todas as chamadas de método para outro renderizador (1703). - Adicione o carregamento prévio da playlist para o próximo item. Os apps podem
ativar o carregamento prévio chamando
ExoPlayer.setPreloadConfiguration(PreloadConfiguration)
. Por padrão, o pré-carregamento está desativado. Quando a opção está ativada e não interfere na reprodução, oDefaultLoadControl
restringe o carregamento prévio para iniciar e continuar somente quando o player não está carregando para reprodução. Os apps podem mudar esse comportamento implementandoLoadControl.shouldContinuePreloading()
de maneira adequada, como substituindo esse método emDefaultLoadControl
. A implementação padrão deLoadControl
desativa o carregamento prévio caso um app esteja usando uma implementação personalizada deLoadControl
. - O método
MediaSourceEventListener.EventDispatcher.dispatchEvent()
foi adicionado para permitir a invocação de eventos de listeners de subclasse (1736). - Adicione
DefaultPreloadManager.Builder
que cria as instânciasDefaultPreloadManager
eExoPlayer
com configurações compartilhadas de forma consistente. - O parâmetro
Renderer[]
foi removido deLoadControl.onTracksSelected()
, já que a implementação deDefaultLoadControl
pode recuperar os tipos de transmissão deExoTrackSelection[]
. - O método
DefaultLoadControl.calculateTargetBufferBytes(Renderer[], ExoTrackSelection[])
foi descontinuado e marcado como final para evitar substituições. Use o novoDefaultLoadControl.calculateTargetBufferBytes(ExoTrackSelection[])
em vez disso. - Informe eventos
MediaSourceEventListener
de fontes secundárias emMergingMediaSource
. Isso vai resultar em eventos de início/erro/cancelamento/conclusão de carregamento sendo informados para legendas sideloaded (aquelas adicionadas comMediaItem.LocalConfiguration.subtitleConfigurations
), que podem aparecer como eventos de carregamento duplicados emitidos porAnalyticsListener
. - Evite que erros de legenda e metadados parem completamente a reprodução.
Em vez disso, a faixa problemática é desativada, e a reprodução das faixas
restantes continua
(1722, link em inglês).
- No novo processamento de legendas (durante a extração), a análise associada (por exemplo,
dados de legenda inválidos) e os erros de carregamento (por exemplo, HTTP 404) são emitidos
por callbacks
onLoadError
. - No processamento de legendas legados (durante a renderização), apenas erros de carregamento
associados são emitidos por callbacks
onLoadError
, enquanto erros de análise são ignorados silenciosamente (este é um comportamento preexistente).
- No novo processamento de legendas (durante a extração), a análise associada (por exemplo,
dados de legenda inválidos) e os erros de carregamento (por exemplo, HTTP 404) são emitidos
por callbacks
- Correção de um bug em que itens de playlist ou períodos em transmissões 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).
- Um setter foi adicionado a
SntpClient
para definir o tempo máximo decorrido desde a última atualização, após a qual o cliente é reinicializado (#1794).
- Agora,
- Transformador:
- Adição de
SurfaceAssetLoader
, que oferece suporte à fila de dados de vídeo para o Transformer por meio de umSurface
. ImageAssetLoader
informa entrada sem suporte usandoAssetLoader.onError
em vez de gerar umaIllegalStateException
.- A configuração da duração da imagem usando
MediaItem.Builder.setImageDurationMs
é obrigatória para a exportação de imagens. - Adição de suporte à exportação para lacunas em sequências de EditedMediaItems de áudio.
- Adição de
- Seleção de faixas:
DefaultTrackSelector
: prefira o áudio baseado em objetos em vez do áudio baseado em canal quando outros fatores forem iguais.
- Extratores:
- Permitir que
Mp4Extractor
eFragmentedMp4Extractor
identifiquem amostras H264 que não são usadas como referência por amostras subsequentes. - Adicionamos a opção de ativar a busca com base no índice em
AmrExtractor
. - Os arquivos MP3 com mais de 128 kB entre frames válidos são tratados como truncados
(em vez de inválidos). Isso significa que arquivos com dados não MP3 no final,
sem outros metadados para indicar o comprimento dos bytes MP3, agora param
a reprodução no final dos dados MP3 em vez de falharem com
ParserException: Searched too many bytes.{contentIsMalformed=true, dataType=1}
(#1563). - Correção do processamento de amostra de pré-rolagem 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, link em inglês).
- Melhoramos o cálculo da taxa de frames usando a duração da mídia da caixa
mdhd
emMp4Extractor
eFragmentedMp4Extractor
(#1531). - Correção da escalação incorreta de
media_time
nas listas de edição de MP4. Enquantosegment_duration
já era dimensionado corretamente usando a escala de tempo do filme,media_time
agora é dimensionado corretamente usando a escala de tempo da faixa, conforme especificado pelo padrão de formato MP4 (1792). - Processamento de frames fora de ordem no cálculo de
endIndices
para MP4 com lista de edição (#1797). - Correção da análise da duração da mídia na caixa
mdhd
de arquivos MP4 para processar valores-1
(#1819). - Foi adicionado suporte para a identificação da caixa
h263
em arquivos MP4 para vídeo H.263 (1821, link em inglês). - Adição de suporte ao formato de arquivo de mídia base ISO AC-4 de nível 4 (#1265).
- Permitir que
- DataSource:
- Atualização de
HttpEngineDataSource
para permitir o uso a partir da versão S da extensão 7 em vez do nível 34 da API (#1262). DataSourceContractTest
: afirma queDataSource.getUri()
retorna o URI resolvido (conforme documentado). Quando isso for diferente do URI solicitado, os testes poderão indicar isso usando o novo métodoDataSourceContractTest.TestResource.Builder.setResolvedUri()
.DataSourceContractTest
: garante queDataSource.getUri()
egetResponseHeaders()
retornem o valor "open" após uma chamada com falha paraopen()
(devido a um recurso "not found") e antes de uma chamadaclose()
subsequente.- A substituição de
DataSourceContractTest.getNotFoundResources()
permite que as subclasses de teste forneçam vários recursos "not found" e também todos 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
- Atualização de
- Áudio:
- Configura automaticamente os metadados de intensidade CTA-2075 no codec, se presentes na mídia.
- O volume diminui suavemente ao procurar.
- Correção de sons de estouro que podem ocorrer durante buscas.
- Correção de acúmulo de erros de truncamento para o algoritmo de alongamento de tempo/mudança de tom do Sonic.
- Correção de um bug no
SpeedChangingAudioProcessor
que causava a queda de frames de saída.
- Vídeo:
- O
MediaCodecVideoRenderer
evita a decodificação de amostras que não são renderizadas nem usadas como referência por outras amostras. - Na API 35 e versões mais recentes,
MediaCodecAdapter
agora pode receber umSurface
null
emconfigure
e fazer chamadas para um novo métododetachOutputSurface
para remover umSurface
definido anteriormente, se o codec oferecer suporte a isso (MediaCodecInfo.detachedSurfaceSupported
). - Os valores de proporção de pixels fornecidos por
MediaCodecAdapter
são usados, se fornecidos, ao processaronOutputFormatChanged
(#1371). - Adição de uma solução alternativa para um problema no dispositivo Galaxy Tab S7 FE que faz com que os streams H264 seguros de 60 fps sejam marcados como sem suporte (#1619).
- Adição de uma solução alternativa para codecs que ficam presos após a última amostra sem retornar um sinal de fim de transmissão.
- O
- Texto:
- Adicionamos um
VoiceSpan
personalizado e o preenchemos para intervalos de voz do WebVTT (#1632). - Verifique se o WebVTT no HLS com carimbos de data/hora de legenda muito grandes (que transbordam
um
long
de 64 bits quando representado como microssegundos e multiplicado pela base de tempo MPEG90,000
) são exibidos (#1763). - Suporte a legendas CEA-608 em conteúdo Dolby Vision (#1820).
- Correção da reprodução que travava em transmissões de vários períodos do DASH quando as legendas CEA-608 estavam ativadas (#1863).
- Adicionamos um
- Metadados:
- Atribua o tipo
C.TRACK_TYPE_METADATA
a faixas com conteúdo icy ou vnd.dvb.ait.
- Atribua o tipo
- Imagem:
- Adição de
ExternallyLoadedImageDecoder
para integração simplificada com bibliotecas externas de carregamento de imagens, como Glide ou Coil.
- Adição de
- DataSource:
FileDescriptorDataSource
, um novoDataSource
que pode ser usado para ler de umFileDescriptor
, foi adicionado (3757, link em inglês).
- Efeito:
- Adição de uma solução alternativa para
DefaultVideoFrameProcessor
para escalonamento menor deSurfaceTexture
.SurfaceTexture
pode incluir uma pequena escalação que corta uma borda de 1 texel ao redor da borda de um buffer cortado. Isso agora é processado de modo que a saída seja 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 para
- Extensão de IMA:
- Correção de um bug em que limpar a playlist pode causar um
ArrayIndexOutOfBoundsException
emImaServerSideAdInsertionMediaSource
. - Correção do bug em que as transmissões de DAI inseridas do lado do servidor sem um pré-rolagem podem
resultar em um
ArrayIndexOutOfBoundsException
ao reproduzir depois do último anúncio intermediário (#1741).
- Correção de um bug em que limpar a playlist pode causar um
- Sessão:
MediaButtonReceiver.shouldStartForegroundService(Intent)
foi adicionado para permitir que os apps substituam esse método e impeçam um comando de reprodução para retomar a reprodução. Por padrão, o serviço é sempre iniciado, e a reprodução não pode ser suprimida sem que o sistema cause uma falha no serviço com umForegroundServiceDidNotStartInTimeException
(#1528).- Correção de um bug que fazia com que comandos personalizados enviados de um
MediaBrowser
fossem enviados para oMediaSessionCompat.Callback
em vez da varianteMediaBrowserServiceCompat
do método quando conectado a um serviço legado. Isso impediu que oMediaBrowser
recebesse o valor de retorno real enviado de volta pelo serviço legado (#1474). - Processamento de
IllegalArgumentException
gerado por dispositivos de determinados fabricantes ao definir o broadcast receiver para intents de botão de mídia (#1730). - Adicione botões de comando para itens de mídia. Isso adiciona a API Media3 para o que
era conhecido como
Custom browse actions
com a biblioteca legada comMediaBrowserCompat
. Os botões de comando do Media3 para itens de mídia estão disponíveis paraMediaBrowser
eMediaController
. Consulte Ações de navegação personalizadas do AAOS. - Correção de um bug em que um controlador Media3 às vezes não permitia que um app de sessão
iniciasse um serviço em primeiro plano depois de solicitar
play()
. - Restrinja
CommandButton.Builder.setIconUri
para aceitar apenas URIs de conteúdo. - Transmita dicas de conexão de um navegador Media3 para o
MediaBrowserCompat
inicial ao se conectar a umMediaBrowserCompat
legado. O serviço pode receber as sugestões de conexão transmitidas como sugestões raiz com a primeira chamada paraonGetRoot()
. - Correção de um bug em que uma
MediaBrowser
conectada a um serviço de navegador legado não recebia um erro enviado pelo serviço depois que o navegador se inscrevia em umaparentid
. - Melhoria no comportamento de interoperabilidade, para que um navegador Media3 conectado
a uma
MediaBrowserService
legada não solicite as filhas de umaparentId
duas vezes ao se inscrever em uma mãe.
- Interface:
- O vídeo esticado/recortado foi incluído na
opção de ativação da solução alternativa
PlayerView
-in-Compose-AndroidView
devido a problemas com transições compartilhadas baseadas em XML. Os apps que usamPlayerView
dentro deAndroidView
precisam chamarPlayerView.setEnableComposeSurfaceSyncWorkaround
para ativar (#1237, #1594). - O
setFullscreenButtonState
foi adicionado aoPlayerView
para permitir atualizações do ícone do botão de tela cheia sob demanda, ou seja, fora da banda e não reativo a uma interação de clique (#1590, #184). - Correção de um bug em que a opção "Nenhum" na seleção de texto não funcionava se houvesse preferências de seleção de faixa de texto definidas pelo app.
- O vídeo esticado/recortado foi incluído na
opção de ativação da solução alternativa
- Extensão DASH:
- Adição de suporte a períodos que começam no meio de um segmento (#1440).
- Extensão do Smooth Streaming:
- Correção de um erro
Bad magic number for Bundle
ao reproduzir transmissões do SmoothStreaming com faixas de texto (#1779).
- Correção de um erro
- Extensão RTSP:
- Extensões de decodificador (FFmpeg, VP9, AV1 etc.):
- Adiciona o módulo de decodificador IAMF, que oferece suporte à reprodução de arquivos MP4
que contêm faixas IAMF usando a biblioteca nativa libiamf para
sintonizar áudio.
- A reprodução é ativada com um layout estéreo e 5.1 com espacialização e rastreamento opcional da cabeça ativado, mas o suporte à reprodução binaural não está disponível no momento.
- Adicionamos suporte de 16 KB para extensões de decodificador no Android 15 (1685).
- Adiciona o módulo de decodificador IAMF, que oferece suporte à reprodução de arquivos MP4
que contêm faixas IAMF usando a biblioteca nativa libiamf para
sintonizar áudio.
- Extensão do Google Cast:
- A limpeza da linha do tempo é interrompida após a desconexão da CastSession, o que permite que o app de envio retome a reprodução localmente após uma desconexão.
- Preencha a
DeviceInfo
do CastPlayer quando umContext
for fornecido. Isso permite vincular oMediaSession
a umRoutingSession
, o que é necessário para integrar o comutador de saída (1056, link em inglês).
- Test Utilities:
- O
DataSourceContractTest
agora inclui testes para verificar:- O fluxo de entrada
read position
foi atualizado. - O buffer de saída
offset
é aplicado corretamente.
- O fluxo de entrada
- O
- App de demonstração
- Correção de vazamentos de memória no app de demonstração de formato curto (#1839).
- Símbolos descontinuados foram removidos:
Player.hasPrevious
ePlayer.hasPreviousWindow()
descontinuados foram removidos. UsePlayer.hasPreviousMediaItem()
.- O método
Player.previous()
descontinuado foi removido. UsePlayer.seekToPreviousMediaItem()
- O método
DrmSessionEventListener.onDrmSessionAcquired
descontinuado foi removido. - Os construtores
DefaultEncoderFactory
descontinuados foram removidos. UseDefaultEncoderFactory.Builder
Versão 1.5.0-rc02
19 de novembro de 2024
Use a versão estável 1.5.0.
Versão 1.5.0-rc01
13 de novembro de 2024
Use a versão estável 1.5.0.
Versão 1.5.0-beta01
30 de outubro de 2024
Use a versão estável 1.5.0.
Versão 1.5.0-alpha01
10 de setembro de 2024
Use a versão estável 1.5.0.
Versão 1.4.0
Versão 1.4.1
27 de agosto de 2024
Lançamento de androidx.media3:media3-*:1.4.1
.
A versão 1.4.1 contém estas confirmações.
- ExoPlayer:
- Extratores:
- MP3: correção do erro
Searched too many bytes
ignorando corretamente os dados não MP3 finais com base no campo de comprimento em um frameInfo
(1480).
- MP3: correção do erro
- Texto:
- TTML: correção do processamento de valores de
tts:fontSize
de porcentagem para garantir que eles sejam herdados corretamente de nós pai com valores detts:fontSize
de porcentagem. - Correção de
IndexOutOfBoundsException
emLegacySubtitleUtil
devido ao processamento incorreto do caso em que o horário de início da saída solicitado era maior ou igual ao horário final do evento noSubtitle
(#1516).
- TTML: correção do processamento de valores de
- DRM:
- Correção do erro
android.media.MediaCodec$CryptoException: Operation not supported in this configuration: ERROR_DRM_CANNOT_HANDLE
em dispositivos com a API 31 ou mais recente que reproduzem conteúdo do L1 Widevine. Esse erro é causado por uma implementação incompleta do métodoMediaDrm.requiresSecureDecoder
do framework (#1603).
- Correção do erro
- Efeito:
- Adicione um método
release()
aGlObjectsProvider
.
- Adicione um método
- Sessão:
- Um toque duplo em
KEYCODE_HEADSETHOOK
agora é transformado em uma ação "procurar o próximo", conforme documentado (#1493). - Processe
KEYCODE_HEADSETHOOK
como um comando "play" emMediaButtonReceiver
ao decidir se ele será ignorado para evitar umForegroundServiceDidNotStartInTimeException
(#1581).
- Um toque duplo em
- Extensão RTSP:
- As descrições de mídia inválidas foram puladas na análise do SDP (1087, link em inglês).
Versão 1.4.0
25 de julho de 2024
Lançamento de androidx.media3:media3-*:1.4.0
.
A versão 1.4.0 contém estas confirmações.
- Biblioteca comum:
- Encaminhamento de chamadas de busca sem operação presumidas para os métodos protegidos
BasePlayer.seekTo()
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
. - A dependência de compilação foi removida da simplificação aprimorada do Java 8 (#1312).
- A duração transmitida para
MediaItem.Builder.setImageDurationMs()
é ignorada para umMediaItem
que não seja de imagem (conforme documentado). - Adição de
Format.customData
para armazenar informações personalizadas fornecidas pelo app sobre instâncias deFormat
.
- Encaminhamento de chamadas de busca sem operação presumidas para os métodos protegidos
- ExoPlayer:
- Foi adicionado
BasePreloadManager
, que coordena o pré-carregamento de várias origens com base nas prioridades definidas pelorankingData
. É possível personalizar essa classe. AdicioneDefaultPreloadManager
, que usaPreloadMediaSource
para pré-carregar amostras de mídia das fontes na memória e usa um número inteirorankingData
que indica o índice de um item na interface. - Adicionamos
PlayerId
à maioria dos métodos deLoadControl
para permitir que as implementações deLoadControl
ofereçam suporte a vários jogadores. Buffer.isDecodeOnly()
eC.BUFFER_FLAG_DECODE_ONLY
foram removidos. Não é preciso definir essa flag, porque os renderizadores e decodificadores vão decidir pular buffers com base no carimbo de data/hora. As implementações personalizadas deRenderer
precisam verificar se o tempo de buffer é pelo menosBaseRenderer.getLastResetPositionUs()
para decidir se uma amostra vai ser mostrada. Implementações personalizadas deSimpleDecoder
podem verificarisAtLeastOutputStartTimeUs()
se necessário ou marcar outros buffers comDecoderOutputBuffer.shouldBeSkipped
para ignorá-los.- Permite que um valor nulo seja retornado por
TargetPreloadStatusControl.getTargetPreloadStatus(T)
para indicar que não precarrega umMediaSource
com orankingData
fornecido. remove(MediaSource)
foi adicionada aBasePreloadManager
.- Adicione
reset()
aBasePreloadManager
para liberar todas as origens de espera e manter a instância do gerenciador de pré-carregamento. ExoPlayer.setPriority()
(eBuilder.setPriority()
) foram adicionados para definir o valor de prioridade usado emPriorityTaskManager
e para a importância do MediaCodec na API 35.- Correção do problema na atualização do último tempo de rebuffer, que resultou em
chave
bs
(fome de buffer) incorreta no CMCD (#1124). - Adicione
PreloadMediaSource.PreloadControl.onLoadedToTheEndOfSource(PreloadMediaSource)
para indicar que a origem foi carregada até o fim. Isso permite que as implementaçõesDefaultPreloadManager
ePreloadMediaSource.PreloadControl
personalizadas carreguem a próxima fonte ou realizem outras ações. - Correção de um bug em que o pular silêncio no final dos itens pode acionar uma exceção de reprodução.
- Adicione
clear
aPreloadMediaSource
para descartar o período de pré-carregamento. - Foi adicionado um novo código de erro
PlaybackException.ERROR_CODE_DECODING_RESOURCES_RECLAIMED
que é usado quando os recursos do codec são recuperados para tarefas de maior prioridade. AdsMediaSource
agora carrega anúncios precedentes antes que a preparação inicial de mídia de conteúdo seja concluída (1358, link em inglês).- Correção de um bug em que a reprodução era movida para
STATE_ENDED
ao preparar novamente uma transmissão ao vivo DASH de vários períodos depois que o período original já tinha sido removido do manifesto. - Renomeie
onTimelineRefreshed()
paraonSourcePrepared()
eonPrepared()
paraonTracksSelected()
emPreloadMediaSource.PreloadControl
. Renomeie também as IntDefs emDefaultPreloadManager.Stage
. - Adição de suporte experimental para programação dinâmica para alinhar melhor o trabalho
com ciclos de ativação da CPU e atrasar a ativação até que os renderizadores possam progredir.
É possível ativar esse recurso usando
experimentalSetDynamicSchedulingEnabled()
ao configurar a instância do ExoPlayer. - Adição do
Renderer.getDurationToProgressUs()
. UmRenderer
pode implementar esse método para retornar ao ExoPlayer a duração que a reprodução precisa avançar para que o renderizador progrida. SeExoPlayer
for definido comexperimentalSetDynamicSchedulingEnabled()
,ExoPlayer
vai chamar esse método ao calcular o tempo para programar a tarefa de trabalho. - Adição de
MediaCodecAdapter#OnBufferAvailableListener
para alertar quando os buffers de entrada e saída estiverem disponíveis para uso porMediaCodecRenderer
. OMediaCodecRenderer
vai sinalizarExoPlayer
ao receber esses callbacks. SeExoPlayer
for definido comexperimentalSetDynamicSchedulingEnabled()
,ExoPlayer
vai programar o loop de trabalho, já que os renderizadores podem progredir. - Use a classe de dados para métodos
LoadControl
em vez de parâmetros individuais. - Adicione
ExoPlayer.isReleased()
para verificar seExoplayer.release()
foi chamado. ExoPlayer.Builder.setMaxSeekToPreviousPositionMs()
foi adicionado para configurar a posição máxima para a qualseekToPrevious()
busca o item anterior (#1425).- Correção de algumas inconsistências de foco de áudio, por exemplo, não informar a perda de foco total ou transitória enquanto o player está pausado (#1436).
- Correção de um possível
IndexOutOfBoundsException
causado por extratores que informam faixas adicionais após a etapa de preparação inicial (#1476). Effects
emExoPlayer.setVideoEffect()
vai receber os carimbos de data/hora com o deslocamento do renderizador removido (#1098).- Correção de uma possível
IllegalArgumentException
ao processar o erro do player que aconteceu ao ler um item de playlist (#1483).
- Foi adicionado
- Transformador:
- Adicione
audioConversionProcess
evideoConversionProcess
aExportResult
para indicar como a respectiva faixa no arquivo de saída foi feita. - As verificações de nível H.264 da otimização de corte foram relaxadas.
- Adição de suporte para alternar entre mídia de entrada SDR e HDR em uma sequência
- Adicionamos suporte a efeitos de áudio no nível da composição.
- Adicionamos suporte para transcodificar imagens Ultra HDR em vídeos HDR.
- Correção de um problema em que o
DefaultAudioMixer
não gera a quantidade correta de bytes após ser redefinido e reutilizado - Contorne um bug do decodificador em que o número de canais de áudio era limitado a estéreo ao processar a entrada PCM.
- Ao selecionar faixas em
ExoPlayerAssetLoader
, ignore as restrições de contagem de canais de áudio, já que elas se aplicam apenas à reprodução. - Substitua a interface
androidx.media3.transformer.Muxer
porandroidx.media3.muxer.Muxer
e 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
AudioGraphInput
para melhorar a sincronização de áudio e vídeo. - 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 vão estar disponíveis noExportException.codecInfo
.
- Adicione
- Extratores:
- MPEG-TS: a mudança é revertida para garantir que o último frame seja renderizado transmitindo a última unidade de acesso de um stream para a fila de amostras (#7909). Correções foram incorporadas para resolver os problemas que surgiram em streams HLS somente de I-frame(#1150) e streams HLS H.262 (#1126).
- MP3: prefira o tamanho de dados de um frame
Info
em vez do tamanho informado pelo fluxo principal (por exemplo, tamanho do arquivo ou cabeçalho HTTPContent-Length
). Isso ajuda a excluir dados de trailers não reproduzíveis (por exemplo, arte de álbuns) dos cálculos de busca de taxa de bits constantes, tornando as buscas mais precisas (#1376). - MP3: use a contagem de frames e outros dados em um frame
Info
(se presente) para calcular uma taxa de bits média para a busca de taxa de bits constante, em vez de extrapolar a partir da taxa de bits do frame após o frameInfo
, que pode ser artificialmente pequeno, por exemplo, o 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 perfil DTS:X 2 para a reprodução de passagem (1299, link em inglês).
- Para a reprodução transferida, redefina o campo de rastreamento para a conclusão do stream
em
DefaultAudioSink
antes de chamarAudioTrack.stop()
para queAudioTrack.StreamEventCallback#onPresentationEnded
identifique corretamente quando todos os dados pendentes forem reproduzidos. - O bug na
SilenceSkippingAudioProcessor
em que as transições entre diferentes formatos de áudio (por exemplo, estéreo para mono) podem fazer com que o processador gere uma exceção foi corrigido (#1352). - Implemente
MediaCodecAudioRenderer.getDurationToProgressUs()
para que o ExoPlayer programe dinamicamente o loop de trabalho principal para quando o MediaCodecAudioRenderer possa progredir.
- Vídeo:
- Correção do problema em que
Listener.onRenderedFirstFrame()
chegava muito cedo ao mudar 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).
- Correção da 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:
- Correção de um problema em que as legendas que começam antes de uma posição de busca são puladas. Esse problema foi introduzido apenas na Media3 1.4.0-alpha01.
- O comportamento padrão de análise de legendas foi alterado para que 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 ambos
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction(false)
eTextRenderer.experimentalSetLegacyDecodingEnabled(true)
. Consulte os documentos sobre personalização para saber como conectar esses componentes a uma instância deExoPlayer
. Esses métodos (e todo o suporte à decodificação de legendas legada) serão removidos em uma versão futura. - Os apps com implementações personalizadas de
SubtitleDecoder
precisam ser atualizados para implementarSubtitleParser
(eSubtitleParser.Factory
em vez deSubtitleDecoderFactory
).
- Essa mudança pode ser substituída chamando ambos
- PGS: correção da decodificação de comprimento de série para resolver
0
como um índice de cores, em vez de um valor de cor literal (#1367). - CEA-708: ignora o valor
rowLock
. A especificação CEA-708-E S-2023 afirma querowLock
ecolumnLock
devem ser considerados verdadeiros, independentemente dos valores presentes no stream. O suporte acolumnLock
não é implementado, então é considerado que ele sempre é falso.- Essa mudança foi originalmente incluída nas notas da versão
1.3.0-alpha01
, mas foi revertida acidentalmente antes da versão1.3.0-rc01
. O problema foi corrigido, então a mudança está presente novamente.
- Essa mudança foi originalmente incluída nas notas da versão
- CEA-708: evitar que novas linhas duplicadas sejam adicionadas pelo processamento simples do ExoPlayer do comando "set pen location" (#1315).
- Correção de um
IllegalArgumentException
deLegacySubtitleUtil
quando uma amostra de legenda do 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. Anteriormente, as tags MP4 'album sort' (
soal
), 'artist sort' (soar
) e 'album artist sort' (soaa
) eram mapeadas incorretamente para as tags ID3TSO2
,TSOA
eTSOP
(#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. - Frame
TCON
do ID3 propagado paraMediaMetadata.genre
(#1305).
- Correção do mapeamento de MP4 para tags de classificação ID3. Anteriormente, as tags MP4 'album sort' (
- Imagem:
- Adição de suporte a grids de miniaturas DASH não quadradas (#1300).
- Foi adicionado suporte a AVIF para a API 34 e versões mais recentes.
- Permitir que
null
seja usado como parâmetro paraExoPlayer.setImageOutput()
para limpar umImageOutput
definido anteriormente.
- DataSource:
- Implementação de suporte para URIs de recursos brutos
android.resource://package/id
em quepackage
é diferente do pacote do aplicativo atual. Isso não estava documentado anteriormente, mas é uma maneira mais eficiente de acessar recursos em outro pacote do que por nome. - Verifique se
url
é não nulo nos construtoresDataSpec
. Esse parâmetro já foi anotado como não nulo. - Permitir que
ByteArrayDataSource
resolva um URI em uma matriz de bytes duranteopen()
, em vez de ser codificado na construção (#1405).
- Implementação de suporte para URIs de recursos brutos
- DRM:
- Foi permitido definir um
LoadErrorHandlingPolicy
emDefaultDrmSessionManagerProvider
(1271).
- Foi permitido definir um
- Efeito:
- Suporte a várias mudanças de velocidade no mesmo
EditedMediaItem
ouComposition
emSpeedChangeEffect
. - Suporte para saída HLG e PQ da entrada de bitmap ultra HDR.
- Foi adicionado suporte a EGL_GL_COLORSPACE_BT2020_HLG_EXT, que melhora a saída de superfície HLG no ExoPlayer.setVideoEffect e no Transformer's Debug SurfaceView.
- Atualize a implementação da matriz de sobreposição para que ela seja consistente com a
documentação, invertendo os valores x e y aplicados em
setOverlayFrameAnchor()
. Se estiver usandoOverlaySettings.Builder.setOverlayFrameAnchor()
, inverta os valores x e y multiplicando-os por-1
. - Correção do bug em que
TimestampWrapper
falhava quando usado comExoPlayer#setVideoEffects
(#821). - Mudança do espaço de trabalho de cores SDR padrão de cores lineares para vídeo BT 709 SDR elétrico. Também forneça uma terceira opção para manter o espaço de cores original.
- Agora é possível definir a ordem z indeterminada de EditedMediaItemSequences (#1055).
- Manter uma faixa de luminância consistente em diferentes partes do conteúdo HDR (usa a faixa HLG).
- Adicionamos suporte a sobreposições Ultra HDR (bitmap) em conteúdo HDR.
- Permite que os efeitos
SeparableConvolution
sejam usados antes da API 26. - Remova
OverlaySettings.useHdr
não utilizado, já que o intervalo dinâmico da sobreposição e do frame precisa ser idêntico. - Adição de suporte a 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:
- A API Promote, que é necessária para que os apps reproduzam fluxos de anúncios da DAI, foi promovida a estável.
- Adição de
replaceAdTagParameters(Map <String, String>)
aImaServerSideAdInsertionMediaSource.AdLoader
, que permite substituir parâmetros de tag de anúncios no momento da execução. - Correção de um bug em que
VideoAdPlayer.VideoAdPlayerCallback.onError()
não era chamado quando um erro do player ocorria durante a reprodução do anúncio (#1334). - A versão do SDK do IMA foi atualizada para 3.33.0 para corrigir um
NullPointerException
ao usar URIs de tag de anúnciodata://
(#700).
- Sessão:
- Mude o padrão de
CommandButton.enabled
paratrue
e verifique se o valor pode permanecer falso para os controladores, mesmo que o comando associado esteja disponível. - Foram adicionadas constantes de ícone para
CommandButton
que precisam ser usadas em vez de recursos de ícone personalizados. - O
MediaSessionService.isPlaybackOngoing()
foi adicionado para que os apps possam consultar se o serviço precisa ser interrompido 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 pare o serviço. - A barra de pesquisa foi oculta na notificação de mídia para transmissões ao vivo ao não definir a duração nos metadados da sessão da plataforma (1256, link em inglês).
- A conversão de
MediaMetadata
foi alinhada aMediaDescriptionCompat
para usar a mesma ordem e lógica de preferência ao selecionar propriedades de metadados, como em media1. - Adição de
MediaSession.sendError()
, que permite o envio de erros não fatais para o controlador Media3. Ao usar o controlador de notificações (consulteMediaSession.getMediaNotificationControllerInfo()
), o erro personalizado é usado para atualizar oPlaybackState
da sessão da plataforma para um estado de erro com as informações de erro fornecidas (#543). - Adicione
MediaSession.Callback.onPlayerInteractionFinished()
para informar sessões quando uma série de interações do jogador de um controle específico for concluída. - Adicione
SessionError
e use-o emSessionResult
eLibraryResult
em vez do código de erro para fornecer mais informações sobre o erro e como resolvê-lo, se possível. - Publique o código do app de teste do controle de mídia3, que pode ser usado para testar interações com apps que publicam uma sessão de mídia.
- Propague os extras transmitidos para o
MediaSession[Builder].setSessionExtras()
do media3 para oPlaybackStateCompat.getExtras()
do controlador do media1. - Mapeie erros fatais e não fatais para e da sessão da plataforma. Um
PlaybackException
é mapeado para um estado de erro fatal doPlaybackStateCompat
. UmSessionError
enviado ao controlador de notificação de mídia comMediaSession.sendError(ControllerInfo, SessionError)
é mapeado para um erro não fatal emPlaybackStateCompat
, o que significa que o código e a mensagem de erro são definidos, mas o estado da sessão da plataforma continua diferente deSTATE_ERROR
. - Permita que a atividade da sessão seja definida por controlador para substituir a
atividade global da sessão. A atividade da sessão pode ser definida para um
controlador no momento da conexão criando uma
ConnectionResult
comAcceptedResultBuilder.setSessionActivivty(PendingIntent)
. Depois de conectar, a atividade da sessão pode ser atualizada comMediaSession.setSessionActivity(ControllerInfo, PendingIntent)
. - Melhoria na replicação de erros de chamadas para
MediaLibrarySession.Callback
. Agora, a replicação de erros pode ser configurada usandoMediaLibrarySession.Builder.setLibraryErrorReplicationMode()
para escolher o tipo de erro ou desativar a replicação de erros, que está ativada por padrão.
- Mude o padrão de
- Interface:
- Adição de suporte à exibição de imagens para
PlayerView
quando conectado a umExoPlayer
(1144). - Foi adicionada a personalização de vários ícones no
PlayerControlView
por meio de atributos XML para permitir diferentes drawables por instânciaPlayerView
, em vez de substituições globais (#1200). - Solução para um bug da plataforma que causava vídeo esticado/recortado ao usar
SurfaceView
dentro de umAndroidView
do Compose na API 34 (#1237).
- Adição de suporte à exibição de imagens para
- Downloads:
- Garanta que
DownloadHelper
não vazar instâncias deRenderer
não lançadas, o que pode resultar na falha do app comIllegalStateException: Too many receivers, total of 1000, registered for pid
(#1224).
- Garanta que
- Extensão do Cronet:
- Correção de
SocketTimeoutException
emCronetDataSource
Em algumas versões do Cronet, a solicitação fornecida pelo callback nem sempre é a mesma. Isso faz com que o callback não seja concluído e o tempo limite da solicitação seja excedido (https://issuetracker.google.com/328442628).
- Correção de
- Extensão HLS:
- Correção de um bug em que amostras de EMSG pendentes que aguardavam uma descontinuidade eram
delegadas em
HlsSampleStreamWrapper
com um deslocamento incorreto, causando umIndexOutOfBoundsException
ou umIllegalArgumentException
(#1002). - Correção do bug em que as playlists não principais continuavam sendo recarregadas para transmissões LL-HLS (#1240).
- Correção de um bug em que a ativação do CMCD para HLS com segmentos de inicialização
resultava em
Source Error
eIllegalArgumentException
. - Correção do bug em que as playlists de reprodução não principais não eram atualizadas durante a reprodução em tempo real (#1240).
- Correção de um bug em que a ativação do CMCD para transmissões ao vivo HLS causava
ArrayIndexOutOfBoundsException
(#1395).
- Correção de um bug em que amostras de EMSG pendentes que aguardavam 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
MediaQueueItem
no artista no item de mídia Media3 (#1255).
- Correção de um bug que convertia o título do álbum do
- Test Utilities:
- Implementar
onInit()
eonRelease()
noFakeRenderer
. - Os métodos
TestPlayerRunHelper.runUntil()/playUntil()
foram alterados para falhar em erros não fatais (por exemplo, aqueles informados paraAnalyticsListener.onVideoCodecError()
). Use a nova cadeia de métodosTestPlayerRunHelper.run(player).ignoringNonFatalErrors().untilXXX()
para desativar esse comportamento.
- Implementar
- App de demonstração:
- Use
DefaultPreloadManager
no app de demonstração de formulário curto. - Permitir a configuração do modo de repetição com argumentos
Intent
na linha de comando (#1266). - Use
HttpEngineDataSource
comoHttpDataSource
quando o dispositivo oferecer suporte a ele.
- Use
- Símbolos descontinuados foram removidos:
- Remoção de
CronetDataSourceFactory
. UseCronetDataSource.Factory
. - Alguns construtores
DataSpec
foram removidos. UseDataSpec.Builder
. - O método
setContentTypePredicate(Predicate)
foi removido deDefaultHttpDataSource
,OkHttpDataSource
eCronetDataSource
. Use o método equivalente em cadaXXXDataSource.Factory
. - Os construtores
OkHttpDataSource
eOkHttpDataSourceFactory
foram removidos. UseOkHttpDataSource.Factory
. - O
PlayerMessage.setHandler(Handler)
foi removido. UsesetLooper(Looper)
. - Remova o campo
Timeline.Window.isLive
. Use o métodoisLive()
. - Os construtores
DefaultHttpDataSource
foram removidos. UseDefaultHttpDataSource.Factory
- O
DashMediaSource.DEFAULT_LIVE_PRESENTATION_DELAY_MS
foi removido. UseDashMediaSource.DEFAULT_FALLBACK_TARGET_LIVE_OFFSET_MS
- O
MediaCodecInfo.isSeamlessAdaptationSupported(Format, Format, boolean)
foi removido. UseMediaCodecInfo.canReuseCodec(Format, Format)
. - O método
DrmSessionManager.DUMMY
egetDummyDrmSessionManager()
foi removido. UseDrmSessionManager.DRM_UNSUPPORTED
. - Remova
AnalyticsListener.onAudioInputFormatChanged(EventTime, Format)
,AnalyticsListener.onVideoInputFormatChanged(EventTime, Format)
,AudioRendererEventListener.onAudioInputFormatChanged(Format)
eVideoRendererEventListener.onVideoInputFormatChanged(Format)
. Use as sobrecargas que recebem umDecoderReuseEvaluation
. - A IntDef
RendererSupport.FormatSupport
e as constantesFORMAT_HANDLED
,FORMAT_EXCEEDS_CAPABILITIES
,FORMAT_UNSUPPORTED_DRM
,FORMAT_UNSUPPORTED_SUBTYPE
eFORMAT_UNSUPPORTED_TYPE
foram removidas. Use a IntDef e as constantes equivalentes emandroidx.media3.common.C
(por exemplo,C.FORMAT_HANDLED
). - A interface
Bundleable
foi removida. Isso inclui a remoção de todos os campos constantesBundleable.Creator<Foo> CREATOR
. Os autores de chamadas 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 estas confirmações.
- Biblioteca comum:
- Adicione
Format.labels
para permitir rótulos alternativos ou localizados.
- Adicione
- ExoPlayer:
- Correção do problema em que
PreloadMediaPeriod
não conseguia reter as transmissões quando era pré-carregado novamente - Aplique o
TrackSelectionResult
correspondente correto ao período de reprodução na reseleção de faixas. - Renderizadores ativados antecipadamente são iniciados somente após o avanço do período de reprodução na transição entre itens de mídia (1017).
- Adição do tipo de retorno ausente à regra
-keepclasseswithmembers
do proguard paraDefaultVideoFrameProcessor.Factory.Builder.build()
(1187, link em inglês).
- Correção do problema em que
- Transformador:
- Adicionamos uma solução alternativa para a exceção gerada devido ao fato de
MediaMuxer
não oferecer suporte a carimbos de data/hora de apresentação negativos antes da API 30.
- Adicionamos uma solução alternativa para a exceção gerada devido ao fato de
- Seleção de faixas:
DefaultTrackSelector
: prefira faixas de vídeo com uma taxa de frames razoável (>=10fps) em vez de faixas com uma taxa de frames menor ou não definida. Isso garante que o player selecione a faixa de vídeo "real" em MP4s extraídos de fotos em movimento que podem conter duas faixas HEVC, em que uma tem uma resolução mais alta, mas um número muito pequeno de frames (#1051).
- Extratores:
- Correção do problema em que o preenchimento não era ignorado ao ler blocos de tamanho ímpar de arquivos WAV (#1117).
- MP3: preencha
Format.averageBitrate
de frames de metadados, comoXING
eVBRI
. - MPEG-TS: reverta uma mudança que tinha como objetivo garantir que o último frame fosse renderizado transmitindo a última unidade de acesso de um stream para a fila de amostras (#7909). Isso ocorre porque a mudança causa novos problemas com streams HLS somente de I-frame (#1150) e streams HLS H.262 (#1126).
- Áudio:
- Permitir a recuperação do renderizador desativando o offload se a faixa de áudio não conseguir ser inicializada no modo de offload.
- Vídeo:
- Adicionamos uma solução alternativa para um problema de dispositivo no Galaxy Tab S7 FE, Chromecast com Google TV e Lenovo M10 FHD Plus que faz com que as transmissões H265 de 60 fps sejam marcadas como sem suporte.
- Adição de uma solução alternativa que garante que o primeiro frame seja sempre renderizado durante o encapsulamento, mesmo que o dispositivo não faça isso automaticamente, conforme exigido pela API (#1169). (966).
- Correção do problema em que o processamento de informações de cor HDR causava um comportamento incorreto do codec e impedia a troca de formato adaptável para faixas de vídeo SDR (#1158).
- Texto:
- WebVTT: evita que dicas diretamente consecutivas criem instâncias
CuesWithTiming
adicionais falsas deWebvttParser.parse
(#1177).
- WebVTT: evita que dicas diretamente consecutivas criem instâncias
- DRM:
- Solução alternativa para um
NoSuchMethodError
que pode ser gerado pelo frameworkMediaDrm
em vez deResourceBusyException
ouNotProvisionedException
em 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 como substituto se
Locale
não identificar um nome de exibição (#988).
- O nome do idioma da faixa de áudio é incluído como substituto se
- Extensão DASH:
- Preencha todos os elementos
Label
do manifesto emFormat.labels
(#1054).
- Preencha todos os elementos
- Extensão RTSP:
- Os valores de informações de sessão vazios (i-tags) são ignorados na análise de SDP (1087, link em inglês).
- Extensões do decodificador (FFmpeg, VP9, AV1, MIDI etc.):
- Desative a extensão MIDI como uma dependência local por padrão, porque ela requer que um repositório Maven adicional seja configurado. Os usuários que precisam desse módulo de uma dependência local podem reativá-lo.
Versão 1.3.0
6 de março de 2024
Lançamento de androidx.media3:media3-*:1.3.0
.
A versão 1.3.0 contém estas confirmações.
- Biblioteca comum:
- Implementação de suporte a URIs de recursos brutos
android.resource://package/[type/]name
em 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 em letras minúsculas.
- Defina anúncios com um
MediaItem
completo em vez de um únicoUri
emAdPlaybackState
. - Aumente
minSdk
para 19 (Android KitKat). Isso está alinhado com todas as outras bibliotecas do AndroidX e é necessário para fazermos upgrade para as versões mais recentes das nossas dependências do AndroidX. - Preencha
artworkUri
eartworkData
emMediaMetadata.Builder.populate(MediaMetadata)
quando pelo menos um deles não for nulo (#964).
- Implementação de suporte a URIs de recursos brutos
- ExoPlayer:
- Foram adicionados
PreloadMediaSource
ePreloadMediaPeriod
, que permitem que os apps carreguem uma origem de mídia de conteúdo em uma posição inicial específica antes da reprodução. OPreloadMediaSource
prepara a 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 de pré-carregamento implementandoPreloadMediaSource.PreloadControl
e definindo a fonte pré-carregada para o player. - Adição de
ExoPlayer.setImageOutput
, que permite que os apps definamImageRenderer.ImageOutput
. - Agora,
DefaultRenderersFactory
fornece umImageRenderer
ao player por padrão comImageOutput
eImageDecoder.Factory.DEFAULT
nulos. - O evento
Player.Listener.onPositionDiscontinuity
é emitido quando o silêncio é ignorado (#765). - Foi adicionado suporte experimental para analisar legendas durante a extração. É
possível ativar isso usando
MediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
. - Suporte a fontes de mídia adaptativas com
PreloadMediaSource
. - Implemente
HttpEngineDataSource
, umHttpDataSource
usando a API HttpEngine. - Evite a subclassificação de
CompositeSequenceableLoader
. Esse componente foi feito extensível anteriormente, mas nunca foi subclassificado na biblioteca. As personalizações podem ser feitas encerrando uma instância usando o padrão de decorador e implementando umCompositeSequenceableLoaderFactory
personalizado. - Correção de um problema em que a repetição do mesmo horário causava a exclusão dos metadados desse item (1007, link em inglês).
- Renomeie os métodos
experimentalSetSubtitleParserFactory
emBundledChunkExtractor.Factory
eDefaultHlsExtractorFactory
parasetSubtitleParserFactory
e não permita a transmissão denull
. Use os novos métodosexperimentalParseSubtitlesDuringExtraction(boolean)
para controlar o comportamento de análise. - Foi adicionado suporte à personalização do
SubtitleParser.Factory
usado durante a extração. Isso pode ser feito comMediaSource.Factory.setSubtitleParserFactory()
. - Adicionar prefixo de origem a todos os campos
Format.id
gerados a partir deMergingMediaSource
. Isso ajuda a identificar qual origem produziu umFormat
(#883). - O regex usado para validar nomes de chaves de dados comuns do cliente de mídia (CMCD, na sigla em inglês) personalizados foi corrigido para verificar apenas hifen (#1028).
- A codificação dupla dos parâmetros de consulta do CMCD foi desativada (1075, link em inglês).
- Foram adicionados
- Transformador:
- Foi adicionado suporte para a compactação de vídeos em câmera lenta H.265/HEVC SEF.
- Aumento da velocidade de transmuxing, especialmente para edições de "remover vídeo".
- Adicionamos uma API para garantir que o arquivo de saída comece em um frame de vídeo. Isso pode tornar a saída das operações de corte mais compatível com implementações de players que não mostram o primeiro frame do vídeo até o selo de apresentação (#829).
- Adição de suporte para otimizar operações de corte de MP4 de recurso único.
- Adição de suporte para garantir que um frame de vídeo tenha o primeiro carimbo de data/hora no arquivo de saída. Correção de arquivos de saída que começam com um frame preto em players baseados em iOS (#829).
- Seleção de faixas:
- Foi adicionado
DefaultTrackSelector.selectImageTrack
para permitir a seleção de imagens. - Adição de
TrackSelectionParameters.isPrioritizeImageOverVideoEnabled
para determinar se uma faixa de imagem será selecionada quando uma faixa de imagem e uma de vídeo estiverem disponíveis. O valor padrão éfalse
, o que significa que a seleção de uma faixa de vídeo é priorizada.
- Foi adicionado
- Extratores:
- Adição de mais análise AV1C ao extrator MP4 para recuperar
os valores
ColorInfo.colorSpace
,ColorInfo.colorTransfer
eColorInfo.colorRange
(#692). - MP3: use a taxa de bits constante (CBR) para procurar arquivos com um cabeçalho
Info
, o equivalente CBR do cabeçalhoXing
. Anteriormente, usávamos a tabela de busca do cabeçalhoInfo
, mas isso resulta em uma busca menos precisa do que se a ignorássemos e presumirmos que o arquivo é CBR. - MPEG2-TS: adição de suporte a DTS, DTS-LBR e DTS:X Profile2 (275).
- Extração de tipos de áudio de descritores de TS e mapeamento para flags de função, permitindo que os usuários façam seleções de faixa de áudio mais informadas (#973).
- Adição de mais análise AV1C ao extrator MP4 para recuperar
os valores
- Áudio:
- Vídeo:
- Mude o construtor
MediaCodecVideoRenderer
que usa um argumentoVideoFrameProcessor.Factory
e substitua-o por um construtor que usa um argumentoVideoSinkProvider
. Os apps que querem injetar umVideoFrameProcessor.Factory
personalizado podem instanciar umCompositingVideoSinkProvider
que use oVideoFrameProcessor.Factory
personalizado e transmita o provedor de destino 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 objects
ao usarDefaultExtractorsFactory.setTextTrackTranscodingEnabled
(#836). - CEA-708: ignora o valor
rowLock
. A especificação CEA-708-E S-2023 afirma querowLock
ecolumnLock
devem ser considerados verdadeiros, independentemente dos valores presentes no stream. O suporte acolumnLock
não é implementado, então é considerado que ele 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 da grade são cortadas e miniaturas
individuais são fornecidas para
ImageOutput
próximas dos horários de apresentação.
- Adição de suporte a miniaturas DASH. As imagens da grade são cortadas e miniaturas
individuais são fornecidas para
- DRM:
- Reproduza amostras "clear lead" não criptografadas em conteúdo DRM imediatamente
por padrão, mesmo que as chaves das amostras criptografadas posteriores ainda não estejam
prontas. Isso pode levar a interrupções durante a reprodução se as chaves ainda não estiverem prontas
quando a posição de reprodução alcançar as amostras criptografadas. No entanto, a reprodução
não terá começado até esse ponto. Esse comportamento pode
ser desativado com
MediaItem.DrmConfiguration.Builder.setPlayClearContentWithoutKey
ouDefaultDrmSessionManager.Builder.setPlayClearSamplesWithoutKeys
.
- Reproduza amostras "clear lead" não criptografadas em conteúdo DRM imediatamente
por padrão, mesmo que as chaves das amostras criptografadas posteriores ainda não estejam
prontas. Isso pode levar a interrupções durante a reprodução se as chaves ainda não estiverem prontas
quando a posição de reprodução alcançar as amostras criptografadas. No entanto, a reprodução
não terá começado até esse ponto. Esse comportamento pode
ser desativado com
- Extensão de IMA:
- Correção do problema em que anúncios DASH e HLS sem a extensão de arquivo adequada não podiam ser reproduzidos
- Sessão:
- A detecção de clique duplo foi desativada para apps de TV (962, link em inglês).
- Correção de um problema em que
MediaItem.RequestMetadata
com extras não nulos não era transmitido entre controladores de mídia e sessões. - Adição de um construtor ao
MediaLibrarySession.Builder
que usa apenas umContext
em vez de umMediaLibraryService
.
- Extensão HLS:
- Reduza
HlsMediaPeriod
para a visibilidade privada do pacote. Esse tipo não pode depender diretamente de fora do pacote HLS. - A resolução busca o início de um segmento de forma mais eficiente (1031).
- Reduza
- Extensões do decodificador (FFmpeg, VP9, AV1, MIDI etc.):
- Decodificador MIDI: ignora mensagens de eventos SysEx (#710).
- Test Utilities:
- Não pausar a reprodução em
TestPlayerRunHelper.playUntilPosition
. O teste mantém a reprodução em um estado de reprodução, mas suspende o progresso até que o teste possa adicionar declarações e outras ações.
- Não pausar a reprodução em
- App de demonstração:
- Adicione um módulo de demonstração de conteúdo curto para demonstrar o uso de
PreloadMediaSource
com o caso de uso de conteúdo curto.
- Adicione um módulo de demonstração de conteúdo 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 do problema em que a busca manual fora do
intervalo
LiveConfiguration.min/maxOffset
continua ajustando o deslocamento de volta paramin/maxOffset
. - Correção do problema em que os layouts de canais OPUS e VORBIS estavam incorretos para 3, 5, 6, 7 e 8 canais (#8396).
- Correção de um problema em que as seleções de faixas depois de buscar zero em uma transmissão ao vivo permitiam que a transmissão começasse na posição padrão (#9347).
- Correção do problema em que novas instâncias de
CmcdData.Factory
estavam recebendo valores negativos parabufferedDurationUs
de fontes de bloco, resultando em umaIllegalArgumentException
(#888).
- Correção do problema em que a busca manual fora do
intervalo
- Transformador:
- Solução para um problema em que o codificador era gerado no momento da configuração por ter definido uma taxa de operação alta.
- Extratores:
- As faixas HEVC secundárias (não reproduzíveis) em fotos em movimento JPEG são marcadas como
ROLE_FLAG_ALTERNATE
para evitar que sejam selecionadas automaticamente para reprodução devido à resolução mais alta. - Correção da detecção de frame-chave incorreto para transmissões TS H264 (#864).
- Correção da estimativa de duração de streams TS com mais de 47721 segundos (#855).
- As faixas HEVC secundárias (não reproduzíveis) em fotos em movimento JPEG são marcadas como
- Áudio:
- Correção do processamento de EOS para
SilenceSkippingAudioProcessor
quando chamado várias vezes (#712).
- Correção do processamento de EOS para
- Vídeo:
- Adição de uma solução alternativa para um problema de dispositivo no Galaxy Tab S7 FE, Chromecast com Google TV e Lenovo M10 FHD Plus que faz com que os streams AVC de 60 fps sejam marcados como não compatíveis (693, link em inglês).
- Metadados:
- Correção do bug em que
MediaMetadata
era preenchido apenas com comentários do Vorbis com teclas em maiúsculas (#876). OutOfMemoryError
é detectado ao analisar frames ID3 muito grandes, o que significa que a reprodução pode continuar sem as informações de tag, em vez de falhar completamente.
- Correção do bug em que
- DRM:
- A solução alternativa para o URL de licença
https://default.url
do ClearKey foi estendida para a API 33 e versões mais recentes (antes, a solução alternativa era aplicada apenas na API 33). (#837). - Correção de
ERROR_DRM_SESSION_NOT_OPENED
ao alternar de conteúdo criptografado para conteúdo claro sem uma superfície anexada ao player. O erro ocorreu por usar incorretamente um decodificador seguro para abrir o conteúdo claro.
- A solução alternativa para o URL de licença
- Sessão:
- Coloque as chaves e os valores personalizados em
MediaMetadataCompat
paraMediaMetadata.extras
eMediaMetadata.extras
paraMediaMetadataCompat
(#756, #802). - Correção da transmissão de
notifyChildrenChanged
para controladores legados (644). - Correção de um bug em que a configuração de um tempo negativo para um temporizador
setWhen
desativado da notificação causava uma falha em alguns dispositivos (#903). - Correção de
IllegalStateException
quando o controlador de notificação de mídia não concluiu a conexão quando a primeira atualização de notificação foi solicitada (#917).
- 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 do decodificador (FFmpeg, VP9, AV1, MIDI etc.):
- Extensão do Google Cast:
- A criação de uma
Timeline
foi limpa para que o app não falhe ao carregar mídia no dispositivo de transmissão (708, link em inglês).
- A criação de uma
Versão 1.2.0
15 de novembro de 2023
- Biblioteca comum:
- Adicione um parâmetro
@Nullable Throwable
aos métodos na interfaceLog.Logger
. O parâmetromessage
para esses métodos não contém mais informações sobre oThrowable
transmitido aos métodosLog.{d,i,w,e}()
. Portanto, as implementações vão precisar anexar essas informações manualmente, se necessário (talvez usandoLogger.appendThrowableString(String, Throwable)
). - Correção de um problema de compatibilidade do Kotlin em que os parâmetros de tipo genérico anulável
e os tipos de elementos de matriz anuláveis não eram detectados como anuláveis. Exemplos
são os parâmetros de método
TrackSelectorResult
eSimpleDecoder
(#6792). - Mudamos o comportamento padrão da interface e das notificações em
Util.shouldShowPlayButton
para mostrar um botão "play" enquanto a reprodução é temporariamente suprimida (por exemplo, devido à perda temporária do foco do áudio). O comportamento legado pode ser mantido usandoPlayerView.setShowPlayButtonIfPlaybackIsSuppressed(false)
ouMediaSession.Builder.setShowPlayButtonIfPlaybackIsSuppressed(false)
(#11213). - Faça upgrade de
androidx.annotation:annotation-experimental
para1.3.1
para corrigir https://issuetracker.google.com/251172715. - Mova
ExoPlayer.setAudioAttributes
para a interfacePlayer
.
- Adicione um parâmetro
- ExoPlayer:
- Correção de problemas de busca em transmissões AC4 causados pela não identificação correta de amostras somente de decodificação (11000).
- A reprodução em dispositivos de saída de áudio inadequados (por exemplo, o
alto-falante integrado em dispositivos Wear OS) foi suprimida quando esse recurso é ativado por
ExoPlayer.Builder.setSuppressPlaybackOnUnsuitableOutput
. O motivo da supressão de reprodução será atualizado comoPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
se a reprodução for tentada quando nenhuma saída de áudio adequada estiver disponível ou se todas as saídas adequadas forem desconectadas durante a reprodução. O motivo da supressão será removido quando uma saída adequada for conectada. - Adicione
MediaSource.canUpdateMediaItem
eMediaSource.updateMediaItem
para aceitar atualizações deMediaItem
após a criação usandoPlayer.replaceMediaItem(s)
. - Agora é possível permitir atualizações de
MediaItem
para todas as classesMediaSource
fornecidas pela biblioteca usandoPlayer.replaceMediaItem(s)
(#33, #9978). - O
MimeTypes.TEXT_EXOPLAYER_CUES
foi renomeado comoMimeTypes.APPLICATION_MEDIA3_CUES
. - Adição de
PngExtractor
, que envia e lê um arquivo PNG inteiro noTrackOutput
como uma amostra. - Melhore o método
SequenceableLoader.continueLoading(long)
na interfaceSequenceableLoader
paraSequenceableLoader.continueLoading(LoadingInfo loadingInfo)
. OLoadingInfo
contém outros parâmetros, incluindoplaybackSpeed
elastRebufferRealtimeMs
, além doplaybackPositionUs
atual. - Melhore o método
ChunkSource.getNextChunk(long, long, List, ChunkHolder)
na interfaceChunkSource
paraChunkSource.getNextChunk(LoadingInfo, long, List, ChunkHolder)
. - Foram adicionados mais campos ao registro de dados comuns do cliente de mídia (CMCD, na sigla em inglês): buffer
de privação (
bs
), prazo (dl
), taxa de reprodução (pr
) e inicialização (su
) (#8699). - A profundidade de bits de luminância e crominância foi adicionada a
ColorInfo
(491, link em inglês). - Foram adicionados mais campos ao registro de dados comuns do cliente de mídia (CMCD, na sigla em inglês): próxima
solicitação de objeto (
nor
) e próxima solicitação de intervalo (nrr
) (#8699). - Adição de funcionalidade para transmitir dados de dados comuns do cliente de mídia (CMCD, na sigla em inglês) usando parâmetros de consulta (#553).
- Correção de
ConcurrentModificationException
emExperimentalBandwidthMeter
(#612). - Adição do parâmetro
MediaPeriodId
aCompositeMediaSource.getMediaTimeForChildMediaTime
. - Suporte a
ClippingMediaSource
(e outras fontes com deslocamentos de tempo de período/janela) emConcatenatingMediaSource2
(11226, link em inglês). - Mude
BaseRenderer.onStreamChanged()
para também receber um argumentoMediaPeriodId
.
- Transformador:
- Analise os dados de rotação EXIF para entradas de imagem.
- O tipo de anotação
TransformationRequest.HdrMode
e as constantes associadas foram removidos. UseComposition.HdrMode
e as constantes associadas. - Simplifique o
OverlaySettings
para corrigir problemas de rotação. - Os parâmetros
frameRate
edurationUs
deSampleConsumer.queueInputBitmap
foram alterados paraTimestampIterator
.
- Seleção de faixas:
- Foi adicionado
DefaultTrackSelector.Parameters.allowAudioNonSeamlessAdaptiveness
para permitir ou não permitir a adaptação não integrada. O padrão permanece no comportamento atual detrue
.
- Foi adicionado
- Extratores:
- MPEG-TS: garante que o último frame seja renderizado transmitindo a última unidade de acesso de um stream para a fila de amostras (#7909).
- Correção de erro de digitação ao determinar
rotationDegrees
.projectionPosePitch
foi alterado paraprojectionPoseRoll
(#461). - Remove a suposição de que as instâncias de
Extractor
podem ser inspecionadas diretamente cominstanceof
. Se você quiser acesso 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
. - Adição de
suporte ao
QuickTime clássico
a
Mp4Extractor
.
- Áudio:
- Adição de suporte a PCM big-endian de 24/32 bits em MP4 e Matroska e análise
da codificação PCM para
lpcm
em MP4. - Adição de suporte para extrair áudio Vorbis em MP4.
- Foi adicionado
AudioSink.getFormatOffloadSupport(Format)
, que recupera o nível de suporte de transferência que o sink pode fornecer para o formato usando umDefaultAudioOffloadSupportProvider
. Ele retorna o novoAudioOffloadSupport
que contémisFormatSupported
,isGaplessSupported
eisSpeedChangeSupported
. - Adicione
AudioSink.setOffloadMode()
, que configura a configuração de transferência no sink de áudio. O padrão éAudioSink.OFFLOAD_MODE_DISABLED
. - O offload pode ser ativado usando
setAudioOffloadPreference
emTrackSelectionParameters
. Se a preferência definida for ativar, o dispositivo oferece suporte ao desligamento para o formato e a seleção de faixa for uma única faixa de áudio, o desligamento de áudio será ativado. - Se
audioOffloadModePreference
estiver definido comoAUDIO_OFFLOAD_MODE_PREFERENCE_REQUIRED
, oDefaultTrackSelector
só vai selecionar uma faixa de áudio e somente se o formato dela tiver suporte para o offload. Se nenhuma faixa de áudio tiver suporte no offload, nenhuma faixa será selecionada. - Desativação do suporte sem intervalos para transferência de dados quando o nível anterior à API 33 devido a um problema na posição de reprodução após a transição da faixa.
- O parâmetro
enableOffload
foi removido da assinatura do métodoDefaultRenderersFactory.buildAudioSink
. - Remova o método
DefaultAudioSink.Builder.setOffloadMode
. - Remova o valor intdef
DefaultAudioSink.OffloadMode.OFFLOAD_MODE_ENABLED_GAPLESS_DISABLED
. - Adição de suporte a metadados sem lacunas do Opus durante a reprodução de transferência de dados.
- Permitir a recuperação do renderizador desativando o offload se houver falha na primeira gravação (627).
- Ativação da programação de transferência por padrão para reprodução offloaded somente de áudio.
- Exclua
ExoPlayer.experimentalSetOffloadSchedulingEnabled
eAudioOffloadListener.onExperimentalOffloadSchedulingEnabledChanged
. onExperimentalSleepingForOffloadChanged
foi renomeado comoonSleepingForOffloadChanged
, eonExperimentalOffloadedPlayback
comoonOffloadedPlayback
.- Movimentação de interfaces
TrackSelectionParameters
relacionadas ao modo de transferência de áudio e definições para uma classeAudioOffloadPreferences
interna. - Adicione callbacks
onAudioTrackInitialized
eonAudioTrackReleased
aAnalyticsListener
,AudioRendererEventListener
eAudioSink.Listener
. - Correção do problema de underflow do buffer de áudio DTS Express (#650).
- Correção de um bug em que a verificação de recursos para E-AC3-JOC gerava uma
IllegalArgumentException
(677).
- Adição de suporte a PCM big-endian de 24/32 bits em MP4 e Matroska e análise
da codificação PCM para
- Vídeo:
- Permita que
MediaCodecVideoRenderer
use umVideoFrameProcessor.Factory
personalizado. - Correção de um bug em que o primeiro frame não podia ser renderizado se o fluxo de áudio começasse com carimbos de data/hora negativos (291, link em inglês).
- Permita que
- Texto:
- O
ExoplayerCuesDecoder
foi removido. As faixas de texto comsampleMimeType = application/x-media3-cues
agora são processadas diretamente porTextRenderer
sem precisar de uma instânciaSubtitleDecoder
.
- O
- Metadados:
MetadataDecoder.decode
não será mais chamado para amostras "somente decodificação", já que a implementação precisa retornar nulo.
- Efeito:
- Adição de
VideoFrameProcessor.queueInputBitmap(Bitmap, Iterator<Long>)
para enfileirar a entrada de bitmap por carimbo de data/hora. - Mude
VideoFrameProcessor.registerInputStream()
para não bloquear. Os apps precisam implementarVideoFrameProcessor.Listener#onInputStreamRegistered()
. - Os parâmetros
frameRate
edurationUs
deVideoFrameProcessor.queueInputBitmap
foram alterados paraTimestampIterator
.
- Adição de
- Extensão de IMA:
- Correção de um bug em que uma transmissão ao vivo DASH de vários períodos que não é o primeiro item de uma playlist pode gerar uma exceção (571, link em inglês).
- Libere o StreamManager antes de chamar
AdsLoader.destroy()
- O SDK do IMA foi movido para a versão 3.31.0.
- Sessão:
- O comportamento do serviço em primeiro plano de notificações foi definido como
FOREGROUND_SERVICE_IMMEDIATE
emDefaultMediaNotificationProvider
(#167). - Use apenas
android.media.session.MediaSession.setMediaButtonBroadcastReceiver()
na API 31 ou versões mais recentes para evitar problemas com a API descontinuada em dispositivos Samsung (#167). - Use o MediaNotificationController como proxy para definir os comandos disponíveis e o layout personalizado usado para preencher a notificação e a sessão da plataforma.
- Converta eventos de botão de mídia recebidos por
MediaSessionService.onStartCommand()
no Media3 em vez de encaminhar para a sessão da plataforma e voltar para o Media3. Com isso, o controlador de chamada é sempre o controlador de notificação de mídia, e os apps podem reconhecer facilmente as chamadas provenientes da notificação da mesma forma em todos os níveis de API com suporte. - Correção de um bug em que o
MediaController.getCurrentPosition()
não avança quando conectado a umMediaSessionCompat
legado - Adicione
MediaLibrarySession.getSubscribedControllers(mediaId)
para conveniência. - Substitua
MediaLibrarySession.Callback.onSubscribe()
para declarar a disponibilidade do ID pai em que o controlador é inscrito. Se for bem-sucedido, a assinatura será aceita enotifyChildrenChanged()
será chamada imediatamente para informar o navegador (#561). - Adicione o módulo de demonstração de sessão para o Automotive OS e ative a demonstração de sessão para o Android Auto.
- Não defina a fila da sessão do framework quando
COMMAND_GET_TIMELINE
não estiver disponível para o controlador de notificação de mídia. Com o Android Auto como o controlador de cliente lendo da sessão do framework, o botãoqueue
na interface do Android Auto não aparece (#339). - O
DataSourceBitmapLoader
foi usado por padrão em vez deSimpleBitmapLoader
(#271, #327). - Adição de
MediaSession.Callback.onMediaButtonEvent(Intent)
, que permite que apps substituam o processamento de eventos padrão do botão de mídia.
- O comportamento do serviço em primeiro plano de notificações foi definido como
- Interface:
- Adição de uma implementação de
Player.Listener
para dispositivos Wear OS que processa a supressão de reprodução devido aPlayer.PLAYBACK_SUPPRESSION_REASON_UNSUITABLE_AUDIO_OUTPUT
, iniciando 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).
- Adição de uma implementação de
- Downloads:
- Declare o tipo de serviço em primeiro plano "data sync" para
DownloadService
para compatibilidade com o Android 14. Ao usar esse serviço, o app também precisa adicionardataSync
comoforegroundServiceType
no manifesto e adicionar a permissãoFOREGROUND_SERVICE_DATA_SYNC
(#11239).
- Declare o tipo de serviço em primeiro plano "data sync" para
- Extensão HLS:
- A playlist ao vivo do HLS é atualizada com um intervalo calculado a partir do último horário de início de carregamento, em vez do último horário de conclusão de carregamento (#663).
- Extensão DASH:
- Permitir vários identificadores DASH no URL do modelo de segmento.
- Adição de suporte experimental para analisar legendas durante a extração. Isso
tem melhor suporte para mesclar legendas sobrepostas, incluindo
a resolução de cintilação ao fazer a transição entre segmentos de legenda. É
possível ativar esse recurso usando
DashMediaSource.Factory.experimentalParseSubtitlesDuringExtraction()
(288, link em inglês).
- Extensão RTSP:
- Correção de uma disputa que poderia levar a
IndexOutOfBoundsException
ao retornar ao TCP ou à reprodução em algumas situações. - Verificação do estado na configuração RTSP ao retornar o estado de carregamento de
RtspMediaPeriod
(#577). - Os métodos de solicitação Rtsp personalizados são ignorados no cabeçalho público de resposta de opções (#613, link em inglês).
- O valor do tempo limite da resposta de configuração RTSP é usado no intervalo de tempo do envio de solicitações de opções RTSP de manutenção (662).
- Correção de uma disputa que poderia levar a
- Extensões do decodificador (FFmpeg, VP9, AV1, MIDI etc.):
- Libere o módulo de decodificador MIDI, que oferece suporte à reprodução de arquivos MIDI padrão usando a biblioteca Jsyn para sintetizar áudio.
- Adicione
DecoderOutputBuffer.shouldBeSkipped
para marcar diretamente os buffers de saída que não precisam ser apresentados. Essa é a opção recomendada em vez deC.BUFFER_FLAG_DECODE_ONLY
, que será descontinuado. - Foram adicionados
Decoder.setOutputStartTimeUs
eSimpleDecoder.isAtLeastOutputStartTimeUs
para permitir que os decodificadores descartem amostras somente de decodificação antes do horário de início. Esse é o preferido em relação aoBuffer.isDecodeOnly
, que será descontinuado. - Correção de bug de publicação do artefato do decodificador MIDI no repositório Maven. O
artefato foi renomeado para
media3-exoplayer-midi
(#734).
- Extensão do Leanback:
- Correção de um bug em que a desativação de uma superfície podia causar uma
ArithmeticException
no código Leanback (#617).
- Correção de um bug em que a desativação de uma superfície podia causar uma
- Test Utilities:
- Tornar
TestExoPlayerBuilder
eFakeClock
compatíveis com os testes de interface do Espresso e do Compose. Isso corrige um bug em que a reprodução avança de forma não determinística durante as interações de visualização do Espresso ou do Compose.
- Tornar
- Símbolos descontinuados foram removidos:
- Remova
TransformationRequest.Builder.setEnableRequestSdrToneMapping(boolean)
eTransformationRequest.Builder.experimental_setEnableHdrEditing(boolean)
. UseComposition.Builder.setHdrMode(int)
e transmita oComposition
paraTransformer.start(Composition, String)
. - Remova o método
DownloadNotificationHelper.buildProgressNotification
descontinuado e use um método não descontinuado que aceita um parâmetronotMetRequirements
.
- Remova
Versão 1.2.0-rc01
1º de novembro de 2023
Use a versão estável 1.2.0.
Versão 1.2.0-beta01
19 de outubro de 2023
Use a versão estável 1.2.0.
Versão 1.2.0-alpha02
29 de setembro de 2023
Use a versão estável 1.2.0.
Versão 1.2.0-alpha01
17 de agosto de 2023
Use a versão estável 1.2.0.
Versão 1.1.0
Versão 1.1.1
16 de agosto de 2023
- Biblioteca comum:
- A dependência
multidex
adicionada acidentalmente foi removida de todos os módulos (#499).
- A dependência
- ExoPlayer:
- Correção de um problema em
PlaybackStatsListener
em quePlaybackStats
s espúrias eram criadas depois que a playlist era apagada - Adicionamos mais campos ao registro de dados comuns do cliente de mídia (CMCD, na sigla em inglês): formato de streaming (sf), tipo de stream (st), versão (v), maior taxa de bits (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_ENDED
ao reproduzir arquivos muito curtos (#538).
- Correção de um bug em que
- Descarregar áudio:
- Adicione cabeçalhos de ID e de comentário Ogg às páginas de bitstream para reprodução de Opus descarregado de acordo com o RFC 7845.
- Vídeo:
- H.265/HEVC: correção da análise de informações de imagem de referência de curto e longo prazo do SPS.
- Texto:
- CEA-608: a lógica de truncamento de dicas foi alterada para considerar apenas o texto visível. Anteriormente, o recuo e o deslocamento de tabulação eram incluídos ao limitar o comprimento da dica a 32 caracteres (o que era tecnicamente correto de acordo com a especificação) (#11019).
- Extensão de IMA:
- O SDK do IMA foi movido para a versão 3.30.3.
- Sessão:
- Adicione um layout personalizado ao estado do controlador e forneça um getter para
acessar. Quando o layout personalizado muda,
MediaController.Listener.onCustomLayoutChanged
é chamado. Os apps que querem enviar layouts personalizados diferentes para diferentes controladores Media3 podem fazer isso emMediaSession.Callback.onConnect
usando umAcceptedResultBuilder
para garantir que o layout personalizado esteja disponível para o controlador quando a conexão for concluída. - Correção de casos em que
MediaLibraryServiceLegacyStub
enviava um erro para umResult
que não tinha suporte a ele, o que produzia umUnsupportedOperationException
(#78). - Corrija a maneira como
PlayerWrapper
cria umVolumeProviderCompat
determinandovolumeControlType
usando comandos legados (COMMAND_ADJUST_DEVICE_VOLUME
eCOMMAND_SET_DEVICE_VOLUME
) e novos comandos (COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
eCOMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
) (#554).
- Adicione um layout personalizado ao estado do controlador e forneça um getter para
acessar. Quando o layout personalizado muda,
Versão 1.1.0
5 de julho de 2023
- Biblioteca comum:
- Adicionar o motivo da supressão para a rota de áudio inadequada e tocar quando estiver pronto mudar o motivo da supressão por muito tempo. (15).
- Adicionar comandos ao player:
COMMAND_GET_METADATA
COMMAND_SET_PLAYLIST_METADATA
COMMAND_SET_DEVICE_VOLUME_WITH_FLAGS
COMMAND_ADJUST_DEVICE_VOLUME_WITH_FLAGS
- Foram adicionados métodos sobrecarregados ao player que permitem que os usuários especifiquem flags
de volume:
void setDeviceVolume(int, int)
void increaseDeviceVolume(int)
void decreaseDeviceVolume(int)
void setDeviceMuted(boolean, int)
- Adição de
Builder
paraDeviceInfo
e descontinuação do construtor - A
DeviceInfo.routingControllerId
foi adicionada para especificar o ID do controlador de roteamento para reprodução remota. Player.replaceMediaItem(s)
foi adicionado como um atalho para adicionar e remover itens na mesma posição (8046, link em inglês).
- ExoPlayer:
- Permitir que o ExoPlayer tenha controle dos métodos de volume do dispositivo somente se
ele tiver sido ativado explicitamente. Use
ExoPlayer.Builder.setDeviceVolumeControlEnabled
para ter acesso a:getDeviceVolume()
isDeviceMuted()
setDeviceVolume(int)
esetDeviceVolume(int, int)
increaseDeviceVolume(int)
eincreaseDeviceVolume(int, int)
decreaseDeviceVolume(int)
edecreaseDeviceVolume(int, int)
- Adicionamos
FilteringMediaSource
, que permite filtrar os tipos de faixa disponíveis de umMediaSource
. - Adição de suporte para a inclusão de dados comuns do cliente de mídia (CMCD, na sigla em inglês) nas
solicitações de saída de formatos de streaming adaptável DASH, HLS e
SmoothStreaming. Os seguintes campos,
br
,bl
,cid
,rtp
esid
, foram incorporados (#8699). Estrutura e métodos da API:- A geração de registros de CMCD é desativada por padrão. Use
MediaSource.Factory.setCmcdConfigurationFactory(CmcdConfiguration.Factory cmcdConfigurationFactory)
para ativá-la. - Todas as chaves são ativadas por padrão. Substitua
CmcdConfiguration.RequestConfig.isKeyAllowed(String key)
para filtrar as chaves registradas. - Substitua
CmcdConfiguration.RequestConfig.getCustomData()
para ativar a geração de registros de chaves personalizadas.
- A geração de registros de CMCD é desativada por padrão. Use
- Ação adicional adicionada ao manifesto da demonstração principal para facilitar
o início do app de demonstração com um arquivo
*.exolist.json
personalizado (439, link em inglês). - Adição de
ExoPlayer.setVideoEffects()
para usarEffect
durante a reprodução de vídeo. - Atualize
SampleQueue
para armazenarsourceId
como umlong
em vez de umint
. Isso muda as assinaturas dos métodos públicosSampleQueue.sourceId
eSampleQueue.peekSourceId
. - Adição de parâmetros aos métodos
LoadControl
shouldStartPlayback
eonTracksSelected
que permitem associar esses métodos aoMediaPeriod
relevante. - Mude a assinatura de
ServerSideAdInsertionMediaSource.setAdPlaybackStates(Map<Object, AdPlaybackState>)
adicionando um parâmetro de linha do tempo que contenha os períodos com os UIDs usados como chaves no mapa. Isso é necessário para evitar problemas de simultaneidade com transmissões ao vivo de vários períodos. - O uso de
EventDispatcher.withParameters(int windowIndex, @Nullable MediaPeriodId mediaPeriodId, long mediaTimeOffsetMs)
eBaseMediaSource.createEventDispatcher(..., long mediaTimeOffsetMs)
foi descontinuado. A variante dos métodos sem omediaTimeOffsetUs
pode ser chamada em vez disso. Mesmo para as variantes descontinuadas, o deslocamento não é mais adicionado astartTimeUs
eendTimeUs
dos objetosMediaLoadData
que são enviados pelo despachante. - Renomeie
ExoTrackSelection.blacklist
comoexcludeTrack
eisBlacklisted
comoisTrackExcluded
. - Correção do comportamento inconsistente entre
ExoPlayer.setMediaItem(s)
eaddMediaItem(s)
quando chamado em uma playlist vazia
- Permitir que o ExoPlayer tenha controle dos métodos de volume do dispositivo somente se
ele tiver sido ativado 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 poderia travar (levando ao tempo limite do muxer) se o fim do fluxo de vídeo fosse sinalizado no momento em que um frame de entrada estava em processamento.
- Consulte codecs por
MediaCodecList
em vez de usar utilitáriosfindDecoder/EncoderForFormat
para ampliar o suporte. - A configuração de B-frame foi removida do
DefaultEncoderFactory
porque não funciona em alguns dispositivos.
- O
- Seleção de faixas:
- Adicionado
DefaultTrackSelector.Parameters.allowInvalidateSelectionsForRendererCapabilitiesChange
, que é desativado por padrão. Quando ativado, oDefaultTrackSelector
aciona uma nova seleção de faixa quando os recursos do renderizador são alterados.
- Adicionado
- Extratores:
- Áudio:
- Correção de um bug em que algumas reproduções falhavam quando o encapsulamento estava ativado e
AudioProcessors
estavam ativos, por exemplo, para corte sem lacunas (#10847). - Encapsular frames Opus em pacotes Ogg em transmissões diretas (descarga).
- Extrapolar a posição atual durante o modo de suspensão com a programação de transferência de carga.
- Adicione
Renderer.release()
eAudioSink.release()
para liberar os recursos no final do ciclo de vida do player. - Ouça as mudanças nos recursos de áudio em
DefaultAudioSink
. Adicione um parâmetro obrigatóriocontext
no construtor deDefaultAudioSink
, com o qual oDefaultAudioSink
vai ser registrado como listener para oAudioCapabilitiesReceiver
e atualizar a propriedadeaudioCapabilities
quando informado sobre uma mudança de recursos. - Propague as mudanças nos recursos de áudio usando um novo evento
onAudioCapabilitiesChanged
na interfaceAudioSink.Listener
e uma nova interfaceRendererCapabilities.Listener
que aciona eventosonRendererCapabilitiesChanged
. - Adição de
ChannelMixingAudioProcessor
para aplicar dimensionamento/mixagem a canais de áudio. - Foi adicionado um novo valor int
DISCARD_REASON_AUDIO_BYPASS_POSSIBLE
aDecoderDiscardReasons
para descartar o decodificador de áudio quando o modo de bypass é possível após a mudança dos recursos de áudio. - Adição de suporte à reprodução direta para DTS Express e DTS:X (335, link em inglês).
- Correção de um bug em que algumas reproduções falhavam quando o encapsulamento estava ativado e
- Vídeo:
- Fazer com que
MediaCodecVideoRenderer
informe umVideoSize
com largura e altura de 0 quando o renderizador estiver desativado.Player.Listener.onVideoSizeChanged
é chamado de acordo com a mudança dePlayer.getVideoSize()
. Com essa mudança, o tamanho do vídeo do ExoPlayer comMediaCodecVideoRenderer
tem uma largura e altura de 0 quandoPlayer.getCurrentTracks
não oferece suporte a vídeo ou o tamanho da faixa de vídeo com suporte ainda não foi determinado.
- Fazer com que
- DRM:
- Reduzimos a visibilidade de vários métodos somente internos em
DefaultDrmSession
que não são esperados para serem 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
- Muxador:
- Adicionou 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 DAI. A implementação atual ainda não oferece suporte à busca em transmissões ao vivo (10912).
- Correção de um bug em que um novo grupo de anúncios era inserido em transmissões ao vivo porque a posição do conteúdo calculado em linhas do tempo consecutivas variava um pouco.
- Sessão:
- Adicione o método auxiliar
MediaSession.getControllerForCurrentRequest
para receber informações sobre o controlador que está chamando o método aPlayer
. androidx.media3.session.MediaButtonReceiver
foi adicionado para permitir que apps implementem a retomada da reprodução com eventos do botão de mídia enviados por, por exemplo, um fone de ouvido Bluetooth (167, link em inglês).- Adição de implementação padrão a
MediaSession.Callback.onAddMediaItems
para permitir que oMediaItems
solicitado seja transmitido paraPlayer
se ele tiverLocalConfiguration
(por exemplo, URI) (282). - Botões de comando "seek to previous" e "seek to next" foram adicionados à visualização de notificação de mídia compacta por padrão para o Android 12 e versões anteriores (410, link em inglês).
- Adição de implementação padrão a
MediaSession.Callback.onAddMediaItems
para permitir que oMediaItems
solicitado seja transmitido paraPlayer
se ele tiverLocalConfiguration
(por exemplo, URI) (282). - Botões de comando "seek to previous" e "seek to next" foram adicionados à visualização de notificação de mídia compacta por padrão para o Android 12 e versões anteriores (410, link em inglês).
- Adicione o método auxiliar
- Interface:
- Foram adicionados os métodos utilitários
shouldShowPlayButton
ehandlePlayPauseButtonAction
para gravar elementos de interface personalizados com um botão de reprodução/pausa.
- Foram adicionados os métodos utilitários
- Extensão RTSP:
- Extensão DASH:
- O deslocamento de tempo da mídia foi removido de
MediaLoadData.startTimeMs
eMediaLoadData.endTimeMs
para transmissões DASH de vários períodos. - Correção de um bug em que a preparação de uma fonte de mídia Dash ao vivo com vários períodos
produzia uma
IndexOutOfBoundsException
(#10838).
- O deslocamento de tempo da mídia foi removido de
- Extensão HLS:
- Adicione
HlsMediaSource.Factory.setTimestampAdjusterInitializationTimeoutMs(long)
para definir um tempo limite para que a linha de execução de carregamento aguarde a inicialização daTimestampAdjuster
. Se a inicialização não for concluída antes do tempo limite, umaPlaybackException
será gerada para evitar a reprodução infinita. O tempo limite é definido como zero por padrão (#323).
- Adicione
- Test Utilities:
- 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
DefaultAudioSink
foram removidos. UseDefaultAudioSink.Builder
. - Remova
HlsMasterPlaylist
e useHlsMultivariantPlaylist
. - O
Player.stop(boolean)
foi removido. UsePlayer.stop()
ePlayer.clearMediaItems()
(sereset
fortrue
). - Dois construtores
SimpleCache
foram descontinuados. Use um construtor que não foi descontinuado e que usa umDatabaseProvider
para melhorar o desempenho. - O construtor
DefaultBandwidthMeter
foi removido. UseDefaultBandwidthMeter.Builder
. - Os construtores
DefaultDrmSessionManager
foram removidos. UseDefaultDrmSessionManager.Builder
. - Dois construtores
HttpDataSource.InvalidResponseCodeException
descontinuados foram removidos. Use um construtor não descontinuado que aceite campos adicionais(cause
,responseBody
) para melhorar a geração de registros de erros. - Remova
DownloadHelper.forProgressive
,DownloadHelper.forHls
,DownloadHelper.forDash
eDownloadHelper.forSmoothStreaming
. UseDownloadHelper.forMediaItem
. - O construtor
DownloadService
foi descontinuado. Use um construtor que não seja descontinuado e que inclua a opção de fornecer um parâmetrochannelDescriptionResourceId
. - As constantes de string descontinuadas para Charsets (
ASCII_NAME
,UTF8_NAME
,ISO88591_NAME
,UTF16_NAME
eUTF16LE_NAME
) foram removidas. Use Charsets do Kotlin do pacotekotlin.text
,java.nio.charset.StandardCharsets
oucom.google.common.base.Charsets
. - O construtor
WorkManagerScheduler
foi removido e substituído por um construtor que inclui a opção de fornecer um parâmetroContext
. - Os métodos
createVideoSampleFormat
,createAudioSampleFormat
,createContainerFormat
ecreateSampleFormat
, que foram usados para instanciar a classeFormat
, foram removidos. Em vez disso, useFormat.Builder
para criar instâncias deFormat
. - Remova os métodos
copyWithMaxInputSize
,copyWithSubsampleOffsetUs
,copyWithLabel
,copyWithManifestFormatInfo
,copyWithGaplessInfo
,copyWithFrameRate
,copyWithDrmInitData
,copyWithMetadata
,copyWithBitrate
ecopyWithVideoSize
descontinuados. UseFormat.buildUpon()
e os métodos de definição em vez disso. - Remova o
ExoPlayer.retry()
descontinuado e useprepare()
. - O construtor
DefaultTrackSelector
com zero argumentos foi removido. UseDefaultTrackSelector(Context)
. - O construtor
OfflineLicenseHelper
foi descontinuado. UseOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - O construtor
DownloadManager
foi descontinuado. Use o construtor que recebe umExecutor
. - Os construtores
Cue
foram removidos. UseCue.Builder
. - O construtor
OfflineLicenseHelper
foi descontinuado. UseOfflineLicenseHelper(DefaultDrmSessionManager, DrmSessionEventListener.EventDispatcher)
. - Foram removidos quatro métodos
AnalyticsListener
descontinuados:onDecoderEnabled
, useonAudioEnabled
e/ouonVideoEnabled
.onDecoderInitialized
, useonAudioDecoderInitialized
e/ouonVideoDecoderInitialized
.onDecoderInputFormatChanged
, useonAudioInputFormatChanged
e/ouonVideoInputFormatChanged
.onDecoderDisabled
, useonAudioDisabled
e/ouonVideoDisabled
.
- Remova o
Player.Listener.onSeekProcessed
e oAnalyticsListener.onSeekProcessed
descontinuados. UseonPositionDiscontinuity
comDISCONTINUITY_REASON_SEEK
. - Remova
ExoPlayer.setHandleWakeLock(boolean)
e usesetWakeMode(int)
. - Remova o
DefaultLoadControl.Builder.createDefaultLoadControl()
descontinuado e usebuild()
. - Remova o
MediaItem.PlaybackProperties
descontinuado e useMediaItem.LocalConfiguration
. O campo descontinuadoMediaItem.playbackProperties
agora é 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:
- Adição de
Buffer.isLastSample()
que indica seBuffer
contém a flagC.BUFFER_FLAG_LAST_SAMPLE
. - Correção do problema em que o último frame não podia ser renderizado se a última amostra com frames fosse removida da fila sem ler a amostra "end of stream". (11079).
- Adição de
- Extratores:
- A análise de H.265 SPS em arquivos MPEG-TS foi corrigida reutilizando a lógica de análise já usada pelos extratores RTSP e MP4 (303, link em inglês).
- Texto:
- SSA: foi adicionado suporte para arquivos UTF-16 que começarem com uma marca de ordem de byte (319).
- Sessão:
- Correção do problema em que o
MediaController
não atualiza os comandos disponíveis quando conectado a umMediaSessionCompat
legado que atualiza as ações. - Correção do bug que impedia a
MediaLibraryService
de retornar null para uma chamada da IU do sistema paraCallback.onGetLibraryRoot
comparams.isRecent == true
na API 30 (#355). - Correção do vazamento de memória de
MediaSessionService
ouMediaLibraryService
(#346). - Correção de um bug em que uma atualização combinada de
Timeline
e posição em umMediaSession
pode fazer com que umMediaController
gere umaIllegalStateException
.
- Correção do 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:
- Redefinição de substituição de transmissão ao vivo de destino ao buscar a posição padrão (11051).
- Correção de um bug em que fluxos de amostra vazios na mídia podiam causar travamento da reprodução.
- Sessão:
- Correção de um bug em que vários itens de fila idênticos publicados por um
MediaSessionCompat
legado resultam em uma exceção emMediaController
(290, link em inglês). - O redirecionamento de
MediaSession.broadcastCustomCommand
ausente foi adicionado aoMediaControllerCompat.Callback.onSessionEvent
legada (293). - Correção de um bug em que chamar
MediaSession.setPlayer
não atualizava os comandos disponíveis. - Correção de um problema em que as instâncias de
TrackSelectionOverride
enviadas de umMediaController
eram ignoradas se referenciassem um grupo comFormat.metadata
(#296). - Correção de um problema em que o
Player.COMMAND_GET_CURRENT_MEDIA_ITEM
precisa estar disponível para acessar metadados peloMediaSessionCompat
legado. - Correção de um problema em que instâncias
MediaSession
em 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).
- Correção de 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 vazios (#11014).
- RTSP:
- Tente novamente com TCP se a configuração RTSP com UDP falhar com o erro RTSP 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:
- A diferença máxima do horário de início de dois segmentos a serem
combinados é configurável em
SegmentDownloader
e subclasses (#248).
- A diferença máxima do horário de início de dois segmentos a serem
combinados é configurável em
- Áudio:
- Vídeo:
- O formato HEVC HDR10 foi mapeado para
HEVCProfileMain10HDR10
em vez deHEVCProfileMain10
. - Adicionamos uma solução alternativa para um problema de dispositivo no Chromecast com Google TV e Lenovo M10 FHD Plus que faz com que os streams AVC de 60 fps sejam marcados como sem suporte (#10898).
- Correção de problemas de desempenho de liberação de frame ao reproduzir mídia com uma taxa de frames muito maior do que a taxa de atualização da tela.
- O formato HEVC HDR10 foi mapeado para
- Transmitir:
- Correção de
STATE_IDLE
transitório ao fazer a transição entre itens de mídia (245, link em inglês).
- Correção de
- RTSP:
- A exceção IllegalArgumentException gerada na análise de mensagens de resposta de RTSP inválidas é detectada (#10971).
- Sessão:
- Correção de um bug em que o botão de reprodução/pausa da notificação não era atualizado com o estado do player (192, link em inglês).
- Extensão de IMA:
- Correção de um bug que impedia o início de streams de DAI sem anúncios
porque o primeiro (e, no caso sem anúncios, o único) evento
LOADED
não foi recebido.
- Correção de um bug que impedia o início de streams de DAI sem anúncios
porque o primeiro (e, no caso sem anúncios, o único) evento
Versão 1.0.0-rc01
16 de fevereiro de 2023
Lançamento de androidx.media3:media3-*:1.0.0-rc01
.
A versão 1.1.0-rc01 contém estas confirmações.
Ela corresponde à versão do ExoPlayer 2.18.3.
- Biblioteca principal:
- Ajustar a lógica de ordem do decodificador do renderizador para manter as
preferências do
MediaCodecSelector
, mesmo se um decodificador informar que não consegue reproduzir a mídia de maneira eficiente. Por exemplo, com o seletor padrão, o decodificador de hardware com suporte apenas funcional terá preferência ao decodificador de software que tem suporte total para o formato (10604, link em inglês). - Foi adicionado o
ExoPlayer.Builder.setPlaybackLooper
, que define uma linha de execução de reprodução existente para uma nova instância do ExoPlayer. - Isso permite que os auxiliares do gerenciador de download sejam apagados (10776, link em inglês).
- Foi adicionado um parâmetro ao
BasePlayer.seekTo
para indicar o comando usado para a busca. - O tema é usado ao carregar drawables no nível 21 ou mais recente da API (220, link em inglês).
ConcatenatingMediaSource2
foi adicionado, o que permite combinar vários itens de mídia em uma única janela (247, link em inglês).
- Ajustar a lógica de ordem do decodificador do renderizador para manter as
preferências do
- Extratores:
- Uma
ParserException
é gerada em vez deNullPointerException
se a tabela de amostras (stbl) estiver sem a descrição necessária (stsd) ao analisar os átomos da lixeira. - Amostras são puladas corretamente ao buscar um frame de sincronização em fMP4 diretamente (10941).
- Uma
- Áudio:
- Use a taxa de bits do formato de áudio compactado para calcular o tamanho mínimo do buffer
para
AudioTrack
em reproduções diretas (passagem).
- 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.getEventTime
se um arquivo de legenda não contivesse dicas, foi corrigido. - SubRip: foi adicionado suporte para arquivos UTF-16 que começarem com uma marca de ordem de byte.
- O
- Metadados:
- Análise de diversos valores separados por nulo de frames ID3, conforme permitido pelo ID3 v2.4.
MediaMetadata.mediaType
foi adicionado para indicar o tipo de conteúdo ou de pasta descrito pelos metadados.MediaMetadata.folderType
foi substituído 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
PlayerView
ao usar um layout da direita para a esquerda (RTL, na sigla em inglês) (227, link em inglês).
- O
- Sessão:
- O abstrato
SimpleBasePlayer
foi adicionado para ajudar a implementar a interfacePlayer
para players personalizados. - O método auxiliar
SessionToken
foi adicionado para converter o token de sessão da plataforma em Media3 (171, link em inglês). - Uso de
onMediaMetadataChanged
para acionar atualizações da sessão de mídia da plataforma (219, link em inglês). - A sessão de mídia foi adicionada como argumento de
getMediaButtons()
doDefaultMediaNotificationProvider
e usa listas imutáveis para maior clareza (216, link em inglês). - O listener de callback
onSetMediaItems
foi adicionado para fornecer meios de modificar/definir a 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.mediaType
foi adicionado para indicar o tipo de conteúdo ou de pasta descrito pelos metadados.MediaMetadata.folderType
foi 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
ImaServerSideAdInsertionMediaSource
na linha de execução do app para evitar problemas. - Foi adicionada uma propriedade
focusSkipButtonWhenAvailable
aoImaServerSideAdInsertionMediaSource.AdsLoader.Builder
para solicitar o foco no botão "Pular" em dispositivos de TV e defini-lo como "true" por padrão. - Foi adicionado um método
focusSkipButton()
aoImaServerSideAdInsertionMediaSource.AdsLoader
para solicitar de maneira programática o foco no botão "Pular". - O SDK do IMA foi movido para a versão 3.29.0.
- 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.isTunnelingEnabled
foi adicionado para verificar se o encapsulamento está ativado para as faixas selecionadas no momento (#2518). - O
WrappingMediaSource
foi adicionado para simplificar o encapsulamento de um ú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
onMediaItemTransition
ausente é enviado ao chamarseekToNext
ouseekToPrevious
em uma playlist de item único (#10667). - Novo
Player.getSurfaceSize
, que retorna o tamanho da superfície em que o vídeo é renderizado. - O bug em que a remoção de listeners durante a liberação do player poderia causar uma
IllegalStateException
(#10758) foi corrigido.
- O
- Build:
- O
compileSdkVersion
mínimo foi aplicado para evitar erros de compilação (#10684). - Evite publicar o bloco quando estiver incluído em outro build do Gradle.
- 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
ProgressiveDownloader
causado 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:
SingleThreadExecutor
será usado para liberar instâncias deAudioTrack
e evitar erros de OutOfMemory ao liberar vários reprodutores ao mesmo tempo (#10057).- Novo
AudioOffloadListener.onExperimentalOffloadedPlayback
para o estado de descarga do AudioTrack (#134). - O
AudioTrackBufferSizeProvider
foi transformado em uma interface pública. - Novo
ExoPlayer.setPreferredAudioDevice
para definir o dispositivo de saída de áudio preferencial (#135). - O
androidx.media3.exoplayer.audio.AudioProcessor
foi renomeado 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,
MetadataRenderer
pode 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 opened
ao alternar entre esquemas DRM em uma playlist, como mudar de Widevine para ClearKey.
- Texto:
- CEA-608: garante que os comandos de alternância do serviço no campo 2 sejam processados corretamente (#10666).
- DASH:
- Análise de
EventStream.presentationTimeOffset
dos manifestos (#10460).
- 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.Builder
foi 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). SimpleBitmapLoader
pode carregar bitmaps de URIsfile://
(#108).- A declaração que impede que
MediaController
busque um anúncio em um período foi corrigida (#122). - Quando a reprodução termina, o
MediaSessionService
é interrompido em primeiro plano e uma notificação é mostrada para reiniciar a reprodução do último item de mídia reproduzido (#112). - Serviços em primeiro plano não serão iniciados com uma intent pendente para pausa (#167).
- O "selo" associado à notificação criada por
DefaultNotificationProvider
foi ocultado nas APIs 26 e 27. O selo é oculto automaticamente na API 28 e mais recentes (#131). - Correção do bug em que uma segunda conexão do binder de uma MediaSession legada para uma MediaController Media3 causava IllegalStateExceptions (#49).
- RTSP:
- 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 identificarCastPlayer
ao 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
ShuffleOrder
comExoPlayer.setShuffleOrder
resulta em uma chamada paraPlayer.Listener#onTimelineChanged
comreason=Player.TIMELINE_CHANGE_REASON_PLAYLIST_CHANGED
(#9889). - Para mídias progressivas, inclua apenas faixas selecionadas na posição em buffer (#10361).
- Agora há um logger personalizado para toda a saída de registro do ExoPlayer (#9752).
- Correção da implementação de
setDataSourceFactory
emDefaultMediaSourceFactory
, 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
playWhenReady
emLeanbackAdapter
(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.
null
eMediaSource.Factory.setDrmSessionManagerProvider
foram renomeados comoMediaSource.Factory.setLoadErrorHandlingPolicy
. As instâncias deDefaultDrmSessionManagerProvider
eDefaultLoadErrorHandlingPolicy
podem ser explicitamente transmitidas, se necessário.MediaItem.RequestMetadata
foi adicionado para representar os metadados necessários para reproduzir a mídia quandoLocalConfiguration
não for conhecido.MediaMetadata.mediaUrl
também foi removido, porque agora ele está incluído emRequestMetadata
.- Adicionamos
Player.Command.COMMAND_SET_MEDIA_ITEM
para 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
TrackSelectionOverrides
foi nivelada emTrackSelectionParameters
, eTrackSelectionOverride
foi promovida para uma classe de nível superior. TracksInfo
foi renomeado comoTracks
, eTracksInfo.TrackGroupInfo
foi renomeado comoTracks.Group
.Player.getCurrentTracksInfo
ePlayer.Listener.onTracksInfoChanged
também foram renomeados comoPlayer.getCurrentTracks
ePlayer.Listener.onTracksChanged
. Isso inclui o "cancelamento da descontinuação" do nome do métodoPlayer.Listener.onTracksChanged
, mas com diferentes tipos de parâmetro.DefaultTrackSelector.buildUponParameters
eDefaultTrackSelector.Parameters.buildUpon
foram alterados para retornarDefaultTrackSelector.Parameters.Builder
em vez doDefaultTrackSelector.ParametersBuilder
descontinuado.- Adicionado
DefaultTrackSelector.Parameters.constrainAudioChannelCountToDeviceCapabilities
, que é ativado por padrão. Quando ativado, oDefaultTrackSelector
prefere faixas de áudio cuja contagem de canais não exceda aos recursos de saída do dispositivo. Em dispositivos portáteis, oDefaultTrackSelector
tem preferência pelo formato estéreo/mono em vez de vários formatos de áudio multicanal, a menos que o formato multicanal possa ser espacializado (Android 12L+) ou o áudio está em um formato de som surround Dolby. Além disso, em dispositivos com suporte à espacialização de áudio, oDefaultTrackSelector
monitora as mudanças nas propriedades Spatializer e aciona uma nova seleção de faixas. Dispositivos com um Modo de interface detelevision
não têm essas restrições, e o formato com a maior contagem de canais vai ter preferência.television
Para ativar esse recurso, a instânciaDefaultTrackSelector
precisa ser criada com umContext
.
- A classe
- Vídeo:
DummySurface
foi 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.AudioAttributes
para 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
AudioTrack
com a máscara de canalAudioFormat.CHANNEL_OUT_7POINT1POINT4
se o decodificador produzir áudio PCM de 12 canais (#10322).
- DRM
- Garanta que a sessão de DRM sempre seja atualizada corretamente ao pesquisar imediatamente após uma mudança de formato (10274).
- Texto:
Player.getCurrentCues()
foi alterado para retornarCueGroup
em vez deList<Cue>
.- SSA: adicionado suporte à configuração de estilo
OutlineColour
quandoBorderStyle == 3
, ou seja, aOutlineColour
define o plano de fundo do sinal (#8435). - CEA-708: analisa dados em vários blocos de serviços e ignora os blocos não associados ao número de serviço selecionado.
- O
RawCcExtractor
foi removido. Ele era usado apenas para processar um formato de legenda interno do Google.
- Extratores:
- Interface:
- Corrigida a entrega de eventos para os
OnClickListener
s definidos emPlayerView
casouseController=false
(#9605). Também foi corrigida a entrega de eventos aoOnLongClickListener
para todas as configurações de visualização. - Corrigido tratamento incorreto de uma sequência de eventos de toque que saem dos limites da
PlayerView
antes daACTION_UP
como um clique (#9861). - Corrigido problema de acessibilidade da
PlayerView
em que o toque podia alternar a reprodução em vez de ocultar os controles (#8627). TrackSelectionView
eTrackSelectionDialogBuilder
foram reescritos para trabalhar com a interfacePlayer
em vez deExoPlayer
. Isso permite que as visualizações sejam usadas com outras implementações doPlayer
e remove a dependência do módulo da interface para o módulo ExoPlayer. Essa é uma alteração interruptiva.- Não mostre faixas de texto forçadas no seletor de faixas da
PlayerView
e mantenha uma faixa de texto forçada adequada selecionada, se a opção "None" estiver selecionada (#9432).
- Corrigida a entrega de eventos para os
- DASH:
- Analisada contagem de canais dos elementos de
AudioChannelConfiguration
do DTS. Isso reativa a passagem de áudio para fluxos do DTS (#10159). - A transmissão de
null
paraDashMediaSource.Factory.setCompositeSequenceableLoaderFactory
foi desativada. As instâncias deDefaultCompositeSequenceableLoaderFactory
podem 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
null
paraHlsMediaSource.Factory.setCompositeSequenceableLoaderFactory
,HlsMediaSource.Factory.setPlaylistParserFactory
eHlsMediaSource.Factory.setPlaylistTrackerFactory
foi desativada. Instâncias deDefaultCompositeSequenceableLoaderFactory
eDefaultHlsPlaylistParserFactory
ou uma referência aDefaultHlsPlaylistTracker.FACTORY
podem ser transmitidas explicitamente, se necessário.
- Smooth Streaming:
- A transmissão de
null
paraSsMediaSource.Factory.setCompositeSequenceableLoaderFactory
foi desativada. As instâncias deDefaultCompositeSequenceableLoaderFactory
podem 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:
DummyDataSource
foi renomeado comoPlaceholderDataSource
.- Foi criada uma solução alternativa de processamento para a interrupção OkHttp.
- Sessão:
MediaSession.MediaItemFiller
foi substituído porMediaSession.Callback.onAddMediaItems
para permitir a resolução assíncrona de solicitações.- Suporte aos métodos
setMediaItems(s)
quando oMediaController
se conecta a uma sessão de mídia legada. MediaController.setMediaUri
eMediaSession.Callback.onSetMediaUri
foram removidos. A mesma funcionalidade pode ser encontrada emMediaController.setMediaItem
eMediaSession.Callback.onAddMediaItems
.- Encaminhamento de chamadas do
MediaController
legadas para reproduzir mídia paraMediaSession.Callback.onAddMediaItems
em vez deonSetMediaUri
. MediaNotification.Provider
eDefaultMediaNotificationProvider
foram adicionados para fornecer personalização das notificações.BitmapLoader
eSimpleBitmapLoader
foram adicionados para fazer o download das imagens de arte.- Adicionamos
MediaSession.setCustomLayout()
para oferecer compatibilidade com versões anteriores da sessão legada. MediaSession.setSessionExtras()
foi adicionado para fornecer paridade de recursos com a sessão legada.MediaSession.MediaSessionCallback
foi renomeado comoMediaSession.Callback
,MediaLibrarySession.MediaLibrarySessionCallback
comoMediaLibrarySession.Callback
, eMediaSession.Builder.setSessionCallback
comosetCallback
.- Correção do NPE em
MediaControllerImplLegacy
(#59). - Atualizadas informações de posição da sessão ao realizar mudanças na linha do tempo (#51).
- NPE foi corrigido em
MediaControllerImplBase
após o lançamento do controlador (#74).
- Reprodução de anúncios / IMA:
- A taxa de pesquisa de anúncio foi reduzida de cada 100 ms para cada 200 ms, de acordo com as recomendações do Media Rating Council (MRC).
- Extensão FFmpeg:
- Atualizada versão do CMake para
3.21.0+
para evitar um bug no CMake que causava falha na sincronização do Gradle do Android Studio (#9933).
- 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.getCurrentTrackGroups
ePlayer.getCurrentTrackSelections
. UsePlayer.getCurrentTracks
. Também é possível continuar usandoExoPlayer.getCurrentTrackGroups
eExoPlayer.getCurrentTrackSelections
, embora esses métodos permaneçam descontinuados. - As constantes
DownloadHelper
,DEFAULT_TRACK_SELECTOR_PARAMETERS_WITHOUT_VIEWPORT
eDEFAULT_TRACK_SELECTOR_PARAMETERS
foram 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.setContext
foi removido. OContext
precisa 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.setTrackId
eMediaItem.SubtitleConfiguration.Builder.setId
foi corrigida para priorizar o campoSubtitleConfiguration
e voltar ao valor daFactory
se 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 daDefaultRenderersFactory
que substituem os métodosbuildVideoRenderers()
oubuildAudioRenderers()
possam acessar a fábrica do adaptador de codec e a transmitir para instânciasMediaCodecRenderer
que eles criam. - Propague os campos de cabeçalho ICY
name
egenre
paraMediaMetadata.station
eMediaMetadata.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
MediaCodec
falhar, o dispositivo entra em suspensão e tenta novamente. Isso corrige um problema que ocorre em alguns dispositivos ao alternar uma superfície de um codec seguro para outro (#8696, link em inglês). - O método
MediaCodecAdapter.getMetrics()
foi adicionado para permitir que os usuários acessem os dados de métricas 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#inputBufferCount
foi renomeado comoqueuedInputBufferCount
.- Os
SimpleExoPlayer.renderers
agora são particulares. Os renderizadores podem ser acessados usando oExoPlayer.getRenderer
. - Atualização de alguns valores constantes das
AnalyticsListener.EventFlags
para corresponder aos valores nasPlayer.EventFlags
. - O
AnalyticsCollector
foi dividido em uma interface e implementação padrão para permitir que ele seja removido pelo R8 se um app não precisar dele.
- 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).
TrackGroup
s duplicados são proibidos em umaTrackGroupArray
. OsTrackGroup
s sempre podem ser distinguíveis definindo umid
no 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
AdaptiveTrackSelection
mudou para permitir um aumento da qualidade em uma largura de banda de rede suficiente, mesmo que a reprodução esteja muito próxima da extremidade ativa (#9784, link em inglês).
- Vídeo:
- A lógica de substituição do decodificador para Dolby Vision foi corrigida a fim de usar um decodificador H264/H265 compatível, se necessário.
- Áudio:
- A lógica de substituição do decodificador para Dolby Atmos (E-AC3-JOC) foi corrigida a fim de usar um decodificador E-AC3 compatível, se necessário.
- As APIs
AudioCapabilities
foram alteradas para exigir a transmissão explícita deAudioCapabilities.DEFAULT_AUDIO_CAPABILITIES
em vez denull
. - A personalização do cálculo do tamanho do buffer da
AudioTrack
agora pode ser feita injetando umAudioTrackBufferSizeProvider
noDefaultAudioSink
(8891, link em inglês). - Tente criar a
AudioTrack
novamente se o tamanho do buffer solicitado for > 1 MB (9712, link em inglês).
- Extratores:
- Texto:
- Um campo
MediaItem.SubtitleConfiguration.id
, que é propagado para o campoFormat.id
da faixa de legenda criada com a configuração, foi adicionado (#9673, link em inglês). - Foi adicionado suporte básico para legendas WebVTT em contêineres Matroska (#9886, link em inglês).
- O
Cea708Decoder
não pode ler mais do que o tamanho declarado de um bloco de serviços.
- Um campo
- DRM:
- O
playbackLooper
foi removido deDrmSessionManager.(pre)acquireSession
Quando umDrmSessionManager
é usado por um app em umaMediaSource
personalizada, oplaybackLooper
precisa 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
AdPlaybackState
para permitir a redefinição de um grupo de anúncios. Assim, ele pode ser reproduzido novamente (#9615, link em inglês). - A velocidade de reprodução de 1,0 é aplicada durante a reprodução do anúncio (#9018, link em inglês).
- O problema em que um grupo de anúncios falhava ao carregar e causava uma redefinição imediata da reprodução foi corrigido (#9929, link em inglês).
- Interface:
- DASH:
- As propriedades essenciais e complementares analisadas foram adicionadas ao arquivo
Representation
(#9579, link em inglês). - Suporte ao papel da faixa
forced-subtitle
(#9727, link em inglês). - O papel da faixa
main
não é mais interpretado 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.Location
relativos (#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
SocketFactory
usada para qualquer conexão com o servidor (#9606, link em inglês). - O método de autenticação DIGEST é usado em vez de BASIC se ambos estiverem presentes (#9800, link em inglês).
- Gerencie quando o tempo de rastreamento RTSP não está disponível (#9775, link em inglês).
- Os valores do cabeçalho das informações de RTP inválidos são ignorados (#9619, link em inglês).
- Uma API cliente é oferecida para substituir a
- Transformador:
- A versão mínima necessária da API aumentou para 21.
- A
TransformationException
agora é usada para descrever erros que ocorrem durante uma transformação. - A
TransformationRequest
foi adicionada para especificar as opções de transformação. - Agora, vários listeners podem ser registrados.
- O travamento do transformador quando a saída do codec é parcialmente lida foi corrigido.
- Uma possível NPE em
Transformer.getProgress
ao liberar a geração do multiplexador foi corrigida. - Um app de demonstração para aplicar transformações foi adicionado.
- Extensão MediaSession:
- Por padrão, o
MediaSessionConnector
agora limpa a playlist ao parar. Os apps que querem manter a playlist retida podem chamarsetClearMediaItemsOnStop(false)
no conector.
- Por padrão, o
- Extensão do Google Cast:
- Extensão FFmpeg:
- O
build_ffmpeg.sh
agora depende dos utilitários de agrupamento do LLVM em vez dos utilitários do GNU (#9933, link em inglês).
- 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-framework
não são compatíveis com apps destinados ao Android 12 e vão falhar com umaIllegalArgumentException
ao criarPendingIntent
s (#9528, link em inglês).
- Upgrade da extensão do Google Cast para depender do
- Símbolos descontinuados foram removidos:
- O
Player.EventListener
foi removido. UsePlayer.Listener
. MediaSourceFactory#setDrmSessionManager
,MediaSourceFactory#setDrmHttpDataSourceFactory
eMediaSourceFactory#setDrmUserAgent
foram removidos. UseMediaSourceFactory#setDrmSessionManagerProvider
.- O
MediaSourceFactory#setStreamKeys
foi removido. UseMediaItem.Builder#setStreamKeys
- O
MediaSourceFactory#createMediaSource(Uri)
foi removido. UseMediaSourceFactory#createMediaSource(MediaItem)
- O
setTag
foi removido deDashMediaSource
,HlsMediaSource
eSsMediaSource
. UseMediaItem.Builder#setTag
. - O
DashMediaSource#setLivePresentationDelayMs(long, boolean)
foi removido. UseMediaItem.Builder#setLiveConfiguration
eMediaItem.LiveConfiguration.Builder#setTargetOffsetMs
para substituir o manifesto ouDashMediaSource#setFallbackTargetLiveOffsetMs
para fornecer um valor de substituição. - O
(Simple)ExoPlayer.setThrowsWhenUsingWrongThread
foi removido. Não é mais possível desativar a aplicação da linha de execução. ActionFile
eActionFileUpgradeUtil
foram removidos. Use o ExoPlayer 2.16.1 ou anterior para usarActionFileUpgradeUtil
a fim de mesclar arquivos de ações legadas noDefaultDownloadIndex
.- A
ProgressiveMediaSource#setExtractorsFactory
foi removida. Use o construtorProgressiveMediaSource.Factory(DataSource.Factory, ExtractorsFactory)
. ProgressiveMediaSource.Factory#setTag
eProgressiveMediaSource.Factory#setCustomCacheKey
foram removidos. UseMediaItem.Builder#setTag
eMediaItem.Builder#setCustomCacheKey
.- Os construtores
DefaultRenderersFactory(Context, @ExtensionRendererMode int)
eDefaultRenderersFactory(Context, @ExtensionRendererMode int, long)
foram removidos. Use os construtoresDefaultRenderersFactory(Context)
,DefaultRenderersFactory#setExtensionRendererMode
eDefaultRenderersFactory#setAllowedVideoJoiningTimeMs
. - Todos os construtores
CronetDataSource
públicos foram removidos. UseCronetDataSource.Factory
- O
- Mude o
IntDefs
para apenas@Target(TYPE_USE)
. Isso pode interromper a compilação de usos no Kotlin, que podem ser corrigida movendo a anotação para o tipo (Int
).@AacAudioObjectType
@Ac3Util.SyncFrameInfo.StreamType
@AdLoadException.Type
@AdtsExtractor.Flags
@AmrExtractor.Flags
@AspectRatioFrameLayout.ResizeMode
@AudioFocusManager.PlayerCommand
@AudioSink.SinkFormatSupport
@BinarySearchSeeker.TimestampSearchResult.Type
@BufferReplacementMode
@C.BufferFlags
@C.ColorRange
@C.ColorSpace
@C.ColorTransfer
@C.CryptoMode
@C.Encoding
@C.PcmEncoding
@C.Projection
@C.SelectionReason
@C.StereoMode
@C.VideoOutputMode
@CacheDataSource.Flags
@CaptionStyleCompat.EdgeType
@DataSpec.Flags
@DataSpec.HttpMethods
@DecoderDiscardReasons
@DecoderReuseResult
@DefaultAudioSink.OutputMode
@DefaultDrmSessionManager.Mode
@DefaultTrackSelector.SelectionEligibility
@DefaultTsPayloadReaderFactory.Flags
@EGLSurfaceTexture.SecureMode
@EbmlProcessor.ElementType
@ExoMediaDrm.KeyRequest.RequestType
@ExtensionRendererMode
@Extractor.ReadResult
@FileTypes.Type
@FlacExtractor.Flags
(no 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
Player
que o ExoPlayer; - componentes de IU para criar interfaces do usuário para reprodução de mídia;
- módulos que unem as funcionalidades em outras bibliotecas para uso com o ExoPlayer, por exemplo, a inserção de anúncios usando o SDK do IMA.
Para ver mais informações, consulte o projeto Media3 do GitHub (link em inglês).
O ExoPlayer era hospedado anteriormente em um
projeto separado do ExoPlayer no GitHub (link em inglês). Na Media3, o
nome do pacote é androidx.media3.exoplayer
. Planejamos continuar com a manutenção e
o lançamento do projeto ExoPlayer no GitHub por um certo período. Assim, os desenvolvedores vão ter tempo de migrar os aplicativos para a
Media3. A Media3 tem substituições para todos os módulos do ExoPlayer, exceto as
extensões de media2 e mediasession legadas, que foram substituídas pelo novo
módulo media3-session
. Esse módulo fornece integração direta entre os players de mídia e as
sessões de mídia sem precisar usar uma classe de adaptador/conector.