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

Process query string in gst-rtsp-server

我想创建像某些网络摄像机一样工作的 rtsp 服务器。

RTSP 查询相机外观:

DESCRIBE /axis-media/media.amp?videocodec=h264&camera=1&resolution=640x480&fps=15

gst-rtsp-streamer 的文档说:

Usually the url will determine what kind of pipeline should be created. You can for example use query parameters to configure certain parts of the pipeline or select encoders and payloaders based on some url pattern.

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

有类似的question,但是看不懂

提前致谢!

我找到了解决方案!!!

我创建 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;
}

我希望它能帮助某人度过安全的时间!我使用 sources 和 examples/test-cgroups.c