So minimieren Sie die CPU- / Speicherauslastung von ffmpeg beim Aufnehmen von Videos

13

Ich verwende FFmpeg, um Video-Screenshots von der Xvfb-Anzeige zu machen.

Zur Zeit rufe ich es auf mit:

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

Da ich Videos von ungefähr 5 Xvfb-Sitzungen aufzeichne, ist meine CPU-Auslastung sehr hoch und es treten Verzögerungen auf. Die Speicherauslastung für jeden ffmpeg-Prozess beträgt ungefähr 300 MB.

Welche Parameter für ffmpeg sollten verwendet werden, um die Auslastung der Computerressourcen (insbesondere von CPU und Arbeitsspeicher) bei der Erstellung von Video-Screenshots zu minimieren?

Andrei Botalov
quelle

Antworten:

17

1. Erstellen Sie zuerst eine verlustfreie RGB-Ausgabe

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • Die Eingabe ist RGB. Wenn Sie also den Encoder libx264rgb verwenden, wird die potenziell langsame Konvertierung von RGB in YUV vermieden, die bei Verwendung von Libx264 auftreten würde.

  • Dies verwendet die schnellste x264-Kodierungsvoreinstellung: ultraschnell.

  • Der Ausgang ist verlustfrei, da er -crf 0verwendet wird.

2. Dann neu codieren

Die Ausgabe des ersten Befehls wird riesig sein, und die meisten dummen Spieler können RGB H.264 nicht verarbeiten, sodass Sie es neu codieren können:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • Sie können mit dem -crfWert experimentieren , um die Ausgabequalität zu steuern. Ein subjektiv vernünftiger Bereich liegt zwischen 18 und 28, wobei 18 visuell oder nahezu verlustfrei ist. Standard ist 23.

  • Verwenden Sie die langsamste voreingestellten Sie haben Geduld für: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. Standard ist medium.

  • Ich habe hinzugefügt, -vf format=yuv420pum sicherzustellen, dass die Ausgabe mit dummen Playern wie QuickTime und Windows Media Player funktioniert. Sie können dies weglassen, wenn Sie es auf YouTube hochladen oder nur auf VLC, mpv, MPlayer oder einem anderen FFmpeg-basierten Player abspielen.

Siehe auch

Logan
quelle
Ich nehme Videos von einer nicht standardmäßigen Anzeige auf (es ist Xvfb), also kann es eine beliebige Zahl sein
Andrei Botalov
@AndreyBotalov Haben Sie die verlustfreie Methode ausprobiert? Hat es für Sie eine bessere Leistung erbracht?
Logan
1
Momentan rufe ich ffmpegmit -preset superfastparameter auf (habe ich nicht ausprobiert -crf). In diesem Fall werden weniger Ressourcen benötigt und ausreichend große Videos erstellt.
Andrei Botalov
@AndreyBotalov -crf 23wird standardmäßig verwendet, wenn Sie keinen Wert deklarieren. Wenn dies superfastjedoch für Sie ausreicht, ist das Problem möglicherweise behoben.
Logan
1
Sie können die Hardware-Codierung auch über h264_nvenc (nvidia) oder h264_qsv (moderne Intel-CPU) versuchen. Dies wird die Belastung der Codierung von Ihrer CPU auf dedizierte h264-Hardware verlagern.
Kenn
4

Es ist besser, sich auf die Verwendung verschiedener ffmpeg-Optionen zu konzentrieren, die auf eine Weise, die weniger Ressourcen verbraucht, dasselbe Ergebnis erzielen. Es gibt jedoch Möglichkeiten, weniger Ressourcen zu verwenden, wenn Sie mit ffmpeg wirklich eine bestimmte Aufgabe ausführen müssen und zu viele Ressourcen verwendet werden.

Sie können die Priorität des ffmpegCPU-Prozesses verringern :

  • Terminal - Methode: Die Verwendung niceBefehl die Priorität des Prozesses ändern: nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov. Unter Linux reicht die Prioritätsnummer (das niceBefehlsformat ist nice -n <priority> <command>) von -20 bis 20. Je größer die Ganzzahl, desto niedriger die Priorität. Neutral ist 0. Wenn Sie den Befehl verwenden, den ich Ihnen gegeben habe, und ihn auf 8 setzen, gibt die CPU dem Prozess weniger Zeit, was weniger "Leistung" zu sein scheint. Wenn diese Zahl zu hoch oder zwei zu niedrig ist, können Sie sie natürlich ändern.
  • GUI-Methode: Dies wird nicht empfohlen, da Sie weniger Kontrolle über die genaue Anzahl haben und diese nicht wirksam wird, sobald der Prozess beginnt. Es ist jedoch verständlicher. Mit ffmpegläuft, öffnen Sie den Systemmonitor. Scrollen Sie nach unten zu dem benannten Prozess ffmpeg, klicken Sie mit der linken Maustaste darauf, klicken Sie mit der rechten Maustaste darauf und setzen Sie die Priorität auf "Niedrig" oder "Sehr niedrig".

Wenn Sie auch über die Speichernutzung besorgt sind, wissen Sie, dass es nicht möglich ist, einem Prozess anzuweisen, nur so viel Speicher zu belegen und trotzdem auszuführen. Der Kernel steuert automatisch die Speicherzuweisung für Prozesse. Es gibt eine Möglichkeit, Prozesse mit dem timeoutSkript zwischenzuspeichern , sodass Prozesse und untergeordnete Prozesse, die zu viel Speicher belegen (ein von Ihnen festgelegtes Limit), sicher beendet werden und eine Benachrichtigung angezeigt wird. Wenn einem Prozess jedoch nur so viel Speicher zugewiesen wird (etwa vom Kernel) und mehr Speicher angefordert wird, als er nicht haben kann, stürzt er ab.

Einige hilfreiche Informationen:

Mit dem Wissen über Cgroups können Sie viele unterhaltsame Dinge tun, beispielsweise die Kontrolle über den Austausch eines Prozesses.

Richard
quelle
2
Wenn ich richtig verstehe, dass ffmpeg in die Warteschlange mit niedrigerer Priorität gestellt wird, werden Videos mit unerwünschten Verzögerungen erzeugt.
Andrei Botalov
1
Hmm ... ich sehe nichts online, was das aussagt ... Haben Sie eine Quelle, die das anzeigt? (Wenn nicht, sollte es ein Fehler sein).
Richard
2
Wenn ich richtig verstehe, bedeutet eine niedrigere Priorität, dass ffmpeg weniger Prozessorzeit hat als jetzt. Aber der Prozessor ist fast zu 100% ausgelastet, daher denke ich, dass eine
erneute Priorisierung
1
Dies wurde entwickelt, um die CPU-Auslastung des Prozesses zu begrenzen. Wenn Ihre CPU also zu 100% ausgelastet ist, fällt es Ihnen leichter, damit umzugehen.
Richard
4
Ich habe -1 dies, weil egal wie Sie die Priorität ändern, es wird es nur noch schlimmer machen. Durch Festlegen einer niedrigeren Priorität wird die CPU-Zeit für ffmpeg gesenkt, was zu mehr verworfenen Frames führt, oder durch Erhöhen der Priorität werden andere Prozesse auf dem System noch mehr verlangsamt. Beide Ergebnisse sind unerwünscht.
gertvdijk
0

-re (Eingabe) Liest die Eingabe mit der nativen Framerate. Wird hauptsächlich verwendet, um ein Grab-Gerät oder einen Live-Eingabestream zu simulieren (z. B. beim Lesen aus einer Datei). Sollte nicht mit tatsächlichen Grab-Geräten oder Live-Eingabestreams verwendet werden (wo dies zu Paketverlust führen kann). Standardmäßig versucht ffmpeg, die Eingaben so schnell wie möglich zu lesen. Diese Option verlangsamt das Lesen der Eingaben auf die native Bildrate der Eingaben. Es ist nützlich für die Ausgabe in Echtzeit (z. B. Live-Streaming).

劉 劉
quelle
"Sollte nicht mit aktuellen Grab-Geräten verwendet werden", wie z. B. x11grab.
Logan