FFmpeg:如何同时堆叠两个视频,并使用 scale_cuda 仅放大一个视频?

FFmpeg:如何同时堆叠两个视频,并使用 scale_cuda 仅放大一个视频?

这是我使用过的命令,scale_npp可以代替scale_cuda

ffmpeg -c:v h264_cuvid -i "Input1.mkv" -c:v h264_cuvid -i "Input2.mkv" -c:v h264_nvenc -filter_complex "hwupload_cuda,[0:v]scale_cuda=w=1920:h=1080:format=yuv420p:interp_algo=lanczos;[0v][1:v]hstack,hwdownload,format=yuv420p" "output.mkv" -y

但是使用scale_cuda,输出内容如下:

[AVFilterGraph @ 0x565389e2a780] Too many inputs specified for the "scale_cuda" filter

但是这个命令只涉及升级,并且只对 1 个视频有效:

ffmpeg -c:v h264_cuvid -i "Input1.mkv" -c:v h264_nvenc -filter_complex "hwupload_cuda,scale_cuda=w=1920:h=1080:format=yuv420p:interp_algo=lanczos,hwdownload,format=yuv420p" "output.mkv" -y

执行第一个命令的正确方法是什么?

答案1

以下命令应该有效:

ffmpeg -c:v h264_cuvid -i "Input1.mkv" -c:v h264_cuvid -i "Input2.mkv" -filter_complex "[0:v]hwupload_cuda,scale_cuda=w=1920:h=1080:format=nv12:interp_algo=lanczos,hwdownload[0v];[0v][1:v]hstack" -c:v h264_nvenc "output.mkv" -y


  • [0:v]hwupload_cuda,将Input1.mkv的视频流上传到GPU。
  • hwdownload[0v],从 GPU 下载缩放后的视频,并为其指定临时名称[0v]
    我们必须在应用之前从 GPU 下载视频hstack,因为hstack过滤器无法进行 CUDA 加速。
    所选格式为nv12,以匹配(解码的)Input2.mkv 的格式。

测试:

  • 构建合成输入文件(用于测试):
    ffmpeg -f lavfi -i testsrc=size=192x108:rate=1:duration=10 -c:v libx264 -pix_fmt yuv420p Input1.mkv
    ffmpeg -f lavfi -i testsrc=size=1920x1080:rate=1:duration=10 -c:v libx264 -pix_fmt yuv420p Input2.mkv
  • 执行上述命令。

无需以下操作也能正常工作format=nv12

ffmpeg -c:v h264_cuvid -i "Input1.mkv" -c:v h264_cuvid -i "Input2.mkv" -filter_complex "[0:v]hwupload_cuda,scale_cuda=w=1920:h=1080:interp_algo=lanczos,hwdownload[0v];[0v][1:v]hstack" -c:v h264_nvenc "output.mkv" -y

相关内容