Transcodage de contenus multimédias dans un format compatible

Sur Android 12 (niveau d'API 31) ou version ultérieure, le système peut convertir automatiquement enregistrées dans des formats tels que HEVC (H.265) à AVC (H.264) lorsque les vidéos sont ouverts par une application non compatible avec le format HEVC. Cette fonctionnalité permet Capturez des applications pour utiliser un encodage plus moderne et économe en stockage pour les vidéos enregistrées sur l'appareil sans compromettre la compatibilité avec d'autres applications.

Les formats suivants peuvent être transcodés automatiquement pour les contenus créé sur l'appareil:

Format du contenu multimédia Attribut XML Type MIME MediaFormat
HEVC (H.265) HEVC MediaFormat.MIMETYPE_VIDEO_HEVC
HDR10HDR10 MediaFeature.HdrType.HDR10
HDR10+ HDR10Plus MediaFeature.HdrType.HDR10_PLUS

Android part du principe que les applications sont compatibles avec la lecture de tous les formats multimédias. le transcodage de contenu multimédia compatible est désactivé par défaut.

Quand utiliser le transcodage

Le transcodage est une opération coûteuse en calcul et ajoute une lors de l'ouverture d'un fichier vidéo. Par exemple, un fichier vidéo HEVC d'une minute prend environ 20 secondes pour le transcodage au format AVC sur un téléphone Pixel 3. Pour cette raison, vous ne devez transcoder un fichier vidéo que lorsque vous l'envoyez appareil. Par exemple, lorsque vous partagez un fichier vidéo avec d'autres utilisateurs du même d'une application ou d'un serveur cloud non compatible .

N'effectuez pas de transcodage lors de l'ouverture de fichiers vidéo pour les lire sur l'appareil ou pour créer des vignettes.

Configurer le transcodage

Les applications peuvent contrôler leur comportement de transcodage en déclarant leurs contenus multimédias des fonctionnalités. Il existe deux façons de déclarer ces capacités: dans le code, ou dans une ressource.

Déclarer des fonctionnalités dans le code

Vous pouvez déclarer des capacités multimédias dans le code en construisant une instance d'une ApplicationMediaCapabilities à l'aide d'un compilateur:

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

Utilisez cet objet lorsque vous accédez au contenu multimédia via des méthodes telles que 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.
}

Cette méthode permet de contrôler précisément des chemins de code spécifiques, tels que comme n'appeler le transcodage que lors du transfert d'un fichier vidéo hors de l'appareil. Elle prévaut sur la méthode décrite ci-dessous.

Déclarer des fonctionnalités dans une ressource

Déclarer des fonctionnalités dans une ressource permet un contrôle global sur le transcodage. Cette méthode ne doit être utilisée que dans des cas très spécifiques. Par exemple, si votre application ne reçoit que les fichiers vidéo d'autres applications (au lieu de les ouvrir directement) ; et les met en ligne sur un serveur qui n'est pas compatible avec les codecs vidéo modernes (voir l'exemple de scénario 1 ci-dessous).

L'utilisation de cette méthode lorsqu'elle n'est pas absolument nécessaire peut entraîner le transcodage dans des scénarios inattendus, par exemple lors de la création de miniatures sur les vidéos, ce qui nuit à l'expérience utilisateur.

Pour utiliser cette méthode, créez un fichier de ressources 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>

Dans cet exemple, les vidéos HDR enregistrées sur l'appareil sont transcodées de manière fluide en Les vidéos AVC SDR (standard Dynamic Range), contrairement aux vidéos HEVC, ne le sont pas.

Utilisez une balise property dans la balise application pour ajouter une référence au contenu multimédia fichier de capacités. Ajoutez les propriétés suivantes à votre fichier AndroidManifest.xml:

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

Utiliser les fonctionnalités multimédias d'une autre application pour ouvrir un fichier vidéo

Si votre application partage un fichier vidéo avec une autre application, le fichier vidéo devra peut-être doit être transcodée avant que l’application réceptrice puisse l’ouvrir.

Vous pouvez gérer ce cas en ouvrant un fichier vidéo avec openTypedAssetFileDescriptor. et en spécifiant l'UID de l'application réceptrice, que vous pouvez obtenir à l'aide de Binder.getCallingUid. La plate-forme utilise ensuite les capacités multimédias de l'application réceptrice pour déterminer si le fichier vidéo doit être transcodé.

Kotlin

val providerOptions = Bundle().apply {
    putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid())
}
contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)
    .use { fileDescriptor ->
        // Content will be transcoded based on the media capabilities of the
        // calling app.
    }

Java

Bundle providerOptions = new Bundle();
providerOptions.putParcelable(MediaStore.EXTRA_MEDIA_CAPABILITIES_UID, Binder.getCallingUid());
try (AssetFileDescriptor fileDescriptor =  contentResolver.openTypedAssetFileDescriptor(mediaUri, mediaMimeType, providerOptions)) {
    // Content will be transcoded based on the media capabilities of the
    // calling app.
}

Exemples de scénarios

Les schémas suivants illustrent les deux cas d'utilisation courants. Dans les deux cas, la vidéo d'origine est stockée au format HEVC et l'application de partage de vidéos est compatible avec le format HEVC.

Exemple 1. Le transcodage est lancé par l'application de capture vidéo. Exemple 1 L'application de partage de vidéos déclare qu'elle n'est pas compatible avec le format HEVC dans son contenu multimédia. de capacités. Il demande ensuite une vidéo à l'application de capture vidéo. Capture vidéo l'application gère la requête et ouvre le fichier à l'aide de openTypedAssetFileDescriptor, en spécifiant l'UID de l'application de partage. Le processus de transcodage démarre. Une fois reçue, la vidéo transcodée est transmise à l'application de partage, qui l'importe sur un serveur dans le cloud.

Exemple 2. Le transcodage est lancé par l'application de partage de vidéos. Exemple 2 L'application de capture vidéo partage une vidéo avec l'application de partage vidéo à l'aide d'un URI MediaStore. L'application de partage de vidéos ouvre le fichier vidéo à l'aide de openTypedAssetFileDescriptor, en indiquant que ses fonctionnalités multimédias ne sont pas compatibles avec le format HEVC. Ce lance le processus de transcodage. Une fois terminé, le fichier est importé un serveur dans le cloud.

Formats non déclarés

Le transcodage de contenus multimédias compatible est activé pour tous les formats déclarés. non pris en charge. Il est désactivé pour tous les formats déclarés pris en charge. Pour d'autres formats non déclarés, la plate-forme décide de transcoder ou non ou non. Sous Android 12, le transcodage est désactivé pour tous les formats non déclarés. Ce comportement est susceptible de changer pour les nouveaux formats de la à venir.

Options pour les développeurs

Vous pouvez utiliser les options pour les développeurs suivantes pour ignorer les paramètres par défaut d'Android comportement de transcodage:

  • Ignorer les valeurs par défaut de transcodage Ce paramètre détermine si oui ou non la plate-forme contrôle le transcodage automatique. Lors du forçage est activé, les valeurs par défaut de la plate-forme sont ignorées, et la commande enable de transcodage contrôle le transcodage automatique. Cette option est désactivée par par défaut.

  • Activer le transcodage : ce paramètre permet d'indiquer si l'URL n'est pas déclarée ou non sont automatiquement transcodés. Il est activé par défaut, mais il ne fait a un effet si l'option Remplacer les valeurs par défaut de transcodage est également activée.

  • Supposer que les applications sont compatibles avec les formats modernes Ce paramètre contrôle ce qui se passe quand L'application tente de lire un format non déclaré. Cela se produit lorsque le fichier manifeste ne pas déclarer si l'application est compatible ou non avec un format particulier, ou si n'a pas ajouté l'application à la liste de transcodage forcé côté serveur. Lorsque le paramètre est activée, l'application n'effectue pas de transcodage. Lorsque cette option est désactivée, l'application le fait le transcodage. Cette option est activée par défaut.

  • Afficher les notifications de transcodage : lorsque cette option est activée, l'application affiche une notification de progression du transcodage lorsque le transcodage est déclenché par la lecture d'un fichier multimédia non pris en charge. Cette option est activée par défaut.

  • Désactiver le cache de transcodage : si cette option est activée, les applications qui nécessitent une conversion ne le font pas. utiliser le cache de transcodage. Cela peut être utile pendant le développement pour facilement déclenche le transcodage sur un fichier multimédia non pris en charge, mais peut affecter la qualité de l'appareil des performances. Cette option est désactivée par défaut.