繁体   English   中英

Gstreamer Python获取总线消息重新连接

[英]Gstreamer python get bus message reconnection

我在Tkinter应用程序中使用了一些gstreamer管道来显示不同的流,并且我想检测何时其中一个管道失去连接。 我尝试了总线消息,但在我看来,它根本没有发布消息。 我创建了一个小部件来管理gstreamer逻辑,该小部件的代码如下。

from tkinter.ttk import Widget

import gi

# Needed for set_window_handle():
gi.require_version('GstVideo', '1.0')
gi.require_version('Gst', '1.0')
from gi.repository import Gst, GstVideo


class GstWidget(Widget):
    def __init__(self, gst_launch_string, x, y, width, height, master=None, **kw):
        super(GstWidget, self).__init__(master, 'frame', **kw)

        self.place(x=x, y=y, width=width, height=height)

        self.frame_id = self.winfo_id()

        self.player = Gst.parse_launch(gst_launch_string)
        self.player.set_state(Gst.State.PLAYING)

        self.bus = self.player.get_bus()
        self.bus.add_signal_watch()
        self.bus.connect('message::error', self.on_error)
        self.bus.connect('message::state-changed', self.on_status_changed)
        self.bus.connect('message::eos', self.on_eos)
        self.bus.connect('message::info', self.on_info)
        self.bus.enable_sync_message_emission()
        self.bus.connect('sync-message::element', self.set_frame_handle)

    def on_status_changed(self, bus, message):
        print('status_changed message -> {}'.format(message))

    def on_eos(self, bus, message):
        print('eos message -> {}'.format(message))

    def on_info(self, bus, message):
        print('info message -> {}'.format(message))

    def on_error(self, bus, message):
        print('error message -> {}'.format(message.parse_error()))

    def play(self):
        print('Current state of my pipeline is {}'.format(self.player.current_state))
        print('setting pipeline state to playing')
        self.player.set_state(Gst.State.PLAYING)

    def close(self):
        self.player.set_state(Gst.State.NULL)

    def is_playing(self):
        print('\t\t{}'.format(self.player.current_state))
        return self.player.current_state is not Gst.State.PLAYING

    def set_frame_handle(self, bus, message):
        if message.get_structure().get_name() == 'prepare-window-handle':
            frame = message.src
            frame.set_property('force-aspect-ratio', True)
            frame.set_window_handle(self.frame_id)

谁能指出我哪里错了? 我已经为所有事件设置了断点,并且它并没有打印我想要观看的事件的任何内容。 而且,如果有任何方法可以重试在丢失的连接上连接管道,您还能指出我吗?

我终于弄明白了。 “问题”在于tkinter主循环。 由于GStreamer在很大程度上依赖于Glib,并且tkinter不使用glib mainloop,因此我必须在与glib mainloop集成 tkinter时创建一个@jldupont建议的格式

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM