Seite 1 von 1

Video loop mit wxpython und pygst

Verfasst: Montag 10. Mai 2010, 23:33
von py_lo
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()