已经更新了详细的实现过程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,就可以解决运行出错问题
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中的一个视屏窗口,单击无法全屏。