En pygame (o incluso en python en general), ¿cómo crearía un bucle que siga ejecutándose mientras se reproduce un sonido?

En pygame, ¿hay alguna manera de saber si un sonido ha terminado de reproducirse? yo leo el set_endevent y get_endevent documentación pero no puedo darle sentido o encontrar un ejemplo.

Estoy tratando de hacer específicamente lo siguiente:

  1. reproducir un sonido
  2. Mientras se reproduce el sonido, siga iterando en un bucle
  3. Cuando el sonido haya terminado de reproducirse, continúe.

Revisé las otras preguntas que se hicieron: no encontré nada específicamente dirigido a python / pygame.

¡Gracias!

preguntado el 27 de julio de 12 a las 16:07

Parece que necesitas... un oyente. -

4 Respuestas

El truco es que obtienes un objeto de tipo pygame.mixer.Channel cuando llamas al play() método de un sonido (pygame.mixer.Sound). Puede probar si el sonido ha terminado de reproducirse usando el canal get_busy() método.

Un ejemplo simple:

import pygame.mixer, pygame.time

mixer = pygame.mixer

mixer.init()
tada = mixer.Sound('tada.wav')
channel = tada.play()

while channel.get_busy():
    pygame.time.wait(100)  # ms
    print "Playing..."
print "Finished."

Los ejemplos asumen que tiene un archivo de sonido llamado 'tada.wav'.

Respondido 10 Oct 14, 08:10

+1. La llamada de espera evita que su programa acapare un núcleo de CPU, lo que ahorra energía y mantiene el rendimiento. - cees timmerman

Puedes usar un código como este:

import pygame
pygame.mixer.music.load('your_sound_file.mid')
pygame.mixer.music.play(-1, 0.0)
while pygame.mixer.music.get_busy() == True:
    continue

Y no tiene que ser un archivo .mid. Puede ser cualquier tipo de archivo que pygame entienda.

Respondido 27 Jul 12, 17:07

Para usar set_endevent tienes que hacer algo como esto:

# You can have several User Events, so make a separate Id for each one
END_MUSIC_EVENT = pygame.USEREVENT + 0    # ID for music Event

pygame.mixer.music.set_endevent(END_MUSIC_EVENT)

running = True

# Main loop
while running:
    events = pygame.event.get()
    if events:
        for event in events:
            ...
            if event.type == END_MUSIC_EVENT and event.code == 0:
                print "Music ended"
            ...

Respondido 30 Jul 12, 14:07

pygame.mixer.pre_init(44100, 16, 2, 4096) # setup mixer to avoid sound lag
pygame.init()
startmusic="resources\snd\SGOpeningtheme.ogg"
pygame.mixer.set_num_channels(64) # set a large number of channels so all the game sounds will play WITHOUT stopping another
pygame.mixer.music.load(startmusic)
pygame.mixer.music.set_volume(0.3)
pygame.mixer.music.play(-1) # the music will loop endlessly

una vez que se ejecuta el código anterior, la música continuará reproduciéndose hasta que la detenga o desaparezca según la información del sitio de pygame. Puede reproducir el contenido de su corazón y la música continuará. Si necesita que la música se reproduzca dos veces, en lugar de -1, coloque 1. Luego, la música SE REPRODUCIRÁ una vez y se REPETIRÁ UNA VEZ. Puede verificar si la transmisión se está reproduciendo haciendo pygame.mixer.music.get_busy(). Si devuelve True lo es. Falso significa que ha terminado.

Respondido el 19 de Septiembre de 14 a las 07:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.