使用Python的Turtle开发小游戏时winsound播放背景音乐报错如何解决
问题原因
- 你将
winsound.PlaySound("background.wav", winsound.SND_ASYNC)放在了while True无限循环内部,每次循环都会重新触发一次音频播放请求,上一次还在执行的播放任务会被新请求直接中断,不仅导致背景音乐始终卡在开头无法正常播放,还会占满所有可用音频通道,最终其他音效也全部失效。 - winsound本身仅支持无压缩PCM编码的WAV格式音频,如果你的
background.wav是压缩编码格式、文件路径错误、文件名包含特殊字符,也会触发RuntimeError: Failed to play sound报错。 - 你仅使用了
SND_ASYNC标记,没有搭配循环播放标记,单次音频播放结束后就会自动停止,反复调用反而会持续打断正常播放流程。
解决方法
- 首先将背景音乐播放代码从
while循环中移出,放在循环启动前仅执行一次,需要循环播放背景音乐的话,追加winsound.SND_LOOP标记,多个标记用按位或|连接:
import winsound # 放在while循环外部,全局仅执行一次 winsound.PlaySound("background.wav", winsound.SND_ASYNC | winsound.SND_LOOP) while True: # 删除循环内部的背景音乐播放代码 wn.update() # Move the ball ball.setx(ball.xcor() + ball.dx) ball.sety(ball.ycor() + ball.dy)
- 检查音频文件合规性:
- 确认
background.wav和Python脚本放在同一文件夹下,或者填写完整的绝对路径,路径中不要包含中文、空格或特殊符号 - 将音频转码为无压缩PCM编码、16bit位深、44100Hz采样率的WAV格式,适配winsound的解码要求
- 如果需要同时播放背景音乐和其他游戏音效,winsound本身不支持多音频同时输出,可以改用
pygame.mixer模块实现多音频通道管理,示例代码如下:
import pygame # 初始化音频模块 pygame.mixer.init() # 加载并循环播放背景音乐 pygame.mixer.music.load("background.wav") pygame.mixer.music.play(-1) # 加载其他音效 hit_sound = pygame.mixer.Sound("hit.wav") # 需要播放音效时调用,不会打断背景音乐 hit_sound.play()
内容的提问来源于stack exchange,提问作者Anita
相关产品推荐
相关产品推荐

