You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:40:27