Ich habe mir das gst-python-Tutorial durchgelesen und habe eine Frage (das Tutorial findet man hier http://pygstdocs.berlios.de/pygst-tutorial/index.html).
Nehmen wir zum Beispiel mal diese Code-Beispiel (das erste Example aus dem Tutorial):
Code: Alles auswählen
#!/usr/bin/env python
import sys, os, os.path
import pygtk, gtk, gobject
import pygst
pygst.require("0.10")
import gst
class GTK_Main:
def __init__(self):
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_title("Audio-Player")
window.set_default_size(400, 300)
window.connect("destroy", gtk.main_quit, "WM destroy")
vbox = gtk.VBox()
window.add(vbox)
self.entry = gtk.Entry()
vbox.pack_start(self.entry, False, True)
self.button = gtk.Button("Start")
self.button.connect("clicked", self.start_stop)
vbox.add(self.button)
window.show_all()
self.player = gst.element_factory_make("playbin", "player")
fakesink = gst.element_factory_make('fakesink', "my-fakesink")
self.player.set_property("video-sink", fakesink)
bus = self.player.get_bus()
bus.add_signal_watch()
bus.connect('message', self.on_message)
def start_stop(self, w):
if self.button.get_label() == "Start":
filepath = self.entry.get_text()
if os.path.exists(filepath):
self.button.set_label("Stop")
self.player.set_property('uri', "file://" + filepath)
self.player.set_state(gst.STATE_PLAYING)
else:
self.player.set_state(gst.STATE_NULL)
self.button.set_label("Start")
def on_message(self, bus, message):
t = message.type
if t == gst.MESSAGE_EOS:
self.player.set_state(gst.STATE_NULL)
self.button.set_label("Start")
elif t == gst.MESSAGE_ERROR:
self.player.set_state(gst.STATE_NULL)
self.button.set_label("Start")
gtk.gdk.threads_init()
GTK_Main()
gtk.main()
Ich würde jedoch gerne eine GUI-Anwendung in Qt4 schreiben, die Gstreamer benutzt. Jetzt habe ich aber das Problem, dass sämtliche gstreamer-Objekte gObjects sind und ich zum Arbeiten mit deren Signalen einen gObject Event-Loop bräuchte.
Wenn ich z.B. einfach so in meiner Qt-Anwendung bus.add_signal_watch() aufrufe, dann Segfaultet sie mir sofort.
Kann ich irgendwie einen gObject Event-Loop in meine Qt-Anwendung einbinden? Ist es nicht ein bisschen unpraktisch, einen bestimmten Event-Loop vorauszusetzen?
Ich habe Versucht mit QThread einen neuen Thread zu erstellen und in diesem Thread dann einen gObject Event-Loop laufen zu lassen. Aber sobald ich in dem Thread gobject.MainLoop.run() aufrufe, friert meine Anwendung ein.
Ich merke, das die Sache ziemlich kompliziert ist, aber ich hoffe mir kann trotzdem jemand helfen.
Vielen Dank schonmal im Voraus!