2013-07-31 2 views
1

나는 이와 비슷한 문제가 있습니다. problem!Gstreamer : 동적으로 링크를 실현

"qtdemux"요소와 "decoder"요소를 동적으로 연결하는 방법을 혼란스럽게 생각합니까?

명령 줄이 잘 작동합니다. 코드

gst-launch-1.0 filesrc location=/root/park-h264.mp4 ! qtdemux ! vaapidecode ! vaapisink 

을 실행할 때 때 잘 작동하지만 컴파일하고 다음 코드를 실행하면 실패했습니다.

if (!gst_element_link(demux, decoder)) 
    printf("link demux-decoder fail\n"); 

예나 스펙이 있습니까? 도와 줘서 고마워!

+0

와 함께 귀하의 질문에 당신을 도울 수있는 더 나은 영어를 할 사람이 있습니까? 나는 단어가 의미가 없기 때문에 당신이 묻고있는 것을 이해할 수 없다. – xaxxon

+0

@xaxxon 난 그냥 질문을 변경합니다. 내 문제는 동적 링크의 모든 예제입니다. [문제]처럼 (http://gstreamer-devel.966125.n4.nabble.com/GStreamer-C-Code-to-play-video-td3715064.html) 언급 – syler

답변

2

이 문제를 해결했습니다. this page 도움

다음 코드

GstElement *filesrc, *demux, *decoder, *sink; 
static void 
cb_new_pad (GstElement *element, 
      GstPad  *pad, 
      gpointer data) 
{ 
    gchar *name; 

    name = gst_pad_get_name (pad); 
    if (strcmp (name, "video_0") == 0 && 
     !gst_element_link_pads(demux, name, decoder, "sink")) { 
     printf("link demux-decoder fail\n"); 
    } 
    g_free (name); 
} 
static void 
pipeline_init(char *data) 
{ 
    filesrc = gst_element_factory_make ("filesrc", "filesrc"); 
    demux = gst_element_factory_make ("qtdemux", "qtdemux"); 
    decoder = gst_element_factory_make ("vaapidecode", "decoder"); 
    sink = gst_element_factory_make ("vaapisink", "sink"); 

    if (!filesrc || !demux || !decoder || !sink) 
     return; 

    g_object_set (G_OBJECT (filesrc), "location", data, NULL); 

    if (!gst_element_link(filesrc, demux)) { 
     printf("link filesrd--demux fail\n"); 
     return; 
    } 
    if (!gst_element_link(decoder, sink)) { 
     printf("link decoder--sink fail\n"); 
     return; 
    } 

    g_signal_connect (demux, "pad-added", G_CALLBACK (cb_new_pad), NULL); 

}