Bonnes pratiques pour le partage de vidéos

De nombreux utilisateurs partagent des vidéos à l'aide de leur appareil Android. La qualité de la vidéo reçue est souvent inférieure à l'originale en raison du traitement effectué par l'application de partage. Ce document explique comment optimiser la qualité des vidéos partagées et décrit certains pièges courants à éviter lors du traitement des vidéos. Pour optimiser le partage de contenu vidéo HDR, consultez la section Utiliser le module Transformer pour transcoder le contenu HDR en SDR de cette page.

L'essentiel est de maintenir une résolution constante et de maintenir la qualité vidéo aussi élevée que possible le plus longtemps possible pendant que vous vous préparez à partager une vidéo.

Le pipeline de partage

La figure 1 illustre la procédure classique de partage d'une vidéo:

Partager un pipeline vidéo Figure 1. Pipeline de partage de vidéos

Le pipeline comprend les étapes suivantes:

  1. Capturez et encodez une vidéo, en ajoutant éventuellement des effets pendant la capture. L'utilisateur peut également ignorer cette étape et sélectionner dans l'espace de stockage une vidéo préenregistrée depuis une autre application.
  2. modifier, filtrer, retoucher ou traiter la vidéo ;
  3. Mettre à l'échelle ou redimensionner la vidéo en préparation du transcodage.
  4. Transcode la vidéo en vue de la partager. Le filtrage de l'étape 2 est souvent appliqué lors de cette étape.

Le pipeline comporte deux étapes au cours desquelles vous avez la possibilité de définir des paramètres qui déterminent la qualité de votre vidéo: l'encodage lors de l'enregistrement initial et le transcodage avant le partage. En outre, vous devrez peut-être redimensionner la vidéo avant la dernière étape de transcodage, ce qui peut également affecter la qualité.

Recommandations

Le tableau 1 présente les cinq principaux paramètres de qualité vidéo et indique les étapes à suivre.

Paramètre Filmez Partager
Profil Y Y
Résolution Y Y
Débit Y Y
Paramètre de quantification (QP) (rarement) Y
Images B N Y

Tableau 1. Principaux paramètres déterminant la qualité vidéo

Profil

Pour de meilleurs résultats, utilisez les profils plus avancés fournis par le codec spécifique. Pour l'encodage AVC, sélectionnez "Profil élevé" et le niveau 4.

Résolution, recadrage et mise à l'échelle

Vous pouvez modifier la résolution initiale de la vidéo capturée à l'étape de mise à l'échelle avant le transcodage pour le partage, mais le scaling peut dégrader la qualité de la vidéo. Nous vous recommandons d'éviter le scaling et de sélectionner une résolution pour l'encodage initial que vous pourrez utiliser tout au long du pipeline. N'oubliez pas non plus qu'un recadrage extrême entraîne une image de mauvaise qualité, en particulier si vous agrandissez l'image recadrée. Respectez les consignes suivantes :

  • Choisissez une résolution au moins égale à la résolution de partage finale.
  • La résolution de la capture ne doit pas dépasser considérablement la résolution du partage, sauf si toutes les étapes intermédiaires sont conçues pour prendre en charge une résolution plus élevée (par exemple, le débit plus élevé lors de la capture initiale).

    • Si l'encodage de partage produit une résolution de 720 x 1 280, nous vous recommandons une résolution de capture de 720 x 1 280.
    • Si les étapes intermédiaires entre la capture et le partage incluent le recadrage, utilisez une résolution de capture supérieure (par exemple, 1 080 x 1 920) et augmentez le débit de capture pour gérer les pixels supplémentaires.
  • Un recadrage extrême produit une image de mauvaise qualité, en particulier si l'image recadrée a été améliorée.

  • Évitez de passer d'une résolution inférieure à une résolution supérieure. L'augmentation tente de créer des détails absents. Conservez la résolution la plus élevée souhaitée dès le début.

  • Si vous devez augmenter la valeur, ajustez les paramètres d'encodage. Par exemple, si la résolution augmentée comporte deux fois plus de pixels, le débit est multiplié par deux.

La résolution et le débit sont liés. Par exemple, si vous transportez une vidéo haute résolution via un pipeline de partage qui finit par la transcoder vers un faible débit, vous obtenez une image de moins bonne qualité qu'avec une résolution moins élevée. À mesure que le débit diminue, il existe des points de croisement pour lesquels des résolutions plus faibles commencent à générer de meilleurs résultats:

Débit Résolution
Plus de 5 Mbit/s 1080x1920
De 1,5 à 5 Mbit/s ou plus 720x1280
1,5 Mbit/s ou moins équivalent SD. Le même nombre de pixels au format 9:16 correspond à environ 416 x 736.

Tableau 2. Débit et résolution

De nombreuses applications populaires partagent des vidéos à une résolution inférieure ou égale à 720p. Les données indiquent que la résolution 720p est un choix approprié pour les cibles de débit comprises entre 1,5 et 5 Mbit/s.

Débit

Enregistrement…

L'utilisation d'un débit d'encodage plus élevé offre la meilleure amélioration de la qualité vidéo. Nous vous recommandons de choisir des débits correspondant aux applications d'appareil photo natives. Pour une résolution de 720 x 1 280, nous recommandons un débit de capture de 10 Mbit/s.

Étant donné que l'encodage de la capture est effectué sur l'appareil, vous pouvez utiliser un débit plus élevé pour compenser la plupart des transformations des étapes de partage, avec un impact négatif faible. Les fichiers résultants plus volumineux ne sont utilisés que pour la manipulation sur l'appareil.

Vous pouvez réduire le débit à l'étape finale du transcodage, comme indiqué dans le tableau 2.

Partage

Le débit est celui qui a le plus d'impact au moment du partage, car il est directement lié à la taille de la vidéo qui sera mise en ligne. Il existe un compromis entre la qualité vidéo, le temps de transmission des fichiers et les coûts du stockage cloud.

Le choix du profil d'encodage, des frames B et des valeurs de délimitation du point de terminaison est également plus important à ce stade que lors de la capture.

Nous vous recommandons un débit compris entre 4 et 5 Mbit/s (pour une résolution de 720 x 1 280) afin d'assurer une bonne qualité visuelle.

Paramètre de quantification (QP)

Sur Android 12 et versions ultérieures, les clés QP sont standardisées et sont disponibles dans l'API MediaFormat et dans la bibliothèque multimédia du NDK. Sur les versions antérieures d'Android, la manipulation du QP n'est disponible que via les fonctions de framework qui utilisent des clés spécifiques au fournisseur dans la configuration MediaFormat.

Enregistrement…

Pendant l'enregistrement vidéo, utilisez le contrôle du débit plutôt que les paramètres QP, qui ne sont pas toujours disponibles.

Nous vous déconseillons d'ajuster les paramètres QP pour des débits de capture de 10 Mbit/s (pour 720 x 1 280). Si le débit de capture est nettement inférieur (inférieur à 5 Mbit/s pour 720 x 1 280), un paramètre QP de 40 constitue un bon compromis entre une meilleure qualité et ne force pas le codec à dépasser trop souvent le débit cible.

Partage

Nous recommandons une limite QP maximale de 40, en particulier lorsque le débit est inférieur à 4 Mbit/s. Bien que cela garantit une qualité minimale pour les vidéos encodées, cela peut produire un résultat avec un débit plus élevé. L'augmentation du débit dépend de la complexité de la vidéo. Bien qu'une application de partage puisse tolérer des variations dans le débit de la vidéo générée, il est possible qu'elle ne tolère pas une augmentation au-delà d'un certain seuil.

Vous pouvez limiter l'augmentation du débit en encodant de nouveau la vidéo pour la partager avec une limite QP maximale moins restrictive (plus élevée). Cela donne au codec plus de liberté pour sacrifier la qualité et préserver d'autres parties de la vidéo. Vous pouvez réencoder la vidéo pour la partager, car il s'agit d'une opération de transcodage ; vous avez déjà capturé la vidéo que vous souhaitez partager.

L'inconvénient est que répéter l'étape de transcodage avec ces différents paramètres augmente le temps nécessaire au partage de la vidéo. Pour réduire cette latence, vous pouvez examiner la vidéo partiellement transcodée afin de déterminer si elle respecte votre tolérance au dépassement du débit. Si ce n'est pas le cas, vous pouvez arrêter le transcodage et réessayer avec des paramètres QP plus appropriés.

Images B et profils d'encodage

N'utilisez les images B que lors de l'étape de partage et uniquement lorsque vous utilisez Android 10 ou une version ultérieure.

Les applications doivent vérifier les profils d'encodage compatibles à l'aide de CodecCapabilities, car tous les appareils ne sont pas compatibles avec les profils principaux ou supérieurs. Utilisez le profil le plus élevé accepté par l'encodeur AVC: High > Main > Baseline (Élevée > Principal > Référence). Pour des résultats plus sûrs, ne configurez pas les frames B (KEY_LATENCY ou KEY_MAX_B_FRAMES) lorsque vous utilisez le profil de référence, car la configuration de certains encodeurs peut échouer.

Les segments de code suivants supposent un 'MediaFormat format' qui sera utilisé pour configurer l'encodeur AVC

Android 10

API 29 ou version ultérieure

Utilisez le profil compatible le plus élevé et définissez le paramètre "B-frame" sur 1:

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_MAX_B_FRAMES, 1);

Ne définissez pas KEY_LATENCY dans ce cas de figure.

Android 8, 8.1 et 9

API 26, 27, 28

Utilisez le profil compatible le plus élevé, mais désactivez la génération des images B. Cela permet de respecter certaines limites de MediaMuxer dans ces versions de système.

format.setInt32(KEY_PROFILE, AVCProfileHigh);
format.setInt32(KEY_LATENCY, 1);

La valeur KEY_LATENCY empêche les codecs de générer des images B, mais tire toujours parti d'autres efficacités de codec.

Si votre application n'utilise pas MediaMuxer pour assembler le fichier de sortie final, vous pouvez activer les frames B en définissant la valeur KEY_LATENCY sur 2 au lieu de 1. Cela devrait permettre au codec de produire des images B.

Android 7.1 et versions antérieures

API 25 et versions antérieures

Utilisez le profil de référence pour obtenir des résultats plus sûrs.

format.setInt32(KEY_PROFILE, AVCProfileBaseline);

Avant la version 7, Android AOSP n'est compatible qu'avec le profil de référence. Toutefois, il est probable que les OEM aient activé un profil principal/de haut niveau sur certains appareils, éventuellement à l'aide d'un profil spécifique au fournisseur.

Si votre application n'utilise pas MediaMuxer, vous pouvez utiliser le profil principal ou le profil de haut niveau lorsque le codec le prend en charge. Aucune clé de format publique ne permet de contrôler le nombre de frames B.

Utiliser le module Transformer pour transcoder des contenus HDR en SDR

À partir d'Android 13 (niveau d'API 33), nous vous recommandons d'utiliser le module Transformer de Jetpack Media3 pour partager du contenu HDR avec des applications, des services et des appareils non compatibles avec la technologie HDR. Le module Transformer effectue un mappage des tons d'un flux vidéo HDR d'entrée sur SDR et enregistre le résultat au format MP4, ce qui permet une lecture réussie sans perte de détails ni de luminosité de l'image.

Remarque: Sur les appareils ciblant des versions système comprises entre Android 12 (niveau d'API 32) et Android 7.0 (niveau d'API 24), le module Transformer fonctionne différemment. Si l'appareil est compatible avec la technologie HDR, votre application lit le contenu sans mappage des tons. Si l'appareil n'est pas compatible avec la technologie HDR, une erreur est générée pour indiquer que le mappage des tons HDR n'est pas pris en charge.

Le code suivant configure un Transformer qui mappe l'entrée sur SDR et l'encode à nouveau dans le format d'entrée (tel que H.264/AVC):

Kotlin

val transformer = Transformer.Builder(context)
    .setTransformationRequest(
        TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build()

Java

Transformer transformer = new Transformer.Builder(context)
    .setTransformationRequest(
        new TransformationRequest.Builder()
            .setHdrMode(TransformationRequest.HDR_MODE_TONE_MAP_HDR_TO_SDR)
            .build())
    .addListener(/* ... */)
    .build();

Pour tester la fonctionnalité de mappage des tons, consultez l'application de démonstration Transformer.

Vous pouvez également configurer le mappage des tonalités à l'aide de MediaCodec, bien que l'implémentation soit plus complexe. Pour en savoir plus, consultez la documentation de référence de MediaCodec.