2013-07-05 170 views
1

我有以下的管道的正常工作:Gstreamer1.0:鏈接decodebin到videoconvert

GST推出-1.0 -v filesrc位置= /家庭/影片/ sample_h264.mov!解碼器! videoconvert! autovideosink

我想寫一個C程序來做同樣的事情。所以我翻譯以前的管道下面的代碼:

pipeline = gst_pipeline_new ("video_pipeline"); 
if (!pipeline) { 
g_print("Failed to create the pipeline\n"); 
return -1; 
} 

bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); 
watch_id = gst_bus_add_watch (bus, bus_call, loop); 
gst_object_unref (bus); 

source = gst_element_factory_make ("filesrc", "file-source"); 
decoder = gst_element_factory_make ("decodebin", "standard-decoder"); 
converter = gst_element_factory_make ("videoconvert", "converter"); 
sink  = gst_element_factory_make ("autovideosink", "video-sink"); 

if (!source || !decoder || !converter || !sink) { 
g_print("Failed to create one or more pipeline elements\n"); 
return -1; 
} 

g_object_set(G_OBJECT(source), "location", file_name, NULL); 

gst_bin_add_many (GST_BIN (pipeline), source, decoder, converter, sink, NULL); 

if (!gst_element_link_many (source, decoder, converter, sink, NULL)) { 
g_print ("Failed to link some elements!\n"); 
return -1; 
} 
/* run */ 
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING); 
if (ret == GST_STATE_CHANGE_FAILURE) { 
    GstMessage *msg; 

g_print ("Failed to start up pipeline!\n"); 

/* check if there is an error message with details on the bus */ 
    msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0); 
    if (msg)   { 
    GError *err = NULL; 

    gst_message_parse_error (msg, &err, NULL); 
     g_print ("ERROR: %s\n", err->message); 
     g_error_free (err); 
     gst_message_unref (msg); 
    } 
    return -1; 
} 

,但我得到的錯誤,當我嘗試解碼器連接到轉換器。爲什麼它可以在命令行中正常工作,但不能與C代碼一起工作?

回答

2

解碼器使用了一種叫做「有時墊」的東西,它在解碼媒體的decodebins情況下基本上是一個在滿足某些條件時會顯示的墊。 gst-launch會自動完成這類事情,但是在代碼中你需要註冊一個回調,然後在回調中連接pad。另見:GStreamer: how to connect dynamic pads

+0

謝謝你的迴應。我會努力朝這個方向發佈結果。 – abir

1

正如@HarvardGraff所說,decodebin沒有靜態的src墊(見gst-inspect decodebin)。

但是,您也可以在應用中使用啓動字符串。這樣GStreamer應該處理所有的鏈接):

GstError *error = NULL; 
GstElement *pipeline = gst_parse_launch("filesrc name=src ! decodebin ! videoconvert ! autovideosink", &error); 

if (!error) { 
    GstElement filesrc = gst_bin_get_by_name(GST_BIN(pipeline), "src"); 
    g_object_set(filesrc, "location", "/home/Videos/sample_h264.mov", NULL); 
} 
+0

我認爲它是gst_bin_get_by_name(GST_BIN(pipeline),「filesrc」); – gregoiregentil

+0

@gregoiregentil如果我沒有指定'name = src',它的名字將自動被分配給'filesrc0'(或'filesrc1',如果有多個的話)。爲了確保它始終獲得相同的名稱(因此可以使用'gst_bin_get_by_name()')持續查找它,我分配了一個靜態名稱:'src' – mreithub

+0

您是對的。實際上,如果你沒有把name = src(我沒有看到),它會在我的第一條評論中成爲filesrc0。 – gregoiregentil