Sur Android 12 (niveau d'API 31) ou version ultérieure, le système peut convertir automatiquement les vidéos enregistrées dans des formats tels que HEVC (H.265) en AVC (H.264) lorsque les vidéos sont ouvertes par une application qui n'est pas compatible avec HEVC. Cette fonctionnalité permet aux applications de capture vidéo d'utiliser un encodage plus moderne et plus efficace en termes de stockage pour les vidéos enregistrées sur l'appareil, sans sacrifier la compatibilité avec d'autres applications.
Les formats suivants peuvent être transcodés automatiquement pour les contenus créés sur l'appareil :
Format multimédia | Attribut XML | Type MIME MediaFormat |
---|---|---|
HEVC (H.265) | HEVC | MediaFormat.MIMETYPE_VIDEO_HEVC |
HDR10 | HDR10 | MediaFeature.HdrType.HDR10 |
HDR10+ | HDR10Plus | MediaFeature.HdrType.HDR10_PLUS |
Android part du principe que les applications peuvent lire tous les formats multimédias. Par conséquent, le transcodage multimédia compatible est désactivé par défaut.
Quand utiliser le transcodage ?
Le transcodage est une opération coûteuse en termes de calcul et ajoute un délai important lors de l'ouverture d'un fichier vidéo. Par exemple, un fichier vidéo HEVC d'une minute prend environ 20 secondes pour être transcodé en AVC sur un téléphone Pixel 3. C'est pourquoi vous ne devez transcoder un fichier vidéo que lorsque vous l'envoyez hors de l'appareil. Par exemple, lorsque vous partagez un fichier vidéo avec d'autres utilisateurs de la même application ou sur un serveur cloud qui n'est pas compatible avec les formats vidéo modernes.
Ne transcodez pas les fichiers vidéo lorsque vous les ouvrez pour les lire sur l'appareil ou pour créer des miniatures.
Configurer le transcodage
Les applications peuvent contrôler leur comportement de transcodage en déclarant leurs capacités multimédias. Il existe deux façons de déclarer ces fonctionnalités : dans le code ou dans une ressource.
Déclarer des fonctionnalités dans le code
Vous pouvez déclarer des fonctionnalités multimédias dans le code en construisant une instance d'un objet ApplicationMediaCapabilities
à l'aide d'un générateur :
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 à du 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 un contrôle précis de certains chemins de code, comme l'appel du transcodage uniquement 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 capacités dans une ressource permet de contrôler globalement 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 des fichiers vidéo d'autres applications (au lieu de les ouvrir directement) et les importe sur un serveur qui ne prend pas en charge les codecs vidéo modernes (voir l'exemple de scénario 1 ci-dessous).
Utiliser cette méthode lorsque ce n'est pas absolument nécessaire peut entraîner un transcodage dans des scénarios inattendus, par exemple lors de la création de miniatures de vidéos, ce qui dégrade 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 vidéos AVC SDR (plage dynamique standard), contrairement aux vidéos HEVC.
Utilisez une balise property
dans la balise application
pour ajouter une référence au fichier de fonctionnalités multimédias. Ajoutez ces propriétés à 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, il peut être nécessaire de le transcoder avant que l'application destinataire puisse l'ouvrir.
Vous pouvez gérer ce cas en ouvrant un fichier vidéo à l'aide de openTypedAssetFileDescriptor
et en spécifiant l'UID de l'application destinataire, qui peut être obtenu à l'aide de Binder.getCallingUid
.
La plate-forme utilise ensuite les fonctionnalités multimédias de l'application de réception 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 n'est pas compatible avec ce format.
Exemple 1 Le transcodage est lancé par l'application de capture vidéo.
L'application de partage de vidéos déclare qu'elle n'est pas compatible avec le format HEVC dans son fichier de ressources de fonctionnalités multimédias. Il demande ensuite une vidéo à l'application de capture vidéo. L'application de capture vidéo traite la demande 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 la vidéo transcodée reçue, elle est fournie à l'application de partage, qui la met en ligne sur un serveur dans le cloud.
Exemple 2. Le transcodage est initié par l'application de partage de vidéos.
L'application de capture vidéo partage une vidéo avec l'application de partage de vidéos à l'aide d'un URI
MediaStore
. L'application de partage de vidéos ouvre le fichier vidéo à l'aide de openTypedAssetFileDescriptor
, en précisant qu'elle ne prend pas en charge HEVC dans ses fonctionnalités multimédias. Le processus de transcodage est alors lancé. Une fois terminé, le fichier est importé sur un serveur dans le cloud.
Formats non déclarés
Le transcodage multimédia compatible est activé pour tous les formats déclarés non compatibles et désactivé pour tous les formats déclarés compatibles. Pour les autres formats non déclarés, la plate-forme décide s'il faut ou non les transcoder. Dans Android 12, le transcodage est désactivé pour tous les formats non déclarés. Ce comportement pourra être modifié pour les nouveaux formats à l'avenir.
Options pour les développeurs
Vous pouvez utiliser les options pour les développeurs suivantes pour remplacer le comportement de transcodage par défaut d'Android :
Ignorer les paramètres de transcodage par défaut : ce paramètre détermine si la plate-forme contrôle ou non le transcodage automatique. Lorsque le remplacement est activé, les paramètres par défaut de la plate-forme sont ignorés et le paramètre enable transcoding contrôle le transcodage automatique. Cette option est désactivée par défaut.
Activer le transcodage : ce paramètre indique si les formats non déclarés sont automatiquement transcodés. Il est activé par défaut, mais n'a d'effet que si l'option Remplacer les paramètres de transcodage par défaut est également activée.
Supposer que les applications sont compatibles avec les formats modernes : ce paramètre contrôle ce qui se passe lorsque l'application tente de lire un format non déclaré. Cela se produit lorsque le fichier manifeste ne déclare pas si l'application est compatible ou non avec un format particulier, ou lorsque Google n'a pas ajouté l'application à la liste de transcodage forcé côté serveur. Lorsque le paramètre est activé, l'application ne transcode pas. Lorsqu'il est désactivé, l'application transcode. 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 compatible. Cette option est activée par défaut.
Désactiver la cache de transcodage : si cette option est activée, les applications qui nécessitent un transcodage n'utilisent pas la cache de transcodage. Cela peut être utile pendant le développement pour déclencher facilement le transcodage sur un fichier multimédia non compatible, mais peut entraîner de mauvaises performances de l'appareil. Cette option est désactivée par défaut.