【问题标题】:How to play sound with Pyqt5 QtMultimedia?如何使用 Pyqt5 QtMultimedia 播放声音?
【发布时间】:2020-06-30 23:22:35
【问题描述】:
def play_tts(self,file_path):
   file = open(file_path)
   mixer.init()
   mixer.music.load(file)
   mixer.music.play()
   while mixer.music.get_busy():
       time.sleep(0.03)
       if window.ttsIs:
           break
   mixer.stop()
   mixer.quit()
   file.close()
   remove(file_path)

如何用 QtMultimedia 编写上述代码?

你能举个例子吗?

【问题讨论】:

    标签: python pyqt5


    【解决方案1】:

    如果文件是 .wav,则只需使用 QSound:

    import os
    import sys
    
    from PyQt5 import QtCore, QtMultimedia
    
    CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
    
    
    def main():
        filename = os.path.join(CURRENT_DIR, "beal.wav")
    
        app = QtCore.QCoreApplication(sys.argv)
    
        QtMultimedia.QSound.play(filename)
    
    
        # end in 5 seconds:
        QtCore.QTimer.singleShot(5 * 1000, app.quit)
    
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main()
    

    如果你想播放更多格式,那么你应该使用 QMediaPlayer:

    import os
    import sys
    
    from PyQt5 import QtCore, QtMultimedia
    
    CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
    
    
    def main():
        filename = os.path.join(CURRENT_DIR, "sound.mp3")
    
        app = QtCore.QCoreApplication(sys.argv)
    
        player = QtMultimedia.QMediaPlayer()
    
        def handle_state_changed(state):
            if state == QtMultimedia.QMediaPlayer.PlayingState:
                print("started")
            elif state == QtMultimedia.QMediaPlayer.StoppedState:
                print("finished")
                QtCore.QCoreApplication.quit()
    
        player.stateChanged.connect(handle_state_changed)
    
        url = QtCore.QUrl.fromLocalFile(filename)
        player.setMedia(QtMultimedia.QMediaContent(url))
        player.play()
    
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

    • 我想如果声音正在播放,我想等待这个过程。我怎样才能做到这一点?比如mixer.music.get_busy()
    • @KutaN 我建议您忘记使用 Qt 的 while 循环,因为您要阻止事件循环,而是必须使用信号,在这种情况下 QMediaPlayer 的 stateChanged 信号就足够了,请参阅我的更新。在这类似于mixer.music.get_busy()player.state() == QtMultimedia.QMediaPlayer.PlayingState
    • player.state() == QtMultimedia.QMediaPlayer.PlayingState 不起作用。 While 循环未完成。我需要完成布尔变量。
    • @KutaN 看来你没有看我之前的评论,你不应该使用while循环,使用信号,例如改变print("started")print("finished")中的标志状态
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    相关资源
    最近更新 更多