如何使用 GStreamer 和 VAAPi 解决 RAW 流播放问题

How to solve a RAW stream playback problem with GStreamer and VAAPi

我目前在使用 GStreamer 时遇到了一个小问题,这里有更多详细信息:

配置:

我从视频源接收到 UDP 流,该流以 RAW UYVY 格式发送。这是我对其进行解码的命令行:

gst-launch-1.0 -v udpsrc port="1234" caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string)1080, colorimetry=(string)BT709-2, payload=(int)96, ssrc=(uint)1188110121, timestamp-offset=(uint)4137478200, seqnum-offset=(uint)7257, a-framerate=(string)25" ! rtpvrawdepay ! decodebin ! queue ! videoconvert ! xvimagesink

正如我们在下面的屏幕截图中看到的问题,CPU 负载(右)对于此类任务来说太高了,我们可以看到 GPU 负载(左)是几乎为零。

为了克服这个问题,我想使用 VAAPI 图形加速,就像我在之前的项目中所做的那样 H264 其中命令行如下:

gst-launch-1.0 -v udpsrc port=1234 caps= "application/x-rtp, media\=(string)video, clock-rate=(int)90000, encoding-name=(string)H264, packetization-mode=(string)1, profile-level-id=(string)640028, payload=(int)96, ssrc=(uint)2665415388, timestamp-offset=(uint)3571350145, seqnum-offset=(uint)18095, a-framerate=(string)25" ! rtph264depay ! queue ! vaapih264dec low-latency=1 ! autovideosink

上面的行完美运行,CPU 几乎没有更多负载。所以我调整这个命令行以将其与 RAW 流一起使用,这里是命令:

gst-launch-1.0 -v udpsrc port="1234" caps = "application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)RAW, sampling=(string)YCbCr-4:2:2, depth=(string)8, width=(string)1920, height=(string)1080, colorimetry=(string)BT709-2, payload=(int)96, ssrc=(uint)1188110121, timestamp-offset=(uint)4137478200, seqnum-offset=(uint)7257, a-framerate=(string)25" ! rtpvrawdepay ! vaapidecodebin ! videoconvert ! xvimagesink

它与开头的行相同,但我将元素 decodebin 更改为 vaapidecodebin,因为我已将 avdec_h264 替换为 vaapih264dec H264流。不幸的是它不起作用,我最终遇到了这个错误:

WARNING: wrong pipeline: unable to connect rtpvrawdepay0 to vaapidecodebin0

我该如何解决这个问题?你有解决这个问题的线索吗?

你到底想在这里加速什么? CPU 负载可能是由于 videoconvert 因为这是 运行 在软件中将 UYVY 转换为您的渲染器支持的格式(希望这是另一种 YUV 格式而不是 RGB)或者它是未压缩数据从 CPU 内存到 GPU 内存的数据传输。

请注意,传输未压缩的图像数据的数据速率比压缩的 H.264 视频高

如果您认为 videoconvert 是昂贵的部分,您可能想尝试使用 OpenGL 进行转换和显示:.. ! glupload ! glcolorconvert ! glimagesink.

如果您不想走 OpenGL 路线,也许 vaapipostproc 可以帮助您进行颜色转换。