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

Pygame音频播放次数异常求助:摩斯码音效仅部分播放

问题分析与解决方法

问题根源

  1. 单通道冲突:pygame.mixer.music是单音频通道,每次调用load和play会直接中断当前正在播放的音效,后续音效会覆盖前面的,导致大部分音效无法完整播放。
  2. 无播放等待:循环执行速度远快于音效播放时长,前一个音效还没播完就开始下一个操作,直接打断了播放流程。

解决思路

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 14:39:15