1

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

配置:

  • 英特尔 i7-6700
  • 英特尔核芯显卡 530
  • Ubuntu 18.04 LTS
  • GStreamer1.0
  • VAAPI 插件

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负载(左)几乎为零。

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为。不幸的是,它不起作用,我最终遇到了这个错误:vaapih264decH264

WARNING: wrong pipeline: unable to connect rtpvrawdepay0 to vaapidecodebin0

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

4

1 回答 1

2

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

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

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

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

于 2020-02-19T10:57:38.533 回答