Intégration Manuelle des Ensembles de Paramètres (SPS, PPS, VPS) dans les Flux Vidéo Bruts H.264 et H.265

Dans l'ingénierie audiovisuelle, une problématique courante est la non-lecture de fichiers H.264 ou H.265 "nus" par les lecteurs vidéo standards. Fréquemment, la cause n'est pas un encodage défectueux, mais l'absence d'informations cruciales : les ensembles de paramètres SPS (Sequence Parameter Set) et PPS (Picture Parameter Set), et pour le H.265, le VPS (Video Parameter Set). Ces données sont le « mode d'emploi » que le décodeur vidéo utilise pour interpréter correctement le flux binaire. Qu'il s'agisse d'naalyser des enregistrements de surveillance, de préparer des données pour des modèles d'IA ou de manipuler des flux vidéo multiplateformes, la capacité à insérer manuellement ces paramètres est une compétence indispensable. Cet article explore comment utiliser FFmpeg pour remédier à ce problème.

1. Le Rôle Essentiel des Ensembles de Paramètres : SPS, PPS et VPS

Avant de plonger dans les solutions, il est fondamental de comprendre la fonction de ces ensembles de paramètres et leur place dans un flux vidéo.

SPS (Sequence Parameter Set)

Le SPS définit les propriétés globales qui s'appliquent à une séquence entière de vidéo. Il s'agit des "règles du jeu" générales pour le décodage. Les informations clés incluses sont :

  • Le profil et le niveau : Ces valeurs spécifient l'ensemble d'outils d'encodage utilisés et les contraintes de performance (ex: support des B-frames, encodage entropique CABAC).
  • La résolution : Largeur et hauteur de l'image.
  • Le nombre d'images de référence : Combien d'images le décodeur peut stocker pour la prédiction inter-trames.
  • L'espace colorimétrique et la profondeur de couleur.

PPS (Picture Parameter Set)

Le PPS contient des paramètres qui s'appliquent à une ou plusieurs images spécifiques au sein de la séquence, offrant des détails plus fins pour le processus de décodage d'une image. Parmi eux, on trouve :

  • Le mode d'encodage entropique : CABAC ou CAVLC, influençant la complexité du décodage et le taux de compression.
  • Les paramètres de quantification (QP) : Contrôlent le niveau de compression et, par extension, la qualité de l'image.
  • Les paramètres du filtre de déblocage : Utilisés pour réduire les artefacts de blocage.

VPS (Video Parameter Set) pour H.265 (HEVC)

H.265, ou HEVC, introduit un niveau hiérarchique supplémentaire : le VPS. Il se situe au-dessus du SPS et du PPS et décrit des propriétés qui s'étendent sur plusieurs séquences vidéo, comme des informations sur les hiérarchies temporelles ou spatiales. En général, il est requis pour le décodage HEVC.

Encapsulation dans les NALU

Dans un flux binaire H.264 ou H.265, ces paramètres sont encapsulés dans des unités appelées NALU (Network Abstraction Layer Unit). Un flux brut conforme au format Annex B commence typiquement par les NALU des paramètres, précédés de codes de début (0x00000001 ou 0x000001), suivis par les NALU des images. Une structure classique serait :

[Code de Début] [NALU VPS (H.265)] [Code de Début] [NALU SPS] [Code de Début] [NALU PPS] [Code de Début] [NALU d'image IDR] ...

Il est crucial de noter que lorsque vous extraeyz un flux vidéo brut d'un conteneur comme MP4 ou MKV (par exemple, avec ffmpeg -i input.mp4 -vcodec copy -an output.h264), les NALU SPS/PPS/VPS ne sont souvent pas inclus dans le flux binaire extrait. C'est parce que ces informations sont stockées dans l'en-tête du conteneur (comme l'atome moov dans un MP4) et ne sont pas répétées pour chaque segment vidéo. Un décodeur qui tente de lire un tel flux brut sans ces paramètres initiaux échouera.

2. Diagnostic : Vérifier l'Absence de SPS/PPS/VPS

Avant toute intervention, il est essentiel de confirmer que les paramètres sont effectivement manquants. Voici quelques méthodes de diagnostic :

a. Utilisation de FFprobe

L'outil ffprobe, partie intégrante de FFmpeg, est idéal pour analyser les caractéristiques d'un flux. Pour vérifier la présence de NALU de paramètres au début du fichier, vous pouvez examiner la sortie détaillée :

ffprobe -v trace -show_frames votre_flux.h264 | grep "nal_unit_type" | head -n 20

Dans un flux H.264 sain, vous devriez voir des nal_unit_type=7 (SPS) et nal_unit_type=8 (PPS) parmi les premières lignes. Pour H.265, recherchez nal_unit_type=32 (VPS), nal_unit_type=33 (SPS) et nal_unit_type=34 (PPS). L'absence de ces types NALU au début indique un problème.

Une autre technique consiste à utiliser un filtre de flux binaire (BSF) avec FFmpeg. Le filtre h264_mp4toannexb (ou hevc_mp4toannexb pour H.265) est conçu pour ajouter les NALU SPS/PPS (et VPS) manquants à un flux brut qui proviendrait d'un conteneur MP4/MOV.

ffmpeg -i votre_flux_sans_spspps.h264 -c:v copy -bsf:v h264_mp4toannexb -f h264 flux_repare.h264

Si flux_repare.h264 devient lisible alors que votre_flux_sans_spspps.h264 ne l'était pas, c'est une preuve que les paramètres étaient manquants.

b. Logiciels d'Analyse de Flux Professionnels

Des outils comme Elecard StreamEye ou CodecVisa offrent une interface graphique pour une analyse plus approfondie. En chargeant le fichier, ces logiciels affichent une vue "NALU Browser" où vous pouvez inspecter l'ordre et le type de chaque NALU. Vous pourrez visuellement confirmer l'absence de NALU de type SPS, PPS ou VPS au début du flux.

c. Inspection avec un Éditeur Hexadécimal

C'est une méthode "manuelle" mais très précise. Utilisez un éditeur hexadécimal (comme xxd, hexdump ou 010 Editor) pour ouvrir le fichier et rechercher les codes de début (00 00 00 01). Immédiatement après, le prochain octet (ou les quelques octets suivants) indique le type du NALU :

  • H.264 SPS : Le NALU de type 7 commence par 00 00 00 01 67 ... (où 67 est l'octet 0x67).
  • H.264 PPS : Le NALU de type 8 commence par 00 00 00 01 68 ... (où 68 est l'octet 0x68).
  • H.265 VPS : Le NALU de type 32 commence par 00 00 00 01 40 ... (où 40 est l'octet 0x40, dont les 6 bits les moins significatifs donnent le type 32).
  • H.265 SPS : Le NALU de type 33 commence par 00 00 00 01 42 ... (où 42 est l'octet 0x42, type 33).
  • H.265 PPS : Le NALU de type 34 commence par 00 00 00 01 44 ... (où 44 est l'octet 0x44, type 34).

Si le fichier commence directement par un NALU d'image (par exemple, un NALU d'IDR frame pour H.264 est de type 5, donc 00 00 00 01 65 ...), sans les NALU de paramètres précédents, alors ils sont manquants.

Étiquettes: H.264 H.265 HEVC SPS PPS

Publié le 28 août à 02h31