Berikut ini panduan kasar untuk menyetel pembuat enkode:
Kami akan mulai dari dasar-dasarnya, karena akan merugikan untuk menyimpulkan bahwa rentetan cepat dari opsi akan tiba-tiba meningkatkan output yang diharapkan tanpa memahami tujuan dan harapan yang diinginkan:
1. Mulailah dengan memahami opsi pembuat enkode.
Untuk pembuat enkode berbasis NVENC, mulailah dengan mempelajari opsi yang diambil oleh masing-masing pembuat enkode (Perhatikan bahwa saya menggunakan Linux, itulah sebabnya saya menggunakan xclip untuk menyalin opsi codec ke clipboard sebelum menempelkannya di sini):
(Sebuah). Untuk pembuat enkode H.264:
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip
Keluaran:
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). Untuk enkoder HEVC / H.265:
ffmpeg -hide_banner -h encoder=hevc_nvenc | xclip -sel clip
Keluaran:
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. Memahami keterbatasan perangkat keras, dan tetap berpegang pada standar waras terlebih dahulu sebelum menerapkan opsi:
Lihat jawaban ini untuk batasan perangkat keras yang akan Anda hadapi dengan NVENC, terutama untuk pengkodean HEVC pada Pascal.
Untuk infrastruktur akselerasi perangkat keras yang tersedia untuk perangkat keras NVIDIA generasi terbaru dengan FFmpeg, lihat jawaban ini .
Kemudian, menggunakan informasi itu, lanjutkan ke langkah berikutnya.
3. Sintaks sangat penting:
Berikut adalah urutan Anda harus menyampaikan argumen ke FFmpeg:
(Sebuah). Panggil biner.
(b). Berikan argumen apa pun ke FFmpeg (seperti -loglevel
langsung) sebelum menyatakan input.
(c). Jika Anda menggunakan pengodean akselerasi perangkat keras apa pun, seperti cuvid
, nyatakan di sini dan sertakan argumen spesifik yang diperlukan. Pada titik ini, akan sangat penting untuk menyebutkan bahwa decoder memiliki kendala spesifik, seperti resolusi input yang diharapkan, codec yang didukung, dll, dan oleh karena itu, direkomendasikan bahwa dalam produksi, untuk menentukan dan memvalidasi kebutuhan decoder akselerasi perangkat keras sebagai kegagalan. pada tahap ini menghasilkan penyandian yang gagal dan tidak dapat dipulihkan. Faktanya, para pengembang MPV telah menyebutkan hal ini berulang kali , tidak bergantung pada decoding perangkat keras yang dipercepat untuk pengiriman konten yang sangat penting.
(d). Nyatakan masukan Anda. Untuk streaming, gunakan URL dan jika perlu, tambahkan bendera tambahan (seperti ukuran buffer) sesuai kebutuhan. Untuk sumber daya lokal (pada sistem file yang dapat diakses), jalur file absolut diperlukan.
(e). Secara opsional, masukkan filter. Ini diperlukan untuk fungsi-fungsi seperti mengubah ukuran, percakapan format piksel, de-interlacing, dll. Perhatikan bahwa tergantung pada filter yang digunakan di sini, dekoder berbasis perangkat keras (seperti yang dijelaskan pada bagian (c) akan menimbulkan kendala yang harus dihadapi oleh filter Anda. mampu menangani, jika tidak encode Anda akan gagal.
(f). Panggil enkoder video dan audio yang sesuai, dan berikan argumen yang diperlukan kepada mereka, seperti pemetaan, bitrate, preset encoder, dll. Ketika datang ke bitrate, pastikan bahwa nilai yang Anda inginkan diatur melalui opsi -b:v
, -maxrate:v
dan -bufsize:v
. Jangan biarkan ini kosong. Ini adalah titik awal yang baik tentang mengapa nilai-nilai ini penting. Seperti biasa, mulailah dengan menentukan preset. Gulir ke bawah ke bawah untuk melihat catatan tentang dampak kinerja preset dengan enkoder khusus ini.
(g). Sedangkan FFmpeg dapat menyimpulkan format output yang diperlukan dari suatu file tergantung pada ekstensi yang dipilih dari file output, disarankan untuk secara eksplisit mendeklarasikan format output (melalui opsi -f) sehingga opsi tambahan dapat diteruskan ke muxer yang mendasarinya jika diperlukan , seperti yang sering terjadi dengan format streaming seperti HLS, mpegts dan DASH.
(h). Path absolut ke file output.
Dengan contoh Anda di atas, dikutip sebagai:
ffmpeg -i "e:\input.ts" -vcodec h264_nvenc -preset slow -level 4.1
-qmin 10 -qmax 52 "e:\output.mp4"
Anda dapat meningkatkan kualitas output dengan menentukan bitrate yang tepat (melalui -b:v
, -maxrate:v
dan -bufsize:v
pengaturan), memungkinkan teknik pengkodean kuantisasi adaptif (metode AQ spasial dan temporal didukung, yang hanya satu yang dapat digunakan pada satu waktu) dan dengan opsional (dan secara terpisah) memungkinkan prediksi tertimbang (yang akan menonaktifkan dukungan bingkai-B) seperti yang ditunjukkan di bawah ini, serta filter opsional untuk skala bawah yang tepat dan mengubah ukuran jika diperlukan. Contoh di bawah ini menunjukkan snippet handling input mpegts yang disandikan dalam 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"
Peringatan: Perhatikan bahwa prediksi berbobot ( -weighted_pred
) tidak dapat diaktifkan bersamaan dengan kuantisasi adaptif. Mencoba melakukannya akan mengakibatkan kegagalan inisialisasi pembuat enkode.
Cuplikan di atas mengasumsikan bahwa file input adalah aliran MPEG2. Jika bukan itu masalahnya, alihkan ke decoder CUVID yang benar setelah menganalisisnya:
ffprobe -i e:\input.ts
Jika 'H.264 / AVC-nya, ubah cuplikan seperti yang ditunjukkan di bawah ini:
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"
Saya perhatikan bahwa mengaktifkan kuantisasi adaptif atau opsi prediksi berbobot untuk NVENC dapat menimbulkan masalah dengan stabilitas, terutama dengan kombinasi driver perangkat tertentu. Jika memungkinkan, pertimbangkan untuk menggunakan B-frame (tidak lebih dari 3) yang dikombinasikan dengan opsi generik yang -refs:v
diatur ke 16 atau sekitar itu, alih-alih beralih pada AQ dan prediksi tertimbang:
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"
Dengan Turing , khususnya, Anda juga dapat mengambil manfaat dari mengaktifkan B-frame untuk referensi seperti yang ditunjukkan di bawah ini (lihat sakelar -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"
Catatan tambahan tentang jumlah utas (diteruskan ke ffmpeg melalui -threads
opsi):
Semakin banyak utas enkoder di luar batas tertentu akan meningkatkan latensi dan akan memiliki jejak memori penyandian yang lebih tinggi. Degradasi kualitas lebih menonjol dengan jumlah utas yang lebih tinggi dalam mode bitrate konstan dan mode bitrate mendekati-konstan yang disebut VBV (video buffer verifier), karena peningkatan penundaan enkode. Keyframe membutuhkan lebih banyak data daripada jenis bingkai lain untuk menghindari berdenyut keyframe berkualitas buruk.
Mode zero-delay atau slice thread tidak memiliki delay, tetapi opsi ini semakin memperburuk kualitas multi-thread dalam encoders yang didukung.
Oleh karena itu bijaksana untuk membatasi jumlah utas pada enkode di mana latensi penting, karena throughput enkoder yang dirasakan meningkatkan offset manfaat apa pun yang mungkin terjadi dalam jangka panjang.
Dan karena Anda menggunakan Windows, Anda mungkin ingin menghapus shell lolos di \
atas karena saya menulis ini dari kotak Unix menguji perintah di atas.
Catatan tentang dampak kinerja dengan preset dan pertimbangan enkode interlaced:
Untuk throughput tinggi, kinerja latensi rendah, pastikan Anda menggunakan salah satu llhp
atau llhq
preset. Ini sangat berguna untuk beban kerja seperti streaming langsung di mana kompatibilitas yang lebih luas dengan berbagai perangkat yang lebih luas diharapkan, dan dengan demikian, fitur yang melumpuhkan kinerja seperti B-frame dapat dihilangkan sama sekali untuk pertukaran yang baik antara bit-rate yang lebih tinggi di gunakan dan throughput. Preset yang lebih tinggi (seperti default medium
) memiliki pengembalian yang cepat dalam output kualitas sementara pada saat yang sama menimbulkan perlambatan signifikan dalam throughput encoder. Perbedaan kualitas antara llhp
dan llhq
sebagaimana diukur oleh Netflix's VMAF hampir dapat diabaikan, namun peningkatan kinerja pembuat enkode (lebih dari ~ 30% pada test bed saya) dengan yang pertama jelas cukup besar.
Untuk llhp
dan llhq
pra - atur, serta pra-set yang digunakan, Anda juga dapat mengesampingkan metode kontrol-tingkat bawaan dengan meneruskan -rc:v
argumen yang diekspos oleh opsi enkoder. Misalnya, dengan penyandian laju bit konstan, Anda dapat menentukan -rc:v cbr
(yang secara signifikan lebih cepat daripada cbr_ld_hq
metode kontrol laju, membawa tambahan ~ 20% tambahan untuk throughput). Perhatikan bahwa preset yang dipilih memiliki dampak terbesar pada throughput , diikuti oleh opsi preset (seperti metode kontrol laju yang digunakan) yang secara opsional dapat Anda timpa jika diinginkan.
Pertimbangkan alur kerja penyandian Anda dan sesuaikan seperlunya. Jarak tempuh Anda pasti akan bervariasi, berdasarkan konten sumber Anda, rantai filter yang digunakan, variabel konfigurasi pltform tertentu (seperti GPU dan versi driver Anda), dll.
Dalam napas yang sama, perhatikan bahwa NVIDIA telah secara eksplisit menonaktifkan pengkodean interlaced pada Turing di semua tingkatan, bahkan di garis 1660Ti yang menggunakan encoder Volta NVENC yang lebih tua. Jika Anda memerlukan dukungan enkode interlaced, silakan beralih ke Pascal atau SKU lama.