我正在尝试将一些处理逻辑添加到一个本地视频文件的程序中,但是我在理解如何将以下(成功)gst-launch命令转换为代码时遇到了一些麻烦(并提供它使用“pad-added”回调):
gst-launch filesrc location=/path/to/my/video.avi ! decodebin2 ! autovideosink
我已尝试使用decodebin2
代替audioconvert
gstreamer的basic-tutorial-3:
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用户提到了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位置文件名不正确(哎呀)
现在,按照以下建议后,我可以确认我正在获取音频和视频大写类型,并在添加了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
答案 0 :(得分:1)
如果您的文件同时包含音频和视频,则会同时为音频和视频打击垫调用您的回调。因此,在回调中,您应检查打击垫的大写,并确保您尝试仅将视频打印垫链接到视频接收器
答案 1 :(得分:1)
我认为我遇到的主要问题是我正在听解码器的新垫,当我应该从视频接收器获取静态垫时。我用我的回调函数更新了要点,以说明差异。
基本上,它归结为这种变化:
我改变了
GstPad *sink_pad = gst_element_get_static_pad(data->decoder, "sink");
以下
GstPad *sink_pad = gst_element_get_static_pad(data->sink, "sink");