Blog de desenvolvedores Android: Media3 1.9.0

Media3 1.9.0 foi lançado! Além das habituais correções de bugs e melhorias de desempenho, a versão mais recente também contém quatro módulos novos ou amplamente reescritos:

Também adicionamos melhorias de cache e gerenciamento de memória ao PreloadManagere forneceu vários novos ExoPlayer, Transformador e Sessão de mídia simplificações.

Esta versão também oferece o primeiro acesso experimental ao ComposiçãoPlayer para visualizar edições de mídia.


Continue lendo para saber mais e, como sempre, confira o completo notas de lançamento para obter uma visão geral abrangente das alterações nesta versão.

Extraia metadados e frames fora da reprodução

Há muitos casos em que você deseja inspecionar a mídia sem iniciar a reprodução. Por exemplo, você pode querer detectar quais formatos ele contém ou qual é sua duração, ou recuperar miniaturas.

O novo inspetor media3 O módulo combina todos os utilitários para inspecionar mídia sem reprodução em um só lugar:

  • MetadataRetriever para ler duração, formato e metadados estáticos de um MediaItem.

  • Extrator de quadros para obter molduras ou miniaturas de um item.

  • MediaExtractorCompat como um substituto direto para a plataforma Android Extrator de mídia class, para obter informações detalhadas sobre amostras no arquivo.

MetadataRetriever e Extrator de quadros siga um simples Fechamento automático padrão. Dê uma olhada em nosso novas páginas de guia para mais detalhes.
suspend fun extractThumbnail(mediaItem: MediaItem) {
  FrameExtractor.Builder(context, mediaItem).build().use {
    val thumbnail = frameExtractor.getThumbnail().await()
  } 
}

Crie uma UI básica do Material3 Compose Media em apenas algumas etapas

Nas versões anteriores, começamos a fornecer código de conector entre os elementos da IU 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 Material3 totalmente estilizados. Eles permitem que você crie uma UI de mídia em apenas algumas etapas, ao mesmo tempo que fornecem toda a flexibilidade para personalizar o estilo. Se preferir construir seu próprio estilo de UI, você pode usar os blocos de construção que cuidam de toda a lógica de atualização e conexão, então você só precisa se concentrar no design do elemento de UI. Por favor, confira nosso páginas de guia estendidas para os módulos da IU do Compose.


Também estamos trabalhando em ainda mais componentes do Compose, como uma barra de busca pré-construída, um substituto completo e pronto para uso do Visualização do jogadorbem como 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)
    }
  }
}

UI simples do player do Compose com elementos prontos para uso

Gerenciar automaticamente transições entre transmissões locais e do Google Cast

O CastPlayer no media3-cast módulo foi reescrito para lidar automaticamente com transições entre reprodução local (por exemplo, com ExoPlayer) e reprodução remota do Cast.

Quando você configura seu Sessão de mídiabasta construir um CastPlayer em torno de seu ExoPlayer e adicione um Botão MediaRoute para sua UI e pronto!

// MediaSession setup with CastPlayer 
val exoPlayer = ExoPlayer.Builder(context).build()
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
val session = MediaSession.Builder(context, player)
// MediaRouteButton in UI 
@Composable fun UIWithMediaRouteButton() {
  MediaRouteButton()
}

Nova integração do CastPlayer no aplicativo de demonstração de sessão Media3

Reprodução AV1 consistente com a extensão reescrita baseada em dav1d

A versão 1.9.0 contém um módulo de extensão AV1 completamente reescrito baseado no popular dav1d biblioteca.

Tal como acontece com todos os módulos decodificadores de extensão, observe que isso requer construindo a partir da fonte agrupar o código nativo relevante corretamente. Agrupar um decodificador fornece consistência e suporte de formato em todos os dispositivos, mas como ele executa a decodificação em seu processo, é mais adequado para conteúdo em que você pode confiar.

Integre cache e gerenciamento de memória ao PreloadManager

Nós fizemos o nosso PreloadManager ainda melhor também. Ele já permitiu pré-carregar mídia na memória fora da reprodução e, em seguida, entregá-la perfeitamente a 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 demais. Assim, com o Media3 1.9.0, adicionamos dois recursos que tornam isso muito mais fácil e estável:

  1. Suporte de cache – Ao definir até que ponto pré-carregar, agora você pode escolher PreloadStatus.specifiedRangeCached(0, 5000) como estado de destino para itens pré-carregados. Isso adicionará o intervalo especificado ao cache do disco em vez de carregar os dados na memória. Com isso, você pode fornecer uma gama muito maior de itens para pré-carregamento, pois aqueles que estão mais distantes do item atual não precisam mais ocupar memória. Observe que isso requer a configuração de um Cache em DefaultPreloadManager.Builder.

  2. Gerenciamento automático de memória – Também atualizamos nosso CarregarControle interface para lidar melhor com o caso de pré-carregamento, para que agora você possa definir um limite de memória superior explícito para todos os itens pré-carregados na memória. São 144 MB por padrão e você pode configurar o limite em DefaultLoadControl.Builder. O DefaultPreloadManager interromperá automaticamente o pré-carregamento quando o limite for atingido e liberará automaticamente a memória de itens de prioridade mais baixa, se necessário.

Conte com novos comportamentos padrão simplificados no ExoPlayer

Como sempre, também adicionamos muitas melhorias incrementais ao ExoPlayer. Para citar apenas alguns:

  • Ativar e ativar o som – Já tivemos um definirVolume método, mas agora adicionamos a conveniência mudo e ativar o som métodos para restaurar facilmente o volume anterior sem controlá-lo você mesmo.

  • Detecção de jogador preso – Em alguns casos raros, o player pode ficar preso em um estado de buffer ou de reprodução sem fazer nenhum progresso, por exemplo, devido a problemas de codec ou configurações incorretas. Seus usuários ficarão irritados, mas você nunca verá esses problemas em suas análises! Para tornar isso mais óbvio, o jogador agora relata um StuckPlayerException quando detecta um estado travado.

  • Wakelock por padrão – O gerenciamento de wake lock era previamente ativado, resultando em casos extremos difíceis de encontrar, onde o progresso da reprodução pode ser muito atrasado durante a execução em segundo plano. Agora, esse recurso está desativado, então você não precisa se preocupar com isso e também pode remover todo o manuseio manual do wake lock durante a reprodução.

  • Configuração simplificada para lógica do botão CC Mudando Parâmetros TrackSelection dizer “ativar/desativar legendas” foi surpreendentemente difícil de acertar, então adicionamos um booleano simples selectTextByDefault opção para este caso de uso.

Simplifique suas preferências de botão de mídia no MediaSession

Até agora, definir suas preferências sobre quais botões deveriam aparecer na gaveta de notificação de mídia no Android Auto ou WearOS exigia a definição de comandos e botões personalizados, mesmo se você simplesmente quisesse acionar um método de player padrão.

Media3 1.9.0 tem novas funcionalidades para tornar isso muito mais simples – agora você pode defina suas preferências de botão de mídia com um comando de jogador padrão, não exigindo nenhum tratamento de comando personalizado.

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 de botão de mídia com botão de avanço rápido

CompositionPlayer para visualização em tempo real

A versão 1.9.0 apresenta o CompositionPlayer sob um novo @ExperimentalApi anotação. A anotação indica que está disponível para experimentação, mas ainda está em desenvolvimento.

ComposiçãoPlayer é um novo componente nas APIs de edição do Media3 projetado para visualização em tempo real de edições de mídia. Construído sobre o familiar Media3 Jogador interface, ComposiçãoPlayer permite que os usuários vejam suas alterações em ação antes de se comprometerem com o processo de exportação. Ele usa o mesmo Composição objeto para o qual você passaria Transformador para exportação, simplificando o fluxo de trabalho de edição unificando o modelo de dados para visualização e exportação.

Nós encorajamos você a começar a usar ComposiçãoPlayer e compartilhe seu feedbacke fique atento às próximas postagens e atualizações da documentação para obter mais detalhes.

InAppMuxer como muxer padrão no Transformer

O Transformer agora usa InAppMp4Muxer como o muxer padrão para gravar arquivos contêineres de mídia. Internamente, InAppMp4Muxer depende da mídia3 Muxer módulo, fornecendo comportamento consistente em todas as versões da API.

Observe que, embora o Transformer não use mais a plataforma Android MediaMuxer por padrão, você ainda pode fornecer FrameworkMuxer.Factory através de setMuxerFactory se o seu caso de uso exigir.

Novas APIs de ajuste de velocidade

A versão 1.9.0 simplifica APIs de ajustes de velocidade para edição de mídia. Introduzimos novos métodos diretamente no EditadoMediaItem.Builder para controlar a velocidade, tornando a API mais intuitiva. Agora você pode alterar a velocidade de um clipe chamando setSpeed(provedor SpeedProvider) no EditadoMediaItem.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()

Esta nova abordagem substitui o método anterior de utilização Efeitos#createExperimentalSpeedChangingEffects()que foi descontinuado e será removido em uma versão futura.

Apresentando tipos de faixa para EditedMediaItemSequence

Na versão 1.9.0, EditadoMediaItemSequence requer a especificação dos tipos de trilha de saída desejados durante a criação da sequência. Essa alteração garante que o manuseio da trilha seja mais explícito e robusto em toda a composição.

Isto é feito através de um novo EditadoMediaItemSequence.Builder construtor que aceita um conjunto de tipos de trilha (por exemplo, C.TRACK_TYPE_AUDIO, C.TRACK_TYPE_VIDEO).

Para simplificar a criação, adicionamos novos métodos estáticos de conveniência:

  • EditadoMediaItemSequence.withAudioFrom(Lista)

  • EditadoMediaItemSequence.withVideoFrom(Lista)

  • EditadoMediaItemSequence.withAudioAndVideoFrom(Lista)

Incentivamos você a migrar para o novo construtor ou para os métodos de conveniência para obter definições de sequência mais claras e confiáveis.

Exemplo de criação de uma sequência apenas de vídeo:

EditedMediaItemSequence videoOnlySequence =
    EditedMediaItemSequence.Builder(setOf(C.TRACK_TYPE_VIDEO))
        .addItem(editedMediaItem)
        .build()

Por favor entre em contato através do Rastreador de problemas Media3 se você encontrar algum bug ou se tiver dúvidas ou solicitações de recursos. Estamos ansiosos para ouvir de você!

Deixe um comentário