2016-06-06 8 views
0

특정 IP 카메라처럼 작동하는 rtsp 서버를 만들고 싶습니다. 카메라gst-rtsp-server의 쿼리 문자열 처리

RTSP 쿼리 같습니다

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

GST-RTSP - 트리머의 문서는 말한다 :

일반적으로 URL이 을 만들어야합니다 파이프 라인의 종류를 결정합니다. 예를 들어 쿼리 매개 변수를 사용하여 특정 파이프 라인을 구성하거나 URL 패턴을 기반으로 인코더와 페이더를 선택할 수 있습니다.

그러나 쿼리 문자열을 구문 분석하고 다른 파이프 라인을 만드는 예는 찾을 수 없습니다. 나는 다른 길로 만 길을 본다.

비슷한 question이 있었지만 대답을 이해할 수 없습니다.

미리 감사드립니다.

답변

1

해결책을 찾았습니다.

나는 GstRTSPMediaFactory의 서브 클래스를 생성하고 create_element 메소드를 오버라이드 (override) :

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

내가 안전하게 시간에 누군가가 도움을 바랍니다! 나는 소스와 예제/테스트 -cgroups.c를 사용한다.