Seite 1 von 2

PyGame

Verfasst: Donnerstag 22. November 2007, 17:56
von Beltistos
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

Verfasst: Donnerstag 22. November 2007, 18:38
von Imperator
Ä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.

Verfasst: Donnerstag 22. November 2007, 19:21
von Beltistos
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

Verfasst: Donnerstag 22. November 2007, 19:36
von Imperator
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.

Verfasst: Donnerstag 22. November 2007, 21:11
von Beltistos
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

Verfasst: Donnerstag 22. November 2007, 21:23
von Y0Gi
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.

Verfasst: Donnerstag 22. November 2007, 23:21
von veers
Ich behaupte jetzt einfach mal dass das time.sleep für Probleme sorgt, ersetze es doch einfach einmal Testweise durch ein while True: pass;

Verfasst: Freitag 23. November 2007, 11:51
von Y0Gi
Interessanter Einwand. Gibt es in Pygame nicht auch eine Timer-Funktionalität? Mit dieser Tritt das Phänomen möglicherweise nicht auf.

Verfasst: Freitag 23. November 2007, 14:37
von Imperator
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)

Verfasst: Freitag 23. November 2007, 14:52
von BlackJack
Na die Alternative ist es das eben *nicht* zu tun und alles was man haben möchte explizit zu importieren.

Verfasst: Freitag 23. November 2007, 15:29
von keppla
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.

Verfasst: Freitag 23. November 2007, 15:56
von BlackJack
Geschmackssache. Die ca. 240 Namen, die man da importiert, wird man sicher nicht alle brauchen.

Verfasst: Freitag 23. November 2007, 16:18
von Leonidas
Schon seit ewig in meinen Code:

Code: Alles auswählen

import pygame.locals as pyl
Funktioniert, nicht viel Tipparbeit, Namespaces, sauber.

Verfasst: Freitag 23. November 2007, 18:41
von Imperator
Interessant. Muss man dann was spezielles beachten beim Coden?

Verfasst: Freitag 23. November 2007, 18:44
von Leonidas
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.

Verfasst: Samstag 24. November 2007, 15:50
von Beltistos
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

Verfasst: Samstag 24. November 2007, 22:25
von Y0Gi
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*

Verfasst: Sonntag 25. November 2007, 09:55
von Imperator
Könnte es nicht auch an der Hardware selbst liegen?

Verfasst: Sonntag 25. November 2007, 10:24
von Beltistos
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

Verfasst: Sonntag 25. November 2007, 12:10
von Imperator
Dann noch viel Spaß beim Coden mit Python!