Come ridurre al minimo l'utilizzo di CPU / memoria da parte di ffmpeg durante la registrazione di video


13

Uso FFmpeg per realizzare l'acquisizione di schermate video dal display Xvfb.

Attualmente lo invoco con:

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

Mentre registro video da circa 5 sessioni Xvfb il mio utilizzo della CPU è molto elevato e ci sono ritardi a causa di ciò. Anche l'utilizzo della memoria è di circa 300 MB per ciascuno dei processi ffmpeg.

Quali parametri per ffmpeg devo usare per ridurre al minimo l'utilizzo delle risorse del computer (in particolare CPU e memoria) quando si effettua l'acquisizione dello schermo video?

Risposte:


17

1. Creare prima un'uscita RGB senza perdita di dati

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • L'input è RGB, quindi l'uso dell'encoder libx264rgb eviterà la conversione da RGB a YUV potenzialmente lenta che si verificherebbe se si usasse libx264.

  • Questo utilizza il preset di codifica x264 più veloce: ultraveloce.

  • L'output sarà senza perdita perché -crf 0viene utilizzato.

2. Quindi ricodificarlo

L'output del primo comando sarà enorme e la maggior parte dei lettori stupidi non è in grado di gestire RGB H.264, quindi è possibile ricodificarlo:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • Puoi sperimentare il -crfvalore per controllare la qualità dell'output. Una gamma soggettivamente sana è 18-28, dove 18 è visivamente senza perdita di dati o quasi. L'impostazione predefinita è 23.

  • Utilizzare il preset più lento di avere pazienza per: ultrafast, superfast, veryfast, faster, fast, medium, slow, slower, veryslow. L'impostazione predefinita è medium.

  • Ho aggiunto -vf format=yuv420pper garantire che l'output funzioni con lettori stupidi come QuickTime e Windows Media Player. Puoi ometterlo se lo stai caricando su YouTube o lo stai solo riproducendo su VLC, mpv, MPlayer o qualsiasi altro lettore basato su FFmpeg.

Vedi anche


Catturo video da display non predefiniti (è Xvfb) in modo che possa essere qualsiasi numero
Andrei Botalov

@AndreyBotalov Hai provato il metodo lossless? Ha funzionato meglio per te?
Llogan,

1
Attualmente invoco ffmpegcon il -preset superfastparametro (non ho provato -crf). Richiede meno risorse in questo caso e produce video di dimensioni sufficienti.
Andrei Botalov,

@AndreyBotalov -crf 23viene utilizzato per impostazione predefinita se non si dichiara un valore, ma comunque se superfastè sufficiente per te, forse il problema è risolto.
Llogan,

1
Puoi anche provare la codifica hardware tramite h264_nvenc (nvidia) o h264_qsv (CPU Intel moderna). Ciò sposterà l'onere della codifica dalla CPU all'hardware h264 dedicato.
Kenn,

4

È meglio concentrarsi sull'uso di diverse opzioni ffmpeg che raggiungeranno lo stesso risultato in un modo che utilizza meno risorse. Detto questo, ci sono modi per usare meno risorse se hai davvero bisogno di realizzare una cosa specifica con ffmpeg e sta usando troppe risorse.

È possibile ridurre la priorità del ffmpegprocesso della CPU:

  • Metodo di terminale: Utilizzare il nicecomando per modificare la priorità del processo: nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov. In Linux, il numero di priorità (il niceformato del comando è nice -n <priority> <command>) varia da -20 a 20. Maggiore è il numero intero, più bassa è la priorità; neutro è 0. Se usi il comando che ti ho dato e lo imposti a 8, la CPU darà al processo meno tempo, che sembra meno "potenza". Se questo numero è troppo alto o due basso, ovviamente, puoi cambiarlo.
  • Metodo GUI: questo non è raccomandato perché ti dà meno controllo sul numero esatto e non ha effetto non appena inizia il processo. Tuttavia, è più comprensibile. Con l' ffmpegesecuzione, apri il Monitor di sistema. Scorri verso il basso fino al processo denominato ffmpeg, fai clic con il pulsante sinistro del mouse per selezionare, fai clic con il pulsante destro del mouse e imposta la priorità su "Bassa" o "Molto bassa".

Se anche tu sei preoccupato per l'utilizzo della memoria, sappi che non è possibile dire a un processo di prendere solo tanta memoria e continuare a funzionare. Il kernel controlla automaticamente l'allocazione di memoria per i processi. Esiste un modo per mettere in gabbia i processi, con lo timeoutscript , in modo che quando un processo e tutti i processi figlio occupano troppa memoria (un limite impostato dall'utente) vengano chiusi in modo sicuro e venga visualizzata una notifica. Tuttavia, se un processo riceve solo tanta memoria (ad esempio dal kernel) e richiede più memoria che non può avere, andrà in crash.

Alcune cose utili da sapere:

Usando la conoscenza dei Cgroups, puoi fare molte cose divertenti come controllare la swappiness di un processo.


2
Se capisco correttamente, mettere ffmpeg in una coda con priorità inferiore farà sì che produca video con ritardi indesiderati.
Andrei Botalov,

1
Hmm ... Non vedo nulla online che dice che ... Hai una fonte che lo indica? (In caso contrario, dovrebbe essere un bug).
Richard,

2
Se capisco correttamente la priorità più bassa significa che ffmpeg avrà un tempo di processore inferiore a quello che ha ora. Ma il processore è caricato quasi al 100%, quindi penso che la riprogrammazione non aiuterà
Andrei Botalov,

1
Questo è progettato per limitare l'utilizzo della CPU del processo, quindi se la CPU è in esecuzione al 100%, sarà più facile gestirla.
Richard,

4
Ho -1 questo, perché non importa come cambi la priorità, non farà che peggiorare le cose. L'impostazione di una priorità più bassa ridurrà il tempo della CPU per ffmpeg con conseguente perdita di frame o, aumentando la priorità, rallenterà ulteriormente altri processi sul sistema. Entrambi i risultati non sono desiderati.
gertvdijk,

0

-re (input) Legge l'input alla frequenza dei fotogrammi nativa. Utilizzato principalmente per simulare un dispositivo grab o un flusso di input live (ad es. Durante la lettura da un file). Non deve essere utilizzato con dispositivi di acquisizione reali o flussi di input live (dove può causare la perdita di pacchetti). Di default ffmpeg tenta di leggere gli input il più velocemente possibile. Questa opzione rallenta la lettura degli input alla frequenza dei fotogrammi nativa degli input. È utile per l'output in tempo reale (ad es. Streaming live).


"Non deve essere utilizzato con dispositivi di acquisizione reali" come x11grab.
Llogan,
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.