我有一个工作的QMediaPlayer
自动缩放视频到窗口的大小。现在,我想修改这个QMediaPlayer
,这样它就可以将180度旋转视频缩放到窗口大小。
我使用了How to rotate video in QVideoWidget in PyQt5中的第一个解决方案来旋转视频。这意味着在脚本中引入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_()
发布于 2022-06-30 03:13:53
@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)
https://stackoverflow.com/questions/72809524
复制相似问题