在 gst-rtsp-server 中处理查询字符串

Bro*_*sin 0 c inheritance gnome rtsp gstreamer

我想创建 rtsp 服务器,其工作方式类似于某些 ip 摄像机。

RTSP 查询相机外观:

DESCRIBE /axis-media/media.amp?videocodec=h264&camera=1&resolution=640x480&fps=15
Run Code Online (Sandbox Code Playgroud)

gst-rtsp-streamer 的文档说:

通常 url 将决定应创建哪种类型的管道。例如,您可以使用查询参数来配置管道的某些部分,或根据某些 url 模式选择编码器和负载器。

但我找不到任何示例来解析查询字符串并创建不同的管道。我只看到不同的道路。

有类似的问题,但我无法理解答案。

先感谢您!

Bro*_*sin 7

我找到了解决办法!!!

我创建 GstRTSPMediaFactory 的子类并重写 create_element 方法:

typedef struct TestRTSPMediaFactoryClass TestRTSPMediaFactoryClass;
typedef struct TestRTSPMediaFactory TestRTSPMediaFactory;

struct TestRTSPMediaFactoryClass
{
    GstRTSPMediaFactoryClass parent;
};

struct TestRTSPMediaFactory
{
     GstRTSPMediaFactory parent;
};


static GstElement * custom_create_element(GstRTSPMediaFactory      *factory, const GstRTSPUrl *url);


G_DEFINE_TYPE (TestRTSPMediaFactory, test_rtsp_media_factory, GST_TYPE_RTSP_MEDIA_FACTORY);

static void
test_rtsp_media_factory_class_init (TestRTSPMediaFactoryClass * test_klass)
{
   GstRTSPMediaFactoryClass *klass = (GstRTSPMediaFactoryClass *) (test_klass);
   klass->create_element = custom_create_element;
}

static void
test_rtsp_media_factory_init (TestRTSPMediaFactory * media)
{
}

static GstElement *
custom_create_element (GstRTSPMediaFactory * factory, const GstRTSPUrl  *url)
{
     /* you can see at query string: */
     printf("query is: %s\n", url->query);
     /* according to query create GstElement, for example: */
     GstElement *element;
     GError *error = NULL;

     element = gst_parse_launch ("( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )",
                          &error);
     return element;
}


int main (int argc, char *argv[])
{
   ...  
   GstRTSPMediaFactory *factory;
   factory = g_object_new(TEST_TYPE_RTSP_MEDIA_FACTORY, NULL);

   ...
   g_main_loop_run (loop);

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望它能帮助某人安全度过!我使用来源和示例/test-cgroups.c