Python GStreamer 段错误
我想创建一个播放器类,用来播放音乐,使用的是gst库。这是我的代码:
from gi.repository import GObject
GObject.threads_init()
import gst
class PlayerControl:
def __init__(self, main_window):
self.player = gst.element_factory_make("playbin2", "player")
self.sink = gst.element_factory_make("autoaudiosink", "player Output")
self.videosink= gst.element_factory_make("fakesink", "player fake Output")
self.player.set_property("video-sink", self.videosink)
self.player.set_property("audio-sink", self.sink)
self.player_bus = self.player.get_bus()
self.player_bus.add_signal_watch()
self.player_bus.connect("message", self.on_messages)
self.player.connect("about-to-finish", self.on_finish)
self.main_window = main_window
self.main_window.seek_bar.connect("value-changed", self.on_slider_changed)
self.main_window.seek_bar.set_range(0, 100)
self.playing = False
def on_messages(self, bus, message):
print(message)
def play(self, file):
self.playing = True
self.player.set_state(gst.STATE_READY)
self.player.set_property("uri", "file:///"+str(file)) # örnek olsun diye
self.player.set_state(gst.STATE_PLAYING)
GObject.timeout_add(100, self.update_slider)
[...]
我在另一个类中这样调用它来播放声音:
from file import PlayerControl
class PlayerExample():
def __init__( self ):
self.player_gst = PlayerControl(self)
[...]
def play(self, file):
self.playing = True
self.player.set_state(gst.STATE_READY)
self.player.set_property("uri", "file:///"+str(file))
self.player.set_state(gst.STATE_PLAYING)
GObject.timeout_add(100, self.update_slider)
[...]
我把一个gtk按钮连接到了播放功能上。当我点击这个按钮时,程序出现了segmentation fault
的错误,但没有任何信息提示。
另外,如果我把self.player_bus.add_signal_watch()
和self.player.connect("about-to-finish", self.on_finish)
这两行从我的PlayerControl类中去掉,程序就能正常播放声音,但我需要在“即将结束”信号时调用on_finished函数。
为什么这样就不行呢?
1 个回答
0
来自 gi.repository 的 GObject.threads_init()
在 pygst "0.10" 中不起作用,你需要在:
import gobject
gobject.threads_init()
import gst
播放器类的顶部添加这段代码。或者可以使用 Gst-1.0,详细信息请查看 https://wiki.ubuntu.com/Novacut/GStreamer1.0