Итак, у меня есть требование создания видеопотока с OpenCV. Я получаю доступ к своей камере ноутбука и отображаю каждый кадр на Flask. Кроме того, каждые 5 секунд делается снимок (имя файла - текущая временная метка).
У меня 2 проблемы:
- Поток «время от времени» «отстает», потому чтоиз сделанного снимка, я думаю,
- Только один клиент может получить доступ к потоку одновременно, поэтому, когда я открываю поток на своем ноутбуке и моем смартфоне (оба находятся в одной сети), новый клиентобслуживается, а старый зависает.
Вот мой исходный код:
server.py
from camera import VideoCamera
import time
app = Flask(__name__)
def gen(camera):
last_recorded_time = time.time()
while True:
curr_time = time.time()
frame = camera.get_encoded_frame()
if curr_time - last_recorded_time >= 5:
camera.save_encoded_frame(frame)
last_recorded_time = curr_time
yield (b'--frame\r\n'
b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n\r\n')
@app.route('/')
def video_route():
return Response(gen(VideoCamera()), mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(host='10.0.0.6', threaded=True, debug=True)
camera.py
import cv2
import datetime
import numpy as np
class VideoCamera(object):
def __init__(self):
self.video = cv2.VideoCapture(0)
def __del__(self):
self.video.release()
def get_encoded_frame(self):
_, image = self.video.read()
return cv2.imencode('.jpg', image)[1].tobytes()
def save_encoded_frame(self, frame_in_bytes):
nparr = np.fromstring(frame_in_bytes, np.uint8)
decoded_image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
cv2.imwrite("{}.jpg".format(datetime.datetime.now().strftime('%y_%m_%d____%H_%M_%S')), decoded_image)
Я уже пробовал параметр "threadaded" в методе запуска Flask, но он не исправляет никаких проблем.
Буду признателен за любую помощь !!!