Dưới đây là hướng dẫn sơ bộ để điều chỉnh bộ mã hóa:
Chúng ta sẽ bắt đầu từ những điều cơ bản, vì sẽ rất bất lợi khi đi đến kết luận rằng một loạt các lựa chọn nhanh chóng sẽ đột nhiên cải thiện sản lượng dự kiến mà không hiểu các mục tiêu và kỳ vọng mong muốn:
1. Bắt đầu bằng cách hiểu các tùy chọn của bộ mã hóa.
Đối với các bộ mã hóa dựa trên NVENC, hãy bắt đầu với việc tìm hiểu các tùy chọn mà mỗi bộ mã hóa thực hiện (Lưu ý rằng tôi đang sử dụng Linux, đó là lý do tại sao tôi sử dụng xclip để sao chép các tùy chọn codec vào bảng tạm trước khi dán chúng ở đây):
(a). Đối với bộ mã hóa H.264:
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
Đầu ra:
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). Đối với bộ mã hóa HEVC / H.265:
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
Đầu ra:
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. Hiểu các hạn chế của phần cứng và trước tiên hãy tuân thủ các mặc định lành mạnh trước khi áp dụng các tùy chọn:
Tham khảo câu trả lời này để biết các giới hạn phần cứng bạn sẽ gặp phải với NVENC, đặc biệt đối với mã hóa HEVC trên Pascal.
Để biết cơ sở hạ tầng tăng tốc phần cứng có sẵn cho phần cứng NVIDIA thế hệ hiện tại với FFmpeg, hãy xem câu trả lời này .
Sau đó, sử dụng thông tin đó, tiến hành bước tiếp theo.
3. Cú pháp rất quan trọng:
Đây là thứ tự mà bạn phải truyền đối số cho FFmpeg:
(a). Gọi lên nhị phân.
(b). Truyền bất kỳ đối số nào cho FFmpeg (chẳng hạn như -loglevel
trực tiếp) trước khi khai báo đầu vào.
(c). Nếu bạn đang sử dụng bất kỳ giải mã được tăng tốc phần cứng nào, chẳng hạn như cuvid
, hãy khai báo nó ở đây và bao gồm bất kỳ đối số cụ thể nào mà nó yêu cầu. Tại thời điểm này, cần phải đề cập rằng các bộ giải mã có các ràng buộc cụ thể, chẳng hạn như độ phân giải đầu vào dự kiến, codec được hỗ trợ, v.v., như vậy, trong sản xuất, nên xác định và xác nhận sự cần thiết của bộ giải mã tăng tốc phần cứng là thất bại ở giai đoạn này dẫn đến một mã hóa thất bại và không thể phục hồi. Trên thực tế, các nhà phát triển MPV đã đề cập đến vấn đề này nhiều lần , đừng dựa vào giải mã được tăng tốc phần cứng để phân phối nội dung quan trọng.
(d). Khai báo đầu vào của bạn. Đối với các luồng, sử dụng URL và nếu cần, hãy thêm các cờ bổ sung (như kích thước bộ đệm) nếu cần. Đối với tài nguyên cục bộ (trên hệ thống tệp có thể truy cập), đường dẫn tệp tuyệt đối là cần thiết.
(e). Tùy chọn, chèn một bộ lọc. Điều này cần thiết cho các chức năng như thay đổi kích thước, hội thoại định dạng pixel, khử xen kẽ, v.v ... Lưu ý rằng tùy thuộc vào bộ lọc được sử dụng ở đây, bộ giải mã dựa trên phần cứng (như được mô tả trong phần (c) sẽ đưa ra các ràng buộc mà bộ lọc của bạn phải có thể xử lý, nếu không mã hóa của bạn sẽ thất bại.
(f). Gọi lên video và âm thanh mã hóa thích hợp, và vượt qua đối số cần thiết đối với họ, chẳng hạn như ánh xạ, bitrate, cài đặt trước bộ mã hóa, vv Khi nói đến bitrate, đảm bảo rằng giá trị mong muốn của bạn được thiết lập thông qua -b:v
, -maxrate:v
và -bufsize:v
tùy chọn. Đừng để trống. Đây là một điểm khởi đầu tốt về lý do tại sao những giá trị này quan trọng. Như mọi khi, bắt đầu bằng cách chỉ định một cài đặt trước. Cuộn xuống phía dưới để xem ghi chú về tác động hiệu suất của các cài đặt trước với bộ mã hóa cụ thể này.
(g). Trong khi FFmpeg có thể suy ra định dạng đầu ra cần thiết của một tệp tùy thuộc vào phần mở rộng đã chọn của tệp đầu ra, bạn nên khai báo rõ ràng định dạng đầu ra (thông qua tùy chọn -f) để có thể chuyển các tùy chọn bổ sung cho muxer bên dưới , như thường thấy với các định dạng phát trực tuyến như HLS, mpegts và DASH.
(h). Đường dẫn tuyệt đối đến tệp đầu ra.
Với ví dụ của bạn ở trên, được trích dẫn là:
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
Bạn có thể nâng cao chất lượng đầu ra bằng cách xác định bitrate thích hợp (thông qua -b:v
, -maxrate:v
và -bufsize:v
cài đặt), cho phép các kỹ thuật mã hóa lượng tử thích nghi (phương pháp AQ không gian và thời được hỗ trợ, trong đó chỉ có một người có thể được sử dụng tại một thời điểm) và bằng cách tùy ý (và riêng) cho phép dự đoán có trọng số (sẽ vô hiệu hóa hỗ trợ khung B) như hiển thị bên dưới, cũng như bộ lọc tùy chọn để thu nhỏ kích thước phù hợp và thay đổi kích thước nếu cần. Ví dụ dưới đây cho thấy đoạn mã xử lý đầu vào mpegts được mã hóa trong 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"
Cảnh báo: Lưu ý rằng dự đoán có trọng số ( -weighted_pred
) không thể được bật cùng lúc với lượng tử hóa thích ứng. Cố gắng làm như vậy sẽ dẫn đến lỗi khởi tạo bộ mã hóa.
Đoạn mã trên giả định rằng tệp đầu vào là một luồng MPEG2. Nếu không phải như vậy, hãy chuyển sang bộ giải mã CUVID chính xác sau khi phân tích nó:
ffprobe -i e:\input.ts
Nếu 'H.264 / AVC, hãy sửa đổi đoạn mã như dưới đây:
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"
Tôi đã nhận thấy rằng việc cho phép tùy chọn dự đoán lượng tử hóa thích ứng HOẶC trọng số cho NVENC có thể gây ra sự cố với tính ổn định, đặc biệt là với các kết hợp trình điều khiển thiết bị cụ thể. Nếu có thể, hãy cân nhắc sử dụng các khung B (không quá 3) kết hợp với tùy chọn chung -refs:v
được đặt thành 16 hoặc ở đó, thay vì bật AQ và dự đoán có trọng số:
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"
Cụ thể, với Turing , bạn cũng có thể hưởng lợi từ việc bật khung B để tham khảo như hiển thị bên dưới (xem phần chuyển đổi -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"
Một ghi chú thêm về số lượng luồng (được chuyển đến ffmpeg thông qua -threads
tùy chọn):
Nhiều luồng mã hóa vượt quá một ngưỡng nhất định làm tăng độ trễ và sẽ có dung lượng bộ nhớ mã hóa cao hơn. Suy giảm chất lượng nổi bật hơn với số lượng luồng cao hơn trong các chế độ bitrate không đổi và chế độ bitrate gần như không đổi được gọi là VBV (trình xác minh bộ đệm video), do độ trễ mã hóa tăng. Các khung hình chính cần nhiều dữ liệu hơn các loại khung khác để tránh xung các khung hình chính kém chất lượng.
Chế độ luồng không trễ hoặc cắt lát không có độ trễ, nhưng tùy chọn này càng làm giảm chất lượng đa luồng trong các bộ mã hóa được hỗ trợ.
Do đó, khôn ngoan là hạn chế số lượng luồng trên các mã hóa khi độ trễ quan trọng, vì thông lượng bộ mã hóa nhận thức tăng bù đắp bất kỳ lợi thế nào mà nó có thể mang lại trong dài hạn.
Và vì bạn đang ở trên Windows, bạn có thể muốn xóa shell thoát \
ở trên vì tôi đang viết cái này từ hộp Unix đang kiểm tra lệnh ở trên.
Lưu ý về tác động hiệu suất với các cài đặt trước và cân nhắc mã hóa xen kẽ:
Để có thông lượng cao, hiệu suất trễ, đảm bảo bạn đang sử dụng một trong hai llhp
hoặc llhq
cài đặt trước. Điều này hữu ích nhất cho các khối lượng công việc như phát trực tiếp khi có khả năng tương thích rộng hơn với nhiều loại thiết bị hơn và do đó, các tính năng làm tê liệt hiệu suất như khung B có thể được bỏ qua hoàn toàn để trao đổi tốt giữa tốc độ bit cao hơn sử dụng và thông lượng. Các cài đặt trước cao hơn (như mặc định medium
) có lợi nhuận giảm nhanh chóng trong đầu ra chất lượng đồng thời phát sinh sự chậm lại đáng kể trong thông lượng bộ mã hóa. Sự khác biệt về chất lượng giữa llhp
và llhq
được đo bằng VMAF của Netflix hầu như không đáng kể, nhưng hiệu suất của bộ mã hóa tăng (hơn ~ 30% trên giường thử nghiệm của tôi) với cái trước là chắc chắn đáng giá.
Cho llhp
llhq
cài đặt trước và cũng như các cài đặt trước khác đang sử dụng, bạn cũng có thể ghi đè các phương thức kiểm soát tỷ lệ được xây dựng bằng cách chuyển các -rc:v
đối số được hiển thị bởi các tùy chọn bộ mã hóa. Ví dụ, với mã hóa tốc độ bit không đổi, bạn có thể chỉ định -rc:v cbr
(nhanh hơn đáng kể so với cbr_ld_hq
phương pháp kiểm soát tốc độ, mang lại mức tăng thêm ~ 20% cho thông lượng). Lưu ý rằng giá trị đặt trước được chọn có tác động lớn nhất đến thông lượng , theo sau là các tùy chọn đặt sẵn (như phương pháp kiểm soát tốc độ đang sử dụng) mà bạn có thể tùy ý ghi đè nếu muốn.
Xem xét quy trình mã hóa của bạn và điều chỉnh khi cần thiết. Số dặm của bạn chắc chắn sẽ thay đổi, dựa trên nội dung nguồn của bạn, chuỗi bộ lọc đang sử dụng, các biến cấu hình pltform cụ thể (như phiên bản GPU và trình điều khiển của bạn), v.v.
Trong cùng một hơi thở, lưu ý rằng NVIDIA đã vô hiệu hóa mã hóa xen kẽ trên Turing trên tất cả các tầng, ngay cả trong dòng 1660Ti sử dụng bộ mã hóa Volta NVENC cũ. Nếu bạn yêu cầu hỗ trợ mã hóa xen kẽ, vui lòng chuyển sang Pascal hoặc SKU cũ hơn.