You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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加速效率更高:

  1. 先创建一个文本文件video_list.txt,内容如下:
file '/mnt/video-storage/test/cuda/surfing/intermediate1.mp4'
file '/mnt/video-storage/test/cuda/surfing/intermediate2.mp4'
  1. 运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:28:02