¡Te damos la bienvenida a la Vista previa para desarrolladores de Android 12! Envíanos comentarios con frecuencia y tan pronto como puedas, y ayúdanos a hacer de Android 12 la mejor versión hasta el momento.

Transcodificación de contenido multimedia compatible

Ícono para enviar comentarios Nos encantaría saber qué opinas de la transcodificación de contenido multimedia compatible. Realiza una breve encuesta para contarnos lo que piensas. En particular, queremos conocer los casos de uso de tu app que se verán afectados por este cambio.

Android 12 incluye una función nueva que permite que las apps de captura de video usen codificación más moderna y eficiente en cuanto al almacenamiento para los videos que se graban en el dispositivo sin sacrificar la compatibilidad con otras apps.

Android puede convertir automáticamente videos grabados en formatos del tipo de HEVC (H.265) a AVC (H.264) cuando los videos se abren mediante una app que no admite HEVC.

Los siguientes formatos se pueden transcodificar automáticamente para el contenido creado en el dispositivo:

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

Android supone que las apps pueden admitir la reproducción de todos los formatos, por lo que la transcodificación de contenido multimedia compatible está desactivada de manera predeterminada. Las apps que deseen solicitar que se transcodifique el contenido multimedia en un formato más compatible deben declarar sus capacidades de contenido multimedia. Existen dos formas de hacer esa declaración: en un recurso o de forma intercalada en el código.

Declara capacidades en un recurso

Primero, crea un archivo de recursos 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>

En este ejemplo, los videos HDR grabados en el dispositivo se transcodifican sin interrupciones al video AVC SDR (rango dinámico estándar), mientras que los videos HEVC no lo hacen.

Usa una etiqueta property dentro de la etiqueta application a fin de agregar una referencia al archivo de capacidades multimedia. Agrega estas propiedades al archivo AndroidManifest.xml:

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

Declara capacidades en el código

Puedes declarar capacidades multimedia en el código creando una instancia de un objeto ApplicationMediaCapabilities mediante un compilador de la siguiente manera:

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();

Usa este objeto cuando accedas al contenido multimedia con 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.
}

Este método tiene prioridad sobre las capacidades vinculadas en el objeto AndroidManifest.xml de la app, lo que permite un control más detallado de rutas de acceso específicas de códigos, como la realización de pruebas A/B.