To jest moje obecne polecenie zmiany rozmiaru filmów (1080p) z 2 GB do 300 MB, ale zajmuje to dużo czasu:
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
Próbowałem nvenc z moim 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
Rozmiar wyjściowy wynosi zawsze 3⨉ lub 5⨉ rozmiaru oryginalnego - nvenc nie używa -crf
.
Jak więc użyć nvenc z ffmpeg do konwersji / zmiany rozmiaru wideo o wysokiej jakości i małym rozmiarze? Czy powinienem używać GPU do kodowania?
ffmpeg
video-encoding
hongducwb
źródło
źródło
slow
nafast
w pierwszym poleceniu. CRF nie jest zaimplementowany wnvenc
.Odpowiedzi:
W przypadku kodowania opartego na CRF przekaż FFmpeg następujące argumenty we fragmencie poniżej:
Oczywiście musisz dostosować docelową przepływność i stałą
cq
wartość. 19 jest zalecanym ustawieniem, ponieważ jest „wizualnie identyczne z 0, ale zachowuje dobrą kompromis kompresji do rozmiaru pliku. Zobacz ten opis, aby dowiedzieć się więcej o tym, co robi CRF.Zauważ, że
-cq
skala jest logarytmiczna, co oznacza, że 0 jest zasadniczo bezstratne, a 51 byłoby absolutnie najgorsze.Jakość można jeszcze poprawić, dodając opcje, takie jak ramki B. (ogranicz to maksymalnie do 3, a to wymaga profilu głównego H.264 i wyższych. Profile podstawowe nie obsługują ramek B. Aby to zrobić, przejdź
-bf {uint}
do koder wideo, taki,-bf:v 4
który spowodowałby, że koder używałby 4 ramek B.Kluczowe są tu części
-cq:v 19
i-rc:v vbr_hq
argumenty, które pozwalają dostroić enkodera ze zmiennym bitrate zarówno zaprogramowany i maksymalnym dopuszczalnym bitrate (-b:v
i-maxrate:v
) przy jednoczesnym przestrzeganiu wartości CRF 19.A teraz małe notatki na temat NVENC i dostrajanie go do kodowania wysokiej jakości:
NVENC, jak każdy inny koder sprzętowy, ma kilka ograniczeń, a zwłaszcza HEVC, tutaj są znane ograniczenia:
W Pascal:
W przypadku kodów HEVC obowiązują następujące ograniczenia:
Turing ma wszystkie ulepszenia dostępne dla Pascala, z dodatkiem obsługi ramki B dla HEVC i możliwością użycia ramek B jako odniesienia. Zobacz tę odpowiedź, aby zobaczyć przykład tej możliwości.
A w Maxwell Gen 2 (procesory graficzne z serii GM200x):
Kodowaniu HEVC brakuje następujących funkcji:
Wpływ Maxwella jest taki, że sceny o dużym ruchu z HEVC przy ograniczonych przepływnościach mogą cierpieć z powodu artefaktów (blokowania) z powodu brakujących funkcji wyprzedzających i możliwości filtrowania pętli adaptacyjnego próbkowania (SAO). Pascal nieco poprawił tę funkcję, ale w zależności od wersji zestawu SDK, w którym został zbudowany koder wideo, nie wszystkie funkcje mogą być dostępne.
Na przykład tryb prognozowania ważonego dla kodowania H.264 na Pascalu wymaga zestawu NVENC SDK 8.0x i nowszego, a ten tryb kodowania również wyłączy obsługę ramki B. Podobnie, połączenie sprzętowych skalerów działających z Nvidia Performance Primitive (NPP) z NVENC może wprowadzić ulepszenia wydajności w aplikacjach do skalowania wideo kosztem artefaktów skalowania, szczególnie w przypadku skalowanej treści. To samo wpływa na potok kodowania wideo, ponieważ funkcje skalowania NPP działają poza rdzeniami CUDA na GPU i jako taki wpływ na wydajność wprowadzony przez dodatkowe obciążenie powinien być analizowany indywidualnie dla każdego przypadku, aby ustalić, czy jakość wykonania kompromis jest akceptowalny.
Miej to na uwadze: koder sprzętowy zawsze będzie oferował nieco mniejszą personalizację niż równoważna implementacja programowa, a zatem przebieg i akceptowalna jakość wyjściowa zawsze będą się różnić.
I w celach informacyjnych:
Dzięki FFmpeg możesz zawsze odwoływać się do ustawień kodera w celu dostosowania poprzez:
W przypadku koderów opartych na NVENC możesz uruchomić:
Możesz również zobaczyć wszystkie kodery oparte na NVENC i skalery oparte na NPP (jeśli są zbudowane jako takie), uruchamiając:
Przykładowe dane wyjściowe na moim testbed:
źródło
vbr_minqp
wydaje się teraz przestarzałe. Zgadzam się, że ta odpowiedź może być źle zrozumiana, ponieważ nie ma trybu CRFh264_nvenc
.Myślę, że znalazłem rozwiązanie:
Wygląda na to, że h264_nvenc używa
-qp
zamiast-crf
. Ta opcja działa tylko, gdy-rc
jest ustawiona naconstqp
.źródło
-qp
wszystko różni się od-crf
. h264_nvenc 's-qp
jest równa libx264 ' s-qp
Do
-crf
wymiany z libx264 może być-cq
lub-qp
z h264_nvenc:-crf
Wybierz jakość dla trybu stałej jakości-cq
Ustaw docelowy poziom jakości (od 0 do 51, 0 oznacza tryb automatyczny) dla trybu stałej jakości w kontroli prędkości VBR-qp
Metoda kontroli stałej parametru kwantyzacji (od -1 do 51) (domyślnie -1)Najszybsza metoda kodowania akcelerowanego sprzętowo:
-resize
rozdzielczość na wejściu (sprzętowo); nie ma potrzeby kompilacji ffmpeg--enable-libnpp
dlascale_npp
filtra.Po więcej informacji:
ffmpeg -h encoder=h264_nvenc
źródło