PyQt5中MP3文件循环播放失效:为何仅播放一次?
问题原因分析
你的代码里音频只播放一次的核心问题在于 QMediaPlayer的play()方法是异步执行的,而且完全没处理播放完成的回调逻辑:
- 当你在
play()方法的for循环里连续调用100次self.player.play()时,播放器第一次调用play()后就进入了播放状态,后续的99次调用因为播放器正处于播放状态,会被直接忽略,根本不会触发新的播放。 - 同时,循环不会等待当前音频播放完成就立刻执行下一次迭代,所以本质上只有第一次
play()真正生效了。
修复方案
我们需要通过监听QMediaPlayer的播放状态变化,在每次播放完成后重新触发播放,直到达到100次的次数要求。下面是修改后的完整代码:
from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtMultimedia import * from PyQt5 import QtCore, QtMultimedia from PyQt5.QtGui import * import sys class AlarmWindow(QDialog): def __init__(self, alarmName, alarmTime, alarmTone): super().__init__() self.setWindowTitle(alarmName) # 修正:这里你之前写成了赋值,应该是方法调用 self.top, self.left = 100, 50 self.width, self.height = 600, 350 self.setFixedWidth(600) self.setFixedHeight(350) self.icon = "icons\alarm.ico" self.play_count = 0 self.max_play_times = 100 self.url = QtCore.QUrl.fromLocalFile(alarmTone) self.content = QtMultimedia.QMediaContent(self.url) self.player = QtMultimedia.QMediaPlayer() self.player.setMedia(self.content) # 监听播放状态变化,完成后自动续播 self.player.mediaStatusChanged.connect(self.handle_play_finished) self.start_play() self.show() def start_play(self): if self.play_count < self.max_play_times: self.player.play() self.play_count += 1 def handle_play_finished(self, status): # 当音频播放结束(进入EndOfMedia状态),触发下一次播放 if status == QMediaPlayer.EndOfMedia: self.start_play() if __name__ == "__main__": app = QApplication(sys.argv) window = AlarmWindow("Name", "7:55 PM", "basic.mp3") app.exec()
关键修改点说明
- 新增
play_count和max_play_times变量,用来追踪已播放次数和目标次数 - 监听
mediaStatusChanged信号,当检测到音频播放完成(EndOfMedia状态)时,自动触发下一次播放 - 修正了初始化里的
setWindowTitle错误(你之前误写成了赋值语句,正确写法是调用方法) - 现在每次播放都会等待上一次播放完成后再开始,严格执行到100次播放结束
内容的提问来源于stack exchange,提问作者Debtanu Gupta
相关产品推荐
相关产品推荐

