首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PyQt5 QMedaPlayer -缩放旋转视频以填充可用窗口大小

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

Stack Overflow用户
提问于 2022-06-30 01:53:13
回答 1查看 99关注 0票数 0

我有一个工作的QMediaPlayer自动缩放视频到窗口的大小。现在,我想修改这个QMediaPlayer,这样它就可以将180度旋转视频缩放到窗口大小。

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

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

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

代码语言:javascript
运行
复制
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_()
EN

回答 1

Stack Overflow用户

发布于 2022-06-30 03:13:53

@musicamante在他的评论中解决了这个问题。这一答复记录了我对他的建议的解释。

__init__()中,行:

代码语言:javascript
运行
复制
self.gv.fitInView(self.videoitem, Qt.KeepAspectRatio)

什么也做不了。它需要移动到resizeEvent()覆盖。

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

代码语言:javascript
运行
复制
def resizeEvent(self, event):
    super(RotatedPlayer, self).resizeEvent(event)
    self.gv.fitInView(self.videoitem, Qt.KeepAspectRatio)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72809524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档