Encodage en direct avec VP9 à l'aide de FFmpeg
Paramètres d'encodage
VP9 fournit une gamme de paramètres pour optimiser l'encodage en direct. Certains principes généraux sont abordés dans Modes de débit binaire.
Exemple d'encodage VP9 FFmpeg
Le tableau ci-dessous décrit les paramètres d'un exemple d'appel ffmpeg
pour l'encodage VP9.
Paramètre | Description |
---|---|
-quality realtime |
realtime est essentiel pour le streaming en direct et pour les vitesses supérieures à 5 . |
-speed 6 |
Les vitesses 5 à 8 doivent être utilisées pour l'encodage en direct / en temps réel. Les nombres inférieurs (5 ou 6 ) correspondent à une qualité supérieure, mais nécessitent plus de puissance de processeur. Les nombres plus élevés (7 ou 8 ) correspondent à une qualité inférieure, mais sont plus faciles à gérer pour les cas d'utilisation à faible latence et pour les appareils à faible puissance de processeur tels que les mobiles. |
-tile-columns 4 |
Le tiling divise la vidéo en régions rectangulaires, ce qui permet le multithreading pour l'encodage et le décodage. Le nombre de tuiles est toujours une puissance de deux. 0 = 1 tuile, 1 = 2, 2 = 4, 3 = 8, 4 = 16, 5 = 32. |
-frame-parallel 1 |
Activez les fonctionnalités de décodabilité parallèle. |
-threads 8 |
Nombre maximal de threads à utiliser. |
-static-thresh 0 |
Seuil de détection des mouvements. |
-max-intra-rate 300 |
Débit maximal des i-frames (en %) |
-deadline realtime |
Version alternative (ancienne) de -quality realtime |
-lag-in-frames 0 |
Nombre maximal de frames à décaler |
-qmin 4 -qmax 48 |
Valeurs minimale et maximale du quantificateur. Les valeurs indiquées ici ne sont qu'une suggestion. Les ajuster vous aidera à augmenter ou à diminuer la qualité vidéo au détriment de l'efficacité de la compression. |
-row-mt 1 |
Activez le multithreading des lignes. Permet d'utiliser jusqu'à deux fois plus de threads que de colonnes de tuiles. 0 = désactivé, 1 = activé. |
-error-resilient 1 |
Activez les fonctionnalités de résilience aux erreurs. |
Choisir les paramètres d'encodage
Les informations ci-dessous utilisent l'encodage à débit constant (CBR) pour la diffusion en direct à débit adaptatif (ABR), où chaque débit cible est explicitement défini dans le fichier manifeste du packageur. Cela permettra aux clients de passer plus facilement d'un tarif à l'autre. L'encodage à débit variable (VBR) et le mode CQ sont également des options si le débit peut être plus flexible ou si l'encodage est segmenté. Le mode Q aura du mal à gérer l'encodage en temps réel requis pour les vidéos en direct. Pour en savoir plus, consultez Modes de débit binaire.
Pour en savoir plus sur la manipulation du VP9, consultez l'article sur les paramètres VOD, en gardant à l'esprit que nous nous concentrons sur le CBR.
Conseils et astuces
N'oubliez pas que, lors d'une diffusion en direct, tout est limité à une vitesse d'encodage en temps réel minimale de 1x (FFmpeg indique la vitesse d'encodage au fur et à mesure). Si votre vitesse d'encodage est inférieure à 1x, le processus d'encodage ne pourra pas suivre le flux vidéo en direct. Les utilisateurs rencontreront alors des problèmes de mise en mémoire tampon et des interruptions de la transmission, ce qui rendra le flux inutilisable pendant la diffusion en direct (bien que l'archive soit généralement utilisable).
Exemples de paramètres d'encodage en action
Le tableau suivant indique l'utilisation du processeur à 25 FPS pour différentes tailles de frame sur un ordinateur de bureau quadricœur i5 3,6 GHz exécutant Linux :
Résolution cible | Paramètres FFmpeg VP9 | Processeur / Vitesse (exemple) |
---|---|---|
3 840 x 2 160 (2 160p) | -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 | ~88 % 0,39x |
2 560 x 1 440 (1 440p) | -r 30 -g 90 -s 2560x1440 -quality realtime -speed 5 -threads 16 -row-mt 1 -tile-columns 3 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 6000k | ~86 % 0,68x |
1 920 x 1 080 (1 080p) | -r 30 -g 90 -s 1920x1080 -quality realtime -speed 5 -threads 8 -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 4500k | ~82 % 1,04x |
1 280 x 720 (720p) | -r 30 -g 90 -s 1280x720 -quality realtime -speed 5 -threads 8 -row-mt 1 -tile-columns 2 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 3000k | ~78 % 1,77x |
854 x 480 (480p) | -r 30 -g 90 -s 854x480 -quality realtime -speed 6 -threads 4 -row-mt 1 -tile-columns 1 -frame-parallel 1 -qmin 4 -qmax 48 -b:v 1800k | ~64 % 3,51x |
640 x 360 (360p) | -r 30 -g 90 -s 640x360 -quality realtime -speed 7 -threads 4 -row-mt 1 -tile-columns 1 -frame-parallel 0 -qmin 4 -qmax 48 -b:v 730k | ~62 % 5,27x |
426 x 240 (240p) | -r 30 -g 90 -s 426x240 -quality realtime -speed 8 -threads 2 -row-mt 1 -tile-columns 0 -frame-parallel 0 -qmin 4 -qmax 48 -b:v 365k | ~66 % 8,27x |
Voici un exemple de commande 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 libvpx-vp9 \
-b:a 128k -c:a libopus -f webm pipe1
Conseils et astuces
Notez que nous générons ici une sortie vers un canal FIFO ("pipe1"), qui doit être créé avant l'exécution, avant d'exécuter la commande FFmpeg. Pour ce faire, exécutez la commande
mkfifo pipe1
dans votre répertoire de travail. Lorsque vous utilisez Shaka Packager, il écoute ce canal 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
sont reconnues, utilisez la dernière version stable de FFmpeg (3.3.3 actuellement) disponible sur https://www.ffmpeg.org/download.html.
Exemple de groupe de débits adaptatifs
Selon la puissance de la machine exécutant l'encodage FFmpeg, il peut être possible ou non de fournir tous les encodages suivants en même temps. Vous devez donc sélectionner dans la liste un sous-ensemble adapté à vos propres ressources disponibles et à vos audiences cibles.
Ensemble ABR complet 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 libvpx-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 libvpx-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 libvpx-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 libvpx-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 libvpx-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 libvpx-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 libvpx-vp9 -b:a 64k -c:a libopus -f webm pipe7
Toutefois, l'ensemble complet ci-dessus nécessitera un processeur très puissant ou éventuellement une prise en charge du déchargement GPU matériel, comme certains chipsets le proposent de plus en plus. Intel Kabylake (et les versions ultérieures) dispose d'un pipeline d'encodage matériel complet. (Notez que le GPU Kabylake peut encoder VP9 en 8 bits, mais pas en 10 bits.)
Exemple pratique pour ordinateur de bureau utilisant Shaka Packager
Un exemple plus pratique pour les ordinateurs de bureau courants pourrait utiliser Shaka Packager. Un moyen simple de configurer Shaka consiste à l'installer dans un conteneur Docker à l'aide de l'image DockerHub de Google. Pour obtenir des instructions, consultez :
https://github.com/google/shaka-packager#using-docker-for-testing--development
Pour 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 Distribution : OS : https://ubuntustudio.org/2016/10/ubuntu-studio-16-10-released/ |
Processeur | Quad core Intel Core i5-6500 (-MCP-) cache : 6144 Ko fréquences d'horloge : max : 3600 MHz 1 : 800 MHz 2 : 800 MHz 3 : 800 MHz 4 : 800 MHz |
Carte graphique | Carte graphique Intel Skylake intégrée |
Mémoire | 8 Go de RAM |
En pratique, cette machine pourrait produire de manière optimale la plage d'encodages ABR utilisables suivante, avec FFmpeg signalant systématiquement une vitesse d'encodage de 1x :
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 libvpx-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 libvpx-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 libvpx-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é établis de manière expérimentale 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 FFmpeg n'en fournit qu'un sous-ensemble. Voici les paramètres du packageur 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