Tutoriais

Media3 1.11: novidades

Leitura de 3 minutos
Ver o perfil de Toni Heidenreich
Toni Heidenreich Engenheiro de software, Android

O Media3 1.11 já está disponível. Com tecnologia para a grande maioria dos principais apps de mídia do Android, essa versão traz novos recursos, correções de bugs e melhorias em componentes de reprodução, edição e interface. Estamos expandindo nossos módulos de interface do Jetpack Compose com slots personalizáveis Player e padrões fáceis de usar, gestos interativos, observadores de estado e pré-carregamento de vídeos curtos usando PlayerPool. Também modernizamos a integração do Media3 Cast com suporte ao seletor de saída do SystemUI, introduzimos uma nova extensão de rede de cliente HTTP Ktor e adicionamos novos utilitários de multiplexação para arquivos Ogg e WAV.

Leia mais para conferir os principais destaques e as notas de lançamento completas para uma lista abrangente de mudanças.

Interface de reprodução e Compose

Com o Android se tornando o Compose-first, continuamos a expandir os módulos media3-ui-compose e media3-ui-compose-material3. Essa atualização apresenta um controle mais granular sobre o layout do player, padrões de interação mais avançados e uma integração mais profunda com o Material3.

Layout do player personalizável

O Material 3 Player Composable agora oferece suporte a slots de conteúdo dedicados para topControls, centerControls, bottomControls e errorOverlay. Você pode inserir seus próprios Composables ou usar os padrões prontos publicados em PlayerDefaults:

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

O Composable Player também integra o suporte FocusRequester, permitindo a navegação perfeita com botão direcional e teclado em ambientes Android TV, dobráveis e de computadores. 

player_video.png
Exemplo de um player Composable com controles personalizados

Gestos e controle de velocidade do vídeo

PlaybackSpeedState agora oferece uma API de avanço rápido/câmera lenta. O demo-compose app mostra isso com um gesto de toque longo para avançar a reprodução e a busca com toque duplo. Combinada com o ProgressSlider introduzido na versão 1.10, a interface do player do Compose agora oferece interações avançadas de toque e gesto.

Pré-carregamento de vídeos curtos com PlayerPool

Para apps com feeds de mídia de janela deslizante (por exemplo, vídeos verticais curtos), o gerenciamento eficiente de várias instâncias ExoPlayer é um desafio comum. O Media3 1.11 apresenta PlayerPool (em common-ktx) e rememberPooledPlayer (em ui-compose) para processar a reciclagem e o pré-carregamento do player automaticamente.

O novo ShortFormPlayerScreen em demo-compose mostra isso em ação, um feed de paginação vertical em que os players são agrupados, pré-carregados e reciclados perfeitamente à medida que o usuário rola a tela.

MiniController

Um novo Composable MiniController em media3-ui-compose-material3 oferece uma barra de reprodução compacta que mostra o título, o artista, a arte e o progresso do item atual, além dos controles de reprodução/pausa. Como todos os nossos Composables padrão em media3-ui-compose-material3, o MiniController oferece suporte à integração de cores dinâmicas do Material3, permitindo que ele se adapte automaticamente ao tema do plano de fundo do usuário.Isso é ideal para recursos persistentes de folha inferior ou miniplayer, por exemplo, enquanto o usuário navega pelo conteúdo ou durante sessões ativas do Cast.

mini_player.png
O MiniController do Media3 mostrando a arte do álbum, os metadados de mídia e os controles básicos

Titulares de estado expandidos para metadados e erros

Adicionamos vários novos titulares de estado reativos ao media3-ui-compose:

  • rememberCurrentMediaItemState: observa os metadados sobre o item em reprodução.
  • rememberPlaylistState: observa a playlist completa e os índices ativos.
  • rememberErrorState: rastreia erros de reprodução, com um Composable ErrorText correspondente e ErrorOverlay padrão no Material3.

Vamos continuar trabalhando em novas adições e mais opções de personalização em versões futuras. Compartilhe sua opinião no Issue Tracker do projeto.

Integração modernizada do Cast

O Media3 1.11 atualiza a extensão do Cast com opções de configuração programática e suporte ao roteamento no nível do SO.

CastParams e seletor de saída do SystemUI

Agora é possível configurar a extensão do Cast usando CastParams:

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


Cast.getSingletonInstance(context).initialize(castParams)

A configuração de setShowSystemOutputSwitcherOnCastIconClick(true) configura o MediaRouteButton para abrir o seletor de saída do SystemUI nativo do Android em versões de plataforma compatíveis, oferecendo uma experiência unificada de seleção de saída.

Estado reativo do MediaRouteButton no Compose

Os apps que usam o Jetpack Compose agora podem adicionar facilmente o botão de roteamento de mídia (também conhecido como botão Transmitir), que observa automaticamente o estado da caixa de diálogo e é atualizado de acordo. Nenhuma outra lógica é necessária quando usado com o CastPlayer do Media3.

@Composable
fun TopAppBarWithCast() {
  Row {
    Text(text = "App Title")
    MediaRouteButton()
  }
}
cast_button_2.png
Botão de rota de mídia do Media3 em um app que inicia a caixa de diálogo do seletor de saída padrão

Melhorias na reprodução e na sessão principais

Eclipsa Video: metadados HDR dinâmicos do HAGC (API 37 e mais recentes)

O Eclipsa Video promete uma experiência HDR mais consistente em todos os dispositivos, com um branco HDR de linha de base consistente, headroom adaptável dependendo da tela e do ambiente, garantindo que a intenção criativa seja preservada em todos os dispositivos.

O ExoPlayer agora oferece suporte à reprodução dos metadados temporizados necessários do HAGC (ST 2094-50) para mídia progressiva (MP4, Matroska). O player mescla automaticamente as faixas de metadados do HAGC com a faixa de vídeo associada e entrega os metadados fora da banda ao decodificador em dispositivos com a API 37 e mais recentes. Em dispositivos mais antigos, o ExoPlayer volta a oferecer uma experiência de reprodução HDR padrão sem os ajustes.  

eclipsa.png
Ilustração para mostrar os benefícios do HDR do Eclipsa Video, como um contrato de cores mais consistente

Nova extensão de cliente HTTP Ktor

Um novo media3-datasource-ktor módulo de extensão fornece KtorDataSource, com tecnologia da pilha HTTP Ktor. Isso oferece uma alternativa Kotlin-first e compatível com corrotinas aos módulos de fonte de dados Cronet e OkHttp.

Conexões MediaSession assíncronas

MediaSession.Callback agora inclui onConnectAsync(), que permite processar tentativas de conexão do controlador 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 onConnect atual. 

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

Padrões MediaSession mais seguros

Para apps que não substituem onConnect ou onConnectAsync em MediaSession.Callback, a biblioteca agora usa uma configuração mais segura por padrão. Especificamente, os dados da sessão não são mais compartilhados por padrão com controladores não confiáveis, o que significa que apps de terceiros ou não relacionados ao sistema que não têm acesso a notificações são restritos de acessar dados da sessão, a menos que você implemente explicitamente esses métodos de callback 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 multiplexar streams OPUS e VORBIS em arquivos .ogg padrão e WavMuxer para gerar arquivos de áudio PCM .wav não compactados e de ponto flutuante.

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

  • Referências de faixa MP4 (tref): Mp4Muxer.addTrackReference permite vincular metadados dependentes ou faixas auxiliares a streams de vídeo principais.
  • Extração de capítulos:os capítulos QuickTime e Nero de arquivos MP4 (.m4a, .m4b) e os capítulos Matroska agora são extraídos como entradas de metadados Chapter para navegação em audiolivros e podcasts.

Use o Issue Tracker para informar bugs ou se tiver dúvidas ou solicitações de recursos. Esperamos você!

Escrito por:
Continuar lendo