Dictionnaire

Que sont les b frames vidéo dans un fichier ?

Une B-frame est une image vidéo qui peut utiliser à la fois une image précédente et une image suivante. Découvrez comment fonctionnent les b frames vidéo et ce que signifie la valeur Has B Frames dans votre fichier.

b-frames

Une B-frame est une image vidéo qui peut utiliser à la fois une image précédente et une image suivante pour construire son image. Le B signifie bidirectionnel. Les B-frames offrent plus de compression que les autres types d'images, ce qui aide à garder une vidéo légère.

Dans les métadonnées d'un fichier vidéo, vous pouvez voir un champ nommé Has B Frames, aussi écrit has_b_frames. Le nom suggère une réponse oui ou non, mais la valeur est un nombre. Ce nombre indique combien d'images un décodeur doit pouvoir garder en mémoire pour afficher la vidéo dans le bon ordre.

En quoi les B-frames diffèrent-elles des I-frames et des P-frames

La compression vidéo fonctionne généralement en comparant les images et en enregistrant les différences entre elles. La vidéo MPEG-2 définit ces 3 types d'images :

  • I-frame : codée sans référence à d'autres images, le décodage peut donc commencer ici
  • P-frame : peut utiliser l'I-frame ou la P-frame précédente
  • B-frame : peut utiliser l'I-frame ou la P-frame précédente et suivante

Une B-frame peut dépendre d'une image qui arrive plus tard dans le temps, cette image ultérieure doit donc être stockée en premier. L'ordre de stockage diffère donc de l'ordre que vous voyez à l'écran. Une séquence MPEG-2 typique ressemble à ceci :

  • Ordre d'affichage : B1 B2 I3 B4 B5 P6 B7 B8 P9 B10 B11 P12
  • Ordre de stockage : I3 B1 B2 P6 B4 B5 P9 B7 B8 P12 B10 B11

À quoi ressemblent les valeurs

Has B Frames est un nombre entier. FFmpeg décrit cette valeur comme la taille du tampon de réordonnancement des images dans le décodeur. Pour la vidéo MPEG-2, FFmpeg définit 2 valeurs :

  • 0 : vidéo à faible latence avec uniquement des I-frames et des P-frames
  • 1 : vidéo avec des I-frames, des P-frames et des B-frames

Les encodeurs H.264 et HEVC peuvent aussi garder certaines B-frames comme références pour d'autres images. Les fichiers de test FFmpeg pour H.264 montrent comment cela modifie la valeur. Les noms de fichiers donnent les réglages de l'encodeur :

  • Au maximum 3 B-frames à la suite, aucune conservée comme référence : 1
  • Au maximum 3 B-frames à la suite, certaines conservées comme référence : 2
  • Au maximum 4 B-frames à la suite, certaines conservées comme référence : 2

La valeur n'est donc pas un comptage des B-frames. Le programme ffprobe indique le type de chaque image avec une valeur pict_type : I, P ou B. Le champ NB Frames donne le nombre d'images, mais pas leurs types.

D'où vient la valeur

Le nom du champ vient de FFmpeg, dont le programme ffprobe affiche has_b_frames pour les flux vidéo. Un flux H.264 peut indiquer ce nombre dans son propre en-tête. Si l'en-tête ne l'indique pas, FFmpeg le déduit à partir des images et de leurs temps.

Les réglages de l'encodeur décident si une vidéo utilise des B-frames. Dans FFmpeg et dans l'encodeur Microsoft H.264, une valeur de 0 désactive les B-frames.

Quels fichiers le portent

Ce champ n'existe que pour les flux vidéo. Vous pouvez voir ce champ pour la vidéo dans les fichiers MP4, MOV, MKV, WebM et AVI. Un fichier MOV avec des images réordonnées stocke aussi une table avec le temps entre le décodage et l'affichage pour chaque image.

Le codec décide si les B-frames sont possibles. La vidéo MPEG-2 et le profil Main de H.264 peuvent les utiliser, mais pas le profil Baseline de H.264. VP8, un codec utilisé dans les fichiers WebM, n'a pas de B-frames, car ses images ne sont jamais prédites à partir d'images ultérieures.

Pourquoi c'est important

Les B-frames aident à garder une vidéo légère, mais elles ajoutent de la latence. L'encodeur doit réordonner les images avant de les stocker, et ce délai dépend du nombre de B-frames à la suite.

Une vidéo réordonnée a aussi 2 temps différents pour chaque image : le moment où il faut la décoder et le moment où il faut l'afficher. FFmpeg indique les deux sous forme d'horodatages dans la base de temps du flux.