Najlepsze ustawienia dla FFMpeg z NVENC

26

Używam mojego FFMPEG z obsługą mojego GPU ( NVENC ) do konwersji plików z mojego odbiornika satelitarnego (SD, mpeg2 .TS-Files) na pliki h264 .mp4

Oto linia, której używam

ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
       -qmin 10 -qmax 52 "e:\output.mp4"

Ale jakość nie jest tak dobra, jak się spodziewano. A pełna moc mojego systemu nie jest używana:

wprowadź opis zdjęcia tutaj

Tylko 11% GPU i 30% użycia procesora.

Pytanie: Czy mogę wprowadzić kilka ulepszeń, aby poprawić jakość przez równy rozmiar pliku i użyć większej mocy obliczeniowej mojego Geforce GTX 1080?

Znalazłem kilka parametrów od 林正浩 do zmiany, ale -preset slowpowinno już być podejściem najlepszej jakości, prawda?

Dr Snail
źródło

Odpowiedzi:

37

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 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. cuvidZadeklaruj 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:vi -bufsize:vopcji. 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:vi -bufsize:vustawienia), 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:vustawioną 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 -threadsopcji):

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 llhplub dwóch llhqustawień 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 llhpi llhqmierzona 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 llhpi llhqustawień, a także innych ustawień w użyciu, można również zastąpić wbudowane metody kontroli szybkości przez przepuszczanie -rc:vargumenty 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_hqmetoda 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.

林正浩
źródło
1
Epicki! Dziękuję, po tak długim okresie pracy z kodowaniem sprzętowym, czy poleciłbyś to nad kodowaniem procesora, czy też wady związane z jakością / rozmiarem plików nadal są tak duże? Mam na myśli wiele ulepszeń, które zostały wprowadzone w NVENC i NVENC HQ powinny być tej samej jakości w porównaniu do domyślnego x264
Dr. Snail
@ Dr.Snail Polecam najpierw ocenić wymagania dotyczące przepływu pracy i wziąć pod uwagę wszystkie czynniki przed przejściem na sprzętowe rozwiązanie do kodowania. Po pierwsze, NVENC, podobnie jak inne rozwiązania kodowania oparte na SIP, zawsze zapewnia drastycznie wyższą wydajność przy wyższej wydajności energetycznej w porównaniu do implementacji programowej, przy wszystkich innych czynnikach niezmiennych. W tym celu zastosuj szybkość kompromisu jakości zgodnie z oczekiwaniami, a następnie rozważ nieobsługiwane funkcje. Na przykład dzięki NVENC nie możemy bezpośrednio wstawiać informacji HDR i musimy do tego celu użyć zewnętrznego narzędzia.
林正浩
Narzędzia takie jak to: github.com/SK-Hardwired/nv_hevc_hdr_patcher .
林正浩
Ty wybierasz, scale_npp=w=1920:h=1080ponieważ filtry są jedną z rzeczy, które najbardziej korzystają z GPU, prawda? Kolejna rzecz, ograniczenie bitrate o -b:v 1000k -minrate 500k -maxrate 3000kwydaje się zwiększać przewidywalność wielkości wyjściowej
Dr Snail
Tak, @ Dr.Snail. Przewidywalne rozmiary plików są priorytetem.
林正浩
3

Moje doświadczenie z używaniem nvenc polega na tym, że musisz powiedzieć mu, jaka bitrate chcesz - domyślnie jest to VBR, co jest w porządku, ale żadna ilość tuningu nie rekompensuje faktu, że zawsze chce ci dać średni 2M bitrate bez względu na to, jaki plik rozdzielczości go karmisz. Wydaje się, że jest to błąd w koderze; działa przewidywalnie pod każdym innym względem, ale potrzebuje (na przykład) -b:v 4Mpliku 720p lub -b:v 8M1080p. Prawdopodobnie możesz je nieco obniżyć, jeśli chcesz.

serilain
źródło
1

Libvorbis dla audio wydaje się być powolny. ac3 powinien dać ci 15% wzrost prędkości.

Mówi się, że coś jest nie tak ze sterownikiem wideo lub używasz starej kopii ffmpeg. q Nie mam twojego klipu, ale wziąłem plik SD ts z mojego PVR i użyłem twoich ustawień.

Mam 700 fps (ustawienia Twoje) na GTX750 (non TI) (tańszy)

Mam 925 fps (Twoje ustawienia z dźwiękiem ac3)

Inne zalecenie, które mogę zrobić, to:

Zmień qmax na około 23.

Don Giovanni
źródło
Przetestowałem to na starym GTX 760, który znalazłem z 400FPS za pomocą tego polecenia. ffmpeg40\bin\ffmpeg -hwaccel cuvid -c:v mpeg2_cuvid -i "E:\input.ts" -c:v h264_nvenc "E:\output.mp4"Czy możesz dodać swój kod za pomocą AC3 i.stack.imgur.com/CNaWM.png
Dr. Snail
Powinno to działać w linii poleceń. Dodaj go obok swojego -c: v h264_nvenc -c: ac3 Powinieneś także mieć możliwość wypchnięcia 2 sesji. Otwórz 2. linię poleceń i jednocześnie zakoduj kolejne .ts. Jeśli chcesz, chętnie przetestuję jeden z twoich plików .ts, aby sprawdzić, czy można coś jeszcze zrobić, aby zwiększyć szybkość i jakość.
Don Giovanni