这是我使用过的命令,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