Eu coloco marca d'água em vídeos como este:
ffmpeg -y -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i ./input.avi -i ./watermark.png -filter_complex "
[0]hwdownload,format=nv12[downloaded_video];
[1]format=rgba,colorchannelmixer=aa=0.3[logo];
[logo]scale=300:300[scaled_logo];
[downloaded_video][scaled_logo]overlay=W-w-10:H-h+10[overlayed_video];
[overlayed_video]hwupload_cuda=extra_hw_frames=5" -c:v h264_nvenc ./output.mp4
Existe alguma maneira de usar algum dos filtros de escala da nvidia (scale_cuda, scale_npp, scale2ref_npp) e filtro de sobreposição (overlay_cuda) para fazer isso evitando hwdownload e hwupload? Tentei de várias maneiras e não consegui preservar a transparência da imagem png, o que torna a marca d'água um grande bloco branco.
Usando o FFmpeg versão 7.1 com
[0:v][uploaded_logo]overlay_cuda
há um erroCan't overlay yuva420p on nv12
(mas nenhum bloco branco).Podemos consertá-lo usando
[0:v]scale_cuda=format=yuv420p
para converter de NV12 parayuv420p
:ffmpeg -y -hwaccel cuda -hwaccel_output_format cuda -c:v h264_cuvid -i ./input.avi -i ./watermark.png -filter_complex "[0:v]scale_cuda=format=yuv420p[yuv420p_video];[1]format=rgba,colorchannelmixer=aa=0.3,scale=300:300,hwupload_cuda[uploaded_logo];[yuv420p_video][uploaded_logo]overlay_cuda=W-w-10:H-h+10" -c:v h264_nvenc ./output.mp4
-c:v h264_cuvid
- selecione o decodificador especificamente em relação aocomentário de Gyan na postagem a seguir . (a solução está funcionando sem ele).
[1]format=rgba,colorchannelmixer=aa=0.3,scale=300:300,hwupload_cuda[uploaded_logo]
- Prepare o logotipo na CPU e carregue-o na GPU. O formato do logotipo carregado é automaticamente convertido dergba
parayuva420p
.[0:v]scale_cuda=format=yuv420p[yuv420p_video]
- Converta o formato do vídeo decodificado na GPU do formato NV12 padrão parayuv420p
o formato . É necessário porqueoverlay_cuda
o filtro não pode sobreporyuva420p
o formato sobre o formato NV12.[yuv420p_video][uploaded_logo]overlay_cuda=W-w-10:H-h+10
- useoverlay_cuda
o filtro para sobrepor o logotipo sobre o vídeo na GPU.Teste:
Crie um arquivo de entrada de exemplo:
ffmpeg -y -f lavfi -i testsrc=size=640x480:rate=10:duration=10 -c:v libx264 -pix_fmt yuv420p input.avi
Use a seguinte marca d'água .
Executar o comando acima (usando

aa=0.9
) fornece a saída desejada:Nota: A
sobreposição não é tão precisa quanto a sobreposição devido à subamostragem de cores dos formatos. Parece que as implementações de GPU são limitadas a formatos de pixel "subamostrados" (mas não tentei todas as opções).
yuva420p
yuv420p
rgba
rgb24
4:2:0