Ecco una guida approssimativa all'ottimizzazione dell'encoder:
Partiremo dalle basi, poiché sarebbe dannoso saltare alla conclusione che una rapida raffica di opzioni migliorerà improvvisamente la produzione prevista senza comprendere gli obiettivi e le aspettative desiderati:
1. Inizia a comprendere le opzioni dell'encoder.
Per i codificatori basati su NVENC, inizia con l'apprendimento delle opzioni di ciascun codificatore (nota che sono su Linux, motivo per cui sto usando xclip per copiare le opzioni del codec negli appunti prima di incollarle qui):
(un). Per l'encoder H.264:
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
Produzione:
Encoder h264_nvenc [NVIDIA NVENC H.264 encoder]:
General capabilities: delay
Threading capabilities: none
Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
h264_nvenc AVOptions:
-preset <int> E..V.... Set the encoding preset (from 0 to 11) (default medium)
default E..V....
slow E..V.... hq 2 passes
medium E..V.... hq 1 pass
fast E..V.... hp 1 pass
hp E..V....
hq E..V....
bd E..V....
ll E..V.... low latency
llhq E..V.... low latency hq
llhp E..V.... low latency hp
lossless E..V....
losslesshp E..V....
-profile <int> E..V.... Set the encoding profile (from 0 to 3) (default main)
baseline E..V....
main E..V....
high E..V....
high444p E..V....
-level <int> E..V.... Set the encoding level restriction (from 0 to 51) (default auto)
auto E..V....
1 E..V....
1.0 E..V....
1b E..V....
1.0b E..V....
1.1 E..V....
1.2 E..V....
1.3 E..V....
2 E..V....
2.0 E..V....
2.1 E..V....
2.2 E..V....
3 E..V....
3.0 E..V....
3.1 E..V....
3.2 E..V....
4 E..V....
4.0 E..V....
4.1 E..V....
4.2 E..V....
5 E..V....
5.0 E..V....
5.1 E..V....
-rc <int> E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
constqp E..V.... Constant QP mode
vbr E..V.... Variable bitrate mode
cbr E..V.... Constant bitrate mode
vbr_minqp E..V.... Variable bitrate mode with MinQP (deprecated)
ll_2pass_quality E..V.... Multi-pass optimized for image quality (deprecated)
ll_2pass_size E..V.... Multi-pass optimized for constant frame size (deprecated)
vbr_2pass E..V.... Multi-pass variable bitrate mode (deprecated)
cbr_ld_hq E..V.... Constant bitrate low delay high quality mode
cbr_hq E..V.... Constant bitrate high quality mode
vbr_hq E..V.... Variable bitrate high quality mode
-rc-lookahead <int> E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
-surfaces <int> E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
-cbr <boolean> E..V.... Use cbr encoding mode (default false)
-2pass <boolean> E..V.... Use 2pass encoding mode (default auto)
-gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
any E..V.... Pick the first device available
list E..V.... List the available devices
-delay <int> E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
-no-scenecut <boolean> E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
-forced-idr <boolean> E..V.... If forcing keyframes, force them as IDR frames. (default false)
-b_adapt <boolean> E..V.... When lookahead is enabled, set this to 0 to disable adaptive B-frame decision (default true)
-spatial-aq <boolean> E..V.... set to 1 to enable Spatial AQ (default false)
-temporal-aq <boolean> E..V.... set to 1 to enable Temporal AQ (default false)
-zerolatency <boolean> E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
-nonref_p <boolean> E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
-strict_gop <boolean> E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
-aq-strength <int> E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
-cq <float> E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
-aud <boolean> E..V.... Use access unit delimiters (default false)
-bluray-compat <boolean> E..V.... Bluray compatibility workarounds (default false)
-init_qpP <int> E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
-init_qpB <int> E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
-init_qpI <int> E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
-qp <int> E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
-weighted_pred <int> E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
-coder <int> E..V.... Coder type (from -1 to 2) (default default)
default E..V....
auto E..V....
cabac E..V....
cavlc E..V....
ac E..V....
vlc E..V....
(B). Per l'encoder HEVC / H.265:
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
Produzione:
Encoder hevc_nvenc [NVIDIA NVENC hevc encoder]:
General capabilities: delay
Threading capabilities: none
Supported pixel formats: yuv420p nv12 p010le yuv444p yuv444p16le bgr0 rgb0 cuda
hevc_nvenc AVOptions:
-preset <int> E..V.... Set the encoding preset (from 0 to 11) (default medium)
default E..V....
slow E..V.... hq 2 passes
medium E..V.... hq 1 pass
fast E..V.... hp 1 pass
hp E..V....
hq E..V....
bd E..V....
ll E..V.... low latency
llhq E..V.... low latency hq
llhp E..V.... low latency hp
lossless E..V.... lossless
losslesshp E..V.... lossless hp
-profile <int> E..V.... Set the encoding profile (from 0 to 4) (default main)
main E..V....
main10 E..V....
rext E..V....
-level <int> E..V.... Set the encoding level restriction (from 0 to 186) (default auto)
auto E..V....
1 E..V....
1.0 E..V....
2 E..V....
2.0 E..V....
2.1 E..V....
3 E..V....
3.0 E..V....
3.1 E..V....
4 E..V....
4.0 E..V....
4.1 E..V....
5 E..V....
5.0 E..V....
5.1 E..V....
5.2 E..V....
6 E..V....
6.0 E..V....
6.1 E..V....
6.2 E..V....
-tier <int> E..V.... Set the encoding tier (from 0 to 1) (default main)
main E..V....
high E..V....
-rc <int> E..V.... Override the preset rate-control (from -1 to INT_MAX) (default -1)
constqp E..V.... Constant QP mode
vbr E..V.... Variable bitrate mode
cbr E..V.... Constant bitrate mode
vbr_minqp E..V.... Variable bitrate mode with MinQP (deprecated)
ll_2pass_quality E..V.... Multi-pass optimized for image quality (deprecated)
ll_2pass_size E..V.... Multi-pass optimized for constant frame size (deprecated)
vbr_2pass E..V.... Multi-pass variable bitrate mode (deprecated)
cbr_ld_hq E..V.... Constant bitrate low delay high quality mode
cbr_hq E..V.... Constant bitrate high quality mode
vbr_hq E..V.... Variable bitrate high quality mode
-rc-lookahead <int> E..V.... Number of frames to look ahead for rate-control (from 0 to INT_MAX) (default 0)
-surfaces <int> E..V.... Number of concurrent surfaces (from 0 to 64) (default 0)
-cbr <boolean> E..V.... Use cbr encoding mode (default false)
-2pass <boolean> E..V.... Use 2pass encoding mode (default auto)
-gpu <int> E..V.... Selects which NVENC capable GPU to use. First GPU is 0, second is 1, and so on. (from -2 to INT_MAX) (default any)
any E..V.... Pick the first device available
list E..V.... List the available devices
-delay <int> E..V.... Delay frame output by the given amount of frames (from 0 to INT_MAX) (default INT_MAX)
-no-scenecut <boolean> E..V.... When lookahead is enabled, set this to 1 to disable adaptive I-frame insertion at scene cuts (default false)
-forced-idr <boolean> E..V.... If forcing keyframes, force them as IDR frames. (default false)
-spatial_aq <boolean> E..V.... set to 1 to enable Spatial AQ (default false)
-temporal_aq <boolean> E..V.... set to 1 to enable Temporal AQ (default false)
-zerolatency <boolean> E..V.... Set 1 to indicate zero latency operation (no reordering delay) (default false)
-nonref_p <boolean> E..V.... Set this to 1 to enable automatic insertion of non-reference P-frames (default false)
-strict_gop <boolean> E..V.... Set 1 to minimize GOP-to-GOP rate fluctuations (default false)
-aq-strength <int> E..V.... When Spatial AQ is enabled, this field is used to specify AQ strength. AQ strength scale is from 1 (low) - 15 (aggressive) (from 1 to 15) (default 8)
-cq <float> E..V.... Set target quality level (0 to 51, 0 means automatic) for constant quality mode in VBR rate control (from 0 to 51) (default 0)
-aud <boolean> E..V.... Use access unit delimiters (default false)
-bluray-compat <boolean> E..V.... Bluray compatibility workarounds (default false)
-init_qpP <int> E..V.... Initial QP value for P frame (from -1 to 51) (default -1)
-init_qpB <int> E..V.... Initial QP value for B frame (from -1 to 51) (default -1)
-init_qpI <int> E..V.... Initial QP value for I frame (from -1 to 51) (default -1)
-qp <int> E..V.... Constant quantization parameter rate control method (from -1 to 51) (default -1)
-weighted_pred <int> E..V.... Set 1 to enable weighted prediction (from 0 to 1) (default 0)
2. Comprendere le limitazioni dell'hardware e attenersi alle impostazioni predefinite corrette prima di applicare le opzioni:
Fare riferimento a questa risposta per le limitazioni hardware che si incontreranno con NVENC, in particolare per i codici HEVC su Pascal.
Per l'infrastruttura con accelerazione hardware disponibile per l'hardware NVIDIA di generazione corrente con FFmpeg, vedere questa risposta.
Quindi, utilizzando tali informazioni, procedere al passaggio successivo.
3. La sintassi è fondamentale:
Ecco l'ordine in cui devi passare gli argomenti a FFmpeg:
(un). Richiama il binario.
(b). Passare qualsiasi argomento a FFmpeg (come ad esempio -loglevel
direttamente) prima di dichiarare gli input.
(c). Se si utilizza una decodifica con accelerazione hardware, ad esempio cuvid
, dichiararla qui e includere eventuali argomenti specifici richiesti. A questo punto, sarebbe imperativo menzionare che i decodificatori hanno vincoli specifici, come risoluzioni di input attese, codec supportati, ecc. E come tali, si raccomanda che in produzione, determinare e convalidare la necessità di decodificatori con accelerazione hardware come errore in questa fase risulta una codifica non riuscita ed è irrecuperabile. In effetti, gli sviluppatori MPV ne hanno parlato più volte , non fare affidamento sulla decodifica con accelerazione hardware per la consegna di contenuti mission-critical.
(D). Dichiara i tuoi input. Per gli stream, utilizzare l'URL e, se necessario, anteporre flag aggiuntivi (come le dimensioni del buffer) in base alle esigenze. Per le risorse locali (su un filesystem accessibile), è necessario il percorso del file assoluto.
(E). Facoltativamente, inserire un filtro. Ciò è necessario per funzioni come ridimensionamento, conversazioni in formato pixel, deinterlacciamento, ecc. Si noti che a seconda del filtro in uso qui, un decodificatore basato su hardware (come descritto nella sezione (c) introdurrà vincoli che il filtro deve essere in grado di gestire, altrimenti la tua codifica fallirà.
(f). Richiamare i video e audio encoder adeguati, e passare gli argomenti necessari a loro, come le mappature, bitrate, preset encoder, ecc Quando si tratta di bitrate, verificare che i valori desiderati vengono impostati tramite i -b:v
, -maxrate:v
e le -bufsize:v
opzioni. Non lasciare questi vuoti. Questo è un buon punto di partenza sul perché questi valori contano. Come sempre, inizia specificando un predefinito. Scorri verso il basso verso il basso per vedere le note sull'impatto delle prestazioni dei preset con questo particolare encoder.
(G). Considerando che FFmpeg può dedurre il formato di output richiesto di un file in base all'estensione selezionata del file di output, si consiglia di dichiarare esplicitamente il formato di output (tramite l'opzione -f) in modo che le opzioni extra possano essere passate al muxer sottostante se necessario , come spesso accade con i formati di streaming come HLS, mpegts e DASH.
(H). Il percorso assoluto del file di output.
Con il tuo esempio sopra, citato come:
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
È possibile aumentare la qualità dell'output specificando bitrate appropriati (tramite -b:v
, -maxrate:v
e le -bufsize:v
impostazioni), abilitando tecniche di codifica di quantizzazione adattativa (sono supportati i metodi AQ spaziali e temporali, di cui solo uno può essere utilizzato alla volta) e facoltativamente (e separatamente) abilitando la previsione ponderata (che disabiliterà il supporto del B-frame) come mostrato di seguito, nonché un filtro opzionale per un downscale adeguato e ridimensionare se necessario. L'esempio seguente mostra uno snippet che gestisce l'input di mpegts codificato in mpeg2:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v mpeg2_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 \
-spatial_aq:v 1 -aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"
Avvertenza:-weighted_pred
tenere presente che la previsione ponderata ( ) non può essere abilitata contemporaneamente alla quantizzazione adattativa. Tentare di farlo comporterà un errore di inizializzazione dell'encoder.
Lo snippet sopra presuppone che il file di input sia un flusso MPEG2. In caso contrario, passare al decodificatore CUVID corretto dopo averlo analizzato:
ffprobe -i e:\input.ts
Se è "H.264 / AVC, modifica lo snippet come mostrato di seguito:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -spatial_aq:v 1 \
-aq-strength:v 15 -coder:v cabac \
-f mp4 "e:\output.mp4"
Ho notato che l'abilitazione della quantizzazione adattativa o delle opzioni di previsione ponderate per NVENC possono presentare problemi di stabilità, in particolare con combinazioni specifiche di driver di dispositivo. Laddove possibile, considera l'utilizzo di B-frame (non più di 3) in combinazione con l'opzione generica -refs:v
impostata su 16 o giù di lì, invece di attivare o disattivare AQ e previsione ponderata:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac \
-f mp4 "e:\output.mp4"
Con Turing , in particolare, potresti anche trarre vantaggio dall'abilitazione di fotogrammi B per riferimento come mostrato di seguito (vedi l'interruttore -b_ref_mode:v middle)
:
ffmpeg -loglevel debug -threads 4 -hwaccel cuvid -c:v h264_cuvid -i "e:\input.ts" \
-filter:v hwupload_cuda,scale_npp=w=1920:h=1080:interp_algo=lanczos \
-c:v h264_nvenc -b:v 4M -maxrate:v 5M -bufsize:v 8M -profile:v main \
-level:v 4.1 -rc:v vbr_hq -rc-lookahead:v 32 -refs:v 16 \
-bf:v 3 -coder:v cabac -b_ref_mode:v middle \
-f mp4 "e:\output.mp4"
Una nota aggiuntiva sul conteggio dei thread (passata a ffmpeg tramite l' -threads
opzione):
Più thread dell'encoder oltre una certa soglia aumentano la latenza e avranno un footprint di memoria di codifica più elevato. Il degrado della qualità è più evidente con conteggi dei thread più elevati in modalità bitrate costante e modalità bitrate quasi costante chiamata VBV (verificatore buffer video), a causa di un ritardo di codifica aumentato. I fotogrammi chiave necessitano di più dati rispetto ad altri tipi di fotogrammi per evitare pulsazioni di fotogrammi chiave di scarsa qualità.
La modalità thread zero-delay o sliced non ha ritardi, ma questa opzione peggiora ulteriormente la qualità multi-thread negli encoder supportati.
È quindi saggio limitare il conteggio dei thread sui codifiche in cui è importante la latenza, poiché l'aumento del throughput dell'encoder percepito compensa tutti i vantaggi che può portare a lungo termine.
E dal momento che sei su Windows, potresti voler rimuovere le escape di shell \
sopra mentre sto scrivendo questo da una scatola Unix testando il comando sopra.
Note sull'impatto sulle prestazioni con preimpostazioni e considerazioni sulla codifica interlacciata:
Per un throughput elevato e prestazioni a bassa latenza, assicurati di utilizzare uno llhp
o i llhq
preset. Ciò è particolarmente utile per carichi di lavoro come lo streaming live in cui è prevista una più ampia compatibilità con una più ampia varietà di dispositivi e, come tale, le funzionalità che mettono a repentaglio le prestazioni come i frame B possono essere omesse del tutto per un buon compromesso tra bit rate più elevati in utilizzo e throughput. Preimpostazioni più alte (come quelle predefinite medium
) hanno rendimenti in rapido calo nell'output di qualità e allo stesso tempo comportano rallentamenti significativi del throughput dell'encoder. La differenza di qualità tra llhp
e llhq
misurata dal VMAF di Netflix è praticamente trascurabile, ma l'incremento delle prestazioni dell'encoder (oltre il ~ 30% sul mio banco di prova) con il primo è decisamente apprezzabile.
Per i preset llhp
e llhq
, così come altri preset in uso, è anche possibile sovrascrivere i metodi di controllo della velocità incorporati passando gli -rc:v
argomenti esposti dalle opzioni dell'encoder. Ad esempio, con la codifica costante della velocità in bit, è possibile specificare -rc:v cbr
(che è significativamente più veloce del cbr_ld_hq
metodo di controllo della velocità, portando un aumento del ~ 20% aggiuntivo alla velocità effettiva). Si noti che la preselezione selezionata ha il maggiore impatto sulla velocità effettiva , seguita dalle opzioni di preselezione (come il metodo di controllo della frequenza in uso) che è possibile facoltativamente sostituire se lo si desidera.
Considera il tuo flusso di lavoro di codifica e regola se necessario. Il chilometraggio varierà sicuramente, in base al contenuto di origine, alle catene di filtri in uso, alle variabili di configurazione specifiche pltform (come GPU e versioni dei driver), ecc.
Nello stesso respiro, nota che NVIDIA ha esplicitamente disabilitato la codifica interlacciata su Turing su tutti i livelli, anche nella linea 1660Ti che utilizza il vecchio codificatore Volta NVENC. Se hai bisogno di supporto per la codifica interlacciata, passa invece a SKU Pascal o precedenti.