You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Windows下FFmpeg结合ddagrab桌面捕获、nvenc编码与GPU缩放的问题求助

Windows下FFmpeg结合ddagrab桌面捕获、nvenc编码与GPU缩放的问题求助

看起来你遇到的问题是CPU端的捕获帧和GPU端滤镜之间没有做格式/内存空间的转换,导致滤镜链无法衔接。我来帮你拆解问题并给出解决方案。

先分析你的原命令问题:
你用了-hwaccel_output_format cuda,但这个参数是针对本地视频文件解码时,让解码后的帧直接输出到CUDA设备内存;而ddagrab是实时桌面捕获,输出的是CPU系统内存里的帧,这个参数对它不起作用。直接接scale_cuda的话,GPU滤镜无法处理CPU内存里的帧,所以才会报格式转换失败的错误。

修正后的全程GPU处理命令

直接把捕获的帧上传到GPU,然后在GPU内完成缩放和编码,全程不回CPU:

ffmpeg -f lavfi -i ddagrab -vf "hwupload_cuda,scale_cuda=w=960:h=540" -c:v h264_nvenc -cq:v 21 c:\temp\test.mp4

命令各部分解释:

  • -f lavfi -i ddagrab:通过lavfi滤镜输入源捕获桌面,这部分你原来的用法是对的。
  • -vf "hwupload_cuda,scale_cuda=w=960:h=540"
    • hwupload_cuda:把ddagrab输出的CPU内存帧上传到CUDA设备内存,让后续滤镜能在GPU上处理。
    • scale_cuda:在GPU内完成缩放,避免帧回传CPU,提升性能。
  • -c:v h264_nvenc:调用NVIDIA硬件编码器,直接处理GPU内存里的帧,效率拉满。
  • -cq:v 21:恒定质量编码参数,这个设置没问题,平衡画质和文件大小。

额外优化建议(可选)

如果需要更精准的捕获控制,可以给ddagrab加参数:

  • 指定捕获帧率:ddagrab=fps=60
  • 指定捕获的显示器:先用ffmpeg -f lavfi -i ddagrab=list_devices=true查看显示器ID,然后用ddagrab=display_id=1(ID根据实际情况改)
  • 捕获特定区域:ddagrab=x=100:y=100:w=1920:h=1080(指定左上角坐标和宽高)

这样调整后,整个流程从捕获帧上传GPU、缩放、编码全在GPU内完成,不会再出现格式转换错误啦。

备注:内容来源于stack exchange,提问作者signumnova

火山引擎 最新活动