Идея в том, что мое веб-приложение будет развернуто в azure облаке. поэтому для получения потокового видео от Raspberry pi я использую сокеты. Теперь проблема заключается в том, что всякий раз, когда я запускаю код серверной стороны Raspberry pi, использующий TCP-соединение, он успешно соединяется с клиентом (Flask веб-приложение), но в тот момент, когда моя камера Pi запускается, это выдает мне ошибку сломанного канала. Я был бы очень признателен за вашу помощь, если бы вы могли исправить меня, также, пожалуйста, посмотрите на мое Flask веб-приложение, которое я делаю правильно, или нет, и есть ли другой простой способ выполнить эту задачу?
Это клиент боковой код (Flask веб-приложение): Back End:
from flask import Flask
from flask import render_template, Response
import socket
from PIL import Image
import cv2
import numpy
import struct
import io
app = Flask(__name__)
@app.route("/")
def home():
return render_template('home.html')
def gen():
client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect(("192.168.8.100",8081))
connection=client_socket.makefile('wb')
try:
img = None
while True:
image_len = struct.unpack('<L', connection.read(struct.calcsize('<L')))[0]
if not image_len:
break
image_stream = io.BytesIO()
image_stream.write(connection.read(image_len))
image_stream.seek(0)
image = Image.open(image_stream)
im = cv2.cvtColor(numpy.array(image), cv2.COLOR_RGB2BGR)
yield(image.read())
finally:
connection.close()
client_socket.close
return
@app.route("/video_feed")
def video_feed():
return Response(gen(),mimetype='multipart/x-mixed-replace')
if __name__ == '__main__':
import os
HOST = os.environ.get('SERVER_HOST', 'localhost')
try:
PORT = int(os.environ.get('SERVER_PORT', '8081'))
except ValueError:
PORT = 8081
app.run(HOST, PORT)
Front end:
<!DOCTYPE html>
<html lang="en">
<head>
<title>LIVE STREAMING</title>
<link rel="stylesheet" type="text/css" href="/static/css/Style.css" />
</head>
<body>
<h1> Live Video Streaming </h1>
<img src="{{ url_for('video_feed') }}">
</body>
</html>
Код на стороне сервера (работает на Raspberry pi):
import io
import socket
import struct
import time
import picamera
import sys
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0',8081))
server_socket.listen(5)
print("waiting for connection...")
connection = server_socket.accept()[0].makefile('rb')
try:
with picamera.PiCamera() as camera:
camera.resolution = (640, 480)
print("starting Camera...........")
time.sleep(2)
stream = io.BytesIO()
for foo in camera.capture_continuous(stream, 'jpeg'):
connection.write(struct.pack('<L', stream.tell()))
connection.flush()
stream.seek(0)
connection.write(stream.read())
stream.seek(0)
stream.truncate()
finally:
connection.close()
server_socket.close()