python +cv2实现视频流播放 - Go语言中文社区

python +cv2实现视频流播放


最近项目遇到了视频流 的解析与播放功能,虽然暂时是由JAVA负责开发(本人负责C++开发),但是也顺便研究了一下python的简单实现,不多说直接上代码

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import cv2  
import threading


class Producer(threading.Thread):  
    """docstring for ClassName"""  
    def __init__(self,str_rtsp):  
        super(Producer, self).__init__()  
        self.str_rtsp = str_rtsp
        #通过cv2中的类获取视频流操作对象cap  
        self.cap = cv2.VideoCapture(self.str_rtsp)   
        #调用cv2方法获取cap的视频帧(帧:每秒多少张图片)  
        fps = self.cap.get(cv2.CAP_PROP_FPS)  
        print(fps)  
        #获取cap视频流的每帧大小  
        size = (int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)),  
                int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))  
        print(size)  
        #定义编码格式mpge-4  
        fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', '2')  
        #定义视频文件输入对象  
        self.outVideo = cv2.VideoWriter('saveDir.avi',fourcc,fps,size)
        cv2.namedWindow("cap video",0);
    def run(self):  
        print('in producer')   
        while True:  
            ret,image = self.cap.read()
            if (ret == True):
                cv2.imshow('cap video',image)
                self.outVideo.write(image)
            if cv2.waitKey(1) & 0xFF == ord('q'): 
                self.outVideo.release()  
                self.cap.release()  
                cv2.destroyAllWindows()
                break
                # continue


if __name__ == '__main__':  
    print('run program')  
    rtsp_str='rtmp://live.hkstv.hk.lxdns.com/live/hks'
    producer = Producer(rtsp_str)  
    producer.start()       
以上就是python实现视频流播放的简单代码


基本可以实现视频流播放,但是我发现一个问题,就是点击叉号无法关闭视频窗口,只能通过键盘事件关闭,然后仔细研究代码发现,循环里cv2.imshow('cap video',image) 会创建窗口,也就是说每次关闭之后,cv2.imshow都会创建新的窗口,所以才会一直关不掉,问题是找到了但是一直找不到python里的解决方法,最后想到如果能获取当前窗口是否存在,不就可以解决创建问题么所以我又改了下代码

#!/usr/bin/env python3
#-*- coding:utf-8 -*-
import cv2  
import threading
import win32gui,win32con

class Producer(threading.Thread):  
    """docstring for ClassName"""  
    def __init__(self,str_rtsp):  
        super(Producer, self).__init__()  
        self.str_rtsp = str_rtsp
        self.play = True
        #通过cv2中的类获取视频流操作对象cap  
        self.cap = cv2.VideoCapture(self.str_rtsp)   
        #调用cv2方法获取cap的视频帧(帧:每秒多少张图片)  
        fps = self.cap.get(cv2.CAP_PROP_FPS)  
        print(fps)  
        #获取cap视频流的每帧大小  
        size = (int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)),  
                int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))  
        print(size)  
        #定义编码格式mpge-4  
        fourcc = cv2.VideoWriter_fourcc('M', 'P', '4', '2')  
        #定义视频文件输入对象  
        self.outVideo = cv2.VideoWriter('saveDir.avi',fourcc,fps,size)
        cv2.namedWindow("cap video",0);
    def run(self):  
        print('in producer')   
        while True:  
            ret,image = self.cap.read()
            if (ret == True):
                if win32gui.FindWindow(None,'cap video'):
                    cv2.imshow('cap video',image)
                    self.outVideo.write(image)
                else:  
                    self.outVideo.release()
                    self.cap.release()  
                    cv2.destroyAllWindows()
                    break
            cv2.waitKey(1)
            if cv2.waitKey(1) & 0xFF == ord('q'): 
                self.outVideo.release()  
                self.cap.release()  
                cv2.destroyAllWindows()
                break
                # continue

if __name__ == '__main__':  
    print('run program')  
    rtsp_str='rtmp://live.hkstv.hk.lxdns.com/live/hks'
    producer = Producer(rtsp_str)  
    producer.start()
通过判断当前窗口是否存在,来决定图片更新,原则是循环外创建窗口,循环内更新图片
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/jiadianyong12138/article/details/80433063
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-04-19 17:15:06
  • 阅读 ( 688 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢