PyQt5视频播放器设计--在QGraphicsVideoItem上播放视频

该文介绍了一种使用PyQt5框架,结合QMediaPlayer和QGraphicsVideoItem类来播放视频的方法。QGraphicsVideoItem允许视频在显示场景中与其他图形元素结合,并支持缩放、移动等操作。同时,文中还展示了如何添加QGraphicsTextItem模拟弹幕显示,并提供了相关的事件处理函数和自定义槽函数,如播放、暂停、停止、全屏等操作。
摘要由CSDN通过智能技术生成

1、功能概述
QMediaPlayer解码的视频在QGraphicsVideoItem类组件上显示。

使用QGraphicsVideoItem显示视频时,可以在显示场景中和其他图形项组合显示,
可以使用QGraphicsItem类的放大、缩小、拖动、旋转等功能。

在这里插入图片描述

2、主要函数与类
类:
QGraphicsVideoItem对象用于显示播放的视频
QGraphicsTextItem类型的图形项模拟弹幕显示文字。
函数:
scale():获取组件界面的大小
setScale(scale):设置组件界面的大小,参数为组件目前界面的大小。

3、代码实现

import sys
from PyQt5.QtWidgets import  (QApplication, QMainWindow,QFileDialog,
         QGraphicsScene,QGraphicsItem,QGraphicsTextItem)
from PyQt5.QtCore import  pyqtSlot,QSizeF, QUrl,Qt,QFileInfo,QDir
from PyQt5.QtGui import QIcon,QFont
from PyQt5.QtMultimedia import QMediaContent,QMediaPlayer
from PyQt5.QtMultimediaWidgets import  QGraphicsVideoItem

#关于Ui_MainWindow.py,不在此文展示,如有需要请联系我
from ui_MainWindow import Ui_MainWindow

class QmyMainWindow(QMainWindow): 
   def __init__(self, parent=None):
      super().__init__(parent)   #调用父类构造函数,创建窗体
      self.ui=Ui_MainWindow()    #创建UI对象
      self.ui.setupUi(self)      #构造UI界面

      self.player = QMediaPlayer(self)       #创建视频播放器
      self.player.setNotifyInterval(1000)    #信息更新周期, ms

      scene = QGraphicsScene(self)   
      self.ui.graphicsView.setScene(scene)

      self.videoItem = QGraphicsVideoItem()  #视频显示画面
      self.videoItem.setSize(QSizeF(320, 220))
      self.videoItem.setFlag(QGraphicsItem.ItemIsMovable)
      self.videoItem.setFlag(QGraphicsItem.ItemIsSelectable)
      self.videoItem.setFlag(QGraphicsItem.ItemIsFocusable)
      
      scene.addItem(self.videoItem)
      self.player.setVideoOutput(self.videoItem)   #设置视频显示图形项

      self.textItem = QGraphicsTextItem("面朝大海,春暖花开")  #弹幕文字
      font = self.textItem.font()
      font.setPointSize(20)
      self.textItem.setFont(font)
      self.textItem.setDefaultTextColor(Qt.red);
      self.textItem.setPos(100,220)
      self.textItem.setFlag(QGraphicsItem.ItemIsMovable)
      self.textItem.setFlag(QGraphicsItem.ItemIsSelectable)
      self.textItem.setFlag(QGraphicsItem.ItemIsFocusable)
      scene.addItem(self.textItem)

      self.ui.btnText.setCheckable(True)  #弹幕文字按钮
      self.ui.btnText.setChecked(True)

      self.__duration = ""
      self.__curPos = ""
      self.player.stateChanged.connect(self.do_stateChanged)
      self.player.positionChanged.connect(self.do_positionChanged)
      self.player.durationChanged.connect(self.do_durationChanged)
##  ==============自定义功能函数========================
##  ==============event处理函数==========================
   def closeEvent(self,event):  #窗体关闭时
   # 窗口关闭时不能自动停止播放,需手动停止
      if (self.player.state() == QMediaPlayer.PlayingState):
         self.player.stop()
               
##  ==========由connectSlotsByName()自动连接的槽函数============        
   @pyqtSlot()    ##打开文件
   def on_btnOpen_clicked(self):
      curPath = QDir.currentPath()  #获取系统当前目录
##      curPath=os.getcwd()  
      title = "选择视频文件" 
      filt = "视频文件(*.wmv *.avi);;所有文件(*.*)" 
      fileName, flt = QFileDialog.getOpenFileName(self, title, curPath, filt)

      if (fileName == ""):
         return

      fileInfo = QFileInfo(fileName)
      baseName = fileInfo.fileName()
##      baseName=os.path.basename(fileName)
      self.ui.LabCurMedia.setText(baseName)
      curPath = fileInfo.absolutePath()
      QDir.setCurrent(curPath)   #重设当前目录

      media = QMediaContent(QUrl.fromLocalFile(fileName))

      self.player.setMedia(media) #设置播放文件
      self.player.play()

   @pyqtSlot()     ##播放
   def on_btnPlay_clicked(self):
      self.player.play()

   @pyqtSlot()    ##暂停
   def on_btnPause_clicked(self):
      self.player.pause()

   @pyqtSlot()    ##停止
   def on_btnStop_clicked(self):
      self.player.stop()

   @pyqtSlot()    ##全屏
   def on_btnFullScreen_clicked(self):
      self.videoWidget.setFullScreen(True)

   @pyqtSlot()    ##静音按钮
   def on_btnSound_clicked(self):
      mute = self.player.isMuted()
      self.player.setMuted(not mute)
      if mute:
         self.ui.btnSound.setIcon(QIcon(":/icons/images/volumn.bmp"))
      else:
         self.ui.btnSound.setIcon(QIcon(":/icons/images/mute.bmp"))
         
   @pyqtSlot(int)  ##音量调节
   def on_sliderVolumn_valueChanged(self,value):
      self.player.setVolume(value)

   @pyqtSlot(int)  ##播放进度调节
   def on_sliderPosition_valueChanged(self,value):
      self.player.setPosition(value)

   @pyqtSlot()    ##放大
   def on_btnZoomIn_clicked(self):
      sc = self.videoItem.scale()
      self.videoItem.setScale(sc + 0.1)

   @pyqtSlot()    ##缩小
   def on_btnZoomOut_clicked(self):
      sc = self.videoItem.scale()
      self.videoItem.setScale(sc-0.1)
      
   @pyqtSlot(bool)   ##弹幕
   def on_btnText_clicked(self,checked):
      self.textItem.setVisible(checked)
      
        
##  =============自定义槽函数===============================        

   def do_stateChanged(self,state):
      isPlaying= (state==QMediaPlayer.PlayingState)
      
      self.ui.btnPlay.setEnabled(not isPlaying)
      self.ui.btnPause.setEnabled(isPlaying)
      self.ui.btnStop.setEnabled(isPlaying)

   def do_durationChanged(self,duration):
      self.ui.sliderPosition.setMaximum(duration)

      secs=duration/1000   #秒
      mins=secs/60         #分钟
      secs=secs % 60       #余数秒
      self.__duration="%d:%d"%(mins,secs)
      self.ui.LabRatio.setText(self.__curPos+"/"+self.__duration)

   def do_positionChanged(self,position):
      if (self.ui.sliderPosition.isSliderDown()):
         return  #如果正在拖动滑条,退出

      self.ui.sliderPosition.setSliderPosition(position)

      secs=position/1000   #秒
      mins=secs/60         #分钟
      secs=secs % 60       #余数秒
      self.__curPos="%d:%d"%(mins,secs)
      self.ui.LabRatio.setText(self.__curPos+"/"+self.__duration)

QGraphicsScene场景对象scene,与界面上的视图组件graphicsView构成了Graphics View架构。
QGraphicsVideoItem对象self.videoItem,并作为媒体播放器self.player的视频输出对象。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: PyQt5是一个用于创建图形界面应用程序的Python库。要设计一个PyQt5视频播放器,可以按照以下步骤进行: 1. 导入必要的PyQt5模块,如QtMultimedia、QtWidgets等。 2. 创建一个主窗口类,并继承自QtWidgets.QMainWindow类。在主窗口中添加视频播放器所需的各种控件,如播放按钮、暂停按钮、音量控制条、进度条等。 3. 使用QtMultimedia.QMediaPlayer类来创建一个媒体播放器。通过调用setMedia函数,将视频的URL或本地文件路径传入,设置为要播放的媒体。 4. 创建一个函数来处理各种控件的点击事件,如播放按钮的点击事件、暂停按钮的点击事件等。通过连接信号和槽的方式将事件与相应的函数关联起来,实现播放器的功能。 5. 在主窗口类中重写resizeEvent函数,用于调整视频播放器的大小,并根据新的大小来重新布局和调整控件。 6. 使用QtMultimedia.QVideoWidget类创建一个视频播放窗口,并将其设置为媒体播放器的视频输出。 7. 在主窗口中添加媒体播放器和视频播放窗口,并进行布局。 8. 设置主窗口的标题、大小等属性,并显示窗口。 9. 在主程序中实例化主窗口类,并调用app.exec_()来启动应用程序的消息循环,使程序保持运行。 通过以上步骤,我们可以设计出一个基本的PyQt5视频播放器。使用PyQt5的丰富控件和功能,我们还可以进一步扩展和美化播放器,如添加播放列表、字幕支持、全屏模式等。 ### 回答2: PyQt5是一个用于创建图形用户界面(GUI)的Python库。要设计一个PyQt5视频播放器,需要首先导入PyQt5的相关模块,然后创建一个GUI窗口。在窗口中,我们可以添加视频播放器的各种功能元素,比如播放按钮、暂停按钮、进度条等等。我们还可以添加视频列表,允许用户选择要播放的视频文件。 在PyQt5中,可以使用QMediaPlayer模块来实现视频播放功能。通过调用QMediaplayer的相关方法,可以实现视频的加载、播放、暂停、停止等操作。同时,可以使用QVideoWidget模块来显示视频画面,将其添加到窗口中。 另外,我们还可以使用QSlider模块实现进度条的功能,让用户能够跳转到视频的任意位置。用户还可以通过拖动进度条来调整视频的播放进度。 在设计过程中,还可以添加一些额外的功能,比如全屏播放、音量调节、视频截图等等。这些功能可以通过使用PyQt5的其他模块来实现。 总之,设计一个PyQt5视频播放器需要先创建一个GUI窗口,然后添加相关的元素和功能模块。通过调用PyQt5的方法和模块,可以实现视频的加载、播放、暂停等操作,同时还可以添加一些额外的功能。设计一个功能完善的PyQt5视频播放器可以让用户更方便地观看和管理视频文件。 ### 回答3: PyQt5是一款功能强大的Python图形用户界面库,可以实现视频播放器设计和开发。下面是一个简单的PyQt5视频播放器设计想法。 首先,我们需要导入PyQt5和PyQtMultimedia模块来实现视频播放功能。然后,可以创建一个主窗口类,并在其初始化函数中添加一个 QLabel 作为视频播放区域,一个 QPushButton 作为控制按钮,以及一个 QSlider 作为进度条。 接下来,我们需要实现视频播放器的基本功能。可以通过调用 QMediaPlayer 类来加载视频文件,并将其设置为 QLabel 的背景。通过设置 QPushButton 的点击事件,可以实现播放/暂停视频的功能。通过连接 QSlider 的 valueChanged 信号和 QMediaPlayer 的 setPosition 方法,可以实现进度条的拖动以及视频的跳转。 此外,可以添加其他控制按钮,例如音量调节按钮和快进/快退按钮。通过设置 QSlider 的 valueChanged 信号和 QMediaPlayer 的 setVolume 方法,可以实现音量的调节。通过设置 QPushButton 的点击事件和 QMediaPlayer 的 setPlaybackRate 方法,可以实现快进/快退视频的功能。 最后,可以添加文件选择按钮,以便用户可以选择需要播放的视频文件。通过设置 QPushButton 的点击事件和 QFileDialog 的 getOpenFileName 方法,可以实现文件选择功能。 通过以上的设计思路,我们可以实现一个基本的PyQt5视频播放器。当然,为了使播放器更加完善和用户友好,我们还可以进一步添加功能,例如全屏播放、播放列表、字幕显示等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值