O Media3 1.9.0 já está disponível. Além das correções de bugs e melhorias de desempenho habituais, a versão mais recente também contém quatro módulos novos ou amplamente reescritos:
media3-inspector: extrair metadados e frames fora da reproduçãomedia3-ui-compose-material3: crie uma interface de mídia básica do Compose do Material 3 em apenas algumas etapasmedia3-cast: processar automaticamente as transições entre o Cast e as reproduções locaismedia3-decoder-av1: reprodução consistente de AV1 com o decodificador de extensão reescrito com base na biblioteca dav1d.
Também adicionamos melhorias de armazenamento em cache e gerenciamento de memória ao PreloadManager e fornecemos várias novas simplificações de ExoPlayer, Transformer e MediaSession.
Esta versão também oferece o primeiro acesso experimental ao CompositionPlayer para visualizar edições de mídia.
Continue lendo para saber mais e, como sempre, confira as notas da versão completas para uma visão geral abrangente das mudanças nesta versão.
Extrair metadados e frames fora da reprodução
Há muitos casos em que você quer inspecionar a mídia sem iniciar uma reprodução. Por exemplo, talvez você queira detectar quais formatos ele contém ou qual é a duração dele, ou recuperar miniaturas.
O novo módulo media3-inspector combina todos os utilitários para inspecionar mídia sem reprodução em um só lugar:
MetadataRetrieverpara ler a duração, o formato e os metadados estáticos de umMediaItem.FrameExtractorpara receber frames ou miniaturas de um item.MediaExtractorCompatcomo um substituto direto para a classe MediaExtractor da plataforma Android, para receber informações detalhadas sobre as amostras no arquivo.
MetadataRetriever e FrameExtractor seguem um padrão AutoCloseable simples. Confira nossas novas páginas de guia para mais detalhes.
suspend fun extractThumbnail(mediaItem: MediaItem) {
FrameExtractor.Builder(context, mediaItem).build().use {
val thumbnail = frameExtractor.getThumbnail().await()
}
}Criar uma interface de mídia básica do Compose do Material 3 em apenas algumas etapas
Nas versões anteriores, começamos a fornecer o código do conector entre os elementos da interface do Compose e sua instância do Player. Com o Media3 1.9.0, adicionamos um novo módulo media3-ui-compose-material3 com botões e elementos de conteúdo do Material3 totalmente estilizados. Eles permitem criar uma interface de mídia em apenas algumas etapas, além de oferecer toda a flexibilidade para personalizar o estilo personalizado. Se preferir criar seu próprio estilo de interface, use os elementos básicos que cuidam de toda a lógica de atualização e conexão. Assim, você só precisa se concentrar em projetar o elemento da interface. Confira nossas páginas de guia estendido para os módulos de interface do Compose.
Também estamos trabalhando em ainda mais componentes do Compose, como uma barra de busca pré-criada, uma substituição completa e pronta para uso do PlayerView, além de integração de legendas e anúncios.
@Composable
fun SimplePlayerUI(player: Player, modifier: Modifier = Modifier) {
Column(modifier) {
ContentFrame(player) // Video surface and shutter logic
Row (Modifier.align(Alignment.CenterHorizontally)) {
SeekBackButton(player) // Simple controls
PlayPauseButton(player)
SeekForwardButton(player)
}
}
}
Interface simples do player do Compose com elementos prontos para uso
Processar automaticamente as transições entre as reproduções locais e do Cast
O CastPlayer no módulo media3-cast foi reescrito para processar automaticamente as transições entre a reprodução local (por exemplo, com ExoPlayer) e a reprodução remota do Cast.
Ao configurar o MediaSession, basta criar um CastPlayer em torno do ExoPlayer e adicionar um MediaRouteButton à interface. Pronto!
// MediaSession setup with CastPlayer
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, castPlayer).build()
// MediaRouteButton in UI
@Composable fun UIWithMediaRouteButton() {
MediaRouteButton()
}
Nova integração do CastPlayer no app de demonstração de sessão do Media3
Reprodução consistente de AV1 com a extensão reescrita com base em dav1d
A versão 1.9.0 contém um módulo de extensão AV1 totalmente reescrito com base na conhecida biblioteca dav1d.
Como em todos os módulos decodificadores de extensão, é necessário criar a partir da origem para agrupar o código nativo relevante corretamente. O agrupamento de um decodificador oferece consistência e suporte a formatos em todos os dispositivos, mas, como ele executa a decodificação no seu processo, é mais adequado para conteúdo em que você confia.
Integrar o armazenamento em cache e o gerenciamento de memória ao PreloadManager
Também melhoramos o PreloadManager. Ele já permitia pré-carregar mídia na memória fora da reprodução e, em seguida, transferi-la para um player quando necessário. Embora tenha um bom desempenho, você ainda precisa ter cuidado para não exceder os limites de memória ao pré-carregar acidentalmente muitos dados. Por isso, com o Media3 1.9.0, adicionamos dois recursos que tornam isso muito mais fácil e estável:
- Suporte ao armazenamento em cache : ao definir o limite de pré-carregamento, agora é possível escolher
PreloadStatus.specifiedRangeCached(0, 5000)como um estado de destino para itens pré-carregados. Isso vai adicionar o intervalo especificado ao cache no disco em vez de carregar os dados na memória. Com isso, é possível fornecer um intervalo muito maior de itens para pré-carregamento, já que os mais distantes do item atual não precisam mais ocupar memória. Para isso, é preciso definir umCacheemDefaultPreloadManager.Builder. - Gerenciamento automático de memória : também atualizamos nossa interface
LoadControlpara lidar melhor com o caso de pré-carregamento. Agora, é possível definir um limite de memória superior explícito para todos os itens pré-carregados na memória. O padrão é 144 MB, e você pode configurar o limite emDefaultLoadControl.Builder. ODefaultPreloadManagervai parar de pré-carregar automaticamente quando o limite for atingido e vai liberar automaticamente a memória de itens de menor prioridade, se necessário.
Confiar em novos comportamentos padrão simplificados no ExoPlayer
Como sempre, também adicionamos muitas melhorias incrementais ao ExoPlayer. Para citar alguns:
- Ativar e desativar o som: já tínhamos um método
setVolume, mas agora adicionamos os métodos de conveniênciamuteeunmutepara restaurar facilmente o volume anterior sem precisar monitorá-lo. - Detecção de player travado: em alguns casos raros, o player pode ficar travado em um estado de armazenamento em buffer ou de reprodução sem progredir, por exemplo, devido a problemas de codec ou configurações incorretas. Seus usuários vão ficar irritados, mas você nunca vai ver esses problemas nas suas análises. Para deixar isso mais claro, o player agora informa um
StuckPlayerExceptionquando detecta um estado travado. - Wakelock por padrão: o gerenciamento de wake lock era opcional, o que resultava em casos extremos difíceis de encontrar, em que o progresso da reprodução podia ser muito atrasado ao ser executado em segundo plano. Agora esse recurso é opcional, então você não precisa se preocupar com isso e também pode remover todo o processamento manual de wake lock na reprodução.
- Configuração simplificada para a lógica do botão CC: mudar o
TrackSelectionParameterspara "ativar/desativar legendas" foi surpreendentemente difícil, então adicionamos uma opção booleana simplesselectTextByDefaultpara esse caso de uso.
Simplificar as preferências de botões de mídia no MediaSession
Até agora, para definir suas preferências de quais botões deveriam aparecer na gaveta de notificações de mídia no Android Auto ou no WearOS, era necessário definir comandos e botões personalizados, mesmo que você só quisesse acionar um método de player padrão.
O Media3 1.9.0 tem uma nova funcionalidade para simplificar isso: agora é possível definir suas preferências de botão de mídia com um comando padrão do player, sem precisar de processamento de comandos personalizados.
session.setMediaButtonPreferences(listOf(
CommandButton.Builder(CommandButton.ICON_FAST_FORWARD) // choose an icon
.setDisplayName(R.string.skip_forward)
.setPlayerCommand(Player.COMMAND_SEEK_FORWARD) // choose an action
.build()
))
Preferências do botão de mídia com o botão de avanço rápido
CompositionPlayer para visualização em tempo real
A versão 1.9.0 apresenta o CompositionPlayer em uma nova anotação @ExperimentalApi. A anotação indica que ele está disponível para experimentação, mas ainda está em desenvolvimento.
CompositionPlayer é um novo componente nas APIs de edição do Media3, projetado para visualização em tempo real de edições de mídia. Criado com base na interface conhecida do Media3 Player, o CompositionPlayer permite que os usuários vejam as mudanças em ação antes de confirmar o processo de exportação. Ele usa o mesmo objeto Composition que você transmitiria para Transformer para exportação, simplificando o fluxo de trabalho de edição ao unificar o modelo de dados para visualização e exportação.
Recomendamos que você comece a usar o CompositionPlayer e compartilhe seu feedback. Além disso, fique de olho nas próximas postagens e atualizações da documentação para mais detalhes.
InAppMuxer como um muxer padrão no Transformer
O Transformer agora usa InAppMp4Muxer como o muxer padrão para gravar arquivos de contêiner de mídia. Internamente, InAppMp4Muxer depende do módulo Muxer do Media3, oferecendo um comportamento consistente em todas as versões da API.
Embora o Transformer não use mais o MediaMuxer da plataforma Android por padrão, ainda é possível fornecer FrameworkMuxer.Factory usando setMuxerFactory se o caso de uso exigir.
Novas APIs de ajuste de velocidade
A versão 1.9.0 simplifica as APIs de ajuste de velocidade para edição de mídia. Introduzimos novos métodos diretamente no EditedMediaItem.Builder para controlar a velocidade, tornando a API mais intuitiva. Agora você pode mudar a velocidade de um clipe chamando setSpeed(SpeedProvider provider) no EditedMediaItem.Builder:
val speedProvider = object : SpeedProvider {
override fun getSpeed(presentationTimeUs: Long): Float {
return speed
}
override fun getNextSpeedChangeTimeUs(timeUs: Long): Long {
return C.TIME_UNSET
}
}
EditedMediaItem speedEffectItem = EditedMediaItem.Builder(mediaItem)
.setSpeed(speedProvider)
.build()Essa nova abordagem substitui o método anterior de usar Effects#createExperimentalSpeedChangingEffects(), que foi descontinuado e será removido em uma versão futura.
Introdução aos tipos de faixa para EditedMediaItemSequence
Na versão 1.9.0, o EditedMediaItemSequence exige que os tipos de faixa de saída desejados sejam especificados durante a criação da sequência. Essa mudança garante que o processamento de faixas seja mais explícito e robusto em toda a composição.
Isso é feito com um novo construtor EditedMediaItemSequence.Builder que aceita um conjunto de tipos de faixa (por exemplo, C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).
Para simplificar a criação, adicionamos novos métodos estáticos de conveniência:
- EditedMediaItemSequence.withAudioFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withVideoFrom(List<EditedMediaItem>)
- EditedMediaItemSequence.withAudioAndVideoFrom(List<EditedMediaItem>)
Recomendamos que você migre para o novo construtor ou os métodos de conveniência para definições de sequência mais claras e confiáveis.
Exemplo de criação de uma sequência somente de vídeo:
EditedMediaItemSequence videoOnlySequence =
EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
.addItem(editedMediaItem)
.build()Entre em contato pelo Issue Tracker do Media3 se encontrar bugs ou se tiver dúvidas ou solicitações de recursos. Esperamos você!
-
Notícias sobre produtosCom o avanço do desenvolvimento agêntico, a engenharia do Android está alcançando uma nova fronteira: passar do preenchimento automático de código para agentes que executam tarefas de ponta a ponta sob sua direção. Você tem total liberdade de escolha e flexibilidade nos modelos e agentes que usa.
Jason Buchel • Leitura de 3 min -
Notícias sobre produtosHoje, mostramos como estamos levando nossa visão de "mais do que uma loja" para o próximo capítulo. Da guia "Você", que agora é o cantinho pessoal de mais de 250 milhões de usuários ativos por mês, à nossa plataforma de jogos unificada, que conecta mais de 700 milhões de perfis de jogador, o Google Play está presente em todos os momentos.
Paul Feng • Leitura de 3 min -
Notícias sobre produtosCom o Googlebook, queremos ajudar os usuários a se expressarem e terem acesso a essas ferramentas.
Cyrus Stoller • Leitura de 2 min
Receba os insights mais recentes sobre o desenvolvimento para Android na sua caixa de entrada toda semana.