PyQt5 QMediaPlayer - 缩放旋转视频以填充可用窗口大小

问题描述 投票:0回答:1

我有一个可用的

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_()
    
pyqt5 rotation resize scale qmediaplayer
1个回答
0
投票
@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)
    
© www.soinside.com 2019 - 2024. All rights reserved.