Python opencv
内容简介
本文使用python 语言,使用 Pyqt5+opencv 实现视频播放。包括:开始/停止播放、网页播放、逐帧播放、倍速播放、播放进度条、抓拍、下载、局部放大等。
使用 QTimer 定时器播放
核心代码
#加载视频 启动定时器 暂停播放时停止定时器即可
self.cap = cv2.VideoCapture(self.url)
self.fps=self.cap.get(5)
self.timer_camera = QTimer(self)
self.timer_camera.timeout.connect(self.show_pic)
#显示视频
def show_pic(self):
#暂停
if self.bfC == 5:
return
success, frame = self.cap.read()
if success:
self.img=frame
show = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
showImage = QImage(show.data, show.shape[1], show.shape[0], QImage.Format_RGB888)
# showImage=showImage.copy(self.x1, self.y1,self.x2, self.y2)
pix=QPixmap.fromImage(showImage)
pix = pix.scaled(self.label.width(), self.label.height(), Qt.IgnoreAspectRatio)
#--------------------------------------
#局部放大
pix = pix.copy(self.x1, self.y1,self.x2, self.y2)
self.label.setPixmap(pix)
#进度条
self.jdt()
cv2.waitKey(int(1000/self.fps))
else:
self.img = ""
self.pushButton_2.setText("重播")
self.timer_camera.stop()
使用线程(Thread)播放
当需要播放多个视频时 使用线程播放
# 显示视频
def show_pic(self,ids,rtmpUrl):
pp = 1
#加载多次视频【当加载视频流/网络视频时 有可能一次加载不上】
while pp < 4:
cap = cv2.VideoCapture(rtmpUrl)
fps = int(cap.get(cv2.CAP_PROP_FPS))
print("-----------------------1111111", fps)
if fps == 0:
pp += 1
continue
break
if fps == 0:
print("视频流获取失败=====》》",rtmpUrl)
# QMessageBox.information(self, "提示框", "读取视频失败,请查看网络连接!", QMessageBox.Yes)
return
aa={
"id":ids,"cap":cap}
#将加载的视频对象存入集合中
self.splList.append(aa)
#播放窗口
label = self.monitorList[ids]["monitorObject"]
#值为1 表示该窗口正在播放视频 停止播放视频时改变改值即可
self.monitorList[ids]["previewHandler"]=1
# 暂停
while True:
if self.monitorList[ids]["previewHandler"]==1:
try:
success, frame = cap.read()
if success:
show = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
showImage = QImage(show.data, show.shape[1], show.shape[0], QImage.Format_RGB888)
pix = QPixmap.fromImage(showImage)
pix = pix.scaled(label.width(),label.height(), Qt.IgnoreAspectRatio)
#全屏下才可局部放大
if label.isFullScreen():
pix = pix.copy(self.x1, self.y1, self.x2, self.y2)
label.setPixmap(pix)
cv2.waitKey(1)
else:
cap.release()
self.splList.remove(aa)
self.monitorList[ids]["previewHandler"] = 0
print("opencv 读取失败===========>", self.splList)
return
except Exception as e:
cap.release()
self.splList.remove(aa)
self.monitorList[ids]["previewHandler"] = 0
print("读取cap异常======》》",e)
return
else:
cap.release()
self.splList.remove(aa)
self.monitorList[ids]["previewHandler"] = 0
print("停止播放======》》")
return
网页播放
#启动 python 服务
os.system("python -m http.server 8083")
#打开html
webbrowser.open_new("http://localhost:8081/SSBF.html?sl=l&url=%s" % (self.url))
其中包含了播放本地视频以及摄像机视频。选用object标签 浏览器支持IE11
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Object 播放视频</title>
<script type="text/javascript" src="jquery-3.2.1.min.js"></script>
</head>
<body id="dsb">
<!--
mp4 IE/360/Chrome
avi IE/360
-->
<!--<object height="800" width="800" data="rtsp://admin:123456aaa@192.168.0.154:554/h265/ch1/sub/av_stream" type='application/x-vlc-plugin' pluginspage="http://www.videolan.org/" events='false' classid='clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921' codebase="http://downloads.videolan.org/pub/videolan/vlc/latest/win32/axvlc.cab"></object>-->
<!--<div >-->
<!--<h1 id="pp">fksdfjksdf</h1>-->
<!--</div>-->
</body>
<script type="text/javascript">
function jscs() {
// alert(0);
var bb = "";
var bb2 = "";
bb += "<object height=\"800\" width=\"800\" data=\"http://192.168.0.156/vid