如何使用套接字将Raspberry pi的实时流视频发送到Flask Web应用

时间:2020-04-08 08:11:04

标签: python sockets flask raspberry-pi azure-web-app-service

想法是,我的Web应用程序将部署在Azure云中。因此,为了从Raspberry pi获得实时视频流,我使用了套接字。现在,问题是,每当我使用TCP连接运行Raspberry pi的服务器端代码时,它就成功与客户端(Flask Web应用程序)连接,但是当我的Pi相机启动时,它给了我一个断线的错误。如果您能纠正我的问题,我将非常感谢您的帮助,也请查看我的Flask网络应用程序我是否做得正确,是否还有另一种简单的方法可以完成此任务?

这是客户端代码(Flask Web应用程序): 后端:

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)

前端:

<!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()

0 个答案:

没有答案