Python实战案例:PyQT模块开发多线程视频播放器(下)Python实战案例:PyQT模块开发多线程视频播放器(下)
在能够实现两个图⽚间进⾏点击交换这样的交互动作后,对PyQt5桌⾯应⽤界⾯的开发有⼀定的了解后,就可以进⾏多线程视频播放器的开发。在开发多线程视频播放器的开发时,同样需要窗⼝布局页⾯的显⽰。
⼀、多线程视频播放器的页⾯布局
在桌⾯应⽤的开发过程中,也需要进⾏页⾯⽅⾯的布局。多线程视频播放初始界⾯如下图⽰。
当点击底部播放按钮后,播放页⾯如下图所⽰。
从界⾯上看,整个页⾯初始布局跟前⾯所提的点击按钮更换图⽚的布局是⼀致的。只不过在点击图⽚的时候发⽣了⼀个视频的播放界⾯,需要调⽤opencv中的视频对象,对象的名字是VideoCapture,直接实例化VideoCapture对象,赋予对象参数就是待播放视频的地址。因此,需要使⽤pip3⼯具管理进⾏opencv-python模块的安装,安装命令如下:
Pip3 install  opencv-python
安装成功后,就可以导⼊cv2中的VideoCapture视频对象,具体布局上的代码如下。
from PyQt5.QtCore import  *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
from cv2 import *
socket编程基于什么层
import time;
#⾯向对象的⽅法来开发
class VideoBox(QWidget):
#初始化界⾯
def __init__(self):
#把⽗类界⾯继承过来
QWidget.__init__(self)
self.pictureLabel=QLabel()
init_image=QPixmap("resources/sssss.jpg")
拔出来的源码自己怎么搭建
self.pictureLabel.setPixmap(init_image)
#把按钮加到桌⾯上
self.playButton=QPushButton()
#设置按钮有效
self.playButton.setEnabled(True)
#设置图标
self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
#把点击动作发⽣在按钮上,clicked点击,connect表⽰点击后执⾏哪⼀个函数        self.t(self.switch_video)
#做布局,指明布局⽅向,有的布局横向QHBoxLayout 纵向布局 QVBoxLayout        layout1=QVBoxLayout()
layout1.addWidget(self.pictureLabel)
layout1.addWidget(self.playButton)
self.setLayout(layout1)
#定义全局视频
self.playCapture = VideoCapture("resources/test.avi")
#定义定时器
def switch_video(self):
pass
if __name__=="__main__":
#定义app
app=QApplication(sys.argv)
#定义的界⾯类实例化
mv=VideoBox()
mv.show()
<_())
上述代码运⾏后的结果如下图所⽰。
⼆、点击后进⾏视频播放动作的交互
应⽤程序的组件界⾯搭建成功后,就可以通过点击下⾯的按钮实现视频的点击播放,但是cv2中的VideoCapture并没有提供视频播放的play⽅法,需要调⽤read()⽅法读取数据,读取数据后可以查看具体内容,这样我们就在按钮点击的⽅法中输出VideoCapture对象的read()⽅法读出的内容。具体代码如下。
from PyQt5.QtCore import  *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
from cv2 import *
import time;
#⾯向对象的⽅法来开发
class VideoBox(QWidget):
#初始化界⾯
def __init__(self):
#把⽗类界⾯继承过来
QWidget.__init__(self)
#设置⼀个播放和暂停的状态值
self.status=True
self.pictureLabel=QLabel()
init_image=QPixmap("resources/sssss.jpg")
self.pictureLabel.setPixmap(init_image)
#把按钮加到桌⾯上
self.playButton=QPushButton()
#设置按钮有效
self.playButton.setEnabled(True)
#设置图标
self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
#把点击动作发⽣在按钮上,clicked点击,connect表⽰点击后执⾏哪⼀个函数        self.t(self.switch_video)
#做布局,指明布局⽅向,有的布局横向QHBoxLayout 纵向布局 QVBoxLayout        layout1=QVBoxLayout()
layout1.addWidget(self.pictureLabel)
layout1.addWidget(self.playButton)
self.setLayout(layout1)
#定义全局视频validationsummary控件的不是作用
self.playCapture = VideoCapture("resources/test.avi")
#定义定时器
def switch_video(self):python入门教程视屏
datas=ad()
print(datas)
if __name__=="__main__":
#定义app
app=QApplication(sys.argv)
#定义的界⾯类实例化
mv=VideoBox()
mv.show()
<_())
上述代码运⾏后在控制台的输出结果如下图所⽰。
从输出结果图中可以看出,输出数据的类型是⼀个两个数据组成的⼀个元组,元组的第⼀个数据是布尔型,表⽰是否有数据,如果为True,表⽰接收的是视频数据,元组的第⼆个数据是数组,数组的内容才是视频的具体内容,在PyQt5中的QBitmap像素图⽚类不能直接接收数组类型的数据,需要PyQt5中QImage类进⾏中间的媒介,也就是QBitmap像素图⽚类可以接收QImage类型的图⽚,⽽QImage类在实例化时可以接收数组,不过需要注意的是,数组必须拉平成⼀维数组,这样QImage实例化的第⼀个参数是数组,第⼆个参数和第三个参数需要指明图⽚数据的宽和⾼,这⾥的宽和⾼可以根据read()⽅法读取数据的数组形状来确定,也就是通过read()数据后的shape属性来获取图像数据的宽和⾼。QImage最后的数据就是处理数组时的格式化⽅式,这⾥采⽤QImage.Format_RGB888模式,也就是8
highcharts地图位RGB的模式,这样的QImage型数据就可以作为QBitmap类中fromImage⽅法的参数,然后再通过图像标签的setBitmap⽅法将图像显⽰在图像标签中。对应的具体代码如下。
from PyQt5.QtCore import  *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import sys
from cv2 import *
import time;
#⾯向对象的⽅法来开发
class VideoBox(QWidget):
#初始化界⾯
def __init__(self):
#把⽗类界⾯继承过来
QWidget.__init__(self)
#设置⼀个播放和暂停的状态值
self.status=True
self.pictureLabel=QLabel()
init_image=QPixmap("resources/sssss.jpg")
self.pictureLabel.setPixmap(init_image)
#把按钮加到桌⾯上
self.playButton=QPushButton()
#设置按钮有效
self.playButton.setEnabled(True)
#设置图标
sklearn实现逻辑回归self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
#把点击动作发⽣在按钮上,clicked点击,connect表⽰点击后执⾏哪⼀个函数
self.t(self.switch_video)
#做布局,指明布局⽅向,有的布局横向QHBoxLayout 纵向布局 QVBoxLayout
layout1=QVBoxLayout()
layout1.addWidget(self.pictureLabel)
layout1.addWidget(self.playButton)
self.setLayout(layout1)
#定义全局视频
self.playCapture = VideoCapture("resources/test.avi")
#定义定时器
def switch_video(self):
success,datas=ad()
height,width=datas.shape[:2]
image_datas=QImage(datas.flatten(),width,height,QImage.Format_RGB888)
image=QPixmap.fromImage(image_datas)
self.pictureLabel.setPixmap(image)
if __name__=="__main__":
#定义app
app=QApplication(sys.argv)
#定义的界⾯类实例化
mv=VideoBox()
mv.show()
<_())
注意,代码中调⽤read()⽅法后通过success和datas来接收的,success接收的就是read()⽅法后成功或失败的布尔值,datas就是视频读取的数据,这⾥直接把数据进⾏使⽤,没有判断success是否为True,如果需要判断数据是否读取成功,需要对success的值进⾏判断,把对datas进⾏数据处理的句⼦放在条件判断的语句体中即可。具体修改后的代码如下。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。