声音不会一直播放! - Pygame,Python

Posted

技术标签:

【中文标题】声音不会一直播放! - Pygame,Python【英文标题】:Sound won't be played consistently! - Pygame, Python 【发布时间】:2019-09-12 01:15:49 【问题描述】:

我正在尝试使用 Python 中的 Pygame 库来演奏一些钢琴声音。我有 .wav 格式的音符,并且我想使用 while 循环持续播放一些音符,但结果与我不同。

我确实尝试了一些其他可能的解决方案,但我没有找到任何解决我的问题的方法。我希望这三个音符(声音)同时播放并每 0.4 秒重复一次。

c4.wav : https://gofile.io/?c=F3U1LG

e4.wav : https://gofile.io/?c=4KflZ9

a4.wav : https://gofile.io/?c=mtNXWd

import pygame
import time
pygame.init()

c4 = pygame.mixer.Sound("c4.wav")
e4 = pygame.mixer.Sound("e4.wav")
a4 = pygame.mixer.Sound("a4.wav")

while True:
    c4.play()
    e4.play()
    a4.play()
    time.sleep(0.4)

【问题讨论】:

您能否编辑您的问题以包含有关确切程序执行时发生的情况的信息。你只是告诉我们这不是你所期望的。 根据问题所在,这些答案也可能有所帮助 - ***.com/questions/2936914/pygame-sounds-dont-play 【参考方案1】:

来自pygame.mixer.Sound.play() documentation:

开始在可用频道上播放声音(即在计算机的扬声器上)。这将强制选择一个频道,因此播放可能会在必要时切断当前播放的声音。

所以你需要等待声音完成播放(或使用多个通道同时发出声音)

可能是这样的:

def playAndWait( sound ):
    """ Play a sound, wait for it to finish """
    sound.play()                      # play the sound
    time.sleep( sound.get_length() )  # wait for sound to end

    # Quickly confirm sound has stopped, should not loop (much).
    # (This is probably unnecessary)
    while ( pygame.mixer.get_busy() ):
        time.sleep( 0.1 )

while True:
    playAndWait( c4 )
    playAndWait( e4 )
    playAndWait( a4 )
    time.sleep( 0.4 )

在 pygame 中使用 time.sleep() 并不理想,因为它会减慢/中断事件处理。所以在实践中,需要使用其他一些等待延迟计时的方法。

【讨论】:

我不想等待声音结束。假设这些声音每个长 2 秒。在我播放完每一个之后,我想播放确切的声音,而不会在我第一次播放它们时中断,在播放 0.4 秒后它一直在播放。因此,当我播放第一个声音时,在它结束之前(2 秒),我想再播放 5 次。所以我想在第一个声音是 0.4 秒、0.8 秒、1.2 秒、1.6 秒以及在 2 秒结束时播放 ot,但是这 5 次都不应该停止。有可能吗? @MateoKurti - 是的,这是可能的,但您必须自己管理延迟。问题中的代码播放所有 3 种声音,可能在前一个声音甚至输出之前开始下一个声音,因此在循环重复之前,用户只会听到最后排队的声音 (a4) 的 0.4 秒。

以上是关于声音不会一直播放! - Pygame,Python的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PyGame 不播放声音

带有 Pygame 通道的复音

pygame声音无法打开文件

PyGame 更改预设声音字体

我需要帮助在 Replit(Pygame) 上播放声音

用 Python 播放声音 [重复]