Sounds mit pymedia mehrfach abspielen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Shana
User
Beiträge: 28
Registriert: Dienstag 22. August 2006, 11:58
Wohnort: Bremen
Kontaktdaten:

Donnerstag 24. August 2006, 13:43

Hallo,

ich hab nun folgendes Problem, ich spiele mit pymedia eine mp3 Datei ab, kann diese auch stoppen. Nun möchte ich die Datei allerdings nocheinmal abspielen, bekomme aber nur eine Fehlermeldung.
Für hilfreiche Tipps wäre ich sehr dankbar.

Hier mein Code:

Code: Alles auswählen

import pymedia
import time

Code: Alles auswählen

    def OnStart(self, event):
        self.play.start()
        thread.start_new_thread(self.play.startPlayback,(str(self.aktuelle_datei),))
        while self.play.isPlaying():
            time.sleep( 0.01 )

    def OnStop(self, event):
        self.play.stop()
Zuletzt noch die Fehlermeldung:
Bild
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Freitag 25. August 2006, 22:04

das problem ist der neue thread!
kannst du das aus dem thread rausnehmen?
http://www.cs.unm.edu/~dlchao/flake/doom/
Benutzeravatar
Shana
User
Beiträge: 28
Registriert: Dienstag 22. August 2006, 11:58
Wohnort: Bremen
Kontaktdaten:

Sonntag 27. August 2006, 09:51

Das ist meiner Ansicht nicht so gut, dass aus dem Thread zu nehmen, denn dann wäre mein Programm ja damit beschäftigt, das Lied abzuspielen und man könnte in der Zeit nichts anderes mehr machen.

Gibt es keine andere Möglichkeit?
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Sonntag 27. August 2006, 10:24

Wie wäre es, wenn du das andere in einen neuen Thread tust ;)
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Sonntag 27. August 2006, 11:12

Also ich würde vermuten, dass startPlayback das automatisch im Hintergrund abspielt. Der neue Thread wird also direkt von pymedia erstellt.
Benutzeravatar
Shana
User
Beiträge: 28
Registriert: Dienstag 22. August 2006, 11:58
Wohnort: Bremen
Kontaktdaten:

Sonntag 27. August 2006, 19:47

Ja, das schon, das Problem ist allerdings, dass ich überprüfen möchte, ob das aktuelle zu Ende ist, um dann das neue Lied zu starten. Diese While-Schleife, die ich oben gepostet habe, die soll man benutzen ( steht im Modul, dass ich importiere ~> pymedia ). Allerdings wird diese nie ausgeführt, was ich auch sehr komisch finde. Ich hatte gedacht, dass diese solange läuft, bis das Lied zu Ende ist, ist aber nicht so. Also weiß ich nun nicht, wie ich gucken kann, wann das Lied zu Ende ist.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Sonntag 27. August 2006, 19:52

also das musst du genauer (mit kompletten code) erklären.
also an sich sieht ja die isPlaying ganz vernünftig und verständlich an.
http://www.cs.unm.edu/~dlchao/flake/doom/
Benutzeravatar
Shana
User
Beiträge: 28
Registriert: Dienstag 22. August 2006, 11:58
Wohnort: Bremen
Kontaktdaten:

Sonntag 27. August 2006, 20:05

Code: Alles auswählen

self.OnStart(self, event=True):
    self.OnStop()
    time.sleep(0.5)
    self.play.start()
    thread.start_new_thread(self.play.startPlayback,(str(self.aktuelle_datei),))
    while self.play.isPlaying():
        time.sleep(0.01)
Hier ist ja das Problem, dass die Wiedergabe in einem neuen Thread geladen wird, da sonst das Problem ist, dass das Programm mit dem Wiedergeben beschäftigt ist und man nichts anderes mehr machen kann. Durch den Thread ist es auch so, dass die While-Schleife nicht durchlaufen wird. So kann man jetzt nicht feststellen, wann die Wiedergabe zu Ende ist. Gibt es nicht vielleicht eine Methode, diesen Thread 'auszufragen'?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Sonntag 27. August 2006, 20:13

dann liefert das ganze doch schon das, was du willst, oder nicht?
du bekommst das ende genau mit. dann ist ja die funktion ausgeführt.
bei der while-schleife machst du doch auch nichts anderes als warten, wie du das so auch machst.
http://www.cs.unm.edu/~dlchao/flake/doom/
Benutzeravatar
Shana
User
Beiträge: 28
Registriert: Dienstag 22. August 2006, 11:58
Wohnort: Bremen
Kontaktdaten:

Montag 28. August 2006, 10:21

Aber durch den neuen Thread wird die While-Schleife in der Funktion doch garnicht durchlaufen!
Benutzeravatar
Spaten
User
Beiträge: 52
Registriert: Samstag 27. Mai 2006, 11:35
Wohnort: Bremen
Kontaktdaten:

Montag 28. August 2006, 16:28

vielleicht musst du die Schleife mit in eine neue Funktion bzw Methode schreiben,
die du dann in einem neuen Thread öffnest.
(ist mir gerade so eingefallen, werds vielleicht mal ausprobieren)

Code: Alles auswählen

def starter(self):
   self.play.start()
   self.play.startPlayback(self.aktuelle_datei)
   while self.play.isPlaying():
        time.sleep(0.01)

def OnStart(self, event=True):
    self.OnStop()
    time.sleep(0.5)
    thread.start_new_thread(self.starter)
Weiß nicht, ob das so funktioniert, kann ich dann a auch mal selber ausprobieren,
aber ich wollte dir nur mal meine Idee mitteilen ;)
Python-Version: 2.5
Benutzeravatar
Shana
User
Beiträge: 28
Registriert: Dienstag 22. August 2006, 11:58
Wohnort: Bremen
Kontaktdaten:

Montag 28. August 2006, 18:49

Jap, danke, habs ausprobiert und es klappt jetzt. Danke!

Code: Alles auswählen

def starter(self, event=True):
        self.play.start()
        self.play.startPlayback(self.aktuelle_datei)
        while self.play.isPlaying():
            time.sleep(0.01)

        self.OnNext()

def OnStart(self, event=True):
        '''
        startet die Wiedergabe
        '''
            self.OnStop()
            time.sleep(0.5)
            thread.start_new_thread(self.starter,(True,))
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Dienstag 29. August 2006, 10:03

Warum in alles in der Welt fragst du jede Hunderstelsekunde ab? Reicht nicht alle 10 Sekunden, oder von mir aus jede Sekunde?

Kannst du pymedia nicht einfach fragen, wie lange der Song ist? Dann kannst du einfach die angegebene Zeit warten.
Antworten