PyQt5 简单实现视频播放器

3 篇文章 0 订阅

已经更新了详细的实现过程PyQt5 实现视频播放器(二) ,详细版本 ,适合新手入门,并附上完整示例代码。

Qt5 比qt4 有了很多新的功能,今天实现一个小的视频播放器的demo。实现的时候在网上发现用python实现的比较少,所以分享一下给需要的同学,我也是参考了c++写的,所以会c++的自然应该没有什么问题

主要用到的类:QMediaPlayer

一个最简单的视频播放demo如下:

from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *
from PyQt5.QtMultimediaWidgets import QVideoWidget
import sys
if __name__ == '__main__':
    app = QApplication(sys.argv)
    player = QMediaPlayer()
    vw=  QVideoWidget()                       # 定义视频显示的widget
    vw.show()
    player.setVideoOutput(vw)                 # 视频播放输出的widget,就是上面定义的
    player.setMedia(QMediaContent(QFileDialog.getOpenFileUrl()[0]))  # 选取视频文件
    player.play()                               # 播放视频
    sys.exit(app.exec_())

主要就是定义了一个给QMediaPlayer 和 视频输出的widget ,然后弹出框选择视频文件,选完后直接播放,效果如下:

                   

到这里就完成了最简单的视频播放的demo,其它的界面布局,就是放置这个QVideoWidget在不同的地方。

这里还会有一个编码的问题,  

 DirectShowPlayerService::doRender: Unresolved error code 80040266

这是因为使用的QMediaPlayer ,底层是使用DirectShowPlayerService,所以安装一个DirectShow解码器,例如LAV Filters,就可以解决运行出错问题

参考:DirectShowPlayerService::doRender: Unresolved error code 80040266 · Issue #4 · qyvlik/Flat.qml · GitHub

          Unresolved error code 0x80040266_unresolved error code 80040266-CSDN博客

LAV 解码器的 地址:LAV Filters - DirectShow Media Splitter and Decoders - Doom9's Forum

Version 0.73.1: Installer (both x86/x64)   (我是直接下载的这个安装一下就解决问题了)

ok,至此QMediaPlayer 的简单demo完成

但是在使用的过程中会需要用到播放、暂停、进度条等,这里说一下思路
1、播放、暂停、停止,QTMediaPlayer都是直接的函数play() ,pause(),stop()  可以绑定按钮或这快捷键直接实现比如:

self.btn_play.clicked.connect(self.player.play)

 2、进度条的更新和显示

  QMediaPlayer 有一个 进度位置变化的信号:

[signal] void QMediaPlayer::positionChanged(qint64 position)
Signal the position of the content has changed to position, expressed in milliseconds.
Note: Notifier signal for property position. 

 视频总长的获取:

注意这里,视频的总长在获取的时候有可能是0,也就是在视频刚加载的时候,可以使用durationChanged() 来监听。我是加上了0.1 避免为0.在计算进度百分比的时候会除于总长,用来更新slider。

3、关于视频全屏的问题:

  在mainwindow 里无法进行全屏,比如设置了双击全屏,或者网上有说全屏了再退出全屏就变成一个新的widget。

  这个问题花费我最多的时间,看了官方的bug说明,目前没有好的解决方法,网上有一个解决办法是用两个widget,全屏的时候用一个,退出全屏的时候用另一个,感觉治标不治本。不过目前也只能这样了。下面,左边是一个单独的视屏川口,双击可以全屏,右边是在mainwindow中的一个视屏窗口,单击无法全屏。

  • 18
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论
你可以使用QMediaPlayer的positionChanged()信号和durationChanged()信号来获取当前播放时间和总时间,然后将其转换为可读的格式并在UI中显示。 以下是一个简单的示例代码: ```python from PyQt5.QtCore import QUrl, QTime from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent from PyQt5.QtWidgets import QApplication, QLabel, QMainWindow class MainWindow(QMainWindow): def __init__(self): super().__init__() self.player = QMediaPlayer(self) self.player.positionChanged.connect(self.update_position) self.player.durationChanged.connect(self.update_duration) self.label = QLabel(self) self.setCentralWidget(self.label) url = QUrl.fromLocalFile("/path/to/your/media/file.mp3") content = QMediaContent(url) self.player.setMedia(content) def update_position(self, position): position_time = QTime(0, (position / 60000) % 60, (position / 1000) % 60) self.label.setText(f"Position: {position_time.toString('mm:ss')} / {self.duration}") def update_duration(self, duration): self.duration = QTime(0, (duration / 60000) % 60, (duration / 1000) % 60).toString('mm:ss') if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() window.player.play() app.exec_() ``` 在这个例子中,我们创建了一个QMainWindow,并在其中心放置了一个QLabel来显示当前的播放时间。QMediaPlayer被用来播放媒体文件,并连接到positionChanged()和durationChanged()信号,以便在播放时更新UI。我们还创建了两个QTime变量来存储当前播放时间和总时间。在update_position()方法中,我们将当前播放时间转换为可读的格式,并将其与总时间一起显示在标签中。在update_duration()方法中,我们将总时间转换为可读的格式。
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮尔菲特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值