Comment réduire l'utilisation du processeur / de la mémoire par ffmpeg lors de l'enregistrement vidéo

13

J'utilise FFmpeg pour faire une capture d'écran vidéo à partir de l'affichage Xvfb.

Actuellement, je l'invoque avec:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov

Comme j'enregistre la vidéo d'environ 5 sessions Xvfb, mon utilisation du processeur est très élevée et il y a des retards à cause de cela. L'utilisation de la mémoire est également d'environ 300 Mo pour chacun des processus ffmpeg.

Quels paramètres pour ffmpeg dois-je utiliser pour minimiser l'utilisation des ressources informatiques (en particulier le processeur et la mémoire) lors de la capture d'écran vidéo?

Andrei Botalov
la source

Réponses:

17

1.Faites d'abord une sortie RVB sans perte

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • L'entrée est RVB, donc l'utilisation de l'encodeur libx264rgb évitera la conversion RVB en YUV potentiellement lente qui se produirait si vous utilisez la libx264 ordinaire.

  • Il utilise le préréglage d'encodage x264 le plus rapide: ultra-rapide.

  • La sortie sera sans perte car elle -crf 0est utilisée.

2. Puis réencodez-le

La sortie de la première commande sera énorme, et la plupart des joueurs stupides ne peuvent pas gérer RGB H.264, vous pouvez donc le ré-encoder:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • Vous pouvez tester la -crfvaleur pour contrôler la qualité de sortie. Une plage subjectivement saine est de 18 à 28, où 18 est visuellement sans perte ou presque. La valeur par défaut est 23.

  • Utilisez le plus lent de présélection que vous avez la patience pour: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. La valeur par défaut est medium.

  • J'ai ajouté -vf format=yuv420ppour m'assurer que la sortie fonctionne avec des lecteurs stupides comme QuickTime et Windows Media Player. Vous pouvez omettre cela si vous le téléchargez sur YouTube ou ne le jouez que sur VLC, mpv, MPlayer ou tout autre lecteur basé sur FFmpeg.

Regarde aussi

llogan
la source
Je capture une vidéo à partir d'un affichage non par défaut (c'est Xvfb), donc ça peut être n'importe quel nombre
Andrei Botalov
@AndreyBotalov Avez-vous essayé la méthode sans perte? Est-ce que ça a mieux marché pour vous?
llogan
1
Actuellement j'invoque ffmpegavec le -preset superfastparamètre (je n'ai pas essayé -crf). Il prend moins de ressources dans ce cas et produit des vidéos de bonne taille.
Andrei Botalov
@AndreyBotalov -crf 23est utilisé par défaut si vous ne déclarez pas de valeur, mais de toute façon si cela superfastvous suffit, le problème est peut-être résolu.
llogan
1
Vous pouvez également essayer l'encodage matériel via h264_nvenc (nvidia) ou h264_qsv (modern intel cpu). Cela transférera le fardeau de l'encodage de votre CPU vers le matériel h264 dédié.
Kenn
4

Il est préférable de se concentrer sur l'utilisation de différentes options ffmpeg qui permettront d'obtenir le même résultat d'une manière qui utilise moins de ressources. Cela dit, il existe des moyens d'utiliser moins de ressources si vous avez vraiment besoin d'accomplir une chose spécifique avec ffmpeg et qu'il utilise trop de ressources.

Vous pouvez diminuer la priorité du ffmpegprocessus CPU de:

  • Terminal méthode: Utilisez la nicecommande 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 niceformat de la commande est nice -n <priority> <command>) varie de -20 à 20. Plus l'entier est grand, plus la priorité est faible ; neutre est 0. Si vous utilisez la commande que je vous ai donnée et que vous la définissez sur 8, le processeur donnera au processus moins de temps, ce qui semble être moins de "puissance". Si ce nombre est trop élevé ou deux bas, bien sûr, vous pouvez le changer.
  • Méthode GUI: Ceci n'est pas recommandé car il vous donne moins de contrôle sur le nombre exact et il ne prend pas effet dès le début du processus. Cependant, c'est plus compréhensible. En ffmpegcours d'exécution, ouvrez le Moniteur système. Faites défiler jusqu'au processus nommé ffmpeg, cliquez dessus avec le bouton gauche pour le sélectionner, faites un clic droit dessus et définissez la priorité sur "Faible" ou "Très faible".

Si vous vous inquiétez également de l'utilisation de la mémoire, sachez 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 timeoutscript , de sorte que lorsqu'un processus et tout processus enfant prennent trop de mémoire (une limite que vous avez définie), ils soient arrêtés en toute sécurité et une notification s'affiche. Cependant, si un processus ne dispose que de tant de mémoire (disons par le noyau) et qu'il demande plus de mémoire qu'il ne peut pas en avoir, il se bloquera.

Quelques informations utiles à savoir:

En utilisant les connaissances de Cgroups, vous pouvez faire beaucoup de choses amusantes comme contrôler la permutabilité d'un processus.

Richard
la source
2
Si je comprends bien, mettre ffmpeg dans une file d'attente de priorité inférieure lui fera produire des vidéos avec des retards, ce qui n'est pas souhaité.
Andrei Botalov
1
Hmm ... Je ne vois rien en ligne qui dit que ... Avez-vous une source qui indique cela? (Sinon, ce devrait être un bug).
Richard
2
Si je comprends bien, une priorité inférieure signifie que ffmpeg aura moins de temps processeur que maintenant. Mais le processeur est chargé à presque 100%, donc je pense que la redéfinition des priorités n'aidera pas
Andrei Botalov
1
Ceci est conçu pour limiter l'utilisation du processeur du processus, donc si votre processeur fonctionne à 100%, il sera plus facile de le gérer.
Richard
4
J'ai -1 cela, car peu importe comment vous changez la priorité, cela ne fera qu'empirer les choses. La définition d'une priorité inférieure réduira le temps processeur pour ffmpeg, ce qui entraînera davantage de pertes d'images ou, en augmentant la priorité, cela ralentira encore plus les autres processus sur le système. Les deux résultats sont indésirables.
gertvdijk
0

-re (entrée) Lire l'entrée à la fréquence d'images native. Principalement utilisé pour simuler un périphérique de capture 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 réels ou des flux d'entrée en direct (où cela peut entraîner une perte de paquets). Par défaut, ffmpeg tente de lire les entrées le plus rapidement possible. Cette option ralentit la lecture des entrées à la fréquence d'images native des entrées. Il est utile pour la sortie en temps réel (par exemple, la diffusion en direct).

劉 大為
la source
"Ne doit pas être utilisé avec des périphériques de capture réels" tels que x11grab.
llogan