想法是,我的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()