Encodage en direct avec VP9 à l'aide de FFmpeg

Paramètres d'encodage

Le protocole VP9 fournit une plage de paramètres pour optimiser l'encodage en direct. Certains principes généraux de ces options sont décrits dans Modes de débit.

Exemple d'encodage FFmpeg VP9

Le tableau ci-dessous décrit les paramètres d'un exemple d'appel ffmpeg pour l'encodage VP9.

Parameter Description
-quality realtime realtime est essentiel pour la diffusion en direct et les vitesses supérieures à 5.
-speed 6 Vous devez utiliser la vitesse 5 vers 8 pour l'encodage en direct / en temps réel. Les nombres inférieurs (5 ou 6) sont de meilleure qualité, mais nécessitent plus de puissance de traitement. Des nombres plus élevés (7 ou 8) sont de qualité inférieure, mais sont plus faciles à gérer pour les cas d'utilisation nécessitant moins de latence et pour les appareils à faible puissance de processeur tels que les appareils mobiles.
-tile-columns 4 La mosaïque divise la vidéo en régions rectangulaires, ce qui permet de procéder à plusieurs threads pour l'encodage et le décodage. Le nombre de tuiles est toujours de deux. 0 = 1 tuile, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32.
-frame-parallel 1 Activer les fonctionnalités de décodabilité en parallèle.
-threads 8 Nombre maximal de fils de discussion à utiliser.
-static-thresh 0 Seuil de détection des mouvements.
-max-intra-rate 300 Débit iFrame maximal (pct)
-deadline realtime Autre version (ancienne) de -quality realtime
-lag-in-frames 0 Nombre maximal d'images avant
-qmin 4 -qmax 48 Valeurs minimale et maximale pour le quantificateur. Les valeurs indiquées ici ne sont qu'une suggestion et leur ajustement permettra d'augmenter ou de diminuer la qualité des vidéos au détriment de l'efficacité de la compression.
-row-mt 1 Activer le multithreading Utilisation de jusqu'à 2x fils de discussion en tant que colonnes de tuiles. 0 = désactivé, 1 = activé.
-error-resilient 1 Activer les fonctionnalités de résilience des erreurs.

Choisir des paramètres d'encodage

Les informations ci-dessous utilisent l'encodage de débit constant pour le streaming adaptatif de streaming en direct, où chaque débit cible est explicitement défini dans le fichier manifeste du packageur. Cela permettra aux clients de passer d'un tarif à l'autre. L'encodage à débit variable (VBR) et le mode CQ sont également disponibles si le débit peut être plus flexible ou si l'encodage est divisé. Le mode Q est soumis à un encodage en temps réel pour la vidéo en direct. Pour en savoir plus, consultez la section Modes de débit.

Pour en savoir plus sur la façon de manipuler le VP9, il peut également être utile de consulter l'article associé sur les paramètres de vidéo à la demande, mais en tenant compte du CBR.

Conseils et astuces

N'oubliez pas que, lors de la diffusion en direct, tout est limité à une vitesse d'encodage minimale en temps réel d'1x (FFmpeg signale la vitesse d'encodage à mesure de sa progression). Si votre vitesse d'encodage passe en dessous de 1 fois, l'encodage de la vidéo en direct ne sera pas respecté. De plus, si la transmission s'interrompe pendant la diffusion, l'utilisateur ne pourra pas l'utiliser lors de la diffusion (mais elle restera toutefois utilisable).

Exemples de paramètres d'encodage en action

Voici l'utilisation du processeur à 25 FPS pour différentes tailles d'images sur un ordinateur à quatre cœurs i5 3.6 GHz utilisant Linux:

Résolution cible Paramètres FFmpeg VP9 Processeur / Vitesse (exemple)
3840x2160 (2160p) r ~88% 0,39x
2560x1440 (1440p) r ~86% 0,68x
1920x1080 (1080p) R ~82% 1,04x
1280x720 (720p) r ~78% 1,77x
854x480 (480p) R ~64% 3,51x
640x360 (360p) r ~62% 5,27x
426x240 (240p) r ~66% 8,27x

Exemple de fichier FFmpeg:

ffmpeg -stream_loop 100 -i /home/id3as/Videos/120s_tears_of_steel_1080p.webm \
  -r 30 -g 90 -s 3840x2160 -quality realtime -speed 5 -threads 16 -row-mt 1 \
  -tile-columns 3 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 7800k -c:v vp9 \
  -b:a 128k -c:a libopus -f webm pipe1

Conseils et astuces

  • Notez que nous envoyons ici le pipeline FIFO ("pipe1"), qui doit être créé avant l'exécution, avant d'exécuter la commande FFmpeg. Pour ce faire, attribuez la commande mkfifo pipe1 à votre répertoire de travail. Lorsque vous utilisez Shaka Packager, ce pipeline écoute ce tuyau comme source d'entrée pour le flux donné. D'autres modèles d'emballage peuvent nécessiter une méthode différente.

  • Pour vous assurer que les commandes -row-mt seront reconnues, utilisez la dernière version stable de FFmpeg (3.3.3 pour le moment) disponible à l'adresse https://www.ffmpeg.org/download.html.

Exemple de débit adaptatif défini

Selon la puissance de la machine qui exécute l'encodage FFmpeg, il peut être possible ou non de livrer tous les encodages suivants en même temps. Par conséquent, un sous-ensemble adapté à vos propres ressources et audiences cibles doit être sélectionné dans la liste.

Configuration ABR complète du fichier FFmpeg

Dans un scénario idéal, nous combinons les exemples d'encodage décrits dans la section précédente pour créer une seule commande qui les produit tous en même temps:

ffmpeg -stream_loop 100 -i lakes1080p.mp4 \
  -y -r 25 -g 75 -s 3840x2160 -quality realtime -speed 5 -threads 8 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 7800k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe1 \
  -y -r 25 -g 75 -s 2560x1440 -quality realtime -speed 5 -threads 8 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 6000k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe2 \
  -y -r 25 -g 75 -s 1920x1080 -quality realtime -speed 5 -threads 4 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 4500k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe3 \
  -y -r 25 -g 75 -s 1280x720 -quality realtime -speed 5 -threads 4 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 3000k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe4 \
  -y -r 25 -g 75 -s 854x480 -quality realtime -speed 6 -threads 4 \
  -tile-columns 2 -frame-parallel 1 \
  -b:v 2000k -c:v vp9 -b:a 196k -c:a libopus -f webm pipe5 \
  -y -r 25 -g 75 -s 640x360 -quality realtime -speed 7 -threads 2 \
  -tile-columns 1 -frame-parallel 0 \
  -b:v 730k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe6 \
  -y -r 25 -g 75 -s 426x240 -quality realtime -speed 8 -threads 2 \
  -tile-columns 1 -frame-parallel 0 \
  -b:v 365k -c:v vp9 -b:a 64k -c:a libopus -f webm pipe7

L'ensemble complet ci-dessus nécessite toutefois un processeur très puissant, voire une prise en charge du déchargement du GPU matériel tel que certains puces fournies. Intel Kabylake (et versions ultérieures) dispose d'un pipeline d'encodage matériel complet. (Notez que le GPU Kabylake peut encoder les vidéos VP9 8 bits, mais pas 10 bits.)

Exemple d'utilisation pratique sur ordinateur de bureau avec Shaka Packager

Un exemple plus pratique pour les ordinateurs de bureau courants peut être basé sur Shaka Packager. Un moyen simple de configurer Shaka consiste à l'installer dans un conteneur Docker à l'aide de l'image Docker Hub de Google. Pour savoir comment procéder, consultez la page suivante:

https://github.com/google/shaka-packager#using-docker-for-testing--development

Dans cet exemple, nous avons utilisé une machine avec la configuration suivante:

Système Hôte: obs Kernel: 4.4.0-91-lowLatency x86_64 (64 bits)
Ordinateur Xfce 4.12.3 Distro: OS : https://dfpvideostudio.org/2016/10/dfpvideo-studio-16-10-released/
Processeur Processeur Intel Core i5-6500 à quatre cœurs (-MCP-)
cache : 6 144 Ko
vitesse : max. 3 600 MHz 1 : 800 MHz 2 : 800 MHz 3 : 800 MHz 4 : 800 MHz
Carte graphique Graphismes intégrés à Intel Skylake
Mémoire 8 Go de RAM

En pratique, cette machine pourrait produire la plage d'encodages ABR suivante de manière optimale : FFmpeg enregistre régulièrement une vitesse d'encodage multiplié par 1 :

ffmpeg -stream_loop 100 -i 120s_tears_of_steel_1080p.webm \
  -y -r 30 -g 90 -s 1920x1080 -quality realtime -speed 7 -threads 8 \
  -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 \
  -b:v 4500k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe1 \
  -y -r 30 -g 90 -s 1280x720 -quality realtime -speed 8 -threads 6 \
  -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 \
  -b:v 3000k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe2 \
  -y -r 30 -g 90 -s 640x360 -quality realtime -speed 8 -threads 2 \
  -row-mt 1 -tile-columns 1 -frame-parallel 1 -qmin 4 -qmax 48 \
  -b:v 730k -c:v vp9 -b:a 128k -c:a libopus -f webm pipe3

Notez que les paramètres -speed sont assez élevés. Ces paramètres ont été définis à des fins de test et varient d'une machine à l'autre.

Frais généraux de Shaka Packager

L'emballage n'est pas une activité particulièrement gourmande en ressources processeur. Shaka Packager peut être configuré pour écouter toutes les sorties, même si seul un sous-ensemble est transmis par FFmpeg. Les paramètres d'un packageur sont testés sur la machine décrite ci-dessus:

packager \
  in=pipe1,stream=audio,init_segment=livehd-audio-1080.webm,segment_template=livehd-audio-1080-\$Number\$.webm \
  in=pipe1,stream=video,init_segment=livehd-video-1080.webm,template=livehd-video-1080-\$Number\$.webm \
  in=pipe2,stream=audio,init_segment=livehd-audio-720.webm,segment_template=livehd-audio-720-\$Number\$.webm \
  in=pipe2,stream=video,init_segment=livehd-video-720.webm,template=livehd-video-720-\$Number\$.webm \
  in=pipe3,stream=audio,init_segment=livehd-audio-360.webm,segment_template=livehd-audio-360-\$Number\$.webm \
  in=pipe3,stream=video,init_segment=livehd-video-360.webm,template=livehd-video-360-\$Number\$.webm \
  --mpd_output livehd.mpd --dump_stream_info --min_buffer_time=10 --time_shift_buffer_depth=300 \
  --segment_duration=3 --io_block_size 65536