Воспроизведение звука с помощью pygame (python)

На данный момент у меня есть программа, которая воспроизводит отдельные звуки в зависимости от нажатия определенной клавиши. Каждое нажатие клавиши успешно воспроизводит правильный звук в зависимости от нажатой клавиши, но звук обрывается, когда начинает воспроизводиться следующий звук от другой клавиши. Я хочу знать, как заставить мою программу полностью воспроизводить звуки каждой клавиши, даже когда нажата другая клавиша и начинает воспроизводиться новый звук (я хочу, чтобы звуки воспроизводились одновременно). Я использую библиотеки pygame и клавиатуры.

Вот функция, которую я использую для воспроизведения звуков клавиш:

# 'keys' refers to a dictionary that has the key press strings and sound file names stored as key-value pairs.
key = keyboard.read_key() 
def sound(key):
    play = keys.get(key, 'sounds/c2.mp3')
    pygame.mixer.init()
    pygame.mixer.music.load(play)
    pygame.mixer.music.play()

Если вам нужно больше контекста, скажите мне, и я обновлю свой вопрос.


person coatl    schedule 17.08.2020    source источник


Ответы (1)


В pygame вы можете воспроизводить несколько звуковых дорожек одновременно, используя каналы. Обратите внимание, что каналы поддерживают только файлы wav или ogg.

Вот пример кода. Нажмите клавиши 1-3, чтобы запустить трек. Вы также можете запускать один и тот же трек несколько раз.

import pygame

lst = [
'Before The Brave - Free.wav',   # key 1
'Imagine Dragons - Demons.wav',  # key 2
'Shinedown-How Did You Love.wav' # key 3
]

pygame.init()
size = (250, 250)
screen = pygame.display.set_mode(size)

pygame.mixer.init()
print("channel cnt",pygame.mixer.get_num_channels()) # max track count (8 on my machine)

while True: 
    pygame.time.Clock().tick(10) 
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT:
            exit()
    idx = 0
    keys = pygame.key.get_pressed()
    if keys[pygame.K_1]: idx = 1
    if keys[pygame.K_2]: idx = 2
    if keys[pygame.K_3]: idx = 3
    if (idx):
       ch = pygame.mixer.find_channel() # find open channel, returns None if all channels used
       snd = pygame.mixer.Sound(lst[idx-1])  # create sound object, must be wav or ogg
       if (ch): ch.play(snd)  # play on channel if available
person Mike67    schedule 17.08.2020
comment
Я использовал часть вашего кода, и он работает хорошо. Единственная проблема в том, что мне нужно больше восьми каналов. Как увеличить количество доступных каналов? Если я не могу, есть ли способ сохранить работу программы после того, как она ничего не вернет, или мне придется найти способ очистить каналы, чтобы всегда был 1 доступный канал? - person coatl; 17.08.2020
comment
Ответ обновлен, чтобы проверить наличие None. Если каналы заполнены и вы хотите другой звук, вам нужно будет остановить один из каналов и заменить звуковой файл. - person Mike67; 17.08.2020