PyQt5 QMedaPlayer语言 - 缩放旋转视频以填充可用的窗口大小



我有一个工作的QMediaPlayer,自动缩放视频到窗口的大小。现在我想修改QMediaPlayer,使其缩放180度旋转的视频到窗口的大小。

我在PyQt5中如何旋转QVideoWidget中的视频中使用了第一个解决方案来旋转视频。这意味着在脚本中引入QGraphicsSceneQGraphicsView。但是,视频没有扩展到可用的窗口空间。我尝试了QGraphicsView方法fitInView()缩放旋转的图像,但这似乎不是解决方案。

下面的脚本打开两个播放器,(1)缩放未旋转视频的播放器和(2)播放旋转视频但不缩放的播放器。

如何修改第二个播放器,使其旋转缩放视频以适合可用的窗口大小?

from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtWidgets import QVBoxLayout
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView
from PyQt5.QtGui import QPalette
from PyQt5.QtCore import Qt, QUrl
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtMultimediaWidgets import QGraphicsVideoItem, QVideoWidget
import sys
class Player(QWidget):
def __init__(self):
super().__init__()

self.setGeometry(350, 100, 700, 500)
self.setWindowTitle('Non-Rotated Player')

p = self.palette()
p.setColor(QPalette.Window, Qt.black)
self.setPalette(p)
#create media player object
self.player = QMediaPlayer(None, QMediaPlayer.VideoSurface)
self.player.setNotifyInterval(17)
#create videowidget object 
self.videowidget = QVideoWidget()
#create vbox layout
vboxLayout = QVBoxLayout()
vboxLayout.addWidget(self.videowidget)

self.setLayout(vboxLayout)

self.player.setVideoOutput(self.videowidget)

self.filename = 'my_video.MP4'
self.player.setMedia(QMediaContent(QUrl.fromLocalFile(self.filename)))
self.player.setMuted(True)
self.player.play()
class RotatedPlayer(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('Rotated Player')
self.setGeometry(350, 100, 700, 500)

p = self.palette()
p.setColor(QPalette.Window, Qt.black)
self.setPalette(p)
#create media player object
self.player = QMediaPlayer(self, QMediaPlayer.VideoSurface)

# Create the surface and view
self.scene = QGraphicsScene(self)
self.gv = QGraphicsView(self.scene)
self.gv.setStyleSheet('background-color: black;')

# Create the item
self.videoitem = QGraphicsVideoItem()
self.scene.addItem(self.videoitem)
self.videoitem.setRotation(180)

# Shouldn't this scale the item to fit the view???
self.player.setVideoOutput(self.videoitem)
self.gv.fitInView(self.videoitem, Qt.IgnoreAspectRatio)
vboxLayout = QVBoxLayout()
vboxLayout.addWidget(self.gv)

self.setLayout(vboxLayout)

self.filename = 'my_video.MP4'

self.player.setMedia(QMediaContent(QUrl.fromLocalFile(self.filename)))
self.player.setMuted(True)
self.player.play()

if __name__ == '__main__':

app = QApplication(sys.argv)
p = Player() 
p.show()
r = RotatedPlayer()
r.show()
app.exec_()

@musicamante在评论中解决了这个问题。这个答复证明了我对他的建议的理解。

__init__(),行:

self.gv.fitInView(self.videoitem, Qt.KeepAspectRatio)

没有任何作用。它需要移动到resizeEvent()覆盖。

__init__()中删除行并创建以下resizeEvent()覆盖后,视频按预期旋转并调整大小。

def resizeEvent(self, event):
super(RotatedPlayer, self).resizeEvent(event)
self.gv.fitInView(self.videoitem, Qt.KeepAspectRatio)

最新更新