Bir SBS videosu oluşturmak için ffmpeg overlay_cuda filtresi nasıl kullanılır?
FFMPEG, birkaç ay önce yeni filtre "overlay_cuda" ile FFMPEG'in yeni sürümünü piyasaya sürdü, bu filtre "overlay" ile aynı şeyi yapar, ancak onu uygulamak için bir Nvidia kartı kullanır.
Filtrenin FFMPEG web sitesinde açıklamasını buldum, ancak nasıl kullanılacağına dair bir örnek bulamadım. Bulduğum tek örnek geliştiricinin taahhütlerinden, ancak başka bir videonun üzerine bir video veya fotoğraf koymak.
Bunu iki kat genişliğe sahip bir nullsrc görüntüsü kullanarak yapmak için normal overlay filtresinden önce, ancak şimdi bu filtreyle nasıl yapılacağını bilmiyorum.
Kaydetme açıklaması: https://patchwork.ffmpeg.org/project/ffmpeg/patch/[email protected]/ ffmpeg belgeleri web sayfası: https://ffmpeg.org/ffmpeg-filters.html#overlay_005fcuda-1
Umarım bana yardım edebilirsin
Güncelleme:
Bu FFmpeg siparişini şu şekilde verdim:
- Her videoyu girin.
- İlk video sağda dolgu oluşturur ve ardından kartın belleğine yüklenir.
- Yer paylaşımlı Cuda ile, diğer video orijinal videonun sağına yerleştirilir.
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
Ama bu hata mesajını alıyorum:
[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
Piksel formatlarıyla ilgili sorunlarım var, umarım bana yardımcı olabilirsiniz.
Güncelleme 2:
Sonunda piksel formatı sorununu çözdüm ve şimdi dolgu ile kaplamayı yapıyorum (yer paylaşımlı videoya alan ekler)
Bu, başarılı olan komuttur:
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
Şimdi x=800
gibi bir değişkene geçmek istiyorum x=iw+1
ama görünen o ki bu filtre bunu desteklemiyor. Global bir değişken oluşturmanın bir yolu var mı?
Yanıtlar
Anladım! Cuda filtreleri ile neler yapabileceğimi tekrar okuduktan sonra, scale_npp
sadece videoları yeniden boyutlandırmakla kalmayıp, piksel formatını da değiştirebileceğinizi öğrendim .
Birkaç testten sonra çok güzel bir çözüm buldum:
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
Bu FFMPEG komutunu yapan şey:
- Cuda kod çözme ile iki video girin.
- İlk video
[0:v]
:- En-boy oranlı radyoyu bir YUV420P piksel formatında tutan 640 piksel genişliğe kadar çıkış
- GPU belleğinden sistem belleğine indirin
- Videonun sağına 640 piksel genişlik eklemek için bir Dolgu filtresi uygulayın
- GPU belleğine tekrar yükleyin
- Piksel formatını nv12 olarak değiştirin
- Şu şekilde etiketle:
[base]
- İkinci video
[1:v]
- En-boy oranlı radyoyu NV12 piksel formatı ile koruyan 640 piksel genişliğe kadar çıkış
- Şu şekilde etiketle:
[overlay_video]
overlay_cuda
Filtre uygula[base]
arka plan videosu olarak video[overlay_video]
ön plandaki video olarak video- Video
[overlay_video]
olarak sağa 640 piksel ekleyin[base]
- Kodlamayı bitir
-an
Audio null olarak (Bu silinebilir, gerçek kullanımda ses sinyallerini karıştırmanız veya iki videodan birini seçmeniz, hatta harici bir ses kaynağı eklemeniz gerekir.)-c:v h264_nvenc
GPU'yu h264 codec ile kullanarak videoyu kodlayın (Burada ihtiyaçlarınıza göre değişiklik yapabilirsiniz).
Tek dezavantajı, önceden bir çözünürlük ayarlamanız gerekmesidir, giriş çözünürlüğünü ayarlamanın bir yolu yoktur (normal kaplama filtresinde olduğu gibi). Neyse ki, bunu komut dosyası için bir değişken gibi yapabilir ve ffprobe
daha önce bu değişkeni almak için kullanabilirsiniz .