Я делаю проект, который состоит из двух частей. сначала я использую process.py
, и он читает видео по ссылке rtsp в бесконечном l oop, а затем записывает выходное изображение на сервер в том же l oop. как то так:
import cv2
from threading import Thread
class RTSPVideoWriterObject(object):
def __init__(self, src=src):
# Create a VideoCapture object
self.capture = cv2.VideoCapture(src)
self.status, self.frame = None, None
# Start the thread to read frames from the video stream
self.thread = Thread(target=self.update, args=())
self.thread.daemon = True
self.thread.start()
def update(self):
# Read the next frame from the stream in a different thread
while True:
if self.capture.isOpened():
(self.status, self.frame) = self.capture.read()
def save(self):
while True:
try:
# Do some processes
cv2.imwrite('path/to/folder/image.jpg')
except AttributeError:
pass
if __name__ == '__main__':
src = 'rtsp://some-link'
video_stream_widget = RTSPVideoWriterObject(rtsp_stream_link)
video_stream_widget.save()
Работает просто отлично. Следующая часть - это файл server.py
, который я запускаю, пока process
выполняется и сохраняет изображение, чтобы сделать его доступным для клиентов:
import cv2
from flask import Flask, render_template, Response
app = Flask(__name__)
@app.route('/video_feed')
def index():
"""Video streaming home page."""
return render_template('index.html')
def gen():
while True:
# Capture frame-by-frame
img = cv2.imread('path/to/server/image.jpg'))
# ret, img = cap.read()
# if ret:
img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5)
frame = cv2.imencode('.jpg', img)[1].tobytes()
yield b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n'
time.sleep(0.07)
# else:
# break
@app.route('/')
def video_feed():
"""Video streaming route. Put this in the src attribute of an img tag."""
return Response(gen(),
mimetype='multipart/x-mixed-replace; boundary=frame')
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8888, debug=True)
Проблема заключается в том, что при запуске код на сервере и проверка вывода на стороне клиента. Я получаю изображения, которые не полностью отрисованы, и это потому, что я получаю доступ к изображениям на сервере именно тогда, когда process.py
записывает изображение.
Я подумал, что смогу сохраните выходное изображение в process.py
в памяти и получите доступ к нему с помощью server.py
. или даже если бы я мог использовать библиотеку flask -socketio, я смогу добавить больше функций позже. но у меня не так много опыта работы с библиотеками flask
или flask.socketio
или bytesio
.
Мне было интересно, может ли кто-нибудь помочь мне решить эту проблему более организованным и стандартным способом.
Спасибо