PyQt5:QMediaplayer,QVideowidget播放视频

PyQt5:视频播放

前言

最近在一些关于视频管理类的项目,也还有python好久没有更新,所以做一个简单的视频播放器。

环境

IDE:VS2017
Python:py3.6,pyqt5.12
系统:Win10

思路

  • QVideoWidget:这个类主要用作播放视频的控件
  • QMediaPlayer :实现媒体播放的类
  • QMediPlayList:媒体的播放列表,个人理解,用来控制管理播放顺序,方式等

代码片段

  • UI控件
    只用了一个Widget,还有放置了一个ListWideget,显示播放列表。
  • 基本框架
    Qt的简单格式
库导入区:from *** import ***
主窗体类:class m_window():
Main函数:入口函数,程序退出

-主窗体类(主要功能实现)
1.构造函数(初始化函数)
类的入口函数,写了关于QMediaPlayer声明,初始化。,列表初始化,一些信号槽的连接(播放、暂停、进度条、列表切换)

	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.按钮初始化函数,包括位置、大小、文字等设置

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.进度条初始化:声明、定义、类型、位置、大小、量程、显示

	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.播放、暂停按钮的槽函数实现

	def PlayVideo(self):
		self.mplayer.play()

	def StopVideo(self):
		self.mplayer.pause()

5.进度条滑块初始位置设置,媒体时长(ms/1000 转换为S)、进度条根据媒体时长设置量程,媒体时间获取信号槽函数

	def MediaTime(self,time):
		self.Slider.setValue(0)
		self.time = self.mplayer.duration() /1000
		self.Slider.setRange(0,int(self.time))

6.媒体播放位置改变信号的槽函数(用来实现进度条功能)

	def PlaySlide(self,val):
		self.Slider.setValue(int(val/1000))

7.播放列表控件,LIstWidget初始化、playList初始化(现在列表的写死的)

	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位置索引信号(双击实现播放)
信号

	Index_Signle = pyqtSignal(int)

槽函数

	def SetPlayMedia(self,Index):
		self.mplayer.stop()
		self.mplayList.setCurrentIndex(Index)
		self.mplayer.play()

9.ListWidget双击信号槽函数,Signle_Index信号发射函数

	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

评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值