给之前python+openCV实现播放器增加一个页面实现,我选择了pyqt来做一个简单的页面。
-
选择视频文件
-
播放控制:(除了视频播放需要重写,其他功能都只需要调用之前写好的函数即可,已经现的功能)
- 播放,使用 pyqt 的
QLabel
控件展示一帧一帧的图片。 - 暂停,将暂停方法和暂停按钮关联。
- 重播,将视频资源 释放
VideoCapture.release()
后重新加载。 - 截图,关联截图功能。
- 通过进度条控制播放进度 (暂未实现)
- 声音调节(暂未实现)
- 播放,使用 pyqt 的
-
代码实现:
- 实现label展示一张图片
播放按钮和播放方法关联
展示图片方法# 将播放按钮和播放函数关联。 self.PlayBtn.clicked.connect(self.play)
def play(self): video_path = 'https://cdn.theguardian.tv/webM/2015/07/20/150716YesMen_synd_768k_vp8.webm' vplayer = Cv2Player(video_path) open_status = vplayer.capture.isOpened() vplayer.ret, image = vplayer.capture.read() if vplayer.ret is True: vplayer.image = image # 将openCV获取的帧图片格式进行转换,openCV读取帧图片的格式是BGR QtImgBuf = cv2.cvtColor(image, cv2.COLOR_BGR2BGRA) # 把转换格式后的帧图片,实例化QImage对象 QtImg = QtGui.QImage(QtImgBuf.data, QtImgBuf.shape[1], QtImgBuf.shape[0], QtGui.QImage.Format_RGB32) # VideoPlayer是UI界面中的label对象。先用QtImg实例和QPixmap对象,然后将其传给label self.VideoPlayer.setPixmap(QPixmap.fromImage(QtImg)) # 使用QLabel的setScaledContents方法,是图片自适应QLabel的大小 self.VideoPlayer.setScaledContents(True)
- 重写播放发放,实现播放功能
# 获取当前视频状态 def play(self): video_path = 'https://cdn.theguardian.tv/webM/2015/07/20/150716YesMen_synd_768k_vp8.webm' vplayer = Cv2Player(video_path) open_status = vplayer.capture.isOpened() while open_status: vplayer.ret, image = vplayer.capture.read() if vplayer.ret is True: vplayer.image = image # 将openCV获取的帧图片格式进行转换,openCV读取帧图片的格式是BGR QtImgBuf = cv2.cvtColor(image, cv2.COLOR_BGR2BGRA) # 把转换格式后的帧图片,实例化QImage对象 QtImg = QtGui.QImage(QtImgBuf.data, QtImgBuf.shape[1], QtImgBuf.shape[0], QtGui.QImage.Format_RGB32) # VideoPlayer是UI界面中的label对象。先用QtImg实例和QPixmap对象,然后将其传给label self.VideoPlayer.setPixmap(QPixmap.fromImage(QtImg)) # 使用QLabel的setScaledContents方法,是图片自适应QLabel的大小 self.VideoPlayer.setScaledContents(True) vplayer._exit_timing = 0 elif vplayer.exit_timing(): # 如果倒计时为真,播放结束 break # 跟进帧率控制播放每帧图片显示的间隔 cv2.waitKey(int(1000 / int(vplayer.fps))) # 停止视频播放 vplayer.stop()
- 实现label展示一张图片