Как разобрать метаданные ONVIF из потока RTSP в QT?

Сначала я создал несколько примеров с помощью QMediaPlayer, но он не смог обработать поток RTSP (проблема с GStreamer 0.10 в Ubuntu 14.04).

Некоторые другие идеи не сработали, поэтому я переключился на другие решения.

Я создал проигрыватель qt на основе примера LibVLC и vlc-qt DemoPlayer (QT 5.4.1).

Поток работает хорошо, видео работает как шарм.

Я хотел бы проанализировать поток метаданных ONVIF из потока RTSP IP-камеры (он отправляет некоторые простые данные xml с информацией о движении объекта и т. д.) и нарисовать несколько строк на основе метаданных, собранных из потока.

У меня возникли некоторые проблемы с поиском подходящего места для получения этих данных.

Насколько я вижу, LibVLC игнорирует ту часть потока, которую не может разобрать.

Кто-нибудь пытался сделать что-то подобное и указать мне правильное направление, или, может быть, я на неправильном пути, и есть лучшее решение? :)


person Abador    schedule 24.03.2015    source источник


Ответы (2)


С gst-launch вы можете просто использовать этот конвейер:

gst-launch-1.0 rtspsrc location=camera_uri ! application/x-rtp, media=application ! fakesink dump=true

и вы получите метаданные камеры в терминале. Но эти данные будут иметь заголовок rtp-пакета. Чтобы удалить его, вы должны написать элемент depayloader. (Я не нашел ни одного), который удаляет только заголовок rtp.

Пример метода процесса depayloader:

static GstBuffer *
gst_rtp_xml_depay_process (GstRTPBaseDepayload * depayload, GstBuffer   *   buf)
{
  guint8 *payload;
  GstRTPBuffer rtp = { NULL };
  GstRtpXMLDepay *rtpxmldepay;
  rtpxmldepay = GST_RTP_XML_DEPAY (depayload);
  gst_rtp_buffer_map (buf, GST_MAP_READ, &rtp);
  payload = (guint8*)gst_rtp_buffer_get_payload_buffer (&rtp);
  return (GstBuffer*)payload;
}

Если вы хотите получить метаданные в своем приложении, вы можете использовать appsink.

person aborilov    schedule 29.06.2015
comment
Спасибо, целый день искал! ;-) - person Tom; 28.11.2017
comment
Вы спасли день! Для справки: в качестве шаблона я использовал код depayloader G722, заменив depay_process на предложенный вами. Работает как часы. Спасибо. - person Stefano Buora; 10.02.2020

Вам нужно будет каким-то образом подключиться к сигналу GStreamer "handle-request", как описано здесь:

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good-plugins/html/gst-plugins-good-plugins-rtspsrc.html#GstRTSPSrc-handle-request

Нужные вам данные должны содержаться в указателе user_data.

person ChrisWard1000    schedule 30.03.2015