#python #pygame #playback
#python #pygame #воспроизведение
Вопрос:
На данный момент у меня есть программа, которая воспроизводит отдельные звуки на основе определенных нажатий клавиш. Каждое нажатие клавиши успешно воспроизводит правильный звук на основе нажатой клавиши, но звук прерывается, когда начинает воспроизводиться следующий звук с другой клавиши. Я хочу знать, как заставить мою программу воспроизводить звуки из каждой клавиши целиком, даже когда нажата другая клавиша и начинает воспроизводиться новый звук (я хочу, чтобы звуки воспроизводились одновременно). Я использую библиотеки pygame и keyboard.
Вот функция, которую я использую для воспроизведения звуков клавиш:
# '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()
Если вам нужно больше контекста, пожалуйста, скажите мне, и я обновлю свой вопрос.
Ответ №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
Комментарии:
1. Я использовал часть вашего кода, и он хорошо работает. Единственная проблема заключается в том, что мне нужно более восьми каналов. Как бы мне увеличить количество доступных каналов? Если я не могу, есть ли какой-либо способ продолжить работу программы после того, как она вернет «none», или мне придется найти способ очистить каналы, чтобы всегда оставался 1 доступный канал?
2. Ответ обновлен, чтобы проверить, нет ли его. Если каналы заполнены и вам нужен другой звук, вам нужно будет остановить один из каналов и заменить звуковой файл.