Bem-vindo à Visualização do desenvolvedor do Android 12. Envie seu feedback com antecedência e frequência e ajude a deixar o Android 12 ainda melhor.

Transcodificação de mídia compatível

Ícone de feedback Gostaríamos de receber seu feedback sobre a transcodificação de mídia compatível. Responda a uma breve pesquisa para dar sua opinião. Mais especificamente, informe quais casos de uso em seu app são afetados por essa mudança.

O Android 12 introduz um novo recurso que permite que apps de captura de vídeos utilizem uma codificação mais moderna e de armazenamento econômico para vídeos gravados no dispositivo sem sacrificar a compatibilidade com outros apps.

O Android pode converter automaticamente vídeos gravados em formatos como HEVC (H.265) em AVC (H.264) quando os vídeos são abertos por um app que não é compatível com HEVC.

Os formatos a seguir podem ser transcodificados automaticamente para conteúdos criados no dispositivo:

Formato de mídia Atributo XML Tipo MIME do MediaFormat
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 MediaFeature.HdrType.HDR10
HDR10+ HDR10Plus MediaFeature.HdrType.HDR10_PLUS

O Android pressupõe que os apps são compatíveis com a reprodução de todos os formatos de mídia, portanto, a transcodificação de mídia compatível é desativada por padrão. Os apps que quiserem solicitar que a mídia seja transcodificada para um formato mais compatível precisam declarar as funcionalidades de mídia. Há duas formas de declarar isso: em um recurso ou em linha no código.

Declarar funcionalidades em um recurso

Primeiro, crie um arquivo de recurso media_capabilities.xml:

<?xml version="1.0" encoding="utf-8"?>
<media-capabilities xmlns:android="http://schemas.android.com/apk/res/android">
    <format android:name="HEVC" supported="true"/>
    <format android:name="HDR10" supported="false"/>
    <format android:name="HDR10Plus" supported="false"/>
</media-capabilities>

Nesse exemplo, os vídeos HDR gravados no dispositivo são perfeitamente transcodificados para vídeos AVC SDR (intervalo dinâmico padrão), enquanto os vídeos HEVC não são.

Use uma tag property na tag application para adicionar uma referência ao arquivo de funcionalidades de mídia. Adicione as seguintes propriedades ao arquivo AndroidManifest.xml:

<property
    android:name="android.media.PROPERTY_MEDIA_CAPABILITIES"
    android:resource="@xml/media_capabilities" />

Declarar funcionalidades no código

Para declarar funcionalidades de mídia no código, crie uma instância de um objeto ApplicationMediaCapabilities usando um builder:

Kotlin

val mediaCapabilities = ApplicationMediaCapabilities.Builder()
    .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
    .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
    .build()

Java

ApplicationMediaCapabilities mediaCapabilities = new ApplicationMediaCapabilities.Builder()
        .addSupportedVideoMimeType(MediaFormat.MIMETYPE_VIDEO_HEVC)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10)
        .addUnsupportedHdrType(MediaFeature.HdrType.HDR10_PLUS)
        .build();

Use esse objeto ao acessar o conteúdo de mídia usando métodos como ContentResolver#openTypedAssetFileDescriptor():

Kotlin

val providerOptions = Bundle().apply {
    putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities)
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
    .use { fileDescriptor ->
        // Content will be transcoded based on values defined in the
        // ApplicationMediaCapabilities provided.
    }

Java

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES, mediaCapabilities);
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    // Content will be transcoded based on values defined in the
    // ApplicationMediaCapabilities provided.
}

Esse método tem precedência sobre os recursos vinculados no AndroidManifest.xml do app, permitindo um controle mais granular para caminhos de código específicos, como a execução de testes A/B.