使用Pyaudio与Ursina引擎时代码阻塞问题求助
问题根源
你写的play函数是同步阻塞的:Pyaudio的播放循环在主线程内执行,必须等音频播放完毕才会返回,导致Ursina的游戏逻辑被卡住。而playsound通过block=False参数实现了异步播放,不会占用主线程。
修复方案
方案一:用线程异步执行Pyaudio播放
把音频播放逻辑放到子线程中,让主线程继续处理游戏:
import random import pyaudio import wave import threading # 导入线程模块 from playsound import playsound def play(file): def _play_audio(): CHUNK = 1024 sound = wave.open(file, 'rb') p = pyaudio.PyAudio() stream = p.open( format=p.get_format_from_width(sound.getsampwidth()), channels=sound.getnchannels(), rate=sound.getframerate(), output=True, input=False ) data = sound.readframes(CHUNK) while len(data) > 0: stream.write(data) data = sound.readframes(CHUNK) stream.stop_stream() stream.close() p.terminate() # 启动后台线程播放音频 threading.Thread(target=_play_audio, daemon=True).start()
调用方式不变,现在音频会在后台播放,不会阻塞游戏。
方案二:用Ursina内置音频系统(推荐)
Ursina自带的Audio类天然支持异步播放,适配引擎且无需额外依赖:
from ursina import Audio # 导入Ursina音频类 def play(file): Audio(file, autoplay=True)
直接调用play("audio/xxx.wav")即可,该类还支持循环播放(loop=True)、音量调节(volume=0.5)等游戏常用功能。
注意事项
- 用线程方案时,设置
daemon=True能让游戏退出时自动终止音频线程,避免残留进程。 - 优先选择Ursina内置音频,减少依赖的同时能更好地和引擎生命周期适配。
内容的提问来源于stack exchange,提问作者Simon Mendlowitz
相关产品推荐
相关产品推荐

