使用FFmpeg cuvid硬件加速合并视频报错,求可行解决方案
我之前也碰到过一模一样的问题——用filter_complex里的concat滤镜结合cuvid硬件加速时,总会抛出格式转换失败的错误,去掉硬件加速参数后虽然能跑,但CPU直接拉满。
问题根源
h264_cuvid解码输出的是CUDA硬件帧(不是常规的CPU内存帧),而concat复杂滤镜并不支持直接处理这种硬件帧格式。FFmpeg会自动尝试插入auto_scaler_0滤镜来转换格式,但这个转换在你使用的FFmpeg 3.4.2版本里还没实现对CUDA硬件帧的支持,所以才会报错:
Impossible to convert between the formats supported by the filter 'Parsed_concat_0' and the filter 'auto_scaler_0' Error reinitializing filters! Failed to inject frame into filter network: Function not implemented
解决方案:改用concat解复用器
不需要依赖复杂滤镜,直接用FFmpeg的concat解复用器就能完美解决——这种方式要么直接复制流(完全不用CPU),要么结合硬件编解码,既能保证速度,又不会出现格式兼容问题。
步骤1:创建文件列表
新建一个list.txt,把要合并的视频路径按格式写进去,每行一个:
file '/path/to/your/first/video.ts' file '/path/to/your/second/video.mp4' file '/path/to/your/third/video.ts'
步骤2:执行合并命令
场景1:所有视频编码格式一致(直接复制流,最快)
如果你的所有输入视频的音视频编码格式完全相同,用这个命令直接复制流,CPU负载几乎为0:
ffmpeg -y -f concat -safe 0 -i list.txt -c copy result.mp4
参数说明:
-f concat:指定使用concat解复用器处理输入列表-safe 0:允许列表里使用绝对路径(如果用相对路径可以去掉)-c copy:直接复制音视频流,跳过解码/编码步骤-y:自动覆盖已存在的输出文件
场景2:需要重新编码(结合cuvid硬件加速)
如果输入视频编码格式不一致,必须重新编码,那可以结合cuvid硬件解码和nvenc硬件编码,保证全程硬件加速:
ffmpeg -hwaccel cuvid -c:v h264_cuvid -f concat -safe 0 -i list.txt -c:v h264_nvenc -c:a aac result.mp4
这里用h264_cuvid做硬件解码,h264_nvenc做硬件编码,音频如果需要转码可以用aac(也可以用硬件音频编码,比如aac_nvenc,取决于你的显卡支持)。
内容的提问来源于stack exchange,提问作者Jack Kwakman




