簡體   English   中英

Gstreamer將decodebin2鏈接到autovideosink

[英]Gstreamer linking decodebin2 to autovideosink

我正在嘗試將一些處理邏輯添加到一個本地視頻文件中的程序,但是我在理解如何將以下(成功)gst-launch命令轉換為代碼時遇到了一些麻煩(並提供了一個“ pad-added“回調”:

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

我已經盡我的手在GStreamer中的基本教程-3 ,使用decodebin2代替audioconvert

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.convert鏈接到data.sink ,如示例中所述; gst_element_link(data.convert, data.sink)總是失敗。 我懷疑decodebin2有一些特殊的處理decodebin2 一些gstreamer用戶已經注意到使用了ghostpads和單獨的垃圾箱 ,經過快速嘗試后,也沒有取得成功:

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")));

我對如何繼續調試感到有點困惑。 有沒有人有任何指針?

以下是當前代碼的簡要說明 :( 要點

====

更新:我的回調現在正在解雇,我認為這是因為我的filesrc位置的文件名不正確(哎呀)

現在,按照下面的建議,我可以確認我正在獲取音頻和視頻上限類型,並在添加了pad的回調中檢查它們。 但是,我現在在一幀填充處理后得到以下“未鏈接”錯誤:

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

如果您的文件同時包含音頻和視頻,則將同時為音頻和視頻板調用回調。 因此,在回調中,您應該檢查打擊墊的大寫,並確保您嘗試僅將視頻打印墊鏈接到視頻接收器

我認為我遇到的主要問題是,當我應該從視頻接收器獲取靜態打擊墊時,我正在聽新的打擊墊的解碼器。 我用我的回調函數更新了要點來說明差異。

基本上,它歸結為這種變化:

我變了

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

以下

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM