다음은 인코더 튜닝에 대한 대략적인 안내서입니다.
우리는 기본에서 시작합니다. 옵션의 빠른 발사가 원하는 목표와 기대치를 이해하지 않고 갑자기 예상 결과를 향상시킬 것이라는 결론에 뛰어 들기 때문에 다음과 같이 시작합니다.
1. 엔코더의 옵션을 이해하여 시작하십시오.
NVENC 기반 엔코더의 경우, 각 엔코더가 취하는 옵션을 배우는 것부터 시작하십시오 (리눅스를 사용하고 있으므로 xclip을 사용하여 코덱 옵션을 클립 보드에 붙여 넣기 전에 여기에 붙여 넣습니다).
(ㅏ). H.264 인코더의 경우 :
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
산출:
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....
(비). HEVC / H.265 인코더의 경우 :
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
산출:
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. 하드웨어의 한계를 이해하고 옵션을 적용하기 전에 먼저 정상 기본값을 고수하십시오.
NVENC에 적용되는 하드웨어 제한 사항, 특히 Pascal의 HEVC 인코딩에 대해서는 이 답변 을 참조하십시오 .
FFmpeg가있는 현재 세대 NVIDIA 하드웨어에 사용 가능한 하드웨어 가속 인프라에 대해서는 이 답변을 참조하십시오 .
그런 다음 해당 정보를 사용하여 다음 단계로 진행하십시오.
3. 구문이 중요합니다 :
FFmpeg에 인수를 전달해야하는 순서는 다음과 같습니다.
(ㅏ). 바이너리를 불러옵니다.
(비). -loglevel
입력을 선언하기 전에 모든 인수를 FFmpeg (예 : 직접)에 전달하십시오.
(씨). 와 같은 하드웨어 가속 디코딩을 사용하는 cuvid
경우 여기에 선언하고 필요한 특정 인수를 포함하십시오. 이 시점에서 디코더에는 예상되는 입력 해상도, 지원되는 코덱 등과 같은 특정 제약 조건이 있으며 프로덕션 환경에서는 하드웨어 가속 디코더의 필요성을 장애로 결정하고 확인하는 것이 좋습니다. 이 단계에서는 인코딩이 실패하고 복구 할 수 없습니다. 실제로 MPV 개발자는 이것을 반복적으로 언급 했지만 미션 크리티컬 한 컨텐츠 전달을 위해 하드웨어 가속 디코딩에 의존하지 않습니다.
(디). 입력을 선언하십시오. 스트림의 경우 URL을 사용하고 필요한 경우 필요에 따라 추가 플래그 (예 : 버퍼 크기)를 추가하십시오. 로컬 리소스 (액세스 가능한 파일 시스템)의 경우 절대 파일 경로가 필요합니다.
(이자형). 선택적으로 필터를 삽입하십시오. 이것은 크기 조정, 픽셀 형식 대화, 디인터레이싱 등과 같은 기능에 필요합니다. 여기서 사용중인 필터에 따라 (c) 섹션에 설명 된 하드웨어 기반 디코더는 필터가 처리하지 않으면 인코딩이 실패합니다.
(에프). 해당 비디오 및 오디오 인코더를 불러, 그리고 그것을 비트 레이트에 관해서 등 매핑, 비트 레이트, 엔코더 프리셋으로 그들에게 필요한 인수를 통과, 원하는 값이로 설정되어 있는지 확인 -b:v
, -maxrate:v
및 -bufsize:v
옵션을 제공합니다. 비워 두지 마십시오. 이것이 왜 이러한 가치들이 중요한지에 대한 좋은 출발점입니다. 항상 그렇듯이 사전 설정을 지정하여 시작하십시오. 이 특정 인코더로 프리셋의 성능 영향에 대한 메모를 보려면 아래로 스크롤하십시오.
(지). FFmpeg가 출력 파일의 선택된 확장자에 따라 파일의 필수 출력 형식을 추론 할 수있는 반면, 필요한 경우 추가 옵션을 기본 muxer에 전달할 수 있도록 -f 옵션을 통해 출력 형식을 명시 적으로 선언하는 것이 좋습니다. , HLS, mpegts 및 DASH와 같은 스트리밍 형식의 경우가 종종 있습니다.
(h). 출력 파일의 절대 경로입니다.
위의 예에서 다음과 같이 인용됩니다.
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
사용자는 적절한 비트 레이트를 지정하여 출력 품질을 높이기 (관통 수 -b:v
, -maxrate:v
및 -bufsize:v
설정) (하나만이 동시에 사용될 수있는 시공간 AQ 방법은 지원되는)의 적응 양자화 인코딩 기술을 가능하게하고 의해 임의적으로 (개별적으로) 가중 예측 활성화 (B- 프레임 지원 비활성화)와 필요한 경우 적절한 다운 스케일 및 크기 조정을위한 선택적 필터. 아래 예제는 mpeg2로 인코딩 된 mpegts 입력을 처리하는 스 니펫을 보여줍니다.
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"
경고 : 가중 예측 ( -weighted_pred
)은 적응 양자화와 동시에 활성화 될 수 없습니다. 그렇게하면 엔코더 초기화 실패가 발생합니다.
위의 스 니펫은 입력 파일이 MPEG2 스트림이라고 가정합니다. 그렇지 않은 경우 분석 후 올바른 CUVID 디코더로 전환하십시오.
ffprobe -i e:\input.ts
'H.264 / AVC'인 경우 아래와 같이 스 니펫을 수정하십시오.
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"
적응 형 양자화 또는 NVENC에 대한 가중 예측 옵션을 활성화하면 특히 특정 장치 드라이버 조합에서 안정성 문제가 발생할 수 있습니다. 가능한 경우 -refs:v
AQ 및 가중 예측을 토글하는 대신 B- 프레임 (3 개 이하)을 일반 옵션 을 16으로 설정하거나 그와 관련하여 사용하는 것이 좋습니다.
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"
특히 Turing을 사용하면 아래와 같이 B 프레임을 참조 용으로 활성화 할 수 있습니다 (토글 참조 -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"
스레드 수에 대한 추가 참고 사항 ( -threads
옵션을 통해 ffmpeg로 전달 ) :
특정 임계 값을 초과하는 인코더 스레드가 많을수록 대기 시간이 길어지고 인코딩 메모리 풋 프린트가 높아집니다. 인코딩 지연이 증가하여 일정한 비트 전송률 모드와 VBV (비디오 버퍼 검증기)라고하는 거의 일정한 비트 전송률 모드에서 스레드 수가 많아 질수록 품질 저하가 더욱 두드러집니다. 키 프레임은 품질이 좋지 않은 키 프레임을 펄싱하지 않으려면 다른 프레임 유형보다 더 많은 데이터가 필요합니다.
지연 제로 또는 슬라이스 스레드 모드에는 지연이 없지만이 옵션은 지원되는 인코더에서 멀티 스레드 품질을 훨씬 떨어 뜨립니다.
따라서 지각 된 인코더 처리량 증가로 인해 장기적으로 가져올 수있는 모든 이점이 상쇄되므로 대기 시간이 중요한 인코딩의 스레드 수를 제한하는 것이 좋습니다.
그리고 Windows를 사용하고 있으므로 \
위 명령을 테스트하는 Unix 상자에서이를 작성하면서 위 의 셸 이스케이프를 제거 할 수 있습니다 .
사전 설정 및 인터레이스 인코딩 고려 사항의 성능 영향에 대한 참고 사항 :
높은 처리량, 낮은 대기 시간 성능을 위해서는 하나 llhp
또는 llhq
사전 설정을 사용하고 있는지 확인하십시오 . 이는 다양한 장치와의 광범위한 호환성이 예상되는 라이브 스트리밍과 같은 워크로드에 가장 유용합니다. 따라서 B- 프레임과 같은 성능 크리핑 기능을 생략하여 더 높은 비트 전송률 사이의 균형을 유지할 수 있습니다. 사용 및 처리량. 더 높은 사전 설정 (예 : 기본값 medium
)은 엔코더 처리 속도가 크게 느려지는 동시에 품질 출력의 수익 이 빠르게 감소합니다 . 간의 품질 차이 llhp
및 llhq
측정 등의 넷플릭스의 VMAF 사실상 무시할 수는 있지만, 이전 테스트 엔코더에서 엔코더의 성능 향상 (내 테스트 베드에서 ~ 30 % 이상)은 확실히 알 수 있습니다.
들어 llhp
및 llhq
사용 사전 설정뿐만 아니라 다른 프리셋, 당신은 또한 전달하여 내장 속도 제어 방법을 대체 할 수 있습니다 -rc:v
인코더 옵션에 의해 노출로 인수를. 예를 들어, 일정한 비트 전송률 인코딩을 사용 -rc:v cbr
하면 cbr_ld_hq
속도 제어 방법 보다 훨씬 빠르므로 처리량이 20 % 증가합니다. 참고 것을 선택한 사전 설정 처리량에 가장 큰 영향이 원하는 경우 선택적으로 대체 할 수 있습니다 (예 : 사용 속도 제어 방식 등) 사전 설정 옵션 다음을.
인코딩 워크 플로우를 고려하고 필요에 따라 조정하십시오. 마일리지는 소스 콘텐츠, 사용중인 필터 체인, 특정 pltform 구성 변수 (예 : GPU 및 드라이버 버전) 등에 따라 달라집니다.
같은 호흡에서 엔비디아는 이전 Volta NVENC 엔코더를 사용하는 1660Ti 라인에서도 모든 계층에 걸쳐 튜링 에서 인터레이스 인코딩을 명시 적으로 비활성화했습니다 . 인터레이스 인코딩 지원이 필요한 경우 대신 Pascal 또는 이전 SKU로 전환하십시오.