Gstreamer python 获取总线消息重新连接
Gstreamer python get bus message reconnection
我有一些带有 gstreamer 管道的 Tkinter 应用程序来显示不同的流,我想检测其中一个管道何时断开连接。我尝试使用总线消息,但在我看来它根本没有 post 消息。我创建了一个小部件来管理 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)
谁能指出我错在哪里?
我已经为所有事件设置了断点,而且它没有打印我想观看的事件中的任何内容。
如果有任何方法可以在丢失的连接上重试连接管道,你还能指点我吗?
我终于明白了。 "problem" 与 tkinter 主循环有关。
由于 GStreamer 严重依赖 Glib 而 tkinter 不使用 glib mainloop 我不得不创建一个像@jldupont 在 tkinter integration with glib mainloop
所建议的那样
我有一些带有 gstreamer 管道的 Tkinter 应用程序来显示不同的流,我想检测其中一个管道何时断开连接。我尝试使用总线消息,但在我看来它根本没有 post 消息。我创建了一个小部件来管理 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)
谁能指出我错在哪里? 我已经为所有事件设置了断点,而且它没有打印我想观看的事件中的任何内容。 如果有任何方法可以在丢失的连接上重试连接管道,你还能指点我吗?
我终于明白了。 "problem" 与 tkinter 主循环有关。 由于 GStreamer 严重依赖 Glib 而 tkinter 不使用 glib mainloop 我不得不创建一个像@jldupont 在 tkinter integration with glib mainloop
所建议的那样