2016-11-18 52 views
1

QMediaPlayer.mediaStatusChangedを使用している問題があります。ステータスがメディアの終わりに変更されたときにQMediaPlayerの状態が停止しない

メディアステータスがEndOfMediaに変更さQt5.7ドキュメントによれば、QMediaPlayer状態がStoppedStateすべきである:

は再生が現在のメディアの終わりに達しています。プレイヤーはStoppedStateにいます。

Qt5.7

しかし、状態は停止されません。問題を再現するサンプルは次のとおりです。

import sys 

from PyQt5 import QtWidgets 
from PyQt5.QtCore import QUrl 

from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent 

class MediaPlayer(QMediaPlayer): 
    default = 'test.mp3' 

    def __init__(self): 
     super(MediaPlayer, self).__init__() 
     self.mediaStatusChanged[QMediaPlayer.MediaStatus].connect(self.media_status_changed) 

     self.setup_media(self.default) 

    def setup_media(self, media): 
     url = QUrl.fromLocalFile(media) 
     self.setMedia(QMediaContent(url)) 

    def media_status_changed(self, status): 
     if status == QMediaPlayer.EndOfMedia: 
      print(self.state() == QMediaPlayer.StoppedState) # I get False 
      # self.state() is QMediaPlayer.PlayingState 


if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    m = MediaPlayer() 
    m.play() 
    sys.exit(app.exec_()) 

誰も同じ問題に直面していますか? 問題を回避策で解決できますが、Qtの問題である可能性があります。

+0

私はこれを確認することができます。変更の直後の状態になるかもしれませんが、その経験はドキュメントに矛盾しているようです(少なくともC++のQTドキュメントの場合)。これはバグかもしれません。 – Trilarion

+0

Btw。あなたの回避策は何ですか? – Trilarion

+0

私は回避策を使って質問を更新しました。個人的には最初のものを使用します。処理する前に強制停止しますが、方法1や方法2のどちらも好きではありません。 – SyedElec

答えて

1

Windowsのみのバグのようです、私はQtのにissueを報告:

def media_status_changed(self, status): 
    if status == QMediaPlayer.EndOfMedia: 
     super(MediaPlayer, self).stop() 
     # process 
  • を処理する前に

    1. 強制停止:問題を解決する

      の回避策取得するまでポーリングするStoppedState

      def media_status_changed(self, status): 
          if status == QMediaPlayer.EndOfMedia: 
           while not (self.state() == QMediaPlayer.StoppedState): 
            time.sleep(0.1) 
           # process 
      

    ここでQtの問題に関するアップデートを追加します。

    EDIT:Qtのv5.10.1で問題更新と固定

  • 関連する問題