Multimedia mit wxPython

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Der Code sagt leider nicht viel aus, außer, dass du den slider falsch verwendest.

Code: Alles auswählen

t_len = self.mplayer.GetTimeLength()
Das ist ein recht teurer Aufruf, den du alle 100ms absetzte, es müssen Daten in einen fd geschrieben werden, die Antwort vom Prozess abgewartet werden. Außerdem ändert sich die Länge des Videos/Lieds nicht, d.h. du musst die "Range" mit SetRange nur einmal setzten, zu Beginn des Videos. Updaten musst du mit .SetValue.
the more they change the more they stay the same
BlackJack

@Dav1d: Ab wann darf man denn `GetTimeLength()` aufrufen? akhof hat das ja hauptsächlich deswegen in den Timer-Handler verschoben, weil der Aufruf an der Originalstelle von dem Multimediaplayer `None` zurück gegeben hat. Kann es sein, dass das Video schon laufen muss bevor man die Methode aufrufen darf?
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Ja, die Media-Datei muss schon gestartet sein, dafür lässt sich wunderbar das EVT_MEDIA_STARTED Event verwenden.

Kleines Beispiel, ändert die Lautstärke auf Tastendruck und zeigt die Länge und aktuelle Position an:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import MplayerCtrl as mpc
import youtube
import wx

#mpc.DEBUG = True

class Frame(wx.Frame):
    def __init__(self, parent, id, size=(-1,-1)):
        wx.Frame.__init__(self, parent, id, size=size)
        self.mpc = mpc.MplayerCtrl(self, -1, 'mplayer')

        self.Bind(mpc.EVT_MEDIA_STARTED, self.media_started)
        self.Bind(mpc.EVT_MEDIA_FINISHED, self.media_finished)
        self.Bind(mpc.EVT_PROCESS_STARTED, self.process_started)
        self.Bind(mpc.EVT_PROCESS_STOPPED, self.process_stopped)
        self.mpc.Bind(wx.EVT_KEY_DOWN, self.key_down)
        
        self.timer = wx.Timer()
        self.interval = 100
        self.timer.Bind(wx.EVT_TIMER, self.on_timer, self.timer)
        
        self.Center()
        self.Show()

    def media_started(self, evt):
        print '----------> Media started'
        print 'Länge:', self.mpc.GetTimeLength()
        self.timer.Start(self.interval)
    def media_finished(self, evt):
        print '----------> Media finished'
    def process_started(self, evt):
        print '----------> Process started'
        self.mpc.Loadfile('testmovie ü.mpg')
    def process_stopped(self, evt):
        print '----------> Process stopped'

    def on_timer(self, evt):
        if self.mpc.playing:
            print 'Pos:', self.mpc.GetTimePos()
            self.timer.Start(self.interval)

    def key_down(self, evt):
        k = evt.GetKeyCode()
        if k in (43, 45) and self.mpc.playing:
            volume = self.mpc.volume
            if k == 43:
                if not volume > 95:
                    self.mpc.volume += 5
            elif k == 45:
                if not volume <= 5:
                    self.mpc.volume -= 5
        evt.Skip()
            
    
if __name__ == '__main__':
    app = wx.App()
    f = Frame(None, -1)
    app.MainLoop()
the more they change the more they stay the same
BlackJack

@Dav1d: Wenn es denn funktioniert — wie gesagt bei dem oben angeführten Beispielprogramm `mediaplayer.py` werden die Handler nicht aufgerufen. Bei Deinem Beispiel funktioniert es.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@BlackJack, du meinst den Blogbeitrag von driscollis? - Der sollte funktionieren (wobei der zu Zeiten von 0.1.3 entstanden ist, aktuell ist 0.3.1, erst letztens geupdated ;))
the more they change the more they stay the same
Antworten