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 |
HDR10 | HDR10 | 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.