如何每分钟播放同一音频?使用playsound库遇MCI设备错误
问题:playsound循环播放音频触发Error 263错误
尝试用playsound库实现每分钟重复播放同一音频,首次播放正常,但第二次运行时出现如下错误。
原代码
from playsound import playsound from datetime import datetime import time while 1: playsound('mysound.mp3') time.sleep(60 - datetime.now().second)
错误信息(中文翻译)
Error 263 for command: open mysound.mp3 指定的设备未打开或不被MCI识别。 Error 263 for command: close mysound.mp3 指定的设备未打开或不被MCI识别。 Failed to close the file: mysound.mp3 --------------------------------------------------------------------------- PlaysoundException Traceback (most recent call last) c:\Users\ ...\notebook.ipynb Cell 4 line 8 5 import time 7 while 1: ----> 8 playsound('mysound.mp3') 9 time.sleep(60 - datetime.now().second) 12 #playsound('mysound.mp3') 13 14 #def get_data(): (...) 19 # 20 #persistencia(get_data) File c:\src\miniconda\Lib\site-packages\playsound.py:72, in _playsoundWin(sound, block) 70 try: 71 logger.debug('Starting') ---> 72 winCommand(u'open {}'.format(sound)) 73 winCommand(u'play {}{}'.format(sound, ' wait' if block else '')) 74 logger.debug('Returning') File c:\src\miniconda\Lib\site-packages\playsound.py:64, in _playsoundWin.<locals>.winCommand(*command) 60 exceptionMessage = ('\n Error ' + str(errorCode) + ' for command:' 61 '\n ' + command.decode('utf-16') + 62 '\n ' + errorBuffer.raw.decode('utf-16').rstrip('\0')) ... PlaysoundException: Error 263 for command: open mysound.mp3 指定的设备未打开或不被MCI识别。
错误原因
这是Windows平台下playsound库的常见问题:第一次播放后,库没有正确释放音频设备或文件句柄,导致第二次调用MCI命令打开音频时,设备处于异常状态,无法被识别。
修复方案
方案1:改用pygame实现(推荐,稳定性更高)
pygame的音频管理机制更可靠,适合循环播放场景:
import pygame from datetime import datetime import time # 初始化音频 mixer pygame.mixer.init() # 加载音频文件 sound = pygame.mixer.Sound('mysound.mp3') while True: # 播放音频 sound.play() # 等待音频播放完毕,避免和下一次播放重叠 while pygame.mixer.get_busy(): time.sleep(0.1) # 休眠到下一分钟的起始点 time.sleep(60 - datetime.now().second)
方案2:针对playsound的临时修复
如果坚持使用playsound,可以尝试使用绝对路径并添加错误重试机制,同时确保文件未被占用:
from playsound import playsound from datetime import datetime import time import os # 转换为绝对路径,避免相对路径导致的识别问题 sound_path = os.path.abspath('mysound.mp3') while True: try: playsound(sound_path) except Exception: # 捕获错误后短暂延迟重试 time.sleep(1) playsound(sound_path) time.sleep(60 - datetime.now().second)
内容的提问来源于stack exchange,提问作者Thomas Praun
相关产品推荐
相关产品推荐

