Gibt es eine Möglichkeit, den Speicherverbrauch von FFmpeg zu begrenzen?

Gibt es eine Möglichkeit, den Speicherverbrauch von FFmpeg zu begrenzen?

Ich verwende FFmpeg über die Befehlszeile für die Videocodierung aus einem Docker-Container auf einer VM mit Windows Server 2016. Ich mache mir Sorgen, dass dies einen großen Prozentsatz des verfügbaren RAM verbraucht. Das ist nicht wünschenswert, da ich zahlreiche andere Container auf derselben VM laufen habe.

Ist es möglich, den von FFmpeg verwendeten RAM über eine Einstellung oder ein Befehlszeilenargument zu begrenzen?Wenn nicht, wie kann ich ein ähnliches Ergebnis erzielen?

Nachfolgend finden Sie einige (nicht ideale) Möglichkeiten, die ich außerhalb von FFMPEG in Betracht gezogen habe. Ich würde mich über alle Gedanken dazu freuen.

  • Begrenzen Sie die RAM-Nutzung von Prozessen mithilfe des Windows-Systemressourcen-Managers
  • Wenden Sie eine Logik an, die FFmpeg nur dann erlaubt, eine Kodierung zu starten, wenn 8+ GB RAM verfügbar sind
  • Starten Sie es in einem Docker mit begrenztem RAM

Das Problem mit der Speichernutzung (4 GB+) tritt auf, wenn ich (kleine 35 MB) Videos mit diesem Befehl in GIF konvertiere:

ffmpeg -i C:\test\vidmp4.mp4 -vf "fps=24,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" C:\temp\testgif.gif

Antwort1

ffmpegverwendet keinen RAM, dass es nicht wirklichBedürfnisseNormalerweise ist das sehr wenig.

Wenn Ihre ffmpegProzesse wirklich viel RAM verwenden (was eine Fehlinterpretation einiger Lesarten ist), führt eine Begrenzung der RAM-Zuteilung lediglich dazu, dass sie aufgrund eines OOM-Zustands abstürzen.

Wenn Sie uns etwas über Ihre ffmpegBefehlszeile mitteilen, können wir möglicherweise Alternativen vorschlagen, die weniger RAM verwenden.

Antwort2

Bei Verwendung des Split-Filters wurde mir ein hoher RAM-Verbrauch auferlegt. In manchen Situationen war der RAM-Verbrauch wesentlich geringer, wenn ich den Split-Filter vermied.

Anstatt „Split“ zu verwenden, können Sie versuchen, dieselben Eingaben zweimal zu laden und die beiden Eingaben einzeln zu verarbeiten, bis Sie sie zusammenführen (möglicherweise auf Kosten zusätzlicher Verarbeitungszeit).

Versuchen Sie in Ihrem Fall etwas wie:

ffmpeg -i C:\test\vidmp4.mp4 -i C:\test\vidmp4.mp4 -vf "[0:v]fps=24,scale=320:-1:flags=lanczos[s0];[1:v]fps=24,scale=320:-1:flags=lanczos[s1];[s0]palettegen[p];[s1][p]paletteuse" C:\temp\testgif.gif

verwandte Informationen