python - PyQt5:为什么我的 QGraphicsVideoItem 播放后消失?是否可以在最后一帧暂停 QMediaPlayer?
问题描述
我在下面编写了(最少的)代码来显示视频,QGraphicsVideoItem
如QGraphicsScene
. 我关心的视频是动画,显示我想向用户展示的对象的创建(示例)。因此,每个视频的最后一帧是我希望永久保留在图形场景中的内容。但是,当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()
解决方案
推荐阅读
- html - 选择选项未在选择元素下对齐
- publish-subscribe - lwc salesforce 中的 Pubsub 需要帮助
- reactjs - 我们在 facebook 上的网站广告未在 ios 14.7.1 中打开
- mv - 文件名有空格时使用的 mv 命令
- bash - 计算所有不可删除文件的总大小(包括子目录中的文件)
- gremlin - 如何在 Gremlin 中编写条件更新语句
- java - 这个人是如何用 Java 实现图形的?
- google-chrome-extension - 为特定输入字段禁用 Microsoft 自动填充/身份验证器?
- swift - SwiftUI 应用程序不断崩溃可能是由于 ForEach
- google-apps-script - Function not executing when called second time