side:Videos 并排播放两个视频未显示
Playing two videos side by side:Videos not showing
我正在尝试构建一个 GUI,它由 window 上不同位置播放的多个视频组成,所有视频都带有 alpha 通道,因为有些视频与其他视频重叠,具体取决于固件提供的说明外部设备。
我正处于项目的最初阶段,所以我只想在同一屏幕上播放两个视频,然后从那里开始。 (尽管如果你知道一个关于我的最终 objective 的好例子可以分享,那也很棒)。
我看到的适用于该项目的层次结构是一个 QMainWindow,它包含一个 QGraphicsView,一个 QGraphicsScene,它包含两个 QGraphicsVideoItem,它们是 QMediaPlayer 的“输出”。 (我是不是已经走错路了?)
A window 打开,大小合适但没有播放视频。我做了很多测试,比如添加布局,改变某些指令的顺序等等。但是什么都没有。
import sys
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class VideoWindow(QMainWindow):
def __init__(self):
super(VideoWindow, self).__init__()
self.setWindowTitle('QMediaPlayer TEST')
self.resize(1920, 1080)
self.vista = QGraphicsView(self)
self.vista.setGeometry(QRect(0, 0, 1920, 1080))
self.scene = QGraphicsScene(self.vista)
self.scene.setSceneRect(0, 0, 1920, 1080)
self.graphvitem1 = QGraphicsVideoItem()
self.graphvitem2 = QGraphicsVideoItem()
self.mediaPlayer1 = QMediaPlayer(None, QMediaPlayer.VideoSurface)
self.mediaPlayer1.setVideoOutput(self.graphvitem1)
self.mediaPlayer1.setMedia(QMediaContent(QUrl.fromLocalFile("/Users/elemental/Desktop/pyvids/v1na.mp4")))
self.graphvitem1.setPos(100, 100)
self.scene.addItem(self.graphvitem1)
self.mediaPlayer2 = QMediaPlayer(None, QMediaPlayer.VideoSurface)
self.mediaPlayer2.setVideoOutput(self.graphvitem2)
self.mediaPlayer2.setMedia(QMediaContent(QUrl.fromLocalFile("/Users/elemental/Desktop/pyvids/v1na2.mp4")))
self.graphvitem2.setPos(100, 500)
self.scene.addItem(self.graphvitem2)
self.mediaPlayer1.play()
self.mediaPlayer2.play()
self.vista.show()
if __name__ == '__main__':
app = QApplication([])
window = VideoWindow()
window.show()
sys.exit(app.exec_())
您没有在视图上设置场景。
虽然 constructor of QGraphicsView 可以接受 QGraphicsScene(它会自动设置),但 QGraphicsScene 构造器(因为一个场景可以在多个视图之间共享)并添加视图就没有这样方便了作为参数只会将该视图设置为父视图。
self.scene = QGraphicsScene(self.vista)
self.vista.setScene(self.scene)
我正在尝试构建一个 GUI,它由 window 上不同位置播放的多个视频组成,所有视频都带有 alpha 通道,因为有些视频与其他视频重叠,具体取决于固件提供的说明外部设备。
我正处于项目的最初阶段,所以我只想在同一屏幕上播放两个视频,然后从那里开始。 (尽管如果你知道一个关于我的最终 objective 的好例子可以分享,那也很棒)。
我看到的适用于该项目的层次结构是一个 QMainWindow,它包含一个 QGraphicsView,一个 QGraphicsScene,它包含两个 QGraphicsVideoItem,它们是 QMediaPlayer 的“输出”。 (我是不是已经走错路了?)
A window 打开,大小合适但没有播放视频。我做了很多测试,比如添加布局,改变某些指令的顺序等等。但是什么都没有。
import sys
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class VideoWindow(QMainWindow):
def __init__(self):
super(VideoWindow, self).__init__()
self.setWindowTitle('QMediaPlayer TEST')
self.resize(1920, 1080)
self.vista = QGraphicsView(self)
self.vista.setGeometry(QRect(0, 0, 1920, 1080))
self.scene = QGraphicsScene(self.vista)
self.scene.setSceneRect(0, 0, 1920, 1080)
self.graphvitem1 = QGraphicsVideoItem()
self.graphvitem2 = QGraphicsVideoItem()
self.mediaPlayer1 = QMediaPlayer(None, QMediaPlayer.VideoSurface)
self.mediaPlayer1.setVideoOutput(self.graphvitem1)
self.mediaPlayer1.setMedia(QMediaContent(QUrl.fromLocalFile("/Users/elemental/Desktop/pyvids/v1na.mp4")))
self.graphvitem1.setPos(100, 100)
self.scene.addItem(self.graphvitem1)
self.mediaPlayer2 = QMediaPlayer(None, QMediaPlayer.VideoSurface)
self.mediaPlayer2.setVideoOutput(self.graphvitem2)
self.mediaPlayer2.setMedia(QMediaContent(QUrl.fromLocalFile("/Users/elemental/Desktop/pyvids/v1na2.mp4")))
self.graphvitem2.setPos(100, 500)
self.scene.addItem(self.graphvitem2)
self.mediaPlayer1.play()
self.mediaPlayer2.play()
self.vista.show()
if __name__ == '__main__':
app = QApplication([])
window = VideoWindow()
window.show()
sys.exit(app.exec_())
您没有在视图上设置场景。
虽然 constructor of QGraphicsView 可以接受 QGraphicsScene(它会自动设置),但 QGraphicsScene 构造器(因为一个场景可以在多个视图之间共享)并添加视图就没有这样方便了作为参数只会将该视图设置为父视图。
self.scene = QGraphicsScene(self.vista)
self.vista.setScene(self.scene)