Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: PyGST QT4 Video rendering  (gelezen 1231 keer)

PyGST QT4 Video rendering
« Gepost op: 2008/10/30, 17:16:44 »
Hallo, ik probeer een video met hulp van gstreamer af te spelen. Het geluid werkt al, alleen moet het nog gerenderd worden in bijvoorbeeld QWidget. Dit krijg ik niet voor elkaar, zeker niet omdat er stomweg geen documentatie is. Zeker niet voor renderen in een QWidget (of een ander QT onderdeel).

Dit is wat ik al heb:
import pygst
pygst.require("0.10")
import gst, time

from PyQt4.QtGui import *
class vidiplay():
def __init__(self, parent=None):
self.parent = parent
self.player = gst.element_factory_make("playbin", "player")
fakesink = gst.element_factory_make("fakesink", "fakesink")
self.player.set_property("video-sink", fakesink)
bus = self.player.get_bus()
bus.add_signal_watch()
bus.enable_sync_message_emission()


bus.connect('message::*', self.bus_message)

def bus_message(self, bus, message):
t = message.type
if t == gst.MESSAGE_EOS: print "End Of Stream"
elif t == gst.MESSAGE_ERROR:
err, debug = message.parse_error()
print "Error: %s" % err, debug
print t


def startstop(self, loop=False):
if self.player.get_state()[1] == gst.STATE_PLAYING and not loop :
self.player.set_state(gst.STATE_NULL)
self.parent.ui.playknop.setIcon(QIcon(self.parent.style().standardPixmap(QStyle.SP_MediaPlay)))
self.parent.ui.playknop.setText("Play")
else:
self.playmode = True
self.player.set_property("uri", self.vidiurl)
self.player.set_state(gst.STATE_PLAYING)
self.parent.ui.playknop.setIcon(QIcon(self.parent.style().standardPixmap(QStyle.SP_MediaStop)))
self.parent.ui.playknop.setText("Stop")



def null(self):
self.player.set_state(gst.STATE_NULL)
self.parent.ui.playknop.setIcon(QIcon(self.parent.style().standardPixmap(QStyle.SP_MediaPlay)))
self.parent.ui.playknop.setText("Play")
Groet

Offline profoX

  • Lid
    • wesley
    • Lionslink
PyGST QT4 Video rendering
« Reactie #1 Gepost op: 2008/10/30, 18:40:33 »
Gebruik QWidget (ipv QGraphicsView) en gebruik QWidget::winId() wanneer je het "prepare-xwindow-id" message tegenkomt bij een sync_message.. vereist ook een nieuwe connection... ik zal wat sample code schrijven..
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline profoX

  • Lid
    • wesley
    • Lionslink
PyGST QT4 Video rendering
« Reactie #2 Gepost op: 2008/10/30, 19:15:22 »
meh.. khad nog een probleem gevonden, daarom dat 't zo lang duurde.. gobject.threads_init() moet nog uitgevoerd worden voor het importeren van pygst

Bovenaan toevoegen:
import gobject
gobject.threads_init()
en dan gewoon zo:

Deze 2 lijnen verwijderen:
fakesink = gst.element_factory_make("fakesink", "fakesink")
self.player.set_property("video-sink", fakesink)
Deze lijn toevoegen achter bus.enable_sync_message_emission()
bus.connect('sync-message::element', self.sync_message)Deze functie toevoegen:
def sync_message(self, bus, message):
pass
if message.structure is None:
return
message_name = message.structure.get_name()
if message_name == "prepare-xwindow-id":
imagesink = message.src
imagesink.set_property("force-aspect-ratio", True)
imagesink.set_xwindow_id(self.parent.ui.video.winId())
(Zorg ervoor dat je een QWidget hebt met de objectnaam "video")

PS: er kan wat kleine flicker optreden wanneer je het venster gaat resizen enzo, dat is makkelijk te fixen door wat paint properties van de QWidget in te stellen... als het storend is kijk ik wel even of ik een goeie combinatie kan vinden :P
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline profoX

  • Lid
    • wesley
    • Lionslink
PyGST QT4 Video rendering
« Reactie #3 Gepost op: 2008/10/31, 14:42:01 »
[ probleem is ondertussen dus gefixt in bazaar branch van vidiqatch :) ]
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)