您的位置:首页 > 编程语言 > Python开发

python3用消费者和生产者模型,实现视频流读取播放

2017-12-14 17:26 1116 查看
背景:

    在做图像识别处理时候,通过opencv读入RTSP流,解码成每一帧,对每一帧做算法处理,结果会出现解码错误,然后视频读取就卡死。因此采用消费者-生产者模型,通过生产者线程进行生成(读入视频帧)存入queue队列,再通过消费者线程对视频帧进行消费处理。

代码如下:

from queue import Queue
import threading
import cv2
import time,random

class Producer(threading.Thread):
"""docstring for ClassName"""
def __init__(self, frame_queue):
super(Producer, self).__init__()
self.frame_queue = frame_queue

def run(self):
print('in producer')
cap = cv2.VideoCapture('rtsp://admin:passwd@10.130.10.111:554/MPEG-4/ch1/main/av_stream')
print('cap is open',cap.isOpened())
while True:
ret,image = cap.read()
print('get frame = ',ret)
if (ret == True):
self.frame_queue.put(image)
else:
cap = cv2.VideoCapture('rtsp://admin:passwd@10.130.10.111:554/MPEG-4/ch1/main/av_stream')
print('cap is open',cap.isOpened())
# continue

class Consumer(threading.Thread):
"""docstring for Consumer"""
def __init__(self, frame_queue):
super(Consumer, self).__init__()
self.frame_queue = frame_queue

def run(self):
print('in consumer')
while True:
print('frame_queue size=',self.frame_queue.qsize())
frame = self.frame_queue.get()
cv2.imshow('cap video',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
videoWriter.release()
cap.release()
cv2.destroyAllWindows()
break

if __name__ == '__main__':

print('run program')
#定义队列
frame_queue = Queue()

producer = Producer(frame_queue)
producer.daemon = True
producer.start()

print('run Consumer')
consumer = Consumer(frame_queue)
consumer.daemon = True
consumer.start()

producer.join()
consumer.join()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: