J'utilise FFmpeg pour effectuer une capture d'écran vidéo à partir d'un affichage Xvfb.
Actuellement, je l'invoque avec:
ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov
Alors que j'enregistre une vidéo d'environ 5 sessions Xvfb, l'utilisation du processeur est très élevée et il y a des décalages à cause de cela. De plus, l'utilisation de la mémoire est d'environ 300 Mo pour chacun des processus ffmpeg.
Quels paramètres pour ffmpeg dois-je utiliser pour minimiser l'utilisation des ressources de l'ordinateur (notamment le processeur et la mémoire) lors de la capture d'écran vidéo?
ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
L'entrée étant RVB, l'utilisation de l'encodeur libx264rgb évitera ainsi la conversion RVB/YUV potentiellement lente qui se produirait si vous utilisiez libx264 brut.
Ceci utilise le préréglage d’encodage x264 le plus rapide: ultra-rapide.
La sortie sera sans perte car -crf 0
est utilisé.
Le résultat de la première commande sera énorme, et la plupart des lecteurs stupides ne peuvent pas gérer le format RVB H.264, vous pouvez donc le recoder:
ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
Vous pouvez expérimenter avec la valeur -crf
pour contrôler la qualité de la sortie. Une plage subjectivement saine est comprise entre 18 et 28 ans, où 18 est sans perte visuelle ou presque. La valeur par défaut est 23.
Utilisez le préréglage le plus lent pour lequel vous avez de la patience: ultrafast
, superfast
, veryfast
, faster
, fast
, medium
, slow
, slower
, veryslow
. La valeur par défaut est medium
.
J'ai ajouté -vf format=yuv420p
pour m'assurer que la sortie fonctionne avec des lecteurs stupides tels que QuickTime et Windows Media Player. Vous pouvez l'omettre si vous le téléchargez sur YouTube ou si vous ne le lisez que sur VLC, mpv, MPlayer ou tout autre lecteur basé sur FFmpeg.
Il est préférable de se concentrer sur l’utilisation de différentes options de ffmpeg qui permettront d’obtenir le même résultat de manière à utiliser moins de ressources. Cela dit, il y a moyen d'utiliser moins de ressources si vous avez vraiment besoin d'accomplir quelque chose avec ffmpeg et que vous utilisez trop de ressources.
Vous pouvez diminuer la priorité du processus CPU de ffmpeg
:
Nice
pour modifier la priorité du processus: Nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov
. Sous Linux, le numéro de priorité (le format de la commande Nice
est Nice -n <priority> <command>
) est compris entre -20 et 20. Plus le nombre entier est grand, moins la valeur est basse ; neutre est 0. Si vous utilisez la commande que je vous ai donnée et la fixez à 8, le processeur donnera moins de temps au processus, ce qui semble être moins "de puissance". Si ce nombre est trop élevé ou trop faible, vous pouvez le modifier.ffmpeg
étant en cours d'exécution, ouvrez le Moniteur système. Faites défiler la liste jusqu'au processus nommé ffmpeg
, cliquez dessus pour le sélectionner, cliquez dessus avec le bouton droit de la souris et définissez la priorité sur "Faible" ou "Très faible". Si vous êtes préoccupé par l'utilisation de la mémoire, vous devez également savoir qu'il n'est pas possible de dire à un processus de ne prendre que trop de mémoire et de s'exécuter. Le noyau contrôle automatiquement l'allocation de mémoire pour les processus. Il existe un moyen de mettre en cage les processus, avec le timeout
script , de sorte que lorsqu'un processus et tout processus enfant utilisent trop de mémoire (une limite que vous avez définie), ils soient terminés en toute sécurité et qu'une notification s'affiche . Cependant, si un processus ne dispose que de suffisamment de mémoire (par le noyau, par exemple) et demande plus de mémoire qu'il ne peut en avoir, il se bloque.
Quelques choses utiles à savoir sur:
En utilisant la connaissance des Cgroups, vous pouvez faire beaucoup de choses amusantes, comme contrôler le swappiness d'un processus.
-re (entrée) Lecture de l'entrée à la cadence native. Principalement utilisé pour simuler un périphérique de saisie ou un flux d’entrée en direct (par exemple lors de la lecture d’un fichier). Ne doit pas être utilisé avec des périphériques de capture ou des flux d'entrée réels (où cela peut entraîner une perte de paquets). Par défaut, ffmpeg tente de lire la ou les entrées aussi rapidement que possible. Cette option ralentira la lecture de l’entrée ou des entrées à la cadence native de l’entrée ou des entrées. Il est utile pour la sortie en temps réel (par exemple, diffusion en direct).