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 cq
valore 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 -cq
scala è 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 4
da comportare il codificatore utilizzando 4 fotogrammi B.
Le parti chiave sono il -cq:v 19
e gli -rc:v vbr_hq
argomenti, che permettono di effettuare il codificatore sia con un bitrate variabile preimpostato e un bitrate massimo ammissibile ( -b:v
e -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:
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à.
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
slow
afast
nel tuo primo comando. CRF non è implementato innvenc
.