采用线程播放视频内容,防止界面卡死

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#  窗体对应的逻辑部分
class videoWindow(Ui_videoForm,QtWidgets.QWidget):
def __init__(self, parent=None):
super(videoWindow, self).__init__(parent)
self.setupUi(self)

def videoprocessing(self):
# print("gogo")
global videoName #在这里设置全局变量以便在线程中使用
videoName,videoType= QFileDialog.getOpenFileName(self.pushButton_choose,
"选择视频",
'常用路径',
#*.mp4;;*.avi;;
" All Files (*)")
#cap = cv2.VideoCapture(str(videoName))
def playvideo(self):
th = Thread(self)
th.changePixmap.connect(self.setImage)
th.start()

def setImage(self, image):
self.label_image.setPixmap(QPixmap.fromImage(image))

#采用线程来播放视频
class Thread(QThread):

changePixmap = pyqtSignal(QtGui.QImage)
def run(self):
cap = cv2.VideoCapture(videoName)
print(videoName)
while (cap.isOpened()==True):
ret, frame = cap.read()
if ret:
rgbImage = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
convertToQtFormat = QtGui.QImage(rgbImage.data, rgbImage.shape[1], rgbImage.shape[0], QImage.Format_RGB888)#在这里可以对每帧图像进行处理,
p = convertToQtFormat.scaled(600, 600, Qt.KeepAspectRatio)
self.changePixmap.emit(p)
time.sleep(0.01) #控制视频播放的速度
else:
break