【问题标题】:How do I stop Simpleaudio from playing a file twice simulaneously?如何阻止 Simpleaudio 同时播放文件两次?
【发布时间】:2021-01-12 20:33:22
【问题描述】:

我在基于文本的冒险游戏中使用 simpleaudio。我正在使用 Python 3。在我的主循环中,我想实现这一点:播放一个简短的音频剪辑,一旦完成,再次开始播放相同的音频剪辑。我的问题是,我无法弄清楚如何让 Simpleaudio 做到这一点。

我已阅读所有 API 文档,但无济于事。关于循环,我尝试了许多不同的方法,但都没有奏效。

import simpleaudio as sa

def audio(audiofile):
    filename = "/Users/*********/Desktop/Programming/Python Files/Adventure Game/Audio Files/" + audiofile
    wave_obj = sa.WaveObject.from_wave_file(filename)
    play_obj = wave_obj.play()

A = True
while True:
audio("openingtune.wav")
clear_screen()
firstinput = input("> ")
user_input1(firstinput)

# I didn't include the other functions because they're not relevant to this. 

注意:“while true”循环会时常刷新(在接受输入并给出输出之后)。我不知道该怎么做:一旦歌曲播放完一次,它应该从同一点重新开始。

【问题讨论】:

  • 我是否正确理解,无论用户操作如何,歌曲都应该循环播放?目前audio 位于主线程上,将等待input 和循环中的其他函数完成。
  • 是的。无论用户如何移动,歌曲都应该继续播放。
  • 解决方案是否有效/对您有帮助?我注意到您从未接受任何答案,请考虑阅读stackoverflow.com/help/someone-answers
  • Lukasz - 它从来没有奏效。我不确定你是否第一次看到我这么说,只是想让你知道。

标签: python audio simpleaudioengine


【解决方案1】:

与建议相反,simpleaudio 不在主线程上播放音频。根据文档..

该模块实现了一个异步接口,这意味着程序在音频播放开始后立即继续执行,后台线程负责其余的工作。这使得将音频播放合并到需要保持响应的 GUI 驱动应用程序变得容易。

while 循环应该简单地检查线程是否已完成,如果已完成则再次播放音频。

import simpleaudio as sa


class AudioPlayer:
    def __init__(self):
        self.play_obj = None

    def play(audiofile):
        filename = "/Users/*********/Desktop/Programming/Python 
                    Files/Adventure Game/Audio Files/" + audiofile
        wave_obj = sa.WaveObject.from_wave_file(filename)
        self.play_obj = wave_obj.play()
    
    def is_done():
        if self.play_obj:
            return not self.play_obj.is_playing()
        return True

player = AudioPlayer()
while True:
    clear_screen()
    if player.is_done():
        player.play("openingtune.wav")
    ...

如果您连续播放同一个文件,您可能需要考虑将文件字符串一次性传递给构造函数。字符串是不可变的,因此player.play() 调用中的字符串是在循环的每次迭代中创建并通过副本传递的,如果它始终是同一个字符串,那就太疯狂了。

【讨论】:

    【解决方案2】:

    您当前的方法不起作用,因为您在主线程上播放音频。它开始按预期播放音频,但在audio 之后有一系列操作,即所有用户输入。与此同时,audio 可能会停止播放,直到下一次循环才会执行。

    解决方案:在单独的线程上启动音频。

    代码:

    import simpleaudio as sa
    from threading import Thread
    
    def audio(audiofile):
        filename = "/Users/*********/Desktop/Programming/Python Files/Adventure Game/Audio Files/" + audiofile
        wave_obj = sa.WaveObject.from_wave_file(filename)
        while(True):
            play_obj = wave_obj.play()
    
    # Let's play the music on a separate thread
    audio_thread = Thread(target=audio, args=("openingtune.wav",))
    audio_thread.start()
    
    # And now the main game loop
    A = True
    while True:
        clear_screen()
        firstinput = input("> ")
        user_input1(firstinput)
    

    您可能需要引入一些控件来停止播放音频。

    【讨论】:

    • 这对我不起作用。它做了一件奇怪的事情,它播放了一个失真版本的音频。听上去好像是自己分层播放了很多遍,不知道为什么。如果您有同样的问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2021-04-22
    • 2013-01-02
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多