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
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_()
添加回答
举报