toujours voulu savoir sur H.264 – H.265…  sans jamais oser le demander !

Avec l’avènement de la DATV à bas débit, il est devenu crucial d’utiliser avec efficience la bande passante disponible pour transmettre de la vidéo et du son. Les codecs H.264 et H.265 sont là, à notre disposition pour atteindre ce but.

Par où commencer ?

Ce document, sans prétention vous donnera, je l’espère, quelques pistes pour maîtriser ces outils sur la plateforme multimédia OBS Studio.

OBS STUDIO supporte de nombreux codecs, dans cette 1er partie, nous allons nous attaquer à l’utilisation du codec H.264 dans sa version encodage « logiciel » (libx264).

Chaque codec implémente de nombreux praramètes pour optimaliser son codage en fonction du but rechercher : par exemple, la meilleure résolution avec une latence minimum pour le débit disponible.

Pour la version « logiciel » du codec H.264 (libx264), les principales options pour gérer l’encodage sont :

Rate control

C’est ce que fait un encodeur vidéo lorsqu’il décide du nombre de bits à « dépenser » pour une image donnée. L’objectif de l’encodage vidéo est d’enregistrer autant de bits que possible, en réduisant la taille du fichier par rapport au fichier d’entrée original, tout en conservant autant de qualité que possible. Le contrôle du débit est une étape cruciale pour déterminer ce compromis entre la taille et la qualité.

Plusieurs modes sont disponibles :

  • ABR – Average Bit Rate
  • CBR – Constant Bit Rate
  • CRF – Constant Rate Factor
  • VBR – Variable Bit Rate

Dans notre cas, nous désirons dans la mesure du possible avoir un débit constant pour notre TS. Le mode retenu est donc : CBR.

Il est bon de noter qu’il n’existe pas de mode CBR natif, mais vous pouvez “simuler” un réglage de débit binaire constant en réglant les paramètres au moyen des options suivantes (en format OBS ):

x264-params=”nal-hrd=cbr” minrate=1M maxrate=1M bufsize=2M

Dans l’exemple ci-dessus, bufsize est le “buffer de contrôle de débit”, il appliquera donc la “moyenne” demandée (1 MBit/s dans ce cas) sur chaque tranche de 2 MBit/s de vidéo.

Les codages CBR sont généralement inefficaces si la vidéo est facile à coder (par exemple, images vides ou noires).

 


Preset

C’est un ensemble d’options permettant de trouver un compromis entre l’efficacité de la compression et la vitesse de codage. Un préréglage plus lent fournira une meilleure compression. Cela signifie que, par exemple, si vous ciblez une certaine taille de fichier ou un débit binaire constant, vous obtiendrez une meilleure qualité avec un préréglage plus lent.

Si vous spécifiez un préréglage, les modifications qu’il apporte seront appliquées avant que tous les autres paramètres ne soient appliqués.

Vous devez généralement régler cette option sur la vitesse la plus lente que vous pouvez supporter.

Les préréglages disponibles par ordre décroissant de vitesse sont:

  • ultrafast
  • superfast
  • veryfast
  • faster
  • fast
  • medium (default preset)
  • slow
  • slower
  • veryslow
  • placebo (à ignorer)

 

Profile

Cette option limite la sortie à un profil H.264 spécifique. Certains appareils (pour la plupart très anciens ou obsolètes) ne prennent en charge que les profils Constrained Baseline ou Main, plus limités. Vous pouvez définir ces profils avec l’option baseline ou main.

La plupart des appareils modernes prennent en charge le profil High, plus avancé. À moins que vous ne deviez prendre en charge des dispositifs limités, il est recommandé de ne pas définir le profil, ce qui permettra à libx264 de sélectionner automatiquement le profil approprié.

 

Tune

Vous pouvez éventuellement utiliser l’option pour modifier les paramètres en fonction de votre contenu d’entrée. Si vous spécifiez un réglage, les modifications seront appliquées après –preset mais avant tous les autres paramètres.

Les réglages actuels incluent:

  • film – utilisation pour un contenu de film de haute qualité
  • animation – bon pour les dessins animés
  • grain – préserve la structure du grain dans les vieux films
  • image fixe – idéal pour le contenu de type diaporama
  • fastdecode – permet un décodage plus rapide en désactivant certains filtres
  • zerolatency – idéal pour un encodage rapide et un streaming à faible latence
  • psnr – ignorez car il n’est utilisé que pour le développement de codec
  • ssim – ignorez car il n’est utilisé que pour le développement de codec

 

 

Voilà pour la partie théorique. Passons à la pratique !

 

Configuration d’OBS Studio pour son utilisation avec l’ADALM-PLUTO DATV Controller d’Evariste F5OEO.

Dans l’exemple ci-dessous, le débit disponible du TS est de 441.130 kb/s (QPSK, SR 333KS/s, FEC 2/3, Pilot off).

Deux façon de faire sont possibles pour piloter le Pluto par OBS : Streaming et Recording.

 

Output mode Streaming

Grâce au serveur RTMP (Real-Time Messaging Protocol) implémenté dans l’ADALM-PLUTO DATV Controller d’Evariste F5OEO, on peut diffuser vers le Pluto de la vidéo et de l’audio de la même façon que vers un service de streaming tel que you tube avec le mode Streaming d’OBS Studio.

Pour cela, ouvrir OBS, allez dans le menu Settings,

Configurer l’onglet Stream selon la documentation en line sur le Pluto.

Configurer l’onglet Streaming dans Output

Output Mode = Advanced

Encoder = x264

Rate Control = CBR (implémente les options pour simuler un débit constant)

Bitrate = 280 Kbps (comme point de départ : env. 70 % du débit disponible du TS)

Use Custom Buffer Size = oui

Buffer Size = 560 Kbps (comme point de départ : env. 2x le Bitrate)

Keyframe Interval = 2

Ce paramètre fait partie du codec H.264. Fondamentalement, une “Keyframe” est une image entièrement compressée, comme un jpeg. L’image suivante n’est qu’un ensemble de données qui indique ce qui est différent de l’image précédente. Lorsque la différence est trop importante, quelques “Keyframes” sont envoyées. Les “Keyframes” sont également envoyées périodiquement pour que la compression ne soit pas trop mauvaise après un certain temps.

Un intervalle plus court entre les “Keyframes” signifie que vous enverrez plus d’images, ce qui nécessite un débit binaire plus élevé. La recherche du réglage optimal dépend du type de vidéo que vous diffusez. Il semble qu’une valeur de 2 secondes soit un bon compromis entre qualité et bitrate.

CPU Usage Preset = selon les performances de votre PC

Profile = (None)

Tune = film

x264 Options = vide

 

 

Pour contrôler que le Transport Stream (TS) que vous générez est correct, l’ADALM-PLUTO DATV Controller, dans son onglet Analysis, vous permet d’analyser la répartition du débit disponible de votre TS entre les différents éléments le composant,  en particulier, la quantité de Null packets qui seraient mieux utilisés par la vidéo si trop nombreux…

Dans la même fenêtre, on peut également visualiser l’utilisation du buffer vidéo de l’application. Cela vous permettra de vérifier que le débit vidéo est adéquat ainsi que la qualité de son débit constant.

Regardez ce qui se passe lorsque que vous changez les différents paramètres de l’encodeur H.264 pour un même stream vidéo en entrée ou pour les mêmes paramètres d’encodage mais avec un stream vidéo plus ou moins dynamique.  C’est fort intéressant !

 

 

Output mode Recording

Le mode Recording d’OBS Studio permet de générer soi-même son Transport Stream (TS) grâce à son accès direct à FFmpeg intégré dans OBS. Cette façon de faire permet non seulement de fournir le TS au TX Pluto mais également au Portsdown et au DATV-Express.

Tous les paramètres de FFmpeg ne sont malheureusement pas disponibles au travers d’OBS, il est donc important de vérifier à l’aide des fichiers logs qu’il n’y pas d’erreurs avec les paramètres utilisés dans la configuration.

Le log est accessible depuis le menu HelpLog FilesView Current Log

 

 

Ouvrir OBS, allez dans le menu Settings, sélectionnez Output

Dans Output, sélectionnez Recording, puis

Output Mode = Advanced

Type = Custom Output (FFmpeg)

FFmpeg Output Type = Output to URL

File path or URL = udp://172.22.22.150:8282?pkt_size=1316

Remplacez l’adresse IP par celle de votre Pluto et contrôler que le port est bien 8282 (le Pluto, par défaut, attend le TS sur ce port).

Toujours dans Output, sélectionnez Container Format = mpegts

Dans Muxer Settings (if any) copiez la ligne suivante :
muxrate=441130 mpegts_pmt_start_pid=4096 id=1 mpegts_start_pid=256

Assignez le débit net du TS calculé (dans notre exemple 441.130 kbs) à muxrate. Le paramètre mpegts_start_pid permet de fixer le PID PMT . Le PID vidéo est  mpegts_start_pid et le PID audio mpegts_start_pid + 1

Attention de bien contrôler qu’il y ait qu’un espace entre chaque paramètre !

Puis assignez

Video Birate = 280 Kbps (comme point de départ : env. 70 % du débit disponible du TS)

Keyframe interval = 2

Rescale Output = si nécessaire

Video Encoder = libx264

Video Encoder Settings (if any) = vide…

OBS Studio ne documente pas très bien le passage de paramètres supplémentaires à l’encodeur par ce champ… Commencez donc vos premiers tests en le laissant vide. L’encodeur utilise par défaut : preset = medium; profile = high

Ensuite vous pourrez ajouter des options avec par exemple :

preset=ultrafast tune=film x264-params=nal-hrd=cbr:force-cfr:1 minrate=280k maxrate=280k bufsize=560k

Il est bon de noter qu’il n’existe pas de mode CBR natif, mais vous pouvez “simuler” un réglage de débit binaire constant en réglant les paramètres au moyen des options suivantes (en format OBS ):  x264-params=nal-hrd=cbr:force-cfr:1 minrate=280k maxrate=280k bufsize=560k

Dans l’exemple ci-dessus, bufsize est le “buffer de contrôle de débit”, il appliquera donc la “moyenne” demandée (280 Kbit/s dans ce cas) sur chaque tranche de 560 Kbit/s de vidéo.

Attention de bien contrôler qu’il y ait qu’un espace entre chaque paramètre !