使用CUDA加速的FFmpeg调用concat滤镜时出现格式转换错误的求助
使用CUDA加速的FFmpeg调用concat滤镜时出现格式转换错误的求助
看起来你遇到的是FFmpeg硬件加速流和concat滤镜的格式兼容问题,我来帮你分析下原因并给出解决方案。
首先来看你遇到的错误:
Impossible to convert between the formats supported by the filter 'graph 0 input from stream 0:0' and the filter 'auto_scale_0'
[fc#0 @ 0x61ae2b37a1c0] Error reinitializing filters!
这个错误的核心原因是:你通过-hwaccel_output_format cuda让输入视频帧直接留在了CUDA设备内存中,但concat滤镜目前还不支持直接处理硬件加速的帧,FFmpeg尝试自动插入格式转换/缩放滤镜时出现了不兼容的情况。而你换成nvdec/nvenc的时候,帧默认会被下载到主机内存,所以concat能正常工作。
下面给你两种可行的解决方案:
方案一:调整滤镜链,适配硬件帧与concat的兼容
我们可以先把CUDA设备上的帧下载到主机内存,完成concat拼接后再上传回CUDA进行硬件编码,修正后的命令如下:
/home/videotest/ffmpeg-dev/ffmpeg -benchmark -hide_banner -loglevel warning -y \ -hwaccel_device 0 -hwaccel cuda -hwaccel_output_format cuda \ -i /mnt/video-storage/test/cuda/surfing/intermediate1.mp4 \ -i /mnt/video-storage/test/cuda/surfing/intermediate2.mp4 \ -filter_complex '[0:v:0]hwdownload,format=yuv420p[v0];[1:v:0]hwdownload,format=yuv420p[v1];[v0][0:a:0][v1][1:a:0]concat=n=2:v=1:a=1[outv][outa];[outv]hwupload_cuda' \ -map [outv] -map [outa] \ -pix_fmt yuv420p -c:v h264_nvenc -preset p6 -profile:v high \ -force_key_frames 'expr:gte(t,n_forced*5)' -bf 0 -movflags +faststart \ -b:v 3000k -maxrate 4000k \ /mnt/video-storage/test/cuda/surfing/game.mp4
关键修改点说明:
- 对每个输入视频流用
hwdownload把CUDA设备帧下载到主机内存,同时统一格式为yuv420p,确保concat能正常处理 - 把处理后的主机帧传入
concat滤镜完成拼接 - 最后用
hwupload_cuda把拼接后的帧上传回CUDA设备,交给h264_nvenc做硬件编码,保留编码阶段的加速优势
方案二:使用concat demuxer(更高效,适合单纯拼接场景)
如果你的需求只是单纯拼接视频,且两个输入视频的编码参数、分辨率、帧率等一致,推荐用concat demuxer——它直接操作视频流,不需要额外的格式转换,配合CUDA加速效率更高:
- 先创建一个文本文件
video_list.txt,内容如下:
file '/mnt/video-storage/test/cuda/surfing/intermediate1.mp4' file '/mnt/video-storage/test/cuda/surfing/intermediate2.mp4'
- 运行FFmpeg命令:
/home/videotest/ffmpeg-dev/ffmpeg -benchmark -hide_banner -loglevel warning -y \ -hwaccel_device 0 -hwaccel cuda -hwaccel_output_format cuda \ -f concat -safe 0 -i video_list.txt \ -pix_fmt yuv420p -c:v h264_nvenc -preset p6 -profile:v high \ -force_key_frames 'expr:gte(t,n_forced*5)' -bf 0 -movflags +faststart \ -b:v 3000k -maxrate 4000k \ /mnt/video-storage/test/cuda/surfing/game.mp4
说明:
-f concat指定使用concat demuxer读取文件列表-safe 0允许使用绝对路径的视频文件- 这种方式完全避开了滤镜的格式兼容问题,全程利用CUDA加速解码和编码
如果你的两个输入视频参数不一致(比如分辨率不同),那还是得用方案一的滤镜方式,先统一格式再拼接。
备注:内容来源于stack exchange,提问作者Petr Šimůnek
相关产品推荐
相关产品推荐

