Python 如何阻止Simpleaudio同时播放两次文件?

Python 如何阻止Simpleaudio同时播放两次文件?,python,audio,simpleaudioengine,Python,Audio,Simpleaudioengine,我正在一个基于文本的冒险游戏中使用simpleaudio。我正在使用Python3。在我的主循环中,我想实现这一点:播放一个简短的音频片段,一旦它结束,再次开始播放相同的音频片段。我的问题是,我不知道如何让Simpleaudio做到这一点 我已经阅读了所有的API文档,但没有结果。我已经尝试了很多关于循环的不同方法,但没有一种有效 import simpleaudio as sa def audio(audiofile): filename = "/Users/*********/De

我正在一个基于文本的冒险游戏中使用simpleaudio。我正在使用Python3。在我的主循环中,我想实现这一点:播放一个简短的音频片段,一旦它结束,再次开始播放相同的音频片段。我的问题是,我不知道如何让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”循环每隔一段时间刷新一次(在获取输入和输出之后)。我不知道怎么做:一旦歌曲播放完一次,它应该在同一点重新开始。

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

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

代码:


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

与建议相反,
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()
调用中的字符串在循环的每次迭代中都是通过copy创建和传递的,如果总是同一个字符串,这就很难理解了。

我是否正确理解无论用户操作如何,歌曲都应该在循环中播放?当前
audio
位于主线程上,将等待
input
和循环中的其他函数完成。是。无论用户如何移动,歌曲都应该继续播放。解决方案是否有效/对您有帮助?我注意到你从来没有接受任何答案,考虑阅读Lukasz -它从来没有工作过。我不确定你是否第一次看到我这么说,但我只是想让你知道。这对我来说不起作用。它做了一件奇怪的事情,播放了失真的音频。它听起来像是在玩自己分层很多次,我不知道为什么。如果你有同样的问题,请告诉我。
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")
    ...