我有一个可用的
QMediaPlayer
,可以自动将视频缩放到窗口的大小。 现在我想修改该 QMediaPlayer
,以便将 180 度旋转的视频缩放到窗口的大小。
我使用了如何在PyQt5中的QVideoWidget中旋转视频中的第一个解决方案来旋转视频。 这意味着将
QGraphicsScene
和 QGraphicsView
引入脚本中。 但是,视频没有缩放到可用的窗口空间。 我尝试了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_()
在
__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)