Pygame调音台一次只能播放一个声音

时间:2013-03-13 12:45:03

标签: python pygame

这是我的代码:

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)

我认为它会同时播放sound1sound2queue是非阻塞的,代码会立即进入休眠状态。) 相反,它会播放sound1,然后在sound2完成时播放sound1

我已经确认两个通道都是内存中的不同对象,因此find_channel不会返回相同的通道。有没有我缺少的东西或pygame没有处理这个?

2 个答案:

答案 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)