Python opencv 播放视频详解

本文详细介绍了如何使用Python的PyQt5和OpenCV库实现视频播放功能,包括定时器播放、线程播放、网页播放、逐帧与倍速播放、进度条控制、视频抓拍、下载、局部放大以及窗口大小变化时视频尺寸的自适应。还讨论了在布局管理中确保视频窗口大小调整的技巧。
摘要由CSDN通过智能技术生成

内容简介

本文使用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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦天幻地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值