社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
最近项目遇到了视频流 的解析与播放功能,虽然暂时是由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()
通过判断当前窗口是否存在,来决定图片更新,原则是循环外创建窗口,循环内更新图片
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!