Video loop mit wxpython und pygst

Plattformunabhängige GUIs mit wxWidgets.
Antworten
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Hallo,

ich versuche gerade im Hauptfenster ein Video im Hintergrund abzuspielen, was soweit
auch funktioniert - allerdings möchte ich es als Endlosvideo laufen lassen.

Allein auf die "gst.MESSAGE_EOS" Nachricht zu reagieren und das Video dann neu
starten funktioniert nicht wirklich gut... ich möchte keinen Übergang sehen.

Sollte irgendwie mit entsprechendem seeking evtl. funktionieren um einen sauberen
Übergang zu schaffen. Leider finde ich mich in der Doku überhaupt nicht zurecht, bzw
finde entsprechendes nicht.

Weiss ja jmd. zufällig Rat???

Quelle leicht abgewandelt von: http://pygstdocs.berlios.de/pygst-tutorial/playbin.html

Code: Alles auswählen

#!/usr/bin/env python

import sys, os
import pygst
pygst.require("0.10")
import gst
import time

import gobject
import wx


gobject.threads_init()

class WX_Main(wx.App):
  
   def OnInit(self):
       window = wx.Frame(None)
       window.SetTitle("Video-Player")
       window.SetSize((800, 600))
       window.Bind(wx.EVT_CLOSE,self.destroy)
       vbox = wx.BoxSizer(wx.VERTICAL)
       hbox = wx.BoxSizer(wx.HORIZONTAL)
       vbox.Add(hbox, 0, wx.EXPAND, 0)
       self.movie_window = wx.Panel(window)
       vbox.Add(self.movie_window,1,wx.ALL|wx.EXPAND,4)
       window.SetSizer(vbox)
       window.Layout()
       window.Show()
       self.SetTopWindow(window)
      
       self.player = gst.element_factory_make("playbin2", "player")
       bus = self.player.get_bus()
       bus.add_signal_watch()
       bus.enable_sync_message_emission()
       bus.connect('message', self.on_message)
       bus.connect('sync-message::element', self.on_sync_message)
       self.player.set_property('uri',"file://" + "/home/ubuntu/test.avi")
       self.player.set_state(gst.STATE_PLAYING)
       return True

   def on_message(self, bus, message):
       t = message.type
       print t
       if t == gst.MESSAGE_EOS:
           self.player.set_state(gst.STATE_NULL)

	  #self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH,0)
          self.player.set_state(gst.STATE_PLAYING)

       elif t == gst.MESSAGE_ERROR:
           self.player.set_state(gst.STATE_NULL)
  
   def on_sync_message(self, bus, message):
       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.movie_window.GetHandle())
          
   def destroy(self,event):
       #Stop the player pipeline to prevent a X Window System error
       self.player.set_state(gst.STATE_NULL)
       event.Skip()
          
app = WX_Main()
app.MainLoop()
Antworten