27
votes

I'm trying to play sound files (.wav) with pygame but when I start it I never hear anything.
This is the code:

import pygame

pygame.init()
pygame.mixer.init()
sounda= pygame.mixer.Sound("desert_rustle.wav")

sounda.play()

I also tried using channels but the result is the same

15
Probably moot for the original poster, but whoever finds this with a search, avoid those solutions with no sleep time or fixed sleep time. Look at my answer that sleeps, but only while the music/sound is playing. That is what you want to do. - RufusVS

15 Answers

2
votes

Your code plays desert_rustle.wav quite fine on my machine (Mac OSX 10.5, Python 2.6.4, pygame 1.9.1). What OS and Python and pygame releases are you using? Can you hear the .wav OK by other means (e.g. open on a Mac's terminal or start on a Windows console followed by the filename/path to the .wav file) to guarante the file is not damaged? It's hard to debug your specific problem (which is not with the code you give) without being able to reproduce it and without having all of these crucial details.

23
votes

For me (on Windows 7, Python 2.7, PyGame 1.9) I actually have to remove the pygame.init() call to make it work or if the pygame.init() stays to create at least a screen in pygame.

My example:

import time, sys
from pygame import mixer

# pygame.init()
mixer.init()

sound = mixer.Sound(sys.argv[1])
sound.play()

time.sleep(5)
10
votes

sounda.play() returns an object which is necessary for playing the sound. With it you can also find out if the sound is still playing:

channela = sounda.play()
while channela.get_busy():
   pygame.time.delay(100)
8
votes

I had no sound from playing mixer.Sound, but it started to work after i created the window, this is a minimal example, just change your filename, run and press UP key to play:

WAVFILE = 'tom14.wav'
import pygame
from pygame import *
import sys

mixer.pre_init(frequency=44100, size=-16, channels=2, buffer=4096)
pygame.init()
print pygame.mixer.get_init() 
screen=pygame.display.set_mode((400,400),0,32) 

while True:
    for event in pygame.event.get():
        if event.type == QUIT:                                                    
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key==K_ESCAPE:
                 pygame.quit()
                 sys.exit()
            elif event.key==K_UP:
                s = pygame.mixer.Sound(WAVFILE)
                ch = s.play()
                while ch.get_busy():
                    pygame.time.delay(100)
    pygame.display.update()
5
votes

What you need to do is something like this:

 import pygame
 import time

 pygame.init()
 pygame.mixer.init()
 sounda= pygame.mixer.Sound("desert_rustle.wav")

 sounda.play()
 time.sleep (20)

The reason I told the program to sleep is because I wanted a way to keep it running without typing lots of code. I had the same problem and the sound didn't play because the program closed immediately after trying to play the music.

In case you want the program to actually do something just type all the necessary code but make sure it will last long enough for the sound to fully play.

4
votes
import pygame, time


pygame.mixer.init()
pygame.init()

sounda= pygame.mixer.Sound("beep.wav")

sounda.play()

pygame.init() goes after mixer.init(). It worked for me.

3
votes

I had the same problem under windows 7. In my case I wasn't running the code as Administrator. Don't ask me why, but opening a command line as administrator fixed it for me.

3
votes

I think what you need is pygame.mixer.music:

import pygame.mixer
from time import sleep
pygame.mixer.init()
pygame.mixer.music.load(open("\windows\media\chimes.wav","rb"))
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
    sleep(1)
print "done"
1
votes

Just try:

import pygame.mixer
from time import sleep
pygame.mixer.init()
pygame.mixer.music.load(open("\windows\media\chimes.wav","rb"))
print ""
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
    sleep(1)
print "done"

This should work. You just need to add print ""and the sound will have had time to load its self.

1
votes

You missed to wait for the sound to finish. Your application will start playing the sound but will exit immediately.

If you want to play a single wav file, you have to initialize the module and create a pygame.mixer.Sound() object from the file. Invoke play() to start playing the file. Finally, you have to wait for the file to play.

Use get_length() to get the length of the sound in seconds and wait for the sound to finish: (The argument to pygame.time.wait() is in milliseconds)

import pygame

pygame.mixer.init()
sounda = pygame.mixer.Sound('desert_rustle.wav')
sounda.play()
pygame.time.wait(int(sounda.get_length() * 1000))

Alternatively you can use pygame.mixer.get_busy to test if a sound is being mixed. Query the status of the mixer continuously in a loop.
In the loop, you need to delay the time by either pygame.time.delay or pygame.time.Clock.tick. In addition, you need to handle the events in the application loop. See pygame.event.get() respectively pygame.event.pump():

For each frame of your game, you will need to make some sort of call to the event queue. This ensures your program can internally interact with the rest of the operating system.

import pygame
pygame.init()

pygame.mixer.init()
sounda = pygame.mixer.Sound('desert_rustle.wav')
sounda.play()

while pygame.mixer.get_busy():
    pygame.time.delay(10)
    pygame.event.poll()
0
votes

Just try to re-save your wav file to make sure its frequency info. Or you can record a sound to make sure its frequency,bits,size and channels.(I use this method to solve this problem)

0
votes

I've had something like this happen. Maybe you have the same problem? Try using an absolute path:

import pygame

pygame.init()
pygame.mixer.init()
sounda= pygame.mixer.Sound("/absolute_path/desert_rustle.wav")

sounda.play()

Where abslute_path is obviously replaced with your actual absolute path ;)

good luck.

0
votes
import pygame

pygame.init()
sound = pygame.mixer.Sound("desert_rustle.wav")
pygame.mixer.Sound.play(sound)

This will work on python 3

0
votes

5 years late answer but I hope I can help someone.. :-)

Firstly, you dont need the "pygame.init()"-line. Secondly, make a loop and play the sound inside that, or else pygame.mixer will start, and stop playing again immediately.

I got this code to work fine on my Raspberry pi with Raspbian OS. Note that I used a while-loop that continues to loop the sound forver.

import pygame.mixer

pygame.mixer.init()
sounda = pygame.mixer.Sound("desert_rustle.wav")

while True:
    sounda.play()
0
votes

do this:

import pygame

pygame.mixer.init()
pygame.mixer.music.load("desert_rustle.wav")
pygame.mixer.music.play(0)

I think that your problem is that the file is a WAV file. It worked for me with an MP3. This will probably work on python 3.6.