Как отправить потоковое видео в реальном времени из Raspberry pi в Flask веб-приложение с помощью сокетов - PullRequest
0 голосов
/ 08 апреля 2020

Идея в том, что мое веб-приложение будет развернуто в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...