我是视频处理新手,最近开始致力于从 rtsp h265 15fps 800x448 2000kbps 捕获摄像机内容并将其投影到 /dev/fb0 设备。
我在 ubuntu 22.04 上使用 ffmpeg 4.4.2,搭载英特尔 elkhartlake Gen11,使用 HDMI 连接到显示器
当我运行以下 cmd 时
ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -hwaccel vaapi -loglevel verbose -rtsp_transport tcp -stimeout 30000000 -i rtsp://192.168.0.21/media.smp -pix_fmt bgra -f fbdev /dev/fb0
它消耗了 13% 的 CPU 和 1.5% 的 GPU(来自 sudo intel_gpu_top)
我知道大部分 ffmpeg CPU 使用率是由“-pix_fmt bgra”消耗的,因为当我运行
ffmpeg -init_hw_device vaapi=intel:/dev/dri/renderD128 -hwaccel vaapi -loglevel verbose -rtsp_transport tcp -stimeout 30000000 -i rtsp://192.168.0.21/2x2/media.smp -f null -
CPU只有3%-5%,GPU只有1.5%,我猜GPU是用来解码的
如果我从第一个命令中删除“pix_fmt bgra”,则 ffmpeg 退出并显示错误
[fbdev @ 0x55e70d6cc800] Pixel format nv12 is not supported, use bgra
av_interleaved_write_frame(): Invalid argument
我猜 CPU 正忙于从 nv12 转换为 bgra
所以问题是,如何才能用更少的 CPU 将内容投影到 fb0?并将这些活动移至 GPU?我是否应该使用 scale_vaapi 或其他东西?
我确实搜索过 fbset 来支持 nv12,但不太清楚如何操作,所有这些都基于这样的假设:如果我能让 fb0 支持 nv12,那么我就可以删除“-pix_fmt bgra”来减少 CPU 使用率
我也尝试了“perf record”,似乎 CPU 被 swscale filter 使用
或者,假设我使用 vpp_qsv 过滤器,是否意味着我无法将格式转换为 bgra?因为这里的这个函数,因为它没有 bgra https://github.com/FFmpeg/FFmpeg/blob/6d31619af2826adfe5aa71990cebafa8cbd6ecde/libavfilter/vf_vpp_qsv.c#L720
谢谢
答案1
发现我可以简单地使用 vpp_qsv 过滤器。所以完整的命令是这样的
ffmpeg -hwaccel qsv -c:v hevc_qsv -i http://url -vf "vpp_qsv=format=bgra,hwdownload,format=bgra" -f fbdev /dev/fb0
获取 vpp_qsv 的选项信息,因为网上没有太多文档
ffmpeg --help filter=vpp_qsv
对于任何有类似问题的人,我希望以上内容能有所帮助。谢谢