PyQt5 使用指定大小窗口播放视频

Posted 勤奋的大熊猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt5 使用指定大小窗口播放视频相关的知识,希望对你有一定的参考价值。

阅读这一篇的之前推荐阅读PyQt5之前讲到的相关的系列内容(超链接点击跳转)。

import sys
from PyQt5.QtCore import QUrl
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.resize(400, 400)

        self.video_widget = QVideoWidget(self)
        self.video_widget.resize(200, 200)

        self.video_player = QMediaPlayer()
        self.video_player.setMedia(QMediaContent(QUrl.fromLocalFile(r"C:\\Users\\15025\\Desktop\\traffic.avi")))
        self.video_player.setVolume(40)
        self.video_player.setVideoOutput(self.video_widget)
        self.video_player.play()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setWindowIcon(QIcon('./cat.ico'))
    form = MainWindow()
    form.show()
    sys.exit(app.exec_())

各个语句的解释:
self.video_widget = QVideoWidget(self):在QMainWindow上创建一个QVideoWidget组件对象,后面将其与视频关联起来进行视频播放。这里QVideoWidget(self)中的self指代QMainWIndow对象。
self.video_widget.resize(200, 200):设定创建好的QVideoWidget组件的大小为200*200。第一个参数为组件宽度,第二个参数为组件高度。
self.video_player.setVolume(40)表示播放视频时的音量大小。QUrl.fromLocalFile(r"C:\\Users\\15025\\Desktop\\traffic.avi")是从本地读取视频文件的固定用法。此外self.video_player.setMedia()的对象固定为QMediaContent,所以我们要使用QMediaContent对从本地读取的视频对象进行转换。

注意这里的视频文件也可以替换为音频文件实现音频播放。视频文件支持格式.avi.mp4。其余支持格式暂时没有尝试过,大家可以自行尝试。

我看到有小伙伴留言说,没有视频出现。这里请大家重点关注两点:

  1. 视频文件的加载路径问题,看看自己是不是指定错了路径。代码中的r"C:\\Users\\15025\\Desktop\\traffic.avi"路径,小伙伴们在使用时记得替换成自己电脑中的哦。
  2. 视频的格式问题,是不是用了不支持的比较冷门的格式。

最终得到的效果如下:

码字不易,如果大家觉得有用,请高抬贵手给一个赞让我上推荐让更多的人看到吧~

如何在pyqt中播放视频

【中文标题】如何在pyqt中播放视频【英文标题】:How to play videos in pyqt 【发布时间】:2019-09-08 12:48:13 【问题描述】:

我想根据此功能中的选择文件播放视频文件:

    def abrir():
        QFileDialog.getOpenFileName(None, ("Selecciona los medios"),
                                              os.getcwd(),
                                              ("Video Files (*.avi *.mp4 *.flv)"))

我的问题是我必须使用什么选项或在 pyqt 中播放视频文件的模块

编辑: 要播放 S. Nick 的代码,我必须安装 K lite 代码

【问题讨论】:

github.com/baoboa/pyqt5/blob/master/examples/multimediawidgets/… 【参考方案1】:

试试看:

from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtCore import QDir, Qt, QUrl, QSize
from PyQt5.QtMultimedia import QMediaContent, QMediaPlayer
from PyQt5.QtMultimediaWidgets import QVideoWidget
from PyQt5.QtWidgets import (QApplication, QFileDialog, QHBoxLayout, QLabel, 
        QPushButton, QSizePolicy, QSlider, QStyle, QVBoxLayout, QWidget, QStatusBar)

class VideoPlayer(QWidget):

    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()

        openButton = QPushButton("Open Video")   
        openButton.setToolTip("Open Video File")
        openButton.setStatusTip("Open Video File")
        openButton.setFixedHeight(24)
        openButton.setIconSize(btnSize)
        openButton.setFont(QFont("Noto Sans", 8))
        openButton.setIcon(QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
        openButton.clicked.connect(self.abrir)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")

    def abrir(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Selecciona los mediose",
                ".", "Video Files (*.mp4 *.flv *.ts *.mts *.avi)")

        if fileName != '':
            self.mediaPlayer.setMedia(
                    QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(fileName)
            self.play()

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())

if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    player = VideoPlayer()
    player.setWindowTitle("Player")
    player.resize(600, 400)
    player.show()
    sys.exit(app.exec_())

【讨论】:

谢谢,你能解释一下为什么是 fileName, _ = QFileDialog.getOpenFileName(self, "Selecciona los mediose", ".", "Video Files (*.mp4 *.flv *.ts *.mts *.avi)") 而不仅仅是 fileName= @AnimeZero in PyQt5 static QtWidgets.QFileDialog.getOpenFileName(...) 返回类型:(fileName, selectedFilter)

以上是关于PyQt5 使用指定大小窗口播放视频的主要内容,如果未能解决你的问题,请参考以下文章

Qt视频播放窗口叠加透明窗口

Python PyQt5 开发列表数据界面视频介绍

第十三章 视频播放器开发之渲染背景

在 Qt 小部件中的视频顶部绘画

opencv自定义播放视频的窗口大小

使用 OpenCV 和 PyQT5 视频播放速度过快