升级FFmpeg至6.1.1后无法用CUDA转码,RTX4090求正确命令
FFmpeg 6.1.1 + RTX 4090 CUDA转码命令修正
问题背景
此前用FFmpeg 5.1搭配FFmpeg Batch工具,通过以下命令加前置参数-hwaccell cuvid可正常将4K视频转1080P:
-map 0 -map -0:t -filter_complex "scale_cuda=1920:1080:format=yuv420p:interp_algo=lanczos,hwdownload" -fps_mode:v passthrough -c:v h264_nvenc -preset 18 -profile:v high -level 4.1 -b:v 13000K -rc cbr -c:a copy -c:s copy
升级到FFmpeg 6.1.1后,改用-hwaccel cuda无法正常转码,先后出现Cannot find a matching stream for unlabeled input pad scale_cuda:default、格式转换不兼容、NVENC 10bit编码不支持等错误,替换-filter_complex为-vf也无效。
错误核心原因
- FFmpeg 6.x对CUDA硬件加速链路要求更严格,必须明确将输入帧上传到GPU后才能使用CUDA滤镜;
- 原命令未指定主视频流,导致编码器误尝试对非主视频流转码,触发10bit编码错误;
scale_cuda在filter_complex中需要明确标记输入输出链路,否则无法匹配流。
修正后的转码命令
-hwaccel cuda -hwaccel_output_format cuda -map 0 -map -0:t -filter_complex "[0:v:0]hwupload_cuda,scale_cuda=1920:1080:format=yuv420p:interp_algo=lanczos,hwdownload,format=yuv420p[v]" -map "[v]" -fps_mode:v passthrough -c:v h264_nvenc -preset p18 -profile:v high -level 4.1 -b:v 13000K -rc cbr -c:a copy -c:s copy
关键调整说明
- 硬件加速链路修正:添加
-hwaccel_output_format cuda确保解码后的帧直接在GPU内存中,配合hwupload_cuda将帧上传到CUDA设备,让scale_cuda能直接处理GPU帧; - Filter链路明确:用
[0:v:0]指定主视频流作为输入,[v]标记输出流,再通过-map "[v]"绑定到输出,避免流匹配错误; - 编码器参数兼容:将
preset 18改为preset p18(FFmpeg 6.x中NVENC预设的标准写法,数字18为别名); - 格式统一:
hwdownload后添加format=yuv420p确保输出帧格式与编码器要求一致,避免格式转换冲突; - 多流处理:明确指定主视频流,避免FFmpeg尝试对其他视频流转码,解决10bit编码错误。
备选简化命令(单视频流场景)
如果输入只有一条视频流,可改用-vf简化写法:
-hwaccel cuda -hwaccel_output_format cuda -map 0 -map -0:t -vf "hwupload_cuda,scale_cuda=1920:1080:format=yuv420p:interp_algo=lanczos,hwdownload,format=yuv420p" -fps_mode:v passthrough -c:v h264_nvenc -preset p18 -profile:v high -level 4.1 -b:v 13000K -rc cbr -c:a copy -c:s copy
内容的提问来源于stack exchange,提问作者Peppe
相关产品推荐
相关产品推荐

