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