如何通过GPU加速降低FFmpeg向/dev/fb0投影的CPU占用?
解决方案
一、使用VAAPI硬件加速完成格式转换
Intel Elkhart Lake Gen11平台支持VAAPI硬件加速,可通过以下命令让FFmpeg利用GPU完成NV12到BGRA的格式转换,降低CPU占用:
ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -i rtsp://your-camera-url -vf "scale_vaapi=format=bgra" -pix_fmt bgra -f fbdev /dev/fb0
参数说明:
-hwaccel vaapi:启用VAAPI硬件加速解码-hwaccel_device /dev/dri/renderD128:指定VAAPI渲染设备(可通过ls /dev/dri/确认实际路径)-vf "scale_vaapi=format=bgra":调用VAAPI滤镜完成格式转换(无需缩放时也可仅用此滤镜做格式转换)-pix_fmt bgra:指定输出格式匹配/dev/fb0要求-f fbdev:指定输出目标为framebuffer设备
执行后可观察到CPU占用明显下降,GPU占用对应提升。
二、尝试让/dev/fb0支持NV12格式
framebuffer格式支持取决于内核驱动与硬件配置,Elkhart Lake GPU原生支持NV12,可按以下步骤尝试切换:
查看当前framebuffer格式
执行命令查看当前fb0的像素格式:cat /sys/class/graphics/fb0/fmt或安装
fbset工具后查看:sudo apt install fbset fbset -i /dev/fb0切换格式
- 临时切换(重启失效):
若报错则说明硬件或驱动不支持该格式输出。sudo fbset -fb /dev/fb0 -pixfmt nv12 - 永久设置(修改内核参数):
编辑/etc/default/grub,修改GRUB_CMDLINE_LINUX参数,添加显示输出的格式配置,例如:
其中GRUB_CMDLINE_LINUX="video=HDMI-A-1:800x448@15,pixfmt=nv12"HDMI-A-1为你的显示输出名称(可通过xrandr或cat /sys/class/drm/card0/card0-HDMI-A-1/status确认),之后执行sudo update-grub并重启系统。
- 临时切换(重启失效):
注意:该方法兼容性依赖硬件与驱动配置,不一定能成功,不如硬件格式转换可靠。
三、关于vpp_qsv滤镜是否支持转换为BGRA格式
vpp_qsv滤镜支持转换为BGRA格式,Intel Gen11平台(Elkhart Lake)的QSV硬件加速原生支持该功能,可尝试以下命令:
ffmpeg -init_hw_device qsv=hw -filter_hw_device hw -hwaccel qsv -i rtsp://your-camera-url -vf "vpp_qsv=format=bgra" -pix_fmt bgra -f fbdev /dev/fb0
参数说明:
-init_hw_device qsv=hw:初始化QSV硬件设备-filter_hw_device hw:指定滤镜使用QSV硬件设备-hwaccel qsv:启用QSV硬件加速解码-vf "vpp_qsv=format=bgra":调用QSV视频处理滤镜完成格式转换
若FFmpeg 4.4.2编译时开启了QSV支持,命令可正常运行并降低CPU占用;若出现格式不支持报错,可能是编译时未启用完整QSV功能,需重新编译FFmpeg并开启相关选项。
内容的提问来源于stack exchange,提问作者user3299264
相关产品推荐
相关产品推荐

