Как решить проблему воспроизведения потоков RAW с помощью GStreamer и VAAPi - PullRequest
0 голосов
/ 19 февраля 2020

В настоящее время у меня небольшая проблема с GStreamer. Более подробная информация:

Конфигурация:

  • Intel i7-6700
  • Intel HD Graphics 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 charge

Чтобы преодолеть эту проблему, я хочу использовать 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

Как я могу решить эту проблему? Есть ли у вас какие-либо способы решения этой проблемы?

1 Ответ

1 голос
/ 19 февраля 2020

Что именно вы пытаетесь ускорить здесь? Загрузка процессора, вероятно, либо из-за videoconvert, так как он запускается в программном обеспечении для преобразования UYVY в формат, поддерживаемый вашим рендерером (надеюсь, что это другой формат YUV, а не RGB), или это передача несжатых данных из памяти ЦП. в память графического процессора.

Обратите внимание, что передача несжатых данных изображения на намного выше скорости передачи данных, чем сжатого видео H.264.

Если вы считаете, что videoconvert - это дорогая часть, вы можете попробовать использовать OpenGL для конвертации и отображения: .. ! glupload ! glcolorconvert ! glimagesink.

Возможно vaapipostproc может помочь вам с конвертацией цветов, если вы не хотите go маршрут OpenGL.

...