2012-02-03 8 views
3

아래의 기본 파이프 라인을 테스트 중입니다. caps 함수없이 파이프 라인을 실행하면 똑같은 I/O 포맷을 가정하고 똑바로 통과합니다. 일단 캡을 추가하면 프리 롤이 시작되지만 비디오는 싱크 출력까지 계속되지 않습니다.gstreamer 대문자가 파이프 라인을 차단하는 이유

내가 잘못 코딩하고 있습니까?

들으 예술 당신이 capsfilter 필요합니까 어떤 이유로

#include <gst/gst.h> 
#include <glib.h> 



static void 
on_pad_added (GstElement *element, 
       GstPad  *pad, 
       gpointer data) 
{ 
    GstPad *sinkpad; 
    GstElement *decoder = (GstElement *) data; 

g_print ("Dynamic pad created, linking out/in \n"); 

    sinkpad = gst_element_get_static_pad (decoder, "sink"); 

    gst_pad_link (pad, sinkpad); 

    gst_object_unref (sinkpad); 
} 

int 
main (int argc, 
     char *argv[]) 
{ 
    GMainLoop *loop; 

    gboolean link_ok; 

    GstElement *pipeline, *source, *decoder, *ffcs, *vidsc, *capsfout, *sink; 
    GstBus *bus; 
    GstCaps *caps; 


    /* Initialisation */ 
    gst_init (&argc, &argv); 

    loop = g_main_loop_new (NULL, FALSE); 

    /* Create gstreamer elements */ 
    pipeline = gst_pipeline_new ("video-player"); 
    source = gst_element_factory_make ("filesrc",   "file-source"); 
    decoder = gst_element_factory_make ("decodebin2",  "dec-bin2"); 
    ffcs  = gst_element_factory_make ("ffmpegcolorspace", "ffcs"); 
    vidsc = gst_element_factory_make ("videoscale",  "vidsc"); 
    capsfout = gst_element_factory_make ("capsfilter",  "capsfout"); 
    sink  = gst_element_factory_make ("filesink",   "vidout"); 

    if (!pipeline || !source || !decoder || !ffcs || !vidsc || !capsfout || !sink) { 
    g_printerr ("One element could not be created. Exiting.\n"); 
    return -1; 
    } 

    /* we set the input/output filename to the source element */ 
    g_object_set (G_OBJECT (source), "location", argv[1], NULL); 
    g_object_set (G_OBJECT (sink), "location", argv[2], NULL); 

    bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); 

    gst_bin_add_many (GST_BIN (pipeline), 
        source, decoder, ffcs, vidsc, capsfout, sink, NULL); 


    /* we link the elements together */ 
    gst_element_link (source, decoder); 
    gst_element_link (decoder, ffcs); 
    gst_element_link (ffcs, vidsc); 

    caps = gst_caps_new_simple("video/x-raw-yuv", 
         "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'), 
         "width", G_TYPE_INT, 384, 
         "height", G_TYPE_INT, 216, 
         "framerate", GST_TYPE_FRACTION, 25, 1, 
         NULL); 

    link_ok = gst_element_link_filtered(vidsc,sink,caps); 
    gst_caps_unref (caps); 

    if (!link_ok) { 
     g_warning ("Failed to link vidsc to sink!"); 
    }else{ 
     g_print("seems ok, no error reported?\n"); 
    } 


    /* Set the pipeline to "playing" state*/ 
    g_print ("Now playing: %s\n", argv[1]); 
    gst_element_set_state (pipeline, GST_STATE_PLAYING); 


    /* Iterate */ 
    g_print ("Running...\n"); 
    g_main_loop_run (loop); 


    /* Out of the main loop, clean up nicely */ 
    g_print ("Returned, stopping playback\n"); 
    gst_element_set_state (pipeline, GST_STATE_NULL); 

    g_print ("Deleting pipeline\n"); 
    gst_object_unref (GST_OBJECT (pipeline)); 

    return 0; 
} 

답변

1

? 필요한 속성 만 제한합니다. 예 : 당신은 프레임 속도를 설정하지만 capsfilter 앞에 비디오 요소가 없습니다. 프레임 속도에 신경 쓰지 않는다면 (예 : 크기를 강제로 조정하려는 경우) 캡 필터에서 설정 한 캡에서 프레임 속도를 제거하십시오.

3

답변이 늦을 수는 있지만 동적 패드 링크를 잊어 버린 것일 수 있습니다 일부 요소 간에는 on_pad_added 함수를 호출하지 마십시오. 나는 똑같은 문제가 있었다.

그 이후로 추가하려고 시도 했습니까? 예를 들어 gst_element_link 대신 두 요소를 동적으로 연결하는이 줄은 다음과 같습니다.

g_signal_connect (decoder, "pad-added", G_CALLBACK (on_pad_added), ffcs); 
관련 문제