这是我的代码:
pygame.mixer.init(frequency=22050,size=-16,channels=4)
sound1 = pygame.mixer.Sound('sound1.wav')
sound2 = pygame.mixer.Sound('sound2.wav')
chan1 = pygame.mixer.find_channel()
chan2 = pygame.mixer.find_channel()
chan1.queue(sound1)
chan2.queue(sound2)
time.sleep(10)
我认为它会同时播放sound1
和sound2
(queue
是非阻塞的,代码会立即进入休眠状态。)
相反,它会播放sound1
,然后在sound2
完成时播放sound1
。
我已经确认两个通道都是内存中的不同对象,因此find_channel不会返回相同的通道。有没有我缺少的东西或pygame没有处理这个?
答案 0 :(得分:3)
请参阅Pygame Docs,它说:
Channel.queue - 将Sound对象排队以跟随当前
所以,即使你的曲目在不同的频道播放,所以如果你强制播放每个声音,它们会同时播放。
播放多种声音:
mixer.Sound
对象添加到列表中。sound.play
这会强制所有声音同时播放 此外,请确保您有足够的空通道播放所有声音,否则,某些或其他声音将被中断 所以在代码中:
sound_files = [...] # your files
sounds = [pygame.mixer.Sound(f) for f in sound_files]
for s in sounds:
s.play()
你也可以为每个声音创建一个新的Channel
或使用find_channel()
..
sound_files = [...] # your files
sounds = [pygame.mixer.Sound(f) for f in sound_files]
for s in sounds:
pygame.mixer.find_channel().play(s)
答案 1 :(得分:2)
我唯一能想到的是chan1和chan2是相同的,即使它们是不同的对象,它们也可以指向同一个通道。
在获得频道后立即尝试排队,这样你肯定会得到一个与find_channel()不同的频道,因为find_channel()总是返回一个非繁忙的频道。
试试这个:
pygame.mixer.init(frequency=22050,size=-16,channels=4)
sound1 = pygame.mixer.Sound('sound1.wav')
sound2 = pygame.mixer.Sound('sound2.wav')
chan1 = pygame.mixer.find_channel()
chan1.queue(sound1)
chan2 = pygame.mixer.find_channel()
chan2.queue(sound2)
time.sleep(10)