当前位置: 首页 > 面试题库 >

链接元素时,GStreamer错误“声明'GST_IS_ELEMENT(src)'失败”

鲁光霁
2023-03-14
问题内容

我正在使用Python和GObject自省绑定开发基于GStreamer的程序。我正在尝试建立此管道:

videomixer name=mix ! autovideosink \
uridecodebin uri=v4l2:///dev/video0 ! mix.

使用gst-launch-1.0管道可以完美地工作,但是我的Python程序给出了错误:

(minimal.py:12168): GStreamer-CRITICAL **: gst_element_link_pads_full: assertion 'GST_IS_ELEMENT (src)' failed
on_error(): (GError('Internal data flow error.',), 'gstbasesrc.c(2865): gst_base_src_loop (): /GstPipeline:pipeline0/GstURIDecodeBin:uridecodebin0/GstV4l2Src:source:\nstreaming task paused, reason not-linked (-1)')
#!/usr/bin/python3
import gi
gi.require_version('Gst', '1.0')
from gi.repository import GObject, Gst, Gtk, GdkX11, GstVideo
GObject.threads_init()
Gst.init(None)

class Source:
    def __init__(self, uri, pipeline, mixer):
        self.uri = uri
        self.pipeline = pipeline
        self.mixer = mixer

        self.src = Gst.ElementFactory.make('uridecodebin', None)
        self.pipeline.add(self.src)
        self.src.set_property('uri', uri)
        self.src.connect('pad-added', self.on_pad_added, self.src, self.mixer)

    def on_pad_added(self, element, pad, src, dest):
        name = pad.query_caps(None).to_string()
        print('on_pad_added:', name)
        if name.startswith('video/'):
            src.link(dest)

class Main:
    def __init__(self):
        self.window = Gtk.Window()
        self.window.connect('destroy', self.quit)
        self.window.set_default_size(1280, 720)

        self.drawingarea = Gtk.DrawingArea()
        self.window.add(self.drawingarea)

        self.pipeline = Gst.Pipeline()

        self.bus = self.pipeline.get_bus()
        self.bus.add_signal_watch()
        self.bus.connect('message::error', self.on_error)
        self.bus.enable_sync_message_emission()
        self.bus.connect('sync-message::element', self.on_sync_message)

        self.mixer = Gst.ElementFactory.make('videomixer', None)
        self.sink = Gst.ElementFactory.make('autovideosink', None)

        self.pipeline.add(self.mixer)
        self.pipeline.add(self.sink)

        self.mixer.link(self.sink)
        video = Source('v4l2:///dev/video0', self.pipeline, self.mixer)

    def run(self):
        self.window.show_all()
        # You need to get the XID after window.show_all().  You shouldn't get it
        # in the on_sync_message() handler because threading issues will cause
        # segfaults there.
        self.xid = self.drawingarea.get_property('window').get_xid()
        self.pipeline.set_state(Gst.State.PLAYING)
        Gtk.main()
    def quit(self, window):
        self.pipeline.set_state(Gst.State.NULL)
        Gtk.main_quit()
    def on_sync_message(self, bus, msg):
        if msg.get_structure().get_name() == 'prepare-window-handle': msg.src.set_window_handle(self.xid)
    def on_error(self, bus, msg):
        print('on_error():', msg.parse_error())

main = Main()
main.run()

问题答案:

我发现了问题,我错误地链接了动态创建的垫:

src.link(dest)

本来应该:

pad.link(dest.get_compatible_pad(pad, None))


 类似资料:
  • 下面是XSD。 下面是xml文件。 当尝试使用http://www.utilities-online.info/xsdvalidation验证它时,我得到以下错误 第2行62:org.xml.sax.SAXParseException;行号:2;列号:62;CVC-ELT.1:找不到元素“Message”的声明。

  • 我尝试使用http://www.freeformatter.com/xml-validator-xsd.html但由于上面的错误,它失败了。我发现了许多相同的问题,但没有一个答案对我有帮助。请帮助,正确的XML/XSD是什么? 我的XML:(只有最小的一个) 我的XSD:(只有最小的一个)

  • 我使用Visual StudioXML工具创建了XSD。我使用下面的C#代码来验证XML并面对这个错误。 错误 元素没有声明为“http://www.w3.org/2000/09/XMLDSIG#:Signature”。 所以我的问题是如何修复它,因为在编辑模式下,XML是100%有效的? 谢谢你! XSD 更新#1 我试过不同的方法,但都不开心。 即使我用这种方法也不快乐。

  • 执行以下命令时, gst-launch-1.0 filesrc location=野生动物。wmv!decodebin!队列ffmpegcolorspace!自动视频接收器12月!队列音频转换!音频重采样!自动音频接收器 I获取错误如下。 这里有什么问题?

  • 我的PC中安装了visual studio C++6.0和visual studio C++2010 express。我的朋友可以用visual Studio2010 Express在他的PC上编译相同的项目,但我的PC出现了抛出和错误 链接:致命错误LNK1123:转换到COFF时失败 我不想卸载visual studio C++6.0。我得把它留着做其他项目。我可以卸载/安装Visual st

  • 所以一切都很顺利,当我去编辑一些.xml文件并构建项目时,现在我得到了一个gradle错误,上面写着: Android资源链接失败输出:H:\ Android projects \ codicy \ app \ src \ main \ RES \ layout \ activity _ app _ setup . XML:19:错误:找不到资源drawable/toolbarbackground