Seite 1 von 1

wx.MediaCtrl, Probleme auf dem Mac

Verfasst: Samstag 11. April 2009, 12:31
von snakeseven
Hallo,
ich verwende folgende Initialisierung von wx-MediaCtrl:

Code: Alles auswählen

try:
   if self.opsys == 'win':
      self.mc = wx.media.MediaCtrl(self, style=wx.NO_BORDER, szBackend = wx.media.MEDIABACKEND_WMP10, validator = wx.DefaultValidator)          
   else:
      self.mc = wx.media.MediaCtrl(self, style=wx.NO_BORDER, szBackend = wx.media.MEDIABACKEND_QUICKTIME, validator = wx.DefaultValidator) 
except NotImplementedError:
   pass
self.Bind(wx.media.EVT_MEDIA_LOADED, self.play)  
self.Bind(wx.media.EVT_MEDIA_FINISHED, self.autoloadnextsong)
Das Abspielen klappt auf Windows mit dem Mediaplayer Backend ohne Probleme, während auf dem Mac das Abspielen nach ca. 3 Minuten beendet wird. Bei jedem Song endet das Abspielen zu einem anderen Zeitpunkt. Dieser ist aber für die einzelnen Songs immer derselbe.

Setze ich den Playcursor per Seek hinter die Stelle, wo Quicktime vorher nicht weitergespielt hat, wird der Song korrekt zuende agespielt.

Bin schon die Quicktime Settings durchgegangen, ob es vieleicht an der Cachegrösse liegt, da die Files gestreamt werden, aber eine solche Option gibt es dort nicht.

Ich verwende auf dem Mac Python 2.6 und auf dem PC Python 2.5. Glaube aber nicht, dass es daran liegt.

Gruss, Seven

Verfasst: Sonntag 12. April 2009, 17:15
von snakeseven
Ein Blick in den Quicktime Cache zeigt, das QT die Dateien nicht richtig zwischenspeichert. 3MB statt 5, bzw. 2.5 statt 4.2. Dementsprechend werden die Files auch nur verkürzt abgespielt. Teile ich die Soll-Abspielzeit durch die Ist-Abspielzeit, kommt immer derselbe Wert bei raus.

Lade ich dagegen die URLs direkt in den Quicktimeplayer werden die Songs korrekt abgespielt. Es scheint also an der Schnittstelle zu wx.Python zu liegen. Wenn ich den Mediaplayer 9 auf dem MAC installiere (welch Frevel!) dann steht mir trotzdem kein Mediaplayer Backend zur Verfügung !?

Dann wird mir wohl nichts anderes übrig bleiben, als auf das Streamen zu verzichten, was einfach viel Zeit kostet, da die Files erstmal komplett runtergeladen werden müssen :(

Gruss, Seven

(Python-OSX ignoriert auch wx.YieldIfNeeded() und mag kein wx.FutureCall(). Aber das gehört in einen anderen Thread)

Verfasst: Montag 13. April 2009, 17:39
von snakeseven
Hier jetzt ein kleines Script, welches die Problematik verdeutlicht. Wird nach 5 Sekunden per FutureCall ein Stop erzwungen, wird dieser Status korrekt erkannt und der Timer gestoppt. Stoppt dagegen w.MediaCtrl von sich aus, wird kein wx.media.EVT_MEDIA_STOP ausgelöst und in self.OnTimer() eine Fehlermeldung generiert, da self.mc.GetState() keinen Wert liefert (self.mc.Tell() dagegen schon !?).

wx.media.EVT_MEDIA_STOP wird ausgelöst, wenn das Ende des Mediastreams erreicht ist. Da aber kein wx.media.EVT_MEDIA_STOP ausgelöst wird, ist das Ende des Streams offensichtlich noch nicht erreicht. Weshalb stoppt Quicktime aber dann??

Code: Alles auswählen

#!/usr/bin/env python

import wx, wx.media


class Player(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, size=(280, 120))
        panel = wx.Panel(self, -1)
        
        self.status = wx.StaticText(self, -1, pos=(80,10))
        self.filelength = wx.StaticText(self, -1, pos=(80,30))
        self.playposition = wx.StaticText(self, -1, pos=(80,50))
        self.info = wx.StaticText(self, -1, pos=(80,70))
        
        # init wx.MediaCtrl
        try:
            self.mc = wx.media.MediaCtrl(self, style=wx.SIMPLE_BORDER, szBackend=wx.media.MEDIABACKEND_QUICKTIME)
        except NotImplementedError:
            self.Destroy()
        self.Bind(wx.media.EVT_MEDIA_LOADED, self.playfile)
        self.Bind(wx.media.EVT_MEDIA_STOP, self.OnStop)
        
        # init Timer
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnTimer)
        
        st = self.mc.GetState()
        if st == 0: status = 'stop'
        elif st == 2: status = 'play'
        self.status.SetLabel('Status: '+status)
        
        # load song from url 
        #wx.FutureCall(1000, self.mc.LoadURI,'http://cache03-music01.myspacecdn.com/20/std_5c415144919fce1feb54d8c9a6529398.mp3')
        wx.FutureCall(1000, self.mc.LoadURI,'http://cache03-music02.myspacecdn.com/97/std_f5f7a726d2a44b6681c13d0a73944c90.mp3')
        #wx.FutureCall(1000, self.mc.LoadURI,'http://cache03-music02.myspacecdn.com/122/std_5dafc4d577064172bcc9d61b1d25610e.mp3')
        
        # trigger stop
        #wx.FutureCall(20000,self.stop)
        
        self.Center()

        
    def OnTimer(self, evt):
        st = self.mc.GetState()
        offset = self.mc.Tell()
        inf = float(self.mc.Length()) / float(offset)
        
        if st == 0: status = 'stop'
        elif st == 2: status = 'play'
            
        self.status.SetLabel('Status: '+status)
        self.playposition.SetLabel('Playposition: %d' % offset)
        self.info.SetLabel('Len / Pos.: %.2f'% inf)
    
        
    def playfile(self, event=None):
        self.filelength.SetLabel('Filelength: '+str(self.mc.Length()))
        self.timer.Start(500)
        self.mc.Play()
        
        
    def stop(self):
        self.mc.Stop()
        
        
    def OnStop(self, event=None):
        self.timer.Stop()
        self.status.SetLabel('Status: stop')



class Test(wx.App):
    def OnInit(self):
        frame = Player()
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

app = Test(0)
app.MainLoop()

Gruss, Seven