Czy istnieje sposób na wstrzymanie i wznowienie kodowania FFmpeg?

14

Codziennie nagrywam kilka godzin materiału wideo, które ustawiam w kolejce do kodowania ffmpeg. Używam tego veryslowustawienia wstępnego x265, więc kodowanie jednej godziny filmu może potrwać do 20 godzin lub dłużej.

Ponieważ mój komputer pracuje dzień i noc, zastanawiam się, czy ffmpegma sposób na wstrzymanie i wznowienie kodowania? Korzystam Terminalz systemu OS X.

Jeśli tak, to czy mogę kontynuować kodowanie nawet po wyłączeniu terminalu i ponownym uruchomieniu komputera? Myślę, że sesja Terminal jest przywracana po ponownym zalogowaniu w OS X, przynajmniej historia Terminalu.

Winterflags
źródło

Odpowiedzi:

14

Zawieszać

Prostą metodą jest zawieszenie go za pomocą ctrl+ z. Lub możesz uzyskać PID, a pgrep ffmpegnastępnie użyć kill -s SIGSTOP <PID>do zawieszenia.

Następnie wznów za pomocą fgpolecenia lub kill -s SIGCONT <PID>.

Niestety nie przetrwa to ponownego uruchomienia komputera.

VM

Jeśli używasz maszyny wirtualnej z czymś takim jak VirtualBox, możesz wykonać kodowanie na maszynie wirtualnej gościa. Umożliwi to „zapisanie stanu maszyny” w dowolnym momencie, który może przetrwać ponowne uruchomienie. Może także pozwolić ci przypisać maksimum zasobów procesora dla gościa, dzięki czemu twój host będzie zawsze miał dostępne zasoby.

Być może przesada, ale jeśli znasz już maszyny wirtualne lub korzystasz z jednej, jest to możliwe rozwiązanie.

Llogan
źródło
Uwielbiam to rozwiązanie VM, jednak jeśli już go nie używasz, jest to dość duży problem.
user24601
Sposób VirtualBox nie działał dla mnie. Próbowałem tylko zapisać stan w środkowym kodowaniu i próbowałem zawiesić za pomocą [Ctrl] + [z], a następnie zapisać stan. Po przywróceniu stanu i próbie wznowienia ffmpegzatrzymuje się z błędem ( decode_band_types: Input buffer exhausted before END element foundlub / Invalid NAL unit sizei ). Może to ma związek ze skokiem w czasie, nie wiem. Error writing trailerProtocol error
Jānis Elmeris,
@ JānisElmeris Nie mogę zduplikować tego problemu. Wypróbowałem to na Ubuntu 18.04 VM i działało.
llogan
OK, chyba nie mam szczęścia. :) Wypróbowałem ze świeżą maszyną wirtualną Linux Mint 19.1 (opartą na Ubuntu 18.04) VirtualBox.
Jānis Elmeris
mój ffmpeg ma wiele zalet i tyle samo PID. Czy muszę SIGSTOP i SIGCONT każdego z nich? czy istnieje ograniczenie czasowe?
wuppi
12

W systemie Windows naciśnięcie klawisza „Pauza / Przerwa” (klawisz w prawym górnym rogu) spowoduje jego wstrzymanie. Enter zostanie wznowione.

Jeśli to nie działa, kliknij okno wiersza polecenia, aby ustawić fokus.

BuckLee
źródło
To najłatwiejsza i najlepsza odpowiedź dla systemu Windows (zweryfikowana w systemie Windows 10).
Lidsinker
1
To całkowicie uwalnia procesor, ale ram wciąż jest wąski. W moim przypadku mam RAM 8GB i używa prawie wszystkiego, gdy operacja jest wstrzymana. Masz jakieś rozwiązanie? Czy mogę przenieść to na dysk twardy lub coś takiego? Nie przeszkadza mi, że coś się dzieje, kiedy odpuszczam.
latawiec
10

Na dzień 30 września 2015 r . Nie wydawało się to możliwe . Sugerowałbym segmentację pliku źródłowego, kodowanie segmentów, a następnie zszywanie powstałych plików.

To nie jest prawdziwa funkcja pauzy / wznowienia, ale fragmentaryczny podział pozwoli ci na przerwę w kodowaniu.

Zwięzły przegląd poleceń do wydania:

Podziel plik na części

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

To powinno utworzyć plik 000.mp4, plik001.mp4 i tak dalej. Z powodu tego, jak działa segmentator - tnie tylko w ramkach I - te pliki nie będą miały dokładnie nkilku sekund i część wideo może nie być poprawnie odtwarzana, ale wszystkie dane są tam i możesz przekonwertować każdą z części, np.

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

Dołącz ponownie do zakodowanych części

Utwórz plik tekstowy i wpisz nazwę każdego renderowanego pliku w ten sposób

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

I biegnij

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4
Gyan
źródło
Mając tylko 6 GB pamięci i szacowany czas 12 godzin na kodowanie od x264 do x265 i brak przerwy (na komputerze), nie mogę użyć sztuczki VM, ale to brzmi świetnie! Po prostu oczekuję, że krok ponownego połączenia jest szybki, ale ponieważ nie będzie na nim żadnego kodowania, myślę, że tak będzie. Muszę spróbować, dzięki!
Aquarius Power
podczas dołączania tworzy ostrzeżenie: „Kodek dla strumienia 0 nie używa globalnych nagłówków, ale format kontenera wymaga globalnych nagłówków”, ale końcowy wynik to użyteczne wideo, nie widziałem żadnych problemów
Aquarius Power
4

Sugeruję, zamiast wstrzymywać, proces kodowania ma najmniejszy priorytet systemowy (inaczej „ renice ”), dzięki czemu możesz codziennie pracować wygodnie, a kodowanie będzie odbywać się w tle z nieużywanymi zasobami systemowymi. Dzięki temu kodowanie będzie przebiegać bezproblemowo 24 godziny na dobę, 7 dni w tygodniu, bez zakłóceń i bez konfliktu z codzienną pracą

ponieważ AFAIK OSX nie ma polecenia pidof, musisz znać numer procesu ffmpeg (PID)

Następnie można zmienić tą proces do bezczynności tle

sudo renice 20 yourPID

w razie potrzeby możesz również przywrócić proces do bardziej agresywnego priorytetu na pierwszym planie

sudo renice -10 yourPID
John Qube
źródło
Cześć! Dobry pomysł. Będę musiał spróbować.
Winterflags
4

Zawieszenie wątku działa również w systemie Windows, nie z ctrl+ Z, ale w menedżerze zasobów możesz go również wznowić.

Jan Christian Grünhage
źródło
1

(To dla Linuksa)

Jak zapewne wszyscy wiecie, naciśnięcie „q” kończy plik nagrania.

ffplay ma opcję „p”. Dlaczego ffmpeg nie ma tego samego? Może dlatego, że może prowadzić do desynchronizacji między wideo a dźwiękiem? ...

Po prostu ffmpeg-encode do x264-aac-mkv za pomocą crf (23) i zawsze z tymi samymi warunkami wideo, „wyjdź” (q) z nagrań i połącz wszystkie segmenty w określonym katalogu, w którym znajduje się ten skrypt, do 1 pliku w trybie streamcopy za pomocą tego skryptu bash:

#!/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 

Następnie sprawdzam powstały scalony film i wklejam go do innego katalogu. Segmenty są usuwane z katalogu scalania.

Ale bezproblemowy przycisk „Wstrzymaj i wznów” rzeczywiście byłby mile widziany;)

xinu
źródło
0

To tylko pomysł, ale jeśli masz trochę budżetu, dobrym pomysłem byłoby uaktualnienie procesora (do Intel 8. generacji) lub jeszcze lepiej karty graficznej (do NVIDIA GTX 1050 lub wyższej), aby można było kodować h.265 / HEVC z przyspieszeniem sprzętowym zamiast intensywnego procesora x265. Twoje kodowanie wideo zostanie zakończone w czasie krótszym niż 20 godzin, co również obniży koszty energii elektrycznej.

Hendy Irawan
źródło