亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號