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_()
添加回答
舉報