为了账号安全,请及时绑定邮箱和手机立即绑定

QMediaPlayer.setPosition 如何用于 mp3?

QMediaPlayer.setPosition 如何用于 mp3?

阿波罗的战车 2023-04-25 17:42:01
当我尝试从某个位置播放歌曲时遇到问题:它不起作用(歌曲从头开始播放)。只有当歌曲是“mp3”歌曲而不是“m4a”歌曲(它们是我测试的唯一格式)时才会出现此问题。问题似乎来自 qt(或 PyQt?),但我不确定,这是一个最小的例子,我是否遗漏了什么?from PyQt5.QtWidgets import QApplicationfrom PyQt5.QtMultimedia import QMediaContent, QMediaPlayerfrom PyQt5.QtCore import QUrlif __name__ == "__main__":    app = QApplication([])    player = QMediaPlayer()    media_content = QMediaContent(QUrl.fromLocalFile("path_to_my_music_file.mp3"))    player.setMedia(media_content)    player.setPosition(10000)    player.play()    app.exec_()
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

setMedia()是异步的:

注意:该函数在录制指定媒体源后立即返回。它不等待媒体完成加载,也不检查错误。监听 mediaStatusChanged() 和 error() 信号,以便在加载媒体时以及在加载过程中发生错误时收到通知。

由于 MP3 文件的性质,Qt 可能需要一些时间才能正确搜索。不幸的是,据我所知,这只能在播放文件后经过一段时间后才能完成。

一个可能的解决方案是连接到一个自定义函数,该函数延迟 setPosition 直到媒体变得可搜索。

这是一个应该处理它的子类(我只测试了 mp3 文件,所以你应该用其他文件类型尝试它以确保它正常工作)。

class Player(QMediaPlayer):

    _delayedPos = 0

    def setPosition(self, pos):

        super().setPosition(pos)

        if pos and not self.isSeekable():

            self._delayedPos = pos

            try:

                # ensure that the connection is done only once

                self.seekableChanged.connect(self.delaySetPosition, Qt.UniqueConnection)

            except:

                pass

        else:

            self._delayedPos = 0


    def delaySetPosition(self, seekable):

        if seekable:

            self.setPosition(self._delayedPos)

        try:

            # just to be safe, in case the media changes before the previous one

            # becomes seekable

            self.seekableChanged.disconnect(self.delaySetPosition)

        except:

            pass


查看完整回答
反对 回复 2023-04-25
?
大话西游666

TA贡献1817条经验 获得超14个赞

更强大的版本是使用以下信号之一:

  • mediaStatusChanged(QMediaPlayer::MediaStatus 状态)

  • mediaChanged(const QMediaContent &media)

  • currentMediaChanged(const QMediaContent &media)

最好的选择是mediaStatusChanged允许您检查QMediaPlayer::MediaStatus:

from PyQt5.QtWidgets import QApplication

from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer

from PyQt5.QtCore import QUrl


def update_position(status):

    if(status == QMediaPlayer.LoadedMedia):

        player.setPosition(10000)

        player.play()


if __name__ == "__main__":

    app = QApplication([])


    player = QMediaPlayer()

    media_content = QMediaContent(QUrl.fromLocalFile("path_to_my_music_file.mp3"))

    player.mediaStatusChanged.connect(update_position)

    player.setMedia(media_content)


    app.exec_()


查看完整回答
反对 回复 2023-04-25
  • 2 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信