2016-06-06 17 views
0

Ich möchte Rtsp Server erstellen, die wie bestimmte IP-Kamera funktioniert.Prozess Abfrage String in GST-Rtsp-Server

RTSP Abfrage Kamera sieht:

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

Die Dokumentation von gst-RTSP-Streamer sagt:

Normalerweise sind die URL wird feststellen, welche Art von Pipeline erstellt werden soll. Sie können zum Beispiel Abfrageparameter verwenden, um bestimmte Teile der Pipeline zu konfigurieren oder Encoder und Payloader basierend auf einem bestimmten URL-Muster auszuwählen.

Aber ich kann keine Beispiele finden, um Abfragezeichenfolge zu analysieren und verschiedene Pipelines zu erstellen. Ich sehe nur den Weg mit verschiedenen Pfaden.

Es gab ähnliche question, aber ich kann die Antwort nicht verstehen.

Vielen Dank im Voraus!

Antwort

1

Ich fand die Lösung !!!

Ich schaffe Unterklasse von GstRTSPMediaFactory und außer Kraft setzen create_element Methode:

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; 
} 

Ich hoffe, dass es jemand sicher Zeit helfen werden! Ich verwende Quellen und Beispiele/test-cgroups.c dafür