İşte kodlayıcıyı ayarlamak için kabaca bir kılavuz:
Temel seçeneklerden başlayacağız, çünkü hızlı bir seçenek barajının istenen hedefleri ve beklentileri anlamadan aniden beklenen çıktıyı iyileştireceği sonucuna atlamak zararlı olacaktır:
1. Kodlayıcının seçeneklerini anlayarak başlayın.
NVENC tabanlı kodlayıcılar için, her kodlayıcının aldığı seçenekleri öğrenmeye başlayın (Linux'ta olduğumu unutmayın, bu yüzden buraya yapıştırmadan önce codec seçeneklerini panoya kopyalamak için xclip kullanıyorum):
(A). H.264 kodlayıcı için:
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
Çıktı:
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). HEVC / H.265 kodlayıcı için:
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
Çıktı:
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. Donanımın sınırlamalarını öğrenin ve seçenekleri uygulamadan önce aklı başında olan varsayılanlara bağlı kalın:
NVENC ile karşılaşacağınız donanım sınırlamaları, özellikle Pascal'daki HEVC kodlamaları için bu cevaba bakınız .
FFmpeg ile mevcut nesil NVIDIA donanımı için mevcut olan donanım hızlandırmalı altyapı için bu cevaba bakınız .
Ardından, bu bilgileri kullanarak bir sonraki adıma geçin.
3. Sözdizimi kritiktir:
FFmpeg'e argüman iletmeniz gereken sıra:
(A). İkili dosyayı çağır.
(b). -loglevel
Girdileri bildirmeden önce tüm bağımsız değişkenleri FFmpeg'e ( doğrudan buna benzer) iletin.
(c). Herhangi bir donanım hızlandırmalı kod çözme kullanıyorsanız, cuvid
bunu burada bildirin ve gereken belirli bağımsız değişkenleri ekleyin. Bu noktada, kod çözücülerin beklenen girdi çözünürlükleri, desteklenen kodekler vb. Gibi belirli kısıtlamalara sahip olduklarından bahsetmek zorunludur ve bu nedenle, üretimde donanım hızlandırmalı kod çözücülerin arıza olarak ihtiyacını belirlemek ve doğrulamak önerilir. bu aşamada hata kodlaması başarısız olur ve kurtarılamaz. Aslında, MPV geliştiricileri bunu defalarca belirtmiştir , kritik görev içeriği dağıtımı için donanım hızlandırmalı kod çözmeye güvenmemektedir.
(D). Girdilerinizi beyan edin. Akışlar için URL'yi kullanın ve gerekirse fazladan bayrakları (arabellek boyutları gibi) gerektiği gibi ekleyin. Yerel kaynaklar için (erişilebilir bir dosya sisteminde) mutlak dosya yolu gereklidir.
(E). İsteğe bağlı olarak bir filtre takın. Yeniden boyutlandırma, piksel biçiminde konuşma, titreşim giderme vb. Gibi işlevler için bu gereklidir. Burada kullanılan filtreye bağlı olarak, donanım tabanlı bir kod çözücünün ((c) bölümünde açıklandığı gibi) filtrenizin olması gereken kısıtlamaları getireceğini unutmayın. yoksa kodlama başarısız olur.
(f). Uygun video ve ses kodlayıcı çağırın ve bit hızlarına gelince vb eşleştirmeleri, bit, kodlayıcı hazır ayarlar olarak onlara gerekli argümanları, pas, istediğiniz değerler üzerinden belirlenmesini sağlaması -b:v
, -maxrate:v
ve -bufsize:v
seçenekler. Bunları boş bırakmayın. Bu , bu değerlerin neden önemli olduğu konusunda iyi bir başlangıç noktasıdır. Her zaman olduğu gibi, bir ön ayar belirterek başlayın. Bu özel kodlayıcı ile ön ayarların performans etkisi hakkındaki notları görmek için aşağı doğru kaydırın.
(G). FFmpeg, çıktı dosyasının seçilen uzantısına bağlı olarak bir dosyanın gerekli çıktı biçimini çıkarabilirken, gerekirse ekstra seçeneğin temel muxer'e geçirilebilmesi için çıktı biçiminin (-f seçeneği aracılığıyla) açıkça bildirilmesi önerilir. HLS, mpegts ve DASH gibi akış formatlarında olduğu gibi.
(H). Çıktı dosyasının mutlak yolu.
Yukarıdaki örneğinizle birlikte şu şekilde alıntılanmıştır:
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
Eğer uygun bit hızları belirleyerek çıkış kalitesini yükseltmek (aracılığıyla olabilir -b:v
, -maxrate:v
ve -bufsize:v
ayarlar) (sadece bir seferde kullanılabilen uzamsal ve zamansal AQ yöntemleri desteklenir), uyarlamalı nicemleme kodlama tekniklerini sağlayan ve isteğe bağlı olarak (ayrı ayrı) aşağıda gösterildiği gibi ağırlıklı tahmin (B-çerçeve desteğini devre dışı bırakacak) ve uygun bir küçülme için isteğe bağlı bir filtre etkinleştirin ve gerekirse yeniden boyutlandırın. Aşağıdaki örnekte mpeg2 olarak kodlanmış bir pasaj işleme mpegts girişi gösterilmektedir:
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"
Uyarı: Ağırlıklı tahminin ( -weighted_pred
) uyarlanabilir nicemleme ile aynı anda etkinleştirilemeyeceğini unutmayın. Bunu yapmaya çalışmak enkoder başlatma hatasına neden olacaktır.
Yukarıdaki snippet, giriş dosyasının bir MPEG2 akışı olduğunu varsayar. Durum böyle değilse, analiz ettikten sonra doğru CUVID kod çözücüye geçin:
ffprobe -i e:\input.ts
'H.264 / AVC ise, snippet'i aşağıda gösterildiği gibi değiştirin:
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"
Uyarlanabilir nicemlemenin VEYA ağırlıklı tahmin seçeneklerinin etkinleştirilmesinin NVENC için kararlılık, özellikle de belirli aygıt sürücüsü kombinasyonları ile ilgili sorunlar getirebileceğini fark ettim. Mümkün olduğunda, -refs:v
AQ ve ağırlıklı tahmin üzerinde geçiş yapmak yerine B veya 16 (veya 3'ten fazla) jenerik seçenekle kombine edilmiş B-kareleri (en fazla 3) kullanmayı düşünün :
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"
Özellikle Turing ile , aşağıda gösterildiği gibi B-çerçevelerini referans olarak etkinleştirmekten de faydalanabilirsiniz (bkz. Geçiş -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"
İş parçacığı sayıları hakkında ek bir not ( -threads
seçenek aracılığıyla ffmpeg'e iletilir ):
Belirli bir eşiğin ötesinde daha fazla kodlayıcı iş parçacığı gecikmeyi artırır ve daha yüksek bir kodlama belleği alanına sahiptir. Artan kodlama gecikmesi nedeniyle sabit bit hızı modlarında ve VBV (video arabelleği doğrulayıcısı) adı verilen neredeyse sabit bit hızı modunda daha yüksek iplik sayımlarında kalite düşüşü daha belirgindir. Anahtar karelerin düşük kaliteli anahtar karelerin titreşmesini önlemek için diğer kare türlerinden daha fazla veriye ihtiyacı vardır.
Sıfır gecikme veya dilimlenmiş iplik modunun gecikmesi yoktur, ancak bu seçenek desteklenen kodlayıcılarda çoklu iplik kalitesini daha da kötüleştirir.
Bu nedenle, algılanan kodlayıcı verimi arttıkça uzun vadede getirebileceği avantajları dengelediğinden, gecikmenin önemli olduğu kodlardaki iplik sayısını sınırlamak akıllıca olacaktır.
Ve Windows'da olduğunuz için, \
yukarıdaki komutu test eden bir Unix kutusundan yazdığım için yukarıdaki kabuk kaçışlarını kaldırmak isteyebilirsiniz .
Ön ayarlarla ve titreşimli aralıklı kodlama hususlarıyla performans etkisi hakkında notlar:
Yüksek verim, düşük gecikme performansı için, ya llhp
da llhq
ön ayarları kullandığınızdan emin olun . Bu, çok çeşitli cihazlarla daha geniş uyumluluğun beklendiği canlı akış gibi iş yükleri için yararlıdır ve bu nedenle, B-çerçeveleri gibi performans sakatlama özellikleri, daha yüksek bit hızları arasında iyi bir denge sağlamak için tamamen atlanabilir kullanım ve verim. Yüksek önayarlar (varsayılan gibi medium
), kalite çıktısında hızla azalan geri dönüşlere sahipken, aynı zamanda kodlayıcı veriminde önemli yavaşlamalara neden olur. Netflix'in VMAF'si ile ölçülen llhp
ve arasındaki kalite farkıllhq
neredeyse ihmal edilebilir, ancak enkoderin eski ile olan performans artışı (test yatağımda ~% 30'un üzerinde) kesinlikle takdir edilebilir.
İçin llhp
ve llhq
kullanımda hazır ayarlar, hem de diğer hazır ayarlar, ayrıca ileterek dahili hız kontrol yöntemlerini geçersiz kılabilirsiniz -rc:v
kodlayıcı seçenekleri tarafından açığa olarak argümanlar. Örneğin, sabit bit hızı kodlaması ile belirtebilirsiniz -rc:v cbr
(bu, cbr_ld_hq
hız kontrol yönteminden önemli ölçüde daha hızlıdır ve verime ~% 20 artış sağlar). Seçilen ön ayarın verim üzerinde en büyük etkiye sahip olduğunu ve ardından isteğe bağlı olarak isteğe bağlı olarak geçersiz kılabileceğiniz ön ayar seçeneklerinin (kullanımdaki hız kontrol yöntemi gibi) geldiğini unutmayın.
Kodlama iş akışınızı düşünün ve gerektiği gibi ayarlayın. Kilometreniz, kaynak içeriğinize, kullanılan filtre zincirlerine, belirli pltform yapılandırma değişkenlerine (GPU'nuz ve sürücü sürümleriniz gibi) bağlı olarak kesinlikle değişecektir.
Aynı nefeste, NVIDIA'nın, eski Volta NVENC kodlayıcısını kullanan 1660Ti satırında bile , Turing üzerindeki tüm geçişli kodlamayı açıkça devre dışı bıraktığını unutmayın . Geçmeli kodlama desteğine ihtiyacınız varsa, lütfen bunun yerine Pascal veya daha eski SKU'lara geçin.