Oto ogólny przewodnik po strojeniu enkodera:
Zaczniemy od podstaw, ponieważ wyciągnięcie wniosku, że szybki szereg opcji nagle poprawi oczekiwany wynik bez zrozumienia pożądanych celów i oczekiwań, byłoby szkodliwe:
1. Zacznij od zrozumienia opcji enkodera.
W przypadku koderów opartych na NVENC zacznij od poznania opcji, które bierze każdy enkoder (zauważ, że korzystam z Linuksa, dlatego używam xclip do skopiowania opcji kodeka do schowka przed wklejeniem ich tutaj):
(za). W przypadku enkodera H.264:
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
Wynik:
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). W przypadku enkodera HEVC / H.265:
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
Wynik:
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. Poznaj ograniczenia sprzętowe i trzymaj się rozsądnych ustawień domyślnych przed zastosowaniem opcji:
Zapoznaj się z tą odpowiedzią, aby zapoznać się z ograniczeniami sprzętowymi, na które napotkasz NVENC, zwłaszcza w przypadku kodowania HEVC na Pascal.
W przypadku infrastruktury przyspieszanej sprzętowo dostępnej dla sprzętu NVIDIA obecnej generacji z FFmpeg, zobacz tę odpowiedź.
Następnie, korzystając z tych informacji, przejdź do następnego kroku.
3. Składnia ma kluczowe znaczenie:
Oto kolejność, w jakiej musisz przekazywać argumenty do FFmpeg:
(za). Wywołaj plik binarny.
(b). Przekaż dowolne argumenty do FFmpeg (np -loglevel
. Bezpośrednio) przed zadeklarowaniem danych wejściowych.
(do). Jeśli używasz dekodowania przyspieszanego sprzętowo, np. cuvid
Zadeklaruj go tutaj i dołącz wymagane argumenty. W tym miejscu należy koniecznie wspomnieć, że dekodery mają określone ograniczenia, takie jak oczekiwane rozdzielczości wejściowe, obsługiwane kodeki itp. I jako takie zaleca się, aby w produkcji określić i zweryfikować potrzebę dekoderów przyspieszanych sprzętowo jako awarii na tym etapie kodowanie kończy się niepowodzeniem i nie można go odzyskać. W rzeczywistości twórcy MPV wielokrotnie o tym wspominali , nie polegając na przyspieszanym sprzętowo dekodowaniu w celu dostarczania zawartości o znaczeniu krytycznym.
(re). Zadeklaruj swoje dane wejściowe. W przypadku strumieni użyj adresu URL i, jeśli to konieczne, wstaw dodatkowe flagi (takie jak rozmiary buforów) w razie potrzeby. W przypadku zasobów lokalnych (w dostępnym systemie plików) wymagana jest bezwzględna ścieżka do pliku.
(mi). Opcjonalnie włóż filtr. Jest to potrzebne w przypadku funkcji takich jak zmiana rozmiaru, konwersje formatu pikseli, usuwanie przeplotu itp. Należy pamiętać, że w zależności od zastosowanego tutaj filtra sprzętowy dekoder (jak opisano w sekcji (c) wprowadzi ograniczenia, że filtr musi być w stanie obsłużyć, w przeciwnym razie kod się nie powiedzie.
(fa). Wywołać odpowiednie kodery wideo i audio, i przekazać niezbędne argumenty do nich, takie jak odwzorowań, bitrate, presetów enkodera itp Jeśli chodzi o bitrate, upewnić się, że pożądane wartości są ustawiane za pośrednictwem -b:v
, -maxrate:v
i -bufsize:v
opcji. Nie pozostawiaj tych pustych. To dobry punkt wyjścia do tego, dlaczego te wartości mają znaczenie. Jak zawsze zacznij od określenia ustawienia wstępnego. Przewiń w dół, aby zobaczyć uwagi dotyczące wpływu ustawień wstępnych na ten konkretny koder.
(sol). Podczas gdy FFmpeg może wydedukować wymagany format wyjściowy pliku w zależności od wybranego rozszerzenia pliku wyjściowego, zaleca się jawne zadeklarowanie formatu wyjściowego (poprzez opcję -f), aby w razie potrzeby można było przekazać dodatkowe opcje do bazowego multipleksera , jak to często bywa w przypadku formatów strumieniowych, takich jak HLS, MPEGTS i DASH.
(h). Bezwzględna ścieżka do pliku wyjściowego.
W powyższym przykładzie cytowanym jako:
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
Można podnieść jakość wyjściowego przez określenie odpowiedniej szybkości transmisji (poprzez -b:v
, -maxrate:v
i -bufsize:v
ustawienia), umożliwiające adaptacyjne techniki kodowania kwantyzacji (przestrzenne i czasowe metody AQ obsługiwane, z których tylko jeden może być używane w tym samym czasie) i ewentualnie (i oddzielnie) włączanie prognozowania ważonego (które wyłączy obsługę ramki B), jak pokazano poniżej, a także opcjonalny filtr do właściwego zmniejszania skali i zmiany rozmiaru, jeśli to konieczne. Poniższy przykład pokazuje fragment obsługujący wejście mpegts zakodowane w 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"
Ostrzeżenie: należy pamiętać, że prognozowania ważonego ( -weighted_pred
) nie można włączyć jednocześnie z kwantyzacją adaptacyjną. Próba tego spowoduje błąd inicjalizacji enkodera.
Powyższy fragment zakłada, że plik wejściowy jest strumieniem MPEG2. Jeśli tak nie jest, po przeanalizowaniu przełącz na właściwy dekoder CUVID:
ffprobe -i e:\input.ts
Jeśli jest to „H.264 / AVC”, zmodyfikuj fragment kodu, jak pokazano poniżej:
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"
Zauważyłem, że włączenie adaptacyjnej kwantyzacji LUB opcji prognozowania ważonego dla NVENC może wprowadzić problemy ze stabilnością, szczególnie w przypadku określonych kombinacji sterowników urządzeń. Tam, gdzie to możliwe, rozważ użycie ramek B (nie więcej niż 3) w połączeniu z ogólną opcją -refs:v
ustawioną na 16 lub więcej, zamiast przełączania na AQ i prognozowania ważonego:
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"
W szczególności w przypadku Turinga możesz również skorzystać z włączenia ramek B dla odniesienia, jak pokazano poniżej (patrz przełącznik -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"
Dodatkowa uwaga na temat liczby wątków (przekazana do ffmpeg za pośrednictwem -threads
opcji):
Więcej wątków enkodera powyżej pewnego progu zwiększa opóźnienie i będzie mieć większy ślad pamięci kodowania. Degradacja jakości jest bardziej widoczna przy większej liczbie wątków w trybach stałej przepływności i prawie stałej prędkości transmisji zwanej VBV (weryfikator bufora wideo), ze względu na zwiększone opóźnienie kodowania. Klatki kluczowe wymagają więcej danych niż innych typów ramek, aby uniknąć pulsowania klatek kluczowych niskiej jakości.
Tryb zerowego opóźnienia lub tryb wątku odcinanego nie ma opóźnienia, ale ta opcja dalej pogarsza jakość wielowątkowości w obsługiwanych koderach.
Dlatego rozsądnie jest ograniczyć liczbę wątków w kodach, w których liczy się opóźnienie, ponieważ wzrost postrzeganej przepustowości enkodera kompensuje wszelkie korzyści, jakie może przynieść w dłuższej perspektywie.
A ponieważ korzystasz z systemu Windows, możesz chcieć usunąć znaki ucieczki powłoki \
powyżej, gdy piszę to ze skrzynki uniksowej testując powyższe polecenie.
Uwagi na temat wpływu na wydajność z ustawieniami wstępnymi i uwagi na temat kodowania z przeplotem:
Aby uzyskać wysoką przepustowość i niską zwłokę, upewnij się, że korzystasz z jednego llhp
lub dwóch llhq
ustawień wstępnych. Jest to najbardziej przydatne w przypadku obciążeń, takich jak przesyłanie strumieniowe na żywo, gdzie oczekuje się szerszej kompatybilności z szerszą gamą urządzeń, i jako takie, funkcje zmniejszające wydajność, takie jak ramki B, można całkowicie pominąć, aby uzyskać dobry kompromis między wyższymi przepływnościami w wykorzystanie i przepustowość. Wyższe ustawienia wstępne (takie jak domyślne medium
) mają szybko zmniejszające się zwroty w jakości wyjściowej, jednocześnie powodując znaczne spowolnienie przepustowości enkodera. Różnica w jakości pomiędzy llhp
i llhq
mierzona przez VMAF Netflix jest praktycznie nieistotny, ale wzrost wydajności enkodera (ponad ~ 30% na moim stanowisku testowym) w przypadku tego pierwszego jest zdecydowanie znaczący.
Dla llhp
i llhq
ustawień, a także innych ustawień w użyciu, można również zastąpić wbudowane metody kontroli szybkości przez przepuszczanie -rc:v
argumenty wystawiony przez opcji enkodera. Na przykład, ze stałym kodowaniem przepływności, możesz określić -rc:v cbr
(co jest znacznie szybsze niż cbr_ld_hq
metoda kontroli szybkości, zwiększając przepustowość o około 20%). Należy zauważyć, że wybrane ustawienie wstępne ma największy wpływ na przepustowość , a następnie opcje ustawień wstępnych (takie jak stosowana metoda kontroli prędkości), które można opcjonalnie zastąpić w razie potrzeby.
Zastanów się nad procesem kodowania i dostosuj w razie potrzeby. Twój przebieg na pewno będzie się różnić, w zależności od zawartości źródła, używanych łańcuchów filtrów, konkretnych zmiennych konfiguracyjnych pltform (takich jak wersja twojego GPU i sterownika) itp.
W tym samym oddechu zauważ, że NVIDIA wyraźnie wyłącza kodowanie z przeplotem na Turingu na wszystkich poziomach, nawet w linii 1660Ti, która używa starszego kodera Volta NVENC. Jeśli potrzebujesz obsługi kodowania z przeplotem, przełącz się na Pascal lub starsze jednostki SKU.