首页 > 解决方案 > PyQt5:为什么我的 QGraphicsVideoItem 播放后消失?是否可以在最后一帧暂停 QMediaPlayer?

问题描述

我在下面编写了(最少的)代码来显示视频,QGraphicsVideoItemQGraphicsScene. 我关心的视频是动画,显示我想向用户展示的对象的创建(示例)。因此,每个视频的最后一帧是我希望永久保留在图形场景中的内容。但是,当QMediaPlayer播放完视频时,相关的图形视频项目在 Linux 上变为不可见或在 Windows 上变为黑色。有没有办法防止这种行为?例如,是否可以QMediaPlayer在最后一个视频帧上暂停 a?

我已经尝试从播放器获取视频持续时间并运行计时器以在视频结束之前暂停视频,但持续时间仅在视频加载后不可预见的时间内可用,因此这种技术会产生不可靠的结果。

我的代码:

import os
os.environ['QT_MULTIMEDIA_PREFERRED_PLUGINS'] = 'windowsmediafoundation'
import sys

from PyQt5 import QtCore, QtMultimedia, QtMultimediaWidgets, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    """A window that displays a graphics scene in a central graphics view."""
    def __init__(self, parent=None):
        super().__init__(parent)
        self.graphicsScene = QtWidgets.QGraphicsScene()
        self.graphicsScene.setSceneRect(0, 0, 800, 600)
        self.graphicsView = QtWidgets.QGraphicsView()
        self.graphicsView.setScene(self.graphicsScene)
        self.setCentralWidget(self.graphicsView)


class GraphicsVideoItem(QtMultimediaWidgets.QGraphicsVideoItem):
    """An item that displays a video file when added to a graphics scene."""
    def __init__(self, filepath):
        super().__init__()
        self.player = QtMultimedia.QMediaPlayer()
        self.player.setVideoOutput(self)
        self.player.setMedia(
            QtMultimedia.QMediaContent(QtCore.QUrl.fromLocalFile(filepath)))
        self.player.play()


def main():
    app = QtWidgets.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()

    # We display a video by adding it to the graphics scene.
    # The file test.mp4 is located in the same directory as this python file.
    # When the video finishes playing, it becomes invisible on Linux
    # and black on Windows.
    filepath = os.path.abspath("test.mp4")
    videoItem = GraphicsVideoItem(filepath)
    mainWindow.graphicsScene.addItem(videoItem)

    sys.exit(app.exec_())


if __name__ == "__main__":
    main()

标签: pythonpyqtpyqt5qmediaplayer

解决方案


推荐阅读