如何使用 GStreamer 和 VAAPi 解决 RAW 流播放问题
How to solve a RAW stream playback problem with GStreamer and VAAPi
我目前在使用 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
负载(左)是几乎为零。
为了克服这个问题,我想使用 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
可以帮助您进行颜色转换。
我目前在使用 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
负载(左)是几乎为零。
为了克服这个问题,我想使用 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
可以帮助您进行颜色转换。