我正在尝试将一些处理逻辑添加到一个在本地视频文件上运行的程序中,但是我在理解如何将以下(成功的)gst-launch 命令转换为代码(并为其提供“垫添加”回调):
gst-launch filesrc location=/path/to/my/video.avi ! decodebin2 ! autovideosink
我已经尝试过使用 gstreamer 的basic-tutorial-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
。一些 gstreamer 用户提到了使用 ghostpads 和单独的 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