Как при помощи Pygame воспроизвести звук но с задержкой программы

from pygame import mixer
from mutagen.mp3 import MP3
import time

mixer.init()

f = MP3('e:/VSC/Voice_Asistent_Pro/files/cache/main.mp3')
mixer.music.load("e:/VSC/Voice_Asistent_Pro/files/cache/main.mp3")

time.sleep(f.info.length)
mixer.music.play()

Вот моя попытка реализовать данный код, однако он не работает. Так как mixer.music.load тоже ожидает.

Моя цель заменить playsound.


Ответы (1 шт):

Автор решения: Igen

Моё решение использует игровой цикл.

from pygame import mixer,event,init
from pygame import time as pgtime
from mutagen.mp3 import MP3
#Для инициализации "таймера" импортирован init

init()

mixer.init()

f = MP3('e:/VSC/Voice_Asistent_Pro/files/cache/main.mp3')
mixer.music.load("e:/VSC/Voice_Asistent_Pro/files/cache/main.mp3")

clock=pgtime.Clock()
playing=False

def make_something(*args,started_tick=0,music_len=0):
    '''
    Эта функция не будет работать в период проигрования музыки
    Т.е. здесь может быть обработчик основного класса игры, приложения
    '''
    global playing
    if not(0<=(pgtime.get_ticks()-started_tick)>=music_len and (pgtime.get_ticks()-started_tick)<=started_tick+music_len):
        print("Works")
        playing=False
    else:
        if not playing:
            mixer.music.play()
            playing=True
        
        print("Waiting... Music is playing")

#Цикл нужен для обновления тик рейта
while 1:
    clock.tick(60) #Для получения тиков, 60 - fps
    make_something(started_tick=700,music_len=f.info.length)# В начале старта программы пользователя в pygame тик не 0

Если понадобится включение музыки в цикле множество раз, можно завести переменную со стартом музыки в тиках

music_start=-f.info.length

while 1:
    clock.tick(60)
    if happend_something():
        music_start=pgtime.get_ticks()
    make_something(started_tick=music_start,music_len=f.info.length)

PS: В последнем примере таймер может обновляться, даже если музыка еще не завершилась

→ Ссылка