Как воспроизвести звук не прерывая (паралельно) выполнению других команд

Рейтинг: 1Ответов: 1Опубликовано: 05.02.2023

Как мне воспроизвести звук асинхронно?

Пробовал pyglet (келых три строчки кода так еще и после выполнения звука все останавливается), playsound (просто не играл звук при block=False), just_playback (вообще не установился), pygame (слишком много весит). И у всех одна и та же проблема: приостанавливается выполнение кода. Есть ли какая-то библиотека которая могла бы в одну строчку кода, асинхронно воспроизвести звук.

#pg - pyautogui
shut = pg.confirm(text="Завершить єпично работу ПК?", title="Єпичное завершение2023 ", buttons=["OK", "НЕТ"])
if shut == "OK": 
pg.hotkey("win", "r") 
time.sleep(0.5) 
pg.typewrite("cmd") 
pg.press("enter") 
time.sleep(0.5) 
out = pyglet.resource.media("outro.mp3") 
out.play() 
pyglet.app.run() #И ниже код не выполняеться.
pg.typewrite("shutdown /s /t 17") 
pg.press("enter") 

P.S: Если кто-то еще и подскажет библиотеку с возможностью установки и получения значения громкости от души поблагодарю

Ответы

▲ 1Принят

Кстати в pyglet можно регулировать громкость, да там вообще много чего можно.

import time
from threading import Thread

from pyglet.media import Player, load


class MiniPlayer(Player):
    def __init__(self, path_to_file: str):
        super().__init__()
        source = load(path_to_file)
        self.queue(source)

    def on_play(self):
        return self.play()

    def on_pause(self):
        return self.pause()

    def get_volume(self):
        return self.volume

    def set_volume(self, value):
        self.volume = value


def change_volume(player: MiniPlayer):
    for value in range(10, 100, 10):
        time.sleep(1)
        print(value / 100)
        player.set_volume(value / 100)


def main():
    # TO DO ваш код до
    mini_player = MiniPlayer("song.mp3")
    mini_player.on_play()
    print(f"Громкость до: {mini_player.get_volume()}")
    mini_player.set_volume(0.5)
    print(f"Громкость после: {mini_player.get_volume()}")
    # TO DO ваш код после
    print("ваш код после")
    # Имитация кода после
    Thread(target=change_volume, args=(mini_player,)).start()
    time.sleep(10)


if __name__ == '__main__':
    main()

P.S. Мудрил что бы запустить в одтельном потоке но так и не вышло.