PyGame

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.
Beltistos
User
Beiträge: 5
Registriert: Dienstag 20. November 2007, 17:56

Hi,

wenn ich über PyGame Musik (mp3 und ogg, den Rest habe ich nicht ausprobiert) abspielen will, höre ich im Hintergrund immer so eine Art Rauschen. Woran liegt das? An mir? An PyGame? An SDL?

Mein Code:

Code: Alles auswählen

import pygame
from pygame.mixer import music
import time

pygame.mixer.init()
music.load('/home/beltistos/Test.mp3')
music.play()
time.sleep(5)
music.stop()
pygame.mixer.quit()
Beltistos
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Ähem, ich weiß es jetzt nicht konkret, aber gestalte den Code doch ein bisschen sauberer. Du musst music nicht extra importieren etc.

Code: Alles auswählen

import pygame
from pygame.locals import
pygame.init()
reicht vollkommen aus und ist flexibler. Das mixer.quit() ist glaube ich außerdem auch überflüssig. Probiers dann einfach nochmal.
Beltistos
User
Beiträge: 5
Registriert: Dienstag 20. November 2007, 17:56

Danke für die Antwort.
Irgendwie verstehe ich nicht, was
from pygame.locals import
heißen soll? Ich glaube, dahinter fehlt irgendwas, kann mir aber nicht vorstellen, was das sein könnte.
Nur zum Verständnis: Was ist daran unsauber, music zu importieren? Ist zumindest weniger zu schreiben.
Und ja, ich bin Python-Anfänger
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Oh sorry, hinter dem import fehlr ein *. Nun es heißt, dass ein paar Konstanten und Funktionen in das Script eingebunden werden. Für ausführlichere Informationen zum importieren und initiieren von pygame lies dir doch einfach mal das hier durch: http://www.pygame.org/docs/tut/ImportInit.html

Music zu importieren ist von daher unsauber, dass es durch import pygame ja schon importiert wurde. Music so wie du es gemacht hast zu importieren gibt nur dann Sinn, wenn du lediglich das Musicmodul verwenden willst. Und kein richtiges Spiel machen willst.
Beltistos
User
Beiträge: 5
Registriert: Dienstag 20. November 2007, 17:56

Imperator hat geschrieben:Music zu importieren ist von daher unsauber, dass es durch import pygame ja schon importiert wurde. Music so wie du es gemacht hast zu importieren gibt nur dann Sinn, wenn du lediglich das Musicmodul verwenden willst. Und kein richtiges Spiel machen willst.
Will ich auch eigentlich nicht. Es war nur die einfachste Möglichkeit, Musik abzuspielen. Wenn ich aber nur music importiere, komme ich ja nicht mehr an das init() von pygame bzw. pygame.mixer ran. Dann importiere ich einfach pygame.mixer und schreib dann ich halt bisschen mehr, wenn es dadurch besser wird. Danke.
Meine eigentliche Frage ist aber noch nicht beantwortet: Woher kommt das Rauschen und wie kriege ich es weg?

Beltistos
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Imperator: *-Imports sind gaaanz böse und gaaanz weit von "sauber" entfernt.

Folgendes könnte man aber machen:

Code: Alles auswählen

import time

from pygame import mixer


mixer.init()
mixer.music.load('/home/beltistos/Test.mp3')
mixer.music.play()
time.sleep(5)
mixer.music.stop()
mixer.quit()
Letztlich ist das aber recht egal und hängt auch von dem Rest ab, den man in dem Modul noch zu importieren gedenkt.


Beltistos: Was es mit dem Rauschen auf sich hat, weiß ich leider nicht. Ich würde da als erstes die Lautstärke sowie eventuelle Einschränkungen der nutzbaren Bitraten, VBR sowie andere Eigenschaften der Musikdaten überprüfen.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Ich behaupte jetzt einfach mal dass das time.sleep für Probleme sorgt, ersetze es doch einfach einmal Testweise durch ein while True: pass;
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Interessanter Einwand. Gibt es in Pygame nicht auch eine Timer-Funktionalität? Mit dieser Tritt das Phänomen möglicherweise nicht auf.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Y0Gi hat geschrieben:Imperator: *-Imports sind gaaanz böse und gaaanz weit von "sauber" entfernt.
Dann sag doch bitte eine Alternative zu from pygame.locals import*
das wird in jedem Tutorial so gemacht.

@Topic: Pygame hat tatsächlich einige zeitfunktionen zu bieten. In diesem Fall dürfte die hier die Richtige sein:

Code: Alles auswählen

pygame.time.wait(milliseconds)
BlackJack

Na die Alternative ist es das eben *nicht* zu tun und alles was man haben möchte explizit zu importieren.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

BlackJack hat geschrieben:Na die Alternative ist es das eben *nicht* zu tun und alles was man haben möchte explizit zu importieren.
Von dem Statement, dass * böse mal sind, abgesehen, was spricht _in diesem Fall_ dagegen? Das locals-ding enthält ausschliesslich konstanten und scheint mir eigentlich genau dafür gemacht zu sein.
BlackJack

Geschmackssache. Die ca. 240 Namen, die man da importiert, wird man sicher nicht alle brauchen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Schon seit ewig in meinen Code:

Code: Alles auswählen

import pygame.locals as pyl
Funktioniert, nicht viel Tipparbeit, Namespaces, sauber.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Interessant. Muss man dann was spezielles beachten beim Coden?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Imperator hat geschrieben:Interessant. Muss man dann was spezielles beachten beim Coden?
Nein, was denn auch. Es macht nichts magisches, es importiert nur die Locals in einen eigenen Namespace.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Beltistos
User
Beiträge: 5
Registriert: Dienstag 20. November 2007, 17:56

Hallo,
veers hat geschrieben:Ich behaupte jetzt einfach mal dass das time.sleep für Probleme sorgt, ersetze es doch einfach einmal Testweise durch ein while True: pass;
Leider nein, es rauscht auch mit der Endlosschleife oder dem pygame-wait.
Y0Gi hat geschrieben:Ich würde da als erstes die Lautstärke sowie eventuelle Einschränkungen der nutzbaren Bitraten, VBR sowie andere Eigenschaften der Musikdaten überprüfen.
An der Datei liegt es sicher nicht, die lässt sich zum Beispiel mit Amarok perfekt abspielen. Außerdem rauscht es auch bei allen anderen Dateien, die ich getestet habe.

Sonst noch irgendwelche Ideen? :cry:

Beltistos
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Kann/muss man die Audioeinstellungen in Pygame mit bestimmten Optionen initialisieren? Vielleicht wird dein Soundchip falsch erkannt oder so *an die Zeiten von SB 16/Pro/AWE, Gus und Adlib erinner*
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Könnte es nicht auch an der Hardware selbst liegen?
Beltistos
User
Beiträge: 5
Registriert: Dienstag 20. November 2007, 17:56

Problem gelößt! :D
In der pygame.mixer-Dokumentation steht Folgendes:
NOTE: there is currently a bug on some windows machines which makes sound play back 'scratchy'. There is not enough cpu in the sound thread to feed the buffer to the sound api. To get around this you can increase the buffer size. However this means that there is more of a delay between the time you ask to play the sound and when it gets played. Try calling this before the pygame.init or pygame.mixer.init calls. pygame.mixer.pre_init(44100,-16,2, 1024 * 3)
Wenn man pygame.mixer mit den angegebenen Werten initialisiert, rauscht es nicht mehr. Eigentlich läuft bei mir ja Linux, aber was soll's.
Danke an alle die mir geholfen haben!

Beltistos
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Dann noch viel Spaß beim Coden mit Python!
Antworten