Bagaimana cara menggunakan filter ffmpeg overlay_cuda untuk membuat video SBS?

Aug 18 2020

FFMPEG beberapa bulan lalu meluncurkan versi baru FFMPEG dengan filter baru "overlay_cuda", filter ini membuatnya sama dengan "overlay" tetapi menggunakan kartu Nvidia untuk menerapkannya.

Saya menemukan di situs FFMPEG deskripsi filter, tetapi tidak ada contoh bagaimana menggunakannya. Satu-satunya contoh yang saya temukan berasal dari pengembang yang berkomitmen tetapi menempatkan video atau foto di atas video lain.

Saya sebelum filter overlay normal melakukan ini dengan menggunakan gambar nullsrc dengan lebar dua kali tetapi sekarang saya tidak tahu bagaimana menggunakan filter ini.

Deskripsi komitmen: https://patchwork.ffmpeg.org/project/ffmpeg/patch/[email protected]/ halaman web dokumentasi ffmpeg: https://ffmpeg.org/ffmpeg-filters.html#overlay_005fcuda-1

Saya harap Anda dapat membantu saya.

Memperbarui:

Saya membuat pesanan FFmpeg ini yang:

  1. Masukkan setiap video.
  2. Video pertama membuat padding ke kanan dan kemudian diunggah ke memori kartu.
  3. Dengan overlay Cuda, menempatkan video lain di sebelah kanan video aslinya.
ffmpeg -y -loglevel info \
-i $video_1 \ -hwaccel cuda -hwaccel_output_format cuda -i $video_2 \
-filter_complex \
" \
[0:v]pad=w=2*iw:h=ih:x=0:y=0,hwupload_cuda[base];
[base][1:v]overlay_cuda=x=800:y=0" \
-an -c:v h264_nvenc overlay_test.mp4

Tapi saya mendapatkan pesan kesalahan ini:

[overlay_cuda @ 0x55fdec4b2ec0] Can't overlay nv12 on yuv420p 
[Parsed_overlay_cuda_2 @ 0x55fdec4b2d80] Failed to configure output pad on Parsed_overlay_cuda_2
Error reinitializing filters!
Failed to inject frame into filter network: Invalid argument
Error while processing the decoded data for stream #1:0

Saya memiliki masalah dengan format piksel, saya harap Anda dapat membantu saya.

Perbarui 2:

Saya akhirnya memecahkan masalah format piksel dan sekarang membuat overlay dengan padding (menambahkan ruang ke video overlay)

Ini adalah perintah yang berhasil:

ffmpeg -y -loglevel info \
-i $video_1 \ -hwaccel cuda -hwaccel_output_format cuda -i $video_2 \
-filter_complex \
" \
[0:v]pad=w=2*iw:h=ih:x=0:y=0,hwupload_cuda,scale_npp=format=nv12[base];
[base][1:v]overlay_cuda=x=800:y=0" \
-an -c:v h264_nvenc overlay_test.mp4

Sekarang saya ingin mengubah x=800ke variabel seperti x=iw+1tetapi tampaknya filter ini tidak mendukung itu. Apakah ada cara untuk mengatur variabel global?

Jawaban

Maxtrix Aug 24 2020 at 17:37

Saya mendapatkannya! Setelah membaca lagi apa yang dapat saya lakukan dengan filter Cuda, saya menemukan bahwa scale_npptidak hanya mengubah ukuran video, tetapi juga Anda dapat mengubah format piksel.

Jadi setelah beberapa tes saya menemukan solusi yang sangat bagus:

ffmpeg -y -loglevel info \
-hwaccel cuda -hwaccel_output_format cuda -i $video_1 \ -hwaccel cuda -hwaccel_output_format cuda -i $video_2 \
-filter_complex \
" \
[0:v]scale_npp=640:-2:format=yuv420p,hwdownload,pad=w=2*iw:h=ih:x=0:y=0,hwupload_cuda,scale_npp=format=nv12[base];
[1:v]scale_npp=640:-2:format=nv12[overlay_video];
[base][overlay_video]overlay_cuda=x=640:y=0" \
-an -c:v h264_nvenc overlay_test.mp4

Apa yang membuat perintah FFMPEG ini:

  1. Masukkan dua video dengan decoding Cuda.
  2. Video pertama [0:v]:
    • Tingkatkan ke lebar 640 piksel dengan mempertahankan aspek radio dengan format piksel YUV420P
    • Unduh dari memori GPU ke memori sistem
    • Terapkan filter Padding untuk menambahkan lebar 640 piksel di sebelah kanan video
    • Unggah lagi ke memori GPU
    • Ubah format piksel menjadi nv12
    • Beri label sebagai [base]
  3. Video kedua [1:v]
    • Tingkatkan ke lebar 640 piksel dengan mempertahankan aspek radio dengan format NV12 piksel
    • Beri label sebagai [overlay_video]
  4. Terapkan overlay_cudafilter
    • [base] video sebagai video latar belakang
    • [overlay_video] video sebagai video latar depan
    • Masukkan [overlay_video]640 piksel ke kanan sebagai [base]video
  5. Selesaikan encoding
    • -an sebagai Audio null (Ini dapat dihapus, dalam penggunaan nyata Anda perlu mencampur sinyal audio atau memilih salah satu dari dua video, atau bahkan menambahkan sumber audio eksternal.)
    • -c:v h264_nvenc Encode video menggunakan GPU dengan codec h264 (Di sini Anda dapat mengubah sesuai kebutuhan Anda).

Satu-satunya kelemahan adalah Anda perlu mengatur resolusi dari sebelumnya, tidak ada cara untuk mengatur resolusi input (Seperti pada filter overlay normal). Untungnya, Anda dapat membuat ini seperti variabel untuk skrip dan digunakan ffprobeuntuk mendapatkan variabel ini sebelumnya.