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()
在做图像识别处理时候,通过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()
相关文章推荐
- python之函数实现生产者消费者模型(开发模型)
- 多进程 队列 实现生产者消费者模型 python 笔记
- Python3之线程Queue实现生产者消费者模型
- python用于实现多线程异步交互之生产者消费者模型
- 利用python实现生产者消费者的并发模型
- 11.python并发入门(part8 基于线程队列实现生产者消费者模型)
- 【Python之旅】第六篇(五):生产者消费者模型实现多线程异步交互
- python编写类来实现生产者消费者模型
- 4.利用python生成器实现简单的“生产者消费者”模型
- Linux互斥与同步应用(三):posix线程实现单个生产者和单个消费者模型
- Win32信号量实现生产者消费者模型
- Linux--Condition Variable(条件变量)实现生产者-消费者模型 、读写锁
- Kafka 简单实验二(Python实现简单生产者消费者)
- Python之生产者&、消费者模型
- JAVA实现多线程生产者消费者模型
- python中的生产者以及消费者实现
- 生产者消费者模型实现<二>真实实现BlockingQueue
- 13、生产者消费者模型_两种实现方式2
- 使用swoole实现生产者消费者模型(2)
- Java实现生产者-消费者模型