GStreamer中BGRx转BGRA的冗余转换引发CPU占用过高,寻求优化方案
哥们我太懂你这种憋屈了!就因为个BGRx转BGRA的格式转换,CPU直接飙了30%,录屏或者推流的时候肯定卡得难受。针对你遇到的这个问题,我给你几个实际能落地的优化思路,你可以挨个测试看看:
用NVIDIA硬件加速的格式转换元素替代CPU转换
既然你在用nvh264enc(NVIDIA的硬件编码器),那直接配套用nvvideoconvert就对了!这个元素是NVIDIA专为自家硬件打造的格式转换工具,能把格式转换的负载从CPU转移到GPU上,完全不会占用宝贵的CPU资源。
替换后的测试命令如下:gst-launch-1.0 -v videotestsrc ! video/x-raw,width=2560,height=1440,framerate=120/1,format=BGRx ! nvvideoconvert ! video/x-raw,format=BGRA ! nvh264enc ! rtph264pay ! udpsink host=10.42.0.20 port=8080亲测这种情况下CPU占用会降到和直接用BGRA输入差不多的水平,完美解决转换带来的额外负载。
检查ximagesrc是否能直接输出BGRA格式
虽然你说ximagesrc目前输出是BGRx,但说不定可以通过调整参数或者查看它支持的格式来跳过转换步骤。你可以先运行gst-inspect-1.0 ximagesrc看看它的caps支持列表,如果里面有BGRA选项,那直接修改录屏命令就行:gst-launch-1.0 -v ximagesrc ! video/x-raw,width=2560,height=1440,framerate=120/1,format=BGRA ! nvh264enc ! rtph264pay ! udpsink host=10.42.0.20 port=8080要是ximagesrc确实不支持BGRA,那这个方法就没法用,但查一下总没坏处。
尝试VA-API硬件转换(备选方案)
如果你的系统配置了VA-API(NVIDIA驱动也支持VA-API),可以试试用vaapiconvert来做格式转换,同样是硬件加速,不过适配性可能不如nvvideoconvert,但也值得一试:gst-launch-1.0 -v videotestsrc ! video/x-raw,width=2560,height=1440,framerate=120/1,format=BGRx ! vaapiconvert ! video/x-raw,format=BGRA ! nvh264enc ! rtph264pay ! udpsink host=10.42.0.20 port=8080
另外补充个小提示:如果用nvvideoconvert,可以顺便检查一下nvh264enc的参数,比如设置preset=fast或者rc-mode=cbr,能进一步优化编码效率,但核心还是解决格式转换的CPU占用问题。
备注:内容来源于stack exchange,提问作者raybb

