给之前python+openCV实现播放器增加一个页面实现,我选择了pyqt来做一个简单的页面。
选择视频文件
播放控制:(除了视频播放需要重写,其他功能都只需要调用之前写好的函数即可,已经现的功能)
QLabel
控件展示一帧一帧的图片。VideoCapture.release()
后重新加载。代码实现:
# 将播放按钮和播放函数关联。
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()