【问题标题】:Always get 0 when using QMediaPlayer.duration()使用 QMediaPlayer.duration() 时总是得到 0
【发布时间】:2019-02-10 14:29:50
【问题描述】:

这是我的代码:

import sys
from PyQt5.Qt import QUrl
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent, QMediaPlaylist
from PyQt5.QtWidgets import QApplication, QWidget


class Demo(QWidget):
    def __init__(self):
        super(Demo, self).__init__()
        self.playlist = QMediaPlaylist(self)
        self.player = QMediaPlayer(self)
        self.player.setPlaylist(self.playlist)

        self.playlist.addMedia(QMediaContent(
            QUrl.fromLocalFile('mypath')))
        self.playlist.addMedia(QMediaContent(
            QUrl.fromLocalFile('mypath')))
        self.playlist.setPlaybackMode(QMediaPlaylist.Loop)
        self.playlist.setCurrentIndex(1)

        self.player.setVolume(80)
        self.player.play()

        self.player.durationChanged.connect(self.print_durantion)
        print(self.player.duration())  # 0

    def print_durantion(self, d):
        print(d)                       # never printed


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = Demo()
    demo.show()
    sys.exit(app.exec_())

我正在尝试获取文件的持续时间,但始终为 0。它在 QtAssistant 中表示,当初始播放开始时该值可能不可用,并告诉我们使用 durantionChanged 来接收状态通知。

但是如果 duration 总是为 0(值 d 永远不会打印),durationChanged 信号将如何发出?

播放媒体文件时有什么方法可以获取持续时间吗?任何帮助将不胜感激。 (我在MacOS上测试了上面的代码)

【问题讨论】:

  • 在带有 qt-5.12.1/pyqt-5.11.3 和随机 mp3 的 linux 上对我来说很好。你在什么平台上测试,你使用的是什么特定版本的 qt5 和 pyqt5?你想播放什么样的媒体? (PS:它可能不会有任何区别,但尝试连接durationChanged之前调用play())。
  • 我在 MacOS 上测试过,durationChanged 信号永远不会发出。它在 Windows 上运行良好。

标签: python pyqt pyqt4 pyqt5


【解决方案1】:

您在选择媒体后附加durationChanged 信号。该信号仅在选择媒体时触发一次,而不是之后触发。

如果您将它放在setCurrentIndex 之前,它应该会按预期工作,但您可能需要在链接播放列表之前附加它。

这是一个有效的mediaplayer demo application in PyQt5,以确认该信号适用于您当前的 PyQt5 安装。

【讨论】:

  • 抱歉,Mac 上仍然不可用。
  • @mfitzp 先生,您分享的示例帮助我消除了困惑,谢谢先生。
猜你喜欢
  • 2020-11-23
  • 1970-01-01
  • 2018-12-23
  • 2020-06-08
  • 1970-01-01
  • 2010-12-27
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多