3

これが私のコードです:

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非ブロッキングであり、コードはすぐにスリープ状態になります)。 代わりに、再生してから終了時に再生します。 sound2queue
sound1sound2sound1

両方のチャネルがメモリ内の別個のオブジェクトであることを確認したため、find_channelは同じチャネルを返しません。私が見逃しているものがありますか、それともpygameはこれを処理しませんか?

4

2 に答える 2

4

PygameDocsを参照してください。

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)
于 2013-03-13T13:09:49.420 に答える
3

私が考えることができる唯一のことは、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)
于 2013-03-13T13:42:19.237 に答える