C'è un modo per mettere in pausa e riprendere la codifica FFmpeg?


14

Registro alcune ore di riprese video ogni giorno, che inserisco in coda per la codifica ffmpeg. Uso il veryslowpreset con x265, quindi una sola ora di video può richiedere fino a 20 ore o più per codificare.

Dal momento che il mio computer funziona giorno e notte, mi chiedo se ffmpegabbia un modo per mettere in pausa e riprendere la codifica? Sto usando Terminalper OS X.

In tal caso, posso anche continuare a codificare anche dopo aver spento Terminal e riavviato il computer? Penso che la sessione del Terminale venga ripristinata quando accedi di nuovo in OS X, almeno la cronologia del Terminale lo è.

Risposte:


14

Sospendere

Un metodo semplice è quello di sospenderlo con ctrl+ z. Oppure potresti ottenere il PID con pgrep ffmpegquindi usare kill -s SIGSTOP <PID>per sospendere.

Quindi riprendere con il fgcomando o kill -s SIGCONT <PID>.

Purtroppo questo non sopravviverà al riavvio.

VM

Se si utilizza una macchina virtuale, con qualcosa come VirtualBox, è possibile eseguire la codifica in una macchina virtuale guest. Ti permetterà di "salvare lo stato della macchina" in qualsiasi momento che può sopravvivere a un riavvio. Può anche consentire di assegnare risorse CPU massime per il guest in modo che l'host abbia sempre risorse disponibili.

Forse eccessivo, ma se hai familiarità con le macchine virtuali o ne usi già una, è una possibile soluzione.


Adoro quella soluzione VM, tuttavia, a meno che tu non ne stia già utilizzando una, è una seccatura piuttosto grande.
user24601

Il modo VirtualBox non ha funzionato per me. Ho provato solo a salvare lo stato a metà codifica, e ho provato a sospendere di [Ctrl] + [z] e quindi a salvare lo stato. Dopo aver ripristinato lo stato e aver tentato di riprendere, si ffmpeginterrompe con un errore ( decode_band_types: Input buffer exhausted before END element foundo Invalid NAL unit sizee Error writing trailer/ Protocol error). Forse è legato al salto nel tempo, non lo so.
Jānis Elmeris,

@ JānisElmeris Non riesco a duplicare quel problema. L'ho provato su Ubuntu 18.04 VM e ha funzionato.
llogan

OK, probabilmente non sono abbastanza fortunato. :) Provato con una nuova Linux Mint 19.1 (basata su Ubuntu 18.04) VirtualBox VM.
Jānis Elmeris,

il mio ffmpeg ha molti thred e altrettanti PID. Devo SIGSTOP e SIGCONT ciascuno di essi? c'è un vincolo tempestivo?
martedì

11

Su Windows, premendo il tasto "Pausa / Interrompi" (il tasto più in alto a destra) lo metterai in pausa. Enter riprenderà.

Se non funziona, fai clic sulla finestra del prompt dei comandi per attivarlo.


Questa è la risposta più semplice e migliore per Windows (verificata su Windows 10).
Lidsinker

1
Questo libera completamente la cpu ma il ram è ancora strozzato. Nel mio caso ho 8 GB di RAM e sta usando quasi tutto ancora mentre l'operazione è in pausa. Qualche correzione per quello? Posso trasferirlo su hdd o qualcosa del genere? Non mi dispiace un po 'di liquidazione perché le cose vadano avanti quando mi rammarico.
aquilone

10

Non sembrava possibile al 30 settembre 2015 . Suggerirei di segmentare il file sorgente, codificare i segmenti e quindi ricucire i file risultanti.

Questa non è una vera funzione di pausa / ripresa, ma la divisione frammentaria ti consentirà di interrompere la codifica.

Una panoramica generale dei comandi da emettere:

Rompere il file completo in parti

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

Questo dovrebbe creare file000.mp4, file001.mp4 e così via. A causa di come funziona il segmentatore - taglia solo a I-frame - questi file non dureranno esattamente npochi secondi e la parte video potrebbe non essere riprodotta correttamente, ma i dati sono tutti lì e puoi convertire ciascuna delle parti, ad es.

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

Ricongiungi le parti codificate

Crea un file di testo e inserisci il nome di ciascun file renderizzato in questo modo

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

E corri

ffmpeg -f concat -i textfile -c copy -fflags +genpts recording-encoded.mp4

Con solo 6 GB di memoria e un tempo stimato di 12 ore per passare da x264 a x265 e senza interruzioni (desktop), non posso usare il trucco della VM, ma suona bene! Mi aspetto solo che il passo di ricongiungimento sia veloce, ma poiché non ci sarà alcuna codifica, penso che lo sarà. Devo provarlo, grazie vm!
Aquarius Power il

crea un avviso quando si unisce: "Il codec per lo stream 0 non utilizza le intestazioni globali ma il formato del contenitore richiede le intestazioni globali" ma il risultato finale è un video utilizzabile, non ho visto alcun problema
Aquarius Power

4

I sugest invece di mettere in pausa, dai al processo di codifica la minima priorità di sistema (alias " renice "), in modo da poter lavorare comodamente ogni giorno e la codifica avverrà in background con le risorse di sistema inutilizzate. Quindi la tua codifica avverrà senza interruzioni 24 ore su 24, 7 giorni su 7, senza interruzioni, senza essere in conflitto con il lavoro diurno

poiché AFAIK OSX non ha il comando pidof, è necessario conoscere il numero di processo ffmpeg (PID)

quindi puoi rinominare il processo con lo sfondo inattivo

sudo renice 20 yourPID

se necessario, è anche possibile rinominare il processo con priorità di primo piano più aggressive

sudo renice -10 yourPID

Ciao! Buon consiglio Dovrò provarlo.
Winterflags

4

La sospensione del thread funziona anche su Windows, non con ctrl+ Z, ma in Gestione risorse, puoi anche riprenderlo lì.


1

(Questo per Linux)

Come probabilmente saprete, premendo 'q' si termina il file di registrazione.

ffplay ha la possibilità 'p'. Perché ffmpeg non ha la stessa cosa? Forse perché può portare alla desincronizzazione tra video e audio? ...

Ho appena ffmpeg-codificato in x264-aac-mkv con crf (23) e sempre con le stesse condizioni video, 'esci' (q) le registrazioni e unisco tutti i segmenti in una directory specifica, dove risiede questo script, in 1 file in modalità streamcopy con questo script 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 

Dopodiché controllo il risultante video unito e lo incollo in un'altra directory. I segmenti vengono rimossi dalla directory di unione.

Ma un pulsante "Pause & Resume" senza problemi sarebbe davvero il benvenuto;)


0

Questa è solo un'idea, ma se hai qualche budget, sarebbe una buona idea aggiornare il processore (alla Intel di ottava generazione) o anche meglio, la scheda video (a NVIDIA GTX 1050 o superiore) in modo da poter codificare h.265 / HEVC con accelerazione hardware anziché ad alta intensità di CPU x265. La codifica del tuo video verrà completata in meno di 20 ore, risparmiando anche sui costi dell'elettricità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.