2016-11-18 9 views
1

У меня проблема с использованием QMediaPlayer.mediaStatusChanged.Состояние QMediaPlayer не остановлено, когда состояние изменено на конец носителя

Согласно Qt5.7 документации, когда статус СМИ меняется на EndOfMedia, состояние 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

КПП. каково ваше обходное решение? – Trilarion

+0

Я обновил вопрос обходными решениями, лично использую первый, я просто принудительно останавливаю перед обработкой, но мне не нравится ни метод 1, ни метод 2, если вы думаете о лучшем, дайте мне знать, спасибо. – SyedElec

ответ

1

Я доложил о issue в Qt, как это, кажется, только для Windows ошибка:

Возможные обходные пути, чтобы решить эту проблему: остановка Force

  1. перед обработкой

    def media_status_changed(self, status): 
        if status == QMediaPlayer.EndOfMedia: 
         super(MediaPlayer, self).stop() 
         # process 
    
  2. Опрос до получения 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