PyQt5 实现视频播放器

已经更新了详细的实现过程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 ,然后弹出框选择视频文件,选完后直接播放,效果如下:

PyQt5 实现视频播放器_第1张图片                   PyQt5 实现视频播放器_第2张图片

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

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

 DirectShowPlayerService::doRender: Unresolved error code 80040266

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

参考:https://github.com/qyvlik/Flat.qml/issues/4

          https://blog.csdn.net/pyf09/article/details/72782315

LAV 解码器的 地址:http://forum.doom9.org/showthread.php?t=156191

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. 

 视频总长的获取:

PyQt5 实现视频播放器_第3张图片

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

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

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

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

PyQt5 实现视频播放器_第4张图片PyQt5 实现视频播放器_第5张图片

你可能感兴趣的:(Python,qt)