吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1265|回复: 6
收起左侧

[求助] 播放音频自动跳过第3个音频

[复制链接]
abcxyz1022 发表于 2025-2-20 18:10
大佬们,我在python中使用QMediaPlayer播放音频,为什么会固定跳过第3个mp3文件?控制台也没有明显提示。。
可以确认音频没有问题,而且我交换音频文件的顺序,还是第3个无法播放。。
虽然可以换别的库,但是我还是想知道这是为什么。。。
[Python] 纯文本查看 复制代码
# 生成exe后报站闪黑框

import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput
from PySide6.QtCore import QUrl,QThread, Signal
from pydub import AudioSegment

class AudioPlayer(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('语音测试软件-V1.0')
        self.setFixedSize(600, 400)

        # 创建布局
        layout = QVBoxLayout()

        self.urgent_button=QPushButton('紧急广播')
        layout.addWidget(self.urgent_button)


        self.urgent_button.clicked.connect(self.play_urgent)
        # 设置布局
        self.setLayout(layout)

        # 初始化媒体播放器
        self.player = QMediaPlayer()
        self.audio_output = QAudioOutput()
        self.player.setAudioOutput(self.audio_output)

    def play_urgent(self):
        audio_files=["001.mp3","002.mp3","003.mp3","004.mp3"]
        print(f"播放列表:\n{'\n'.join(audio_files)}")
        self.play_audio_files(audio_files)

    def play_stop(self):
        self.player.pause()
        audio_files=[]

    def play_audio_files(self, audio_files):
        if not audio_files:
            return
        current_file = audio_files.pop(0)
        self.player.setSource(QUrl.fromLocalFile(current_file))
        print("正在播放:"+current_file)
        self.player.play()
        # 当当前音频播放结束时,播放下一个音频
        self.player.playbackStateChanged.connect(lambda state: self.play_audio_files(audio_files) if state == QMediaPlayer.StoppedState else None)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    player = AudioPlayer()
    player.show()
    sys.exit(app.exec())








控制台无报错

控制台无报错

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

YWFhYmJi 发表于 2025-2-20 18:52
[Python] 纯文本查看 复制代码
self.player.playbackStateChanged.connect(lambda state: self.play_audio_files(audio_files) if state == QMediaPlayer.StoppedState else None)

这句代码应该写在initUI里,否则每次到下一个音频时都会注册一个新的回调
chenzhigang 发表于 2025-2-20 19:39
如果代码逻辑没问题 那么是第三个音频文件有问题吗 换下顺序呢
 楼主| abcxyz1022 发表于 2025-2-20 20:48
chenzhigang 发表于 2025-2-20 19:39
如果代码逻辑没问题 那么是第三个音频文件有问题吗 换下顺序呢

换顺序也没用,比如我换成[003.mp3, 001.mp3, 002.mp3, 004.mp3],就是002.mp3无法播放了,但是如果列表里面只有3个,那就都能播放了。。。
 楼主| abcxyz1022 发表于 2025-2-20 21:04
YWFhYmJi 发表于 2025-2-20 18:52
[mw_shl_code=python,true]self.player.playbackStateChanged.connect(lambda state: self.play_audio_file ...

那为什么只会跳过第3个音频文件啊?
还有一个就是我按你说的剪切到inti UI里面,报错,我不太会处理。
File "D:\python_project\mao\.venv\123.py", line 33, in <lambda>
    self.player.playbackStateChanged.connect(lambda state: self.play_audio_files(audio_files) if state == QMediaPlayer.StoppedState else None)
                                                                                 ^^^^^^^^^^^
NameError: name 'audio_files' is not defined

YWFhYmJi 发表于 2025-2-20 21:31
本帖最后由 YWFhYmJi 于 2025-2-20 21:33 编辑
abcxyz1022 发表于 2025-2-20 21:04
那为什么只会跳过第3个音频文件啊?
还有一个就是我按你说的剪切到inti UI里面,报错,我不太会处理。
...

跳过第三个文件是因为:
第一个文件播放开始后注册了一个播放完成的回调。
第二个文件开始播放时已经有一个回调,但又注册了一个回调,所以第二个文件播放完成后会执行两次回调,直接跳到第四个文件。
多放几个文件应该还会跳过更多的文件。

改了一下,但是没有Qt测试环境,不知道对不对。

[Python] 纯文本查看 复制代码
# 生成exe后报站闪黑框
 
import sys
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton
from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput
from PySide6.QtCore import QUrl,QThread, Signal
from pydub import AudioSegment
 
class AudioPlayer(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
 
    def initUI(self):
        self.setWindowTitle('语音测试软件-V1.0')
        self.setFixedSize(600, 400)
 
        # 创建布局
        layout = QVBoxLayout()
 
        self.urgent_button=QPushButton('紧急广播')
        layout.addWidget(self.urgent_button)
 
 
        self.urgent_button.clicked.connect(self.play_urgent)
        # 设置布局
        self.setLayout(layout)
 
        # 初始化媒体播放器
        self.player = QMediaPlayer()
        self.audio_output = QAudioOutput()
        self.player.setAudioOutput(self.audio_output)
        self.audio_files = []
        # 当当前音频播放结束时,播放下一个音频
        self.player.playbackStateChanged.connect(lambda state: self.next_audio() if state == QMediaPlayer.StoppedState else None)
 
    def play_urgent(self):
        audio_files=["001.mp3","002.mp3","003.mp3","004.mp3"]
        print(f"播放列表:\n{'\n'.join(audio_files)}")
        self.play_audio_files(audio_files)
 
    def play_stop(self):
        self.audio_files=[]
        self.player.pause()

    def next_audio(self):
        if not self.audio_files:
            return
        current_file = self.audio_files.pop(0)
        self.player.setSource(QUrl.fromLocalFile(current_file))
        print("正在播放:"+current_file)
        self.player.play()
 
    def play_audio_files(self, audio_files):
        self.play_stop()
        self.audio_files = audio_files
        self.next_audio()
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    player = AudioPlayer()
    player.show()
    sys.exit(app.exec())
 楼主| abcxyz1022 发表于 2025-2-21 17:19
YWFhYmJi 发表于 2025-2-20 21:31
跳过第三个文件是因为:
第一个文件播放开始后注册了一个播放完成的回调。
第二个文件开始播放时已经有 ...

确实是,我按照你修改的代码测试,能完整播放整个列表~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-6-3 02:09

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表