Android

Android Developers Blog: Media3 1.11 - Novidades

A nova versão 1.11 do Media3, plataforma amplamente utilizada em aplicativos de mídia para Android, traz novos recursos e melhorias na reprodução, edição e componentes da interface do usuário. Entre as principais adições estão a expansão dos módulos Jetpack Compose UI com slots personalizáveis e pré-carregamento automático de vídeos curtos usando PlayerPool.

Compartilhar
Android Developers Blog: Media3 1.11 - What's new?

A versão 1.11 do Media3 está disponível. Essa atualização traz novos recursos, correções de bugs e melhorias em todos os componentes de reprodução, edição e interface do usuário (UI). Estamos expandindo nossos módulos Jetpack Compose UI com slots personalizáveis Player, padrões fáceis de usar, interações gestuais, observadores de estado e pré-carregamento de vídeos curtos usando PlayerPool. Também modernizamos a integração Media3 Cast com suporte ao Switcher de Saída do SystemUI, introduzimos uma nova extensão HTTP cliente Ktor e adicionamos novas utilidades de multiplexação para arquivos Ogg e WAV.

Saiba mais sobre os destaques principais e confira a lista completa de alterações no relatório de lançamento.

Interface do Usuário (UI) de Reprodução e Compose

A medida que o Android se torna cada vez mais baseado em Compose, estamos expandindo continuamente os módulos media3-ui-compose e media3-ui-compose-material3. Esta atualização introduz um controle mais granular sobre a sua configuração de layout do player, padrões interativos mais ricos e uma integração mais profunda com Material3.

Layout personalizável do Player

A composição do Player do Material 3 agora suporta espaços dedicados para topControls, centerControls, bottomControls e errorOverlay. Você pode inserir seus próprios Composables ou usar os padrões prontos para uso publicados em PlayerDefaults:

Player(
  player = player,
  topControls = { PlayerDefaults.TopControls(player) },
  centerControls = { PlayerDefaults.CenterControls(player) },
  bottomControls = { PlayerDefaults.BottomControls(player) },
)

A composição Player também integra o suporte ao FocusRequester, permitindo a navegação sem problemas com D-pad e teclado em dispositivos Android TV, dobráveis e ambientes de desktop.

Exemplo de um Player Composable com controles personalizados

Gestos e controle da velocidade de reprodução

O PlaybackSpeedState agora fornece uma API para avanço rápido/vídeo em câmera lenta. A aplicação demo-compose ilustra isso com um gesto de long-press para avançar a reprodução e procurar com duplo toque. Combinado com o ProgressSlider introduzido na versão 1.10, a interface do usuário do player Compose agora oferece interações ricas por toque e gesto prontas para uso.

Pré-carregamento de vídeos curtos com PlayerPool

Para aplicativos com feeds de mídia em janelas deslizantes (por exemplo, vídeos verticais curtos), gerenciar eficientemente várias instâncias do ExoPlayer é um desafio comum. A versão 1.11 do Media3 introduz PlayerPool (em common-ktx) e rememberPooledPlayer (em ui-compose) para lidar automaticamente com o reciclagem de jogadores e pré-carregamento.

O novo ShortFormPlayerScreen em demo-compose mostra isso em ação, um feed verticalmente paginado onde os jogadores são empilhados, pré-carregados e reciclados automaticamente enquanto o usuário rola.

MiniController

Um novo Composable MiniController no media3-ui-compose-material3 fornece uma barra de reprodução compacta exibindo o título, artista, arte e progresso do item atual ao lado dos controles play/pause. Como todos os nossos padrões Composables em media3-ui-compose-material3, o MiniController suporta a integração de cores dinâmicas Material3, permitindo que ele se adapte automaticamente ao tema da parede de fundo do usuário. Isso é ideal para ofertas persistentes de bottom-sheet ou mini-player, por exemplo enquanto o usuário navega em conteúdo ou durante sessões ativas Cast.

O MiniController do Media3 mostrando arte de álbum, metadados da mídia e controles básicos

Holders de estado expandidos para metadados e erros

Adicionamos vários novos holders de estado reativos a media3-ui-compose:

  • rememberCurrentMediaItemState – observe os metadados sobre o item atualmente tocando
  • rememberPlaylistState – observe a lista completa de reprodução e índices ativos
  • rememberErrorState – acompanhe erros de reprodução, com um ErrorText Composable correspondente e uma sobreposição padrão ErrorOverlay no Material3

Vamos continuar trabalhando em novas adições e mais opções de personalização nas próximas versões. Por favor, compartilhe suas ideias na página de problemas do projeto.

Integração modernizada com Cast

A versão 1.11 do Media3 atualiza a extensão Cast com opções de configuração programática e suporte para roteamento no nível do sistema operacional.

CastParams e SystemUI Output Switcher

Você pode agora configurar a extensão Cast usando CastParams:

val castParams = CastParams.Builder()
  .setShowSystemOutputSwitcherOnCastButtonClick(true)
  .build()

Cast.getSingletonInstance(context).initialize(castParams)

A configuração setShowSystemOutputSwitcherOnCastIconClick(true) define o botão de roteamento da mídia para abrir a janela nativa do Android SystemUI Output Switcher em versões de plataforma compatíveis, fornecendo uma experiência unificada de seleção de saída.

Efetivo estado do MediaRouteButton no Compose

Os aplicativos que usam Jetpack Compose podem agora adicionar facilmente o botão de roteamento da mídia (também conhecido como botão Cast), que automaticamente observa o estado da janela modal e atualiza conforme necessário. Nenhuma lógica adicional é necessária quando usado junto com CastPlayer do Media3!

@Composable
fun TopAppBarWithCast() {
  Row {
    Text(text = "App Title")
    MediaRouteButton()
  }
}
Botão de roteamento da mídia do Media3 em um aplicativo lançando a janela padrão de seleção de saída

Aprimoramentos no toque e na sessão de reprodução

Eclipsa Video - HAGC metadados dinâmicos HDR (API 37+)

O Eclipsa Video promete uma experiência HDR mais consistente em dispositivos, com um branco HDR de base consistente, espaço dinâmico adaptativo dependendo da tela e do ambiente, garantindo que a intenção criativa seja preservada em todos os dispositivos.

O ExoPlayer agora suporta a reprodução dos metadados necessários HAGC (ST 2094-50) para mídia progressiva (MP4, Matroska). O player mescla automaticamente os trilhos de metadados HAGC com o trilha de vídeo associada e entrega o metadado fora da banda ao decodificador em dispositivos API 37+. Em dispositivos mais antigos, o ExoPlayer cai suavemente para fornecer uma experiência padrão de reprodução HDR sem as ajustes.

Ilustração mostrando os benefícios do Eclipsa Video HDR, como um contrato de cor mais consistente

Nova extensão do cliente HTTP Ktor

Uma nova módulo de extensão media3-datasource-ktor fornece o KtorDataSource, baseado na pilha HTTP Ktor. Isso oferece uma alternativa orientada para Kotlin e amigável a coroutines para os módulos de fonte de dados existentes Cronet e OkHttp.

Conexões assíncronas do MediaSession

O MediaSession.Callback agora inclui o método onConnectAsync(), que permite processar tentativas de conexão de controladores de forma assíncrona — por exemplo, para verificar a autorização antes de aceitar uma conexão. Você pode retornar um Future imediato com Futures.immediateFuture(ConnectionResult) para o mesmo comportamento do existente onConnect.

override fun onConnectAsync(
  session: MediaSession,
  controller: MediaSession.ControllerInfo
): ListenableFuture<MediaSession.ConnectionResult> {
  return authenticateControllerAsync(controller)
}

Melhorias de segurança nas configurações padrão do MediaSession

Para aplicativos que não sobrescrevem onConnect ou onConnectAsync em MediaSession.Callback, a biblioteca agora usa uma configuração mais segura por padrão. Especificamente, os dados da sessão já não são compartilhados por padrão com controladores não confiáveis, o que significa que aplicativos de terceiros ou não do sistema sem acesso às notificações estão restritos a acessar os dados da sessão a menos que você implemente explicitamente esses métodos de retorno de chamada para autorizar a conexão.

Novas implementações de Muxer e análise de contêiner

OggMuxer e WavMuxer

Adicionamos dois novos muxers dedicados: OggMuxer para mesclar fluxos OPUS e VORBIS em arquivos .ogg padrão, e WavMuxer para gerar arquivos de áudio .wav sem compressão e ponto flutuante PCM.

Análise de contêiner e referências de faixas

  • Referências de faixa MP4 (tref): Mp4Muxer.addTrackReference permite vincular metadados ou faixas auxiliares dependentes a fluxos de vídeo primários.
  • Extração de capítulos: Capítulos QuickTime e Nero de arquivos MP4 (.m4a, .m4b) e capítulos Matroska são extraídos como entradas de metadados de capítulo para navegação em livros de áudio e podcasts.

Por favor, use o rastreador de problemas para relatar quaisquer bugs ou se você tiver perguntas ou solicitações de recursos. Estamos ansiosos para ouvir de você!

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa