2012-08-05 36 views
0

我想添加一些處理邏輯突然離開本地視頻文件,但我有一些麻煩理解如何將以下(成功)gst-launch命令轉換成碼(並用 「墊添加」 回調提供的話):Gstreamer鏈接decodebin2到autovideosink

gst-launch filesrc location=/path/to/my/video.avi ! decodebin2 ! autovideosink

我已經盡我的手在GStreamer中的basic-tutorial-3,代替audioconvert使用decodebin2

data.source = gst_element_factory_make("filesrc", "source"); 
data.convert = gst_element_factory_make("decodebin2", "uridecoder"); 
data.sink = gst_element_factory_make("autovideosink", "autodetect"); 

但是,我永遠無法鏈接data.convertdata.sink,如示例中所述; gst_element_link(data.convert, data.sink)總是失敗。我懷疑decodebin2有一些特殊待遇。一些gstreamer的用戶文件檔案化管理using ghostpads and seperate bins,其迅速的嘗試後,也取得了沒有成功:

data.bin = gst_bin_new("processing-bin"); 
gst_bin_add_many(GST_BIN(data.bin), data.decoder, data.sink, NULL); 
gst_element_add_pad(data.bin, 
        gst_ghost_pad_new("bin_sink", 
             gst_element_get_static_pad(data.decoder,"sink"))); 

我如何繼續調試有點困惑。其他人有沒有任何指針?

下面是當前代碼的歸結要點:(gist

====

更新:我的回調,現在射擊,我想這是因爲我曾經爲一個不正確的文件名filesrc位置(哎呦)

現在,在遵循以下建議之後,我可以確認我正在獲取音頻和視頻上限類型,並在添加回調中檢查它們。不過,我現在得到以下「不掛鉤」的錯誤墊處理一幀後:

Debugging information: gstavidemux.c(5187): gst_avi_demux_loop(): /GstPipeline:gstreamer-test/GstBin:processing-bin/GstDecodeBin2:uridecoder/GstAviDemux:avidemux0: 
streaming stopped, reason not-linked 

回答

1

我認爲我遇到的主要問題是我正在收聽解碼器墊,當我應該從視頻接收器獲得靜態墊。我已經使用回調函數更新了要點來說明不同之處。

基本上,它歸結爲這樣的變化:

我改變

GstPad *sink_pad = gst_element_get_static_pad(data->decoder, "sink"); 

以下

GstPad *sink_pad = gst_element_get_static_pad(data->sink, "sink"); 
1

如果你的文件包含音頻和視頻,您的回調將被調用音頻和視頻墊。因此,在回調中,你應該檢查墊的大小,並確保你試圖只將視頻墊連接到視頻接收器

+0

我的回調,現在射擊,我能要檢查的帽子每個新焊盤的類型並相應地處理它們。然而,看起來該流在一幀處理後丟失了其匯。我已更新我的問題以供進一步說明。 – 2012-08-06 00:51:12