Come posso usare la codifica CRF con nvenc in ffmpeg?


22

Questo è il mio attuale comando per ridimensionare i video (1080p) da 2 GB a 300 MB, ma ci vuole molto tempo:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v  libx264 -preset slow -crf 21 -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

Ho provato NVIDIA con la mia NVIDIA GTX1070:

mkdir newfiles  
for %%a in ("*.mp4") do ffmpeg -i "%%a" -c:v h264_nvenc -preset slow -c:a aac -b:a 128k -vf scale=678:-2 "newfiles\%%~na.mp4"  
pause

Le dimensioni dell'output sono sempre 3⨉ o 5⨉ rispetto alle dimensioni originali - nvenc non utilizza -crf.

Quindi, come posso usare nvenc con ffmpeg per convertire / ridimensionare un video con alta qualità e dimensioni ridotte? Devo usare la GPU per la codifica?


Puoi passare slowa fastnel tuo primo comando. CRF non è implementato in nvenc.
Gyan,

L'obiettivo di NVENC è consentire la codifica video in tempo reale (per cose come le videochiamate); la qualità è una considerazione subordinata.
CL.

Risposte:


23

Per i codici basati su CRF, passa i seguenti argomenti nel frammento di seguito a FFmpeg:

-c:v h264_nvenc -rc:v vbr_hq -cq:v 19 -b:v 2500k -maxrate:v 5000k -profile:v high

Ovviamente, dovrai regolare i bit rate target e un cqvalore fisso . 19 è l'impostazione consigliata come 'visivamente identica a 0, ma conserva un buon compromesso di compressione con le dimensioni del file. Vedi questo articolo per saperne di più su ciò che fa CRF.

Si noti che la -cqscala è logaritmica, il che significa che 0 è essenzialmente senza perdita di dati e 51 sarebbe il peggiore assoluto.

La qualità può essere ulteriormente migliorata aggiungendo opzioni come i fotogrammi B. (limitalo a 3, al massimo, e questo richiede il profilo principale H.264 e superiore. I profili di base non supportano i fotogrammi B. Per fare ciò, passa -bf {uint}a il codificatore video, in modo tale -bf:v 4da comportare il codificatore utilizzando 4 fotogrammi B.

Le parti chiave sono il -cq:v 19e gli -rc:v vbr_hqargomenti, che permettono di effettuare il codificatore sia con un bitrate variabile preimpostato e un bitrate massimo ammissibile ( -b:ve -maxrate:v) mentre aderendo ad un valore di 19 CRF.

E ora, piccole note su NVENC e ottimizzazione per codifiche di alta qualità:

NVENC, come qualsiasi altro codificatore basato su hardware, presenta diverse limitazioni, e in particolare con HEVC, ecco le limitazioni note:

  1. Su Pascal:

    Per i codifiche HEVC, si applicano le seguenti limitazioni:

    • Le dimensioni CTU superiori a 32 non sono supportate.
    • Anche i fotogrammi B in HEVC non sono supportati.
    • I formati di trama supportati dall'encoder NVENC limitano gli spazi colore con cui l'encoder può lavorare. Per ora, abbiamo il supporto per 4: 2: 0 (8 bit) e 4: 4: 4 (per 10 bit). Formati estranei come 4: 2: 2 a 10 bit non sono supportati. Ciò influirà su alcuni flussi di lavoro in cui sono richiesti tali spazi colore.
    • Anche il controllo del futuro è limitato a 32 frame. Potresti voler guardare questo editoriale per maggiori dettagli.

Turing ha tutti i miglioramenti disponibili per Pascal, con l'aggiunta del supporto dei frame B per HEVC e la possibilità di utilizzare i frame B come riferimento. Vedi questa risposta per un esempio di questa capacità.

  1. E su Maxwell Gen 2 (GPU serie GM200x):

    La codifica HEVC non ha le seguenti caratteristiche:

L'impatto qui per Maxwell è che le scene pesanti in movimento con HEVC sotto bitrate vincolati possono soffrire di artefatti (blocco) a causa delle funzioni di lookahead mancanti e capacità di filtro di loop adattivo (SAO). Pascal ha in qualche modo migliorato questa funzionalità, ma a seconda della versione dell'SDK con cui è stato costruito l'encoder video, potrebbero non essere disponibili tutte le funzionalità.

Ad esempio, la modalità di previsione ponderata per i codifiche H.264 su Pascal richiede NVENC SDK 8.0x e versioni successive e questa modalità di codifica disabilita anche il supporto B-frame. Allo stesso modo, la combinazione di scaler basati su hardware che eseguono Nvidia Performance Primitives (NPP) con NVENC può introdurre miglioramenti delle prestazioni con applicazioni di ridimensionamento video a costo di ridimensionamento degli artefatti, in particolare con contenuti di livello superiore. Lo stesso influisce anche sulla pipeline di codifica video poiché le funzioni di ridimensionamento di NPP eseguono i core CUDA sulla GPU e, pertanto, l'impatto sulle prestazioni introdotto dal carico aggiuntivo deve essere analizzato caso per caso per determinare se la qualità delle prestazioni il compromesso è accettabile.

Tienilo a mente: un codificatore basato su hardware offrirà sempre una personalizzazione leggermente inferiore rispetto a un'implementazione basata su software equivalente e, come tale, il tuo chilometraggio e la qualità di output accettabile differiranno sempre.

E per il tuo riferimento:

Con FFmpeg, puoi sempre fare riferimento alle impostazioni di un codificatore per la personalizzazione:

ffmpeg -h encoder {encoder-name}

Quindi, per gli encoder basati su NVENC, è possibile eseguire:

ffmpeg -h encoder=hevc_nvenc

ffmpeg -h encoder=h264_nvenc

È inoltre possibile visualizzare tutti gli encoder basati su NVENC e gli scaler basati su NPP (se costruiti come tali) eseguendo:

for i in encoders decoders filters; do
    echo $i:; ffmpeg -hide_banner -${i} | egrep -i "npp|cuvid|nvenc|cuda"
done

Esempio di output sul mio banco di prova:

encoders:
 V..... h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc                NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_h264           NVIDIA NVENC H.264 encoder (codec h264)
 V..... nvenc_hevc           NVIDIA NVENC hevc encoder (codec hevc)
 V..... hevc_nvenc           NVIDIA NVENC hevc encoder (codec hevc)
decoders:
 V..... h263_cuvid           Nvidia CUVID H263 decoder (codec h263)
 V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
 V..... hevc_cuvid           Nvidia CUVID HEVC decoder (codec hevc)
 V..... mjpeg_cuvid          Nvidia CUVID MJPEG decoder (codec mjpeg)
 V..... mpeg1_cuvid          Nvidia CUVID MPEG1VIDEO decoder (codec mpeg1video)
 V..... mpeg2_cuvid          Nvidia CUVID MPEG2VIDEO decoder (codec mpeg2video)
 V..... mpeg4_cuvid          Nvidia CUVID MPEG4 decoder (codec mpeg4)
 V..... vc1_cuvid            Nvidia CUVID VC1 decoder (codec vc1)
 V..... vp8_cuvid            Nvidia CUVID VP8 decoder (codec vp8)
 V..... vp9_cuvid            Nvidia CUVID VP9 decoder (codec vp9)
filters:
 ... hwupload_cuda     V->V       Upload a system memory frame to a CUDA device.
 ... scale_npp         V->V       NVIDIA Performance Primitives video scaling and format conversion

1
Bella risposta! La wiki di ffmpeg su nvenc è un po 'datata e manca di tutte quelle informazioni ... se hai qualche minuto, sarebbe fantastico se tu potessi contribuire con le tue conoscenze lì: trac.ffmpeg.org/wiki/HWAccelIntro
slhck

1
grazie per la risposta :) ffmpeg wiki ha bisogno di più risposte in questo modo
hongducwb

Grazie per il feedback. Vedrò di aggiungere questo al wiki di FFmpeg.
林正浩

i file di colore di output sembrano più scuri, ricordo che un argomento può controllare il colore come il file di input
hongducwb

2
vbr_minqpsembra essere deprecato ora. Sono abbastanza d'accordo sul fatto che questa risposta potrebbe essere fraintesa in quanto non esiste una modalità CRF h264_nvenc.
slhck,

4

Credo di aver trovato una soluzione:

ffmpeg -hwaccel auto -i in.mp4 -c:v h264_nvenc -preset llhq -rc constqp -qp 21 -c:a copy out.mp4

Sembra che h264_nvenc usi -qpinvece di -crf. Questa opzione funziona solo mentre -rcè impostata su constqp.


1
No, -qpè tutto diverso da -crf. h264_nvenc 's -qpè equivalente a libx264 ' s-qp
Meow

@Meow È abbastanza vicino per me, ma è bello sapere che c'è una differenza. Per chiunque possa vederlo in futuro, questa pagina spiega la differenza tra CRF e QP.
Alexander01998,

3

Per la -crfsostituzione da libx264 può essere -cqo -qpda h264_nvenc:

-crf Seleziona la qualità per la modalità di qualità costante

-cq Impostare il livello di qualità target (da 0 a 51, 0 significa automatico) per una modalità di qualità costante nel controllo della frequenza VBR

-qp Metodo di controllo della frequenza dei parametri di quantizzazione costante (da -1 a 51) (impostazione predefinita -1)

Metodo di codifica con accelerazione hardware più veloce:

ffmpeg -hwaccel cuvid -c:v h264_cuvid -resize 640x480 -i input.mp4 -c:v h264_nvenc -cq 21 -c:a copy output.mp4

-resizerisoluzione in ingresso (in hardware); non è necessario compilare ffmpeg --enable-libnppper il scale_nppfiltro.

Per maggiori informazioni:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
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.