PyQt5:视频播放
前言
最近在一些关于视频管理类的项目,也还有python好久没有更新,所以做一个简单的视频播放器。
环境
代码语言:javascript复制IDE:VS2017
Python:py3.6,pyqt5.12
系统:Win10
思路
- QVideoWidget:这个类主要用作播放视频的控件
- QMediaPlayer :实现媒体播放的类
- QMediPlayList:媒体的播放列表,个人理解,用来控制管理播放顺序,方式等
代码片段
- UI控件 只用了一个Widget,还有放置了一个ListWideget,显示播放列表。
- 基本框架 Qt的简单格式
库导入区:from *** import ***
主窗体类:class m_window():
Main函数:入口函数,程序退出
-主窗体类(主要功能实现)
1.构造函数(初始化函数)
类的入口函数,写了关于QMediaPlayer声明,初始化。,列表初始化,一些信号槽的连接(播放、暂停、进度条、列表切换)
代码语言:javascript复制 def __init__(self):
super(m_window,self).__init__()
self.setupUi(self)
#按钮初始化
self.PushButtonInit()
#进度条初始化
self.ProgressBarInit()
#播放器、播放列表初始化
self.mplayer = QMediaPlayer(self)
self.ListWidgetInit()
self.mplayList.setCurrentIndex(0)
#mVideoWidget控件初始化
self.mVideoWin = QVideoWidget(self)
self.mVideoWin.setGeometry(5,5,640,480)
#nplayer设置视频输出窗体(QVideoWideget)
self.mplayer.setVideoOutput(self.mVideoWin)
#信号、槽
self.play.clicked.connect(self.PlayVideo)
self.stop.clicked.connect(self.StopVideo)
self.mplayer.positionChanged.connect(self.PlaySlide)
self.mplayer.durationChanged.connect(self.MediaTime)
self.listWidget.itemDoubleClicked.connect(self.GetItem)
self.Index_Signle.connect(self.SetPlayMedia)
2.按钮初始化函数,包括位置、大小、文字等设置
代码语言:javascript复制def PushButtonInit(self):
self.play = QPushButton(self)
self.play.setGeometry(5,495,50,20)
self.play.setText("Play")
self.play.show()
self.stop = QPushButton(self)
self.stop.setGeometry(65,495,50,20)
self.stop.setText("stop")
self.stop.show()
3.进度条初始化:声明、定义、类型、位置、大小、量程、显示
代码语言:javascript复制 def ProgressBarInit(self):
self.Slider = QSlider(Qt.Horizontal,self)
self.Slider.setGeometry(150,495,200,20)
self.Slider.setRange(0,100)
self.Slider.show()
4.播放、暂停按钮的槽函数实现
代码语言:javascript复制 def PlayVideo(self):
self.mplayer.play()
def StopVideo(self):
self.mplayer.pause()
5.进度条滑块初始位置设置,媒体时长(ms/1000 转换为S)、进度条根据媒体时长设置量程,媒体时间获取信号槽函数
代码语言:javascript复制 def MediaTime(self,time):
self.Slider.setValue(0)
self.time = self.mplayer.duration() /1000
self.Slider.setRange(0,int(self.time))
6.媒体播放位置改变信号的槽函数(用来实现进度条功能)
代码语言:javascript复制 def PlaySlide(self,val):
self.Slider.setValue(int(val/1000))
7.播放列表控件,LIstWidget初始化、playList初始化(现在列表的写死的)
代码语言:javascript复制 def ListWidgetInit(self):
self.mplayList = QMediaPlaylist();
self.mplayList.addMedia(QMediaContent(QUrl.fromLocalFile("https://vd1.bdstatic.com/mda-hg6uempmez9u6mqi/sc/mda-hg6uempmez9u6mqi.mp4?auth_key=1562172911-0-0-4c22196ad1d0fcc49402d91336c999c5&bcevod_channel=searchbox_feed&pd=bjh&abtest=all")))
self.mplayList.addMedia(QMediaContent(QUrl.fromLocalFile("https://vd1.bdstatic.com/mda-hgdizw7w7fpc1pcr/sc/mda-hgdizw7w7fpc1pcr.mp4?auth_key=1562254279-0-0-703eb2eca1f7017eaa49b62a7ef56dda&bcevod_channel=searchbox_feed&pd=bjh&abtest=all")))
self.mplayer.setPlaylist(self.mplayList)
self.mplayList.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop)
self.listWidget.addItem("1")
self.listWidget.addItem("2")
8.列表切换功能实现槽函数,信号为自定义Index位置索引信号(双击实现播放)
信号
代码语言:javascript复制 Index_Signle = pyqtSignal(int)
槽函数
代码语言:javascript复制 def SetPlayMedia(self,Index):
self.mplayer.stop()
self.mplayList.setCurrentIndex(Index)
self.mplayer.play()
9.ListWidget双击信号槽函数,Signle_Index信号发射函数
代码语言:javascript复制 def GetItem(self,Item):
self.Index = self.listWidget.row(Item)
self.Index_Signle.emit(self.Index)
功能截图:
视频1的截图
视频2的播放截图
不足
这个媒体播放器,其实设想的就是一个很简的媒体播放器,只要能实现播放又可以,后来又加了,播放,暂停,进度条,列表等一个修饰性功能。其他功能,进度条拖动,设置播放位置,快进,慢进等功能,在播放列表这一块,本地媒体的获取,在线媒体获取,列表添加媒体,列表Item名称的自动命名等的一些功能实现。由于之前写过一个Qt的音乐播放器,上诉功能也基本实现,也就没有继续往下写,做重复性工作。说一下思路:
本地媒体获取:加一个控件(按钮),利用QFile实现文件选择框,加一下过滤实现本地媒体的选择。
网络媒体获取:加一个LineEidt,用来输入网络在线媒体路径,加入播放列表
进度条拖动:利用Slider信号valuechange等,获取播放位置,利用setPostion设置播放位置
快进:也是对播放位置的处理,设置等间隔时差,实现播放位置的跳跃
列表名单:对本地媒体全路径进行剪切,利用后缀还有‘/’来做切割获取,对ListItem获取,网络媒体就是手动输入了。
列表记录:利用配置文件json、xml等,记录上一次退出时,播放列表名单、播放状态、时间状态等,下一次初始化的时候,进行设置。
源代码
源码。
/---------------------------------2019.11.19-------------------------------------*/
上述的窗口自适应大小,快进,慢进功能实现。
PyQt5:QMediaplayer,QVideowidget播放视频2