Pygame音频播放次数异常求助:摩斯码音效仅部分播放
问题分析与解决方法
问题根源
- 单通道冲突:
pygame.mixer.music是单音频通道,每次调用load和play会直接中断当前正在播放的音效,后续音效会覆盖前面的,导致大部分音效无法完整播放。 - 无播放等待:循环执行速度远快于音效播放时长,前一个音效还没播完就开始下一个操作,直接打断了播放流程。
解决思路
改用pygame.mixer.Sound替代mixer.music:
Sound支持多通道播放,不会被后续音效打断- 可直接获取音效时长,方便等待播放完成
- 提前加载音效文件,避免重复IO操作提升效率
修改后的代码
from pygame import mixer import os import time CURR_DIR = os.path.dirname(os.path.realpath(__file__)) mixer.init() # 提前加载音效文件,避免循环内重复加载 short_beep = mixer.Sound(os.path.join(CURR_DIR, "short beep.mp3")) long_beep = mixer.Sound(os.path.join(CURR_DIR, "long beep.mp3")) short_beep.set_volume(0.7) long_beep.set_volume(0.7) # 获取音效的播放时长(单位:秒) short_duration = short_beep.get_length() long_duration = long_beep.get_length() morse_code = ".... . .-.. ---" def play_morse(code): for char in code: if char == ".": short_beep.play() print(".") time.sleep(short_duration) # 等待短音效播放完成 elif char == "-": long_beep.play() print("-") time.sleep(long_duration) # 等待长音效播放完成 elif char == " ": # 摩斯码标准:单词间间隔为3倍点时长,可根据需求调整 time.sleep(short_duration * 3) print(" ") # 若需要字符间的间隔(摩斯码标准为1倍点时长),可在每个音效播放后添加: # time.sleep(short_duration) play_morse(morse_code)
额外说明
- 如果需要严格遵循摩斯码时间规范(点=1单位,划=3单位,字符间间隔=1单位,单词间间隔=3单位),可以根据音效时长调整等待时间,比如确保短音效文件时长为1单位,长音效为3单位,然后在每个字符播放后添加1单位的间隔(除了空格)。
- 使用
os.path.join替代硬编码的路径分隔符,代码兼容性更好。
内容的提问来源于stack exchange,提问作者Synt4xErr0r 7
相关产品推荐
相关产品推荐

