Gibt es eine Möglichkeit, die FFmpeg-Codierung anzuhalten und fortzusetzen?

13

Ich nehme jeden Tag ein paar Stunden Videomaterial auf, das ich für die Codierung in die Warteschlange gestellt habe ffmpeg. Ich verwende die veryslowVoreinstellung mit x265, so dass das Kodieren einer einzelnen Stunde Video bis zu 20 Stunden oder länger dauern kann.

Da mein Computer Tag und Nacht arbeitet, frage ich mich, ob ffmpeges eine Möglichkeit gibt, die Codierung anzuhalten und fortzusetzen. Ich verwende Terminalfür OS X.

Wenn ja, kann ich die Codierung auch nach dem Herunterfahren des Terminals und dem Neustart des Computers fortsetzen? Ich denke, die Terminal-Sitzung wird wiederhergestellt, wenn Sie sich erneut in OS X anmelden, zumindest der Terminal-Verlauf.

Winterflaggen
quelle

Antworten:

14

Aussetzen

Eine einfache Methode besteht darin, es mit ctrl+ auszusetzen z. Oder Sie könnten die PID mit pgrep ffmpegdann verwenden, kill -s SIGSTOP <PID>um auszusetzen.

Dann mit fgBefehl oder fortfahren kill -s SIGCONT <PID>.

Leider wird dies einen Neustart nicht überstehen.

VM

Wenn Sie eine virtuelle Maschine mit so etwas wie VirtualBox verwenden, können Sie die Codierung in einer Gast-VM durchführen. Sie können damit jederzeit den Maschinenzustand speichern, der einen Neustart übersteht. Sie können dem Gast auch maximale CPU-Ressourcen zuweisen, sodass Ihrem Host immer Ressourcen zur Verfügung stehen.

Möglicherweise übertrieben, aber wenn Sie mit VMs vertraut sind oder bereits eine verwenden, ist dies eine mögliche Lösung.

Logan
quelle
Ich liebe diese VM-Lösung, aber es ist ein ziemlich großer Aufwand, es sei denn, Sie verwenden bereits eine.
user24601
Die VirtualBox-Methode hat bei mir nicht funktioniert. Versucht, nur den Status in der Mitte der Codierung zu speichern, und versucht, mit [Strg] + [z] anzuhalten und dann den Status zu speichern. Stoppt nach dem Wiederherstellen des Status und dem Versuch, den Vorgang fortzusetzen, ffmpegmit einem Fehler ( decode_band_types: Input buffer exhausted before END element foundoder Invalid NAL unit sizeund Error writing trailer/ Protocol error). Vielleicht hängt es mit dem Zeitsprung zusammen, ich weiß es nicht.
Jānis Elmeris
@ JānisElmeris Ich kann dieses Problem scheinbar nicht wiederholen. Ich habe es auf Ubuntu 18.04 VM ausprobiert und es hat funktioniert.
Logan
OK, ich bin wahrscheinlich nicht glücklich genug. :) Versucht mit einer neuen Linux Mint 19.1 (basierend auf Ubuntu 18.04) VirtualBox VM.
Jānis Elmeris
Mein ffmpeg hat viele Threads und ebenso viele PID. Muss ich jeden von ihnen SIGSTOP und SIGCONT? Gibt es eine zeitliche Einschränkung?
Wuppi
10

Zum 30. September 2015 schien dies nicht möglich zu sein . Ich würde vorschlagen, die Quelldatei zu segmentieren, die Segmente zu codieren und dann die resultierenden Dateien zusammenzufügen.

Dies ist keine echte Pausen- / Wiederaufnahmefunktion, aber die schrittweise Unterteilung ermöglicht Ihnen eine Unterbrechung der Codierung.

Eine grobe Übersicht über die Befehle, die ausgegeben werden sollen:

Zerlegen Sie die Datei in Teile

ffmpeg -i recording.mp4 -c copy -flags +global_header -segment_time n -f segment file%03d.mp4

Dies sollte file000.mp4, file001.mp4 und so weiter erstellen. Aufgrund der Funktionsweise des Segmentierers - es werden nur I-Frames geschnitten - sind diese Dateien nicht genau nSekunden lang und der Videoteil wird möglicherweise nicht richtig wiedergegeben, aber die Daten sind alle da und Sie können jeden der Teile konvertieren, z

ffmpeg -i file001.mp4 -{filter/encoding parameters} -fflags +genpts file001-new.mp4

Setzen Sie die codierten Teile wieder zusammen

Erstellen Sie eine Textdatei und geben Sie den Namen jeder so gerenderten Datei ein

file 'file000-new.mp4'
file 'file001-new.mp4'
.... 
file 'filelast-new.mp4'

Und Renn

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4
Gyan
quelle
Mit nur 6 GB Speicher und einer geschätzten Zeit von 12 Stunden für die Umstellung von x264 auf x265 und ohne Unterbrechung (Desktop) kann ich den VM-Trick nicht verwenden, aber das klingt großartig! Ich erwarte nur, dass der Wiedereinstiegsschritt schnell ist, aber da es keine Kodierung gibt, denke ich, wird es so sein. Musst es probieren, danke vm!
Aquarius Power
es erzeugt eine Warnung , wenn Beitritt: „Codec für Stream 0 keine globale Header verwenden , aber Container - Format erfordert globale Header“ , aber das Endergebnis ist ein brauchbares Video, sah ich keine Probleme auf allen
Wassermann Strom
10

Wenn Sie unter Windows die Taste "Pause / Break" (die Taste ganz oben rechts) drücken, wird die Wiedergabe angehalten. Enter wird fortgesetzt.

Wenn es nicht funktioniert, klicken Sie auf das Eingabeaufforderungsfenster, um es zu aktivieren.

BuckLee
quelle
Dies ist die einfachste und beste Antwort für Windows (überprüft unter Windows 10).
Lidsinker
1
Dadurch wird die CPU vollständig entlastet, aber der RAM ist immer noch zu eng. In meinem Fall habe ich 8 GB RAM und es wird fast alles noch verwendet, während der Vorgang angehalten ist. Irgendeine Lösung dafür? Kann ich das auf die Festplatte übertragen oder so? Es macht mir nichts aus, wenn Dinge in Gang kommen, wenn ich die Pause behalte.
Drachen
4

Ich empfehle, anstatt zu pausieren, geben Sie dem Codierungsprozess die niedrigste Systempriorität (auch bekannt als " renice "), damit Sie bequem täglich arbeiten können und die Codierung im Hintergrund mit den nicht verwendeten Systemressourcen erfolgt. So erfolgt Ihre Codierung rund um die Uhr ohne Unterbrechungen, ohne dass es zu Konflikten mit der Tagesarbeit kommt

Da AFAIK OSX nicht über den Befehl pidof verfügt, müssen Sie die PID ( ffmpeg process number ) kennen.

dann können Sie den Vorgang wiederholen, um den Hintergrund mit freizugeben

sudo renice 20 yourPID

Bei Bedarf können Sie den Vorgang auch auf eine aggressivere Vordergrundpriorität umstellen

sudo renice -10 yourPID
John Qube
quelle
Hallo! Guter Vorschlag. Muss es versuchen.
Winterflags
4

Das Suspendieren des Threads funktioniert auch unter Windows, nicht mit ctrl+ Z, aber im Ressourcenmanager können Sie es auch dort fortsetzen.

Jan Christian Grünhage
quelle
1

(Dies für Linux)

Wie Sie wahrscheinlich alle wissen, wird die Aufnahmedatei durch Drücken von 'q' beendet.

ffplay hat die 'p'-Möglichkeit. Warum hat ffmpeg nicht dasselbe? Vielleicht, weil es zu einer Desynchronisation zwischen Video und Audio kommen kann? ...

Ich habe gerade ffmpeg-encode zu x264-aac-mkv mit crf (23) und immer mit den gleichen Videobedingungen, 'quit' (q) die Aufnahmen und füge alle Segmente in einem bestimmten Verzeichnis, in dem sich dieses Skript befindet, zu einer Datei zusammen im Streamcopy-Modus mit diesem Bash-Skript:

#!/bin/bash

# FFMPEG MERGE

# File path must be absolutely absolute...

ffmpeg -f concat -safe 0 -i <(printf "file '%s'\n" /home/me/Videos/FFmpeg/FFmpeg_Merge/*.mkv) -c copy merged.mkv

exit 

Danach überprüfe ich das resultierende zusammengeführte Video und füge es in ein anderes Verzeichnis ein. Die Segmente werden aus dem Zusammenführungsverzeichnis entfernt.

Aber ein stressfreier "Pause & Resume" -Button wäre in der Tat willkommen;)

xinu
quelle
0

Dies ist nur eine Idee, aber wenn Sie etwas Budget haben, ist es eine gute Idee, entweder den Prozessor (auf Intel der 8. Generation) oder sogar die Grafikkarte (auf NVIDIA GTX 1050 oder höher) zu aktualisieren, damit Sie kodieren können h.265 / HEVC mit Hardwarebeschleunigung statt CPU-intensiv x265. Ihre Videokodierung ist in weniger als 20 Stunden abgeschlossen, wodurch Sie auch Stromkosten sparen.

Hendy Irawan
quelle