Как использовать gst-rtsp-server с собственным пайплайном?

Я пишу приложение gstreamer, и мне нужно передать выходной аудио/видеопоток через rtsp. Но в gst-rtsp-server примерах я создал factory создание только по gst-launch синтаксису:

factory = gst_rtsp_media_factory_new ();  
gst_rtsp_media_factory_set_launch (factory,
  "( appsrc name=mysrc ! videoconvert ! x264enc ! rtph264pay name=pay0 pt=96 )");

Можно ли подключить gst-rtsp-server элементов к моей трубе?


person victor1234    schedule 10.04.2014    source источник


Ответы (2)


Вы должны создать подкласс rtsp-media-factory и переопределить default_create_element, который вернет ваш pipeline как GstElement.

person aborilov    schedule 26.02.2015
comment
Что вы имеете в виду под rtsp-media-factory? Нет класса с таким именем (и, насколько мне известно, его не может быть из-за синтаксиса C++) - person c-x-berger; 29.03.2019
comment
@c.berger проверьте github.com/tmatth/gst-prototypes/tree/master /gstrtspserver - person Étienne; 19.08.2019
comment
@Этьен, это хорошее начало, однако это было реализовано для таргетинга на gstreamer-0.10, и многие из используемых им вещей теперь являются закрытыми полями. - person Diego Rodriguez; 25.08.2020
comment
@DiegoRodriguez Я согласен, что это старый код, но я только отвечал на вопрос, что вы подразумеваете под rtsp-media-factory. - person Étienne; 26.08.2020

После долгих исследований я смог понять, как это сделать.

Этот фрагмент показывает вам, как переопределить виртуальные функции, которые делает GstRTSPMediaFactory, в этом случае мы заинтересованы в переопределении create_element и вместо этого указываем на нашу собственную статическую функцию, отвечающую за возвращение конвейера, который вы построили, когда внутренние механизмы GstRTSPMediaFactory нуждаются в этом.

См. это для других виртуальных функций, которые вы можете переопределить.

    GstElement binPipeline;
    
    GstRTSPMediaFactory *custom_pipeline_factory(GstElement *bin)
    {
      GstRTSPMediaFactory *factory = gst_rtsp_media_factory_new();
      GstRTSPMediaFactoryClass *memberFunctions = GST_RTSP_MEDIA_FACTORY_GET_CLASS(factory);

      // pipeline created somewhere else
      binPipeline = bin;
      memberFunctions->create_element = create_bin_element;
      return factory;
    }
    
    GstElement *create_bin_element(GstRTSPMediaFactory *factory, const GstRTSPUrl *url)
    {
      return binPipeline;
    }
person Diego Rodriguez    schedule 19.08.2020