Ffmpeg'de nvenc ile CRF kodlamasını nasıl kullanabilirim?


23

Bu, videoları (1080p) 2GB'dan 300MB'ye yeniden boyutlandırmak için geçerli komutum, ancak çok zaman alıyor:

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

NVIDIA GTX1070 ile nvenc'i denedim:

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

Çıktı boyutu her zaman orijinal boyutun 3⨉ veya 5⨉'udur - nvenc kullanmaz -crf.

Peki yüksek kaliteli ve küçük boyutlu bir videoyu dönüştürmek / yeniden boyutlandırmak için ffmpeg ile nvenc'i nasıl kullanabilirim? Kodlama için GPU'yu kullanmalı mıyım?


Değişebilirsin slowiçin fastilk komuta. CRF uygulanmadı nvenc.
Gyan

NVENC'in amacı, gerçek zamanlı video kodlamasına izin vermektir (video görüşmeleri gibi şeyler için); kalite ikincil bir husustur.
CL.

Yanıtlar:


24

CRF tabanlı kodlamalar için, aşağıdaki kod parçasında aşağıdaki bağımsız değişkenleri FFmpeg'e iletin:

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

Tabii ki, hedef bit hızlarını ve sabit bir cqdeğeri ayarlamanız gerekir . 19, görsel olarak 0 ile aynı olduğu için önerilen ayardır, ancak dosya boyutuna göre iyi sıkıştırma ticaretini korur. Bkz bu yazma-up CRF ne yaptığına ilişkin daha fazla bilgi için.

Bu Not -cqölçeği 0 anlamına gelir, logaritmik kayıpsız esas olarak 51 mutlak kötü olur.

B-kareleri gibi seçenekler ekleyerek kalite daha da geliştirilebilir (bunu en fazla 3 ile sınırlayın ve bu H.264 Ana profili ve üstünü gerektirir. Taban çizgisi profilleri B-karelerini desteklemez. Bunu yapmak -bf {uint}için, Video kodlayıcı, -bf:v 4kodlayıcının 4 B-karesi kullanmasına neden olacak şekilde.

Burada önemli parçaları olan -cq:v 19ve -rc:v vbr_hqayar sağlar argümanlar, önceden belirlenmiş bir değişken bit hızı ve izin verilen maksimum bit (her ikisi de kodlayıcı -b:vve -maxrate:v19 CRF değerine bağlı kalarak).

Ve şimdi, NVENC hakkında küçük notlar ve yüksek kaliteli kodlamalar için ayarlama:

NVENC, diğer donanım tabanlı enkoderler gibi, bazı sınırlamalara sahiptir ve özellikle HEVC ile ilgili olarak, bilinen sınırlamalar şunlardır:

  1. Pascal'da:

    HEVC kodlamaları için aşağıdaki sınırlamalar geçerlidir:

    • 32'nin üzerindeki CTU boyutları desteklenmez.
    • HEVC'deki B-kareleri de desteklenmez.
    • NVENC kodlayıcı tarafından desteklenen doku formatları, kodlayıcının çalışabileceği renk alanlarını sınırlar. Şimdilik 4: 2: 0 (8 bit) ve 4: 4: 4 (10 bit için) desteğimiz var. 4: 2: 2 10 bit gibi harici formatlar desteklenmez. Bu, bu tür renk uzaylarının gerekli olduğu bazı iş akışlarını etkiler.
    • İleri bakma kontrolü de 32 kare ile sınırlıdır. Daha fazla ayrıntı için bu başyazıya bakmak isteyebilirsiniz .

Turing , HEVC için B-çerçeve desteğinin ve B-çerçeveleri referans olarak kullanma özelliğinin eklenmesiyle Pascal için mevcut tüm geliştirmelere sahiptir. Bu yetenekle ilgili bir örnek için bu cevaba bakınız .

  1. Ve Maxwell Gen 2'de (GM200x serisi GPU'lar):

    HEVC kodlaması aşağıdaki özelliklere sahip değildir:

Maxwell için buradaki etki, kısıtlı bit hızları altında HEVC ile birlikte hareket eden ağır sahnelerin, eksik ileri okuma fonksiyonları ve uyarlanabilir örnek ofseti (SAO) döngü filtreleme yetenekleri nedeniyle artefakttan (tıkanma) muzdarip olabileceğidir. Pascal bu yeteneği biraz geliştirdi, ancak video kodlayıcının oluşturulduğu SDK'nın sürümüne bağlı olarak, tüm özellikler mevcut olmayabilir.

Örneğin, Pascal'daki H.264 kodları için ağırlıklı tahmin modu NVENC SDK 8.0x ve üzerini gerektirir ve bu kodlama modu da B-kare desteğini devre dışı bırakır. Benzer şekilde, Nvidia Performance Primitives'tan (NPP) NVENC ile çalışan donanım tabanlı ölçekleyicilerin kombinasyonu, özellikle ölçeklendirilmiş içerikle ölçeklendirme yapaylaştırma maliyetiyle video ölçeklendirme uygulamalarında performans geliştirmeleri getirebilir. Aynı şey, video kodlama boru hattını da etkiler, çünkü NPP'nin ölçekleme işlevleri GPU'daki CUDA çekirdeklerinden dışarı akar ve bu nedenle, ekstra yükün getirdiği performans etkisi, performans kalitesinin olup olmadığını belirlemek için duruma göre analiz edilmelidir. değiş tokuş kabul edilebilir.

Bunu aklınızda bulundurun: Donanım tabanlı bir kodlayıcı, eşdeğer bir yazılım tabanlı uygulamaya göre her zaman biraz daha az özelleştirme sunar ve bu nedenle, kilometre ve kabul edilebilir çıktı kaliteniz her zaman farklılık gösterir.

Ve referans için:

FFmpeg ile özelleştirme için her zaman bir kodlayıcının ayarlarına başvurabilirsiniz:

ffmpeg -h encoder {encoder-name}

Böylece, NVENC tabanlı kodlayıcılar için şunları çalıştırabilirsiniz:

ffmpeg -h encoder=hevc_nvenc

ffmpeg -h encoder=h264_nvenc

Ayrıca çalıştırarak tüm NVENC tabanlı kodlayıcıları ve NPP tabanlı ölçekleyicileri (bu şekilde oluşturulmuşsa) görebilirsiniz:

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

Test yatağımda örnek çıktı:

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
Mükemmel cevap! Nvenc'deki ffmpeg wiki biraz modası geçmiş ve tüm bu bilgilerden yoksun ... Birkaç dakikanız varsa, orada bilginize katkıda bulunmanız harika olurdu: trac.ffmpeg.org/wiki/HWAccelIntro
slhck

1
thank for answer :) ffmpeg wiki bunun gibi daha fazla cevaba ihtiyaç duyuyor
hongducwb

Geri dönüşünüz için teşekkür ederiz. Bunu FFmpeg wiki'sine eklemeyi düşüneceğim.
林正浩

çıktı renk dosyaları daha karanlık gibi görünüyor, bir argüman giriş dosyası ile aynı rengi kontrol edebilirsiniz hatırlıyorum
hongducwb

2
vbr_minqpşimdi kullanımdan kaldırılmış gibi görünüyor. Bu cevabın, CRF modu olmadığı için yanlış anlaşılabileceğini kabul ediyorum h264_nvenc.
slhck

4

Bir çözüm bulduğuma inanıyorum:

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

Görünüşe göre h264_nvenc -qpyerine kullanıyor -crf. Bu seçenek yalnızca -rcolarak ayarlandığında çalışır constqp.


1
Hayır, -qpher şeyden farklı -crf. h264_nvenc 'ın -qpeşdeğerdir libx264 s'-qp
Miyav

@Meow Bu benim için yeterince yakın, ama bir fark olduğunu bilmek güzel. Gelecekte bunu görebilecek herkes için bu sayfada CRF ve QP arasındaki fark açıklanmaktadır.
Alexander01998

3

For -crflibx264 yedek olabilir -cqveya -qph264_nvenc dan:

-crf Sabit kalite modu için kaliteyi seçin

-cq VBR hızı kontrolünde sabit kalite modu için hedef kalite seviyesini ayarlayın (0 ila 51, 0 otomatik anlamına gelir)

-qp Sabit nicemleme parametre hızı kontrol yöntemi (-1'den 51'e) (varsayılan -1)

En hızlı donanım hızlandırmalı kodlama yöntemi:

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

-resizegiriş çözünürlüğü (donanımda); Ffmpeg gerek derlenmeye --enable-libnppiçin scale_nppfiltrenin.

Daha fazla bilgi için:

ffmpeg -h encoder=h264_nvenc

ffmpeg -h denoder=h264_cuvid
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.