Streaming der Raspberry Pi-Kamera auf eine HTML-Webseite mit Picamera und Flask

8

Ich versuche, die Picamera- API und Flask zu verwenden, um einen reinen Python (Live) -Stream des kontinuierlichen JPEG aus dem Raspberry Pi-Kameramodul zu implementieren, um ihn mithilfe einer HTML-Vorlage anzuzeigen, aber ich erhalte weiterhin den Fehler "404 nicht gefunden".

Ich bin ein bisschen unerfahren mit diesem speziellen Thema, entschuldige mich im Voraus.

 app.route('/test/')
    def vid():
            with picamera.PiCamera() as camera:
                    stream = io.BytesIO()
                    for foo in camera.capture_continuous(stream, format='jpeg'):

                            stream.truncate()
                            stream.seek(0)

                            if process(stream):
                                break

Hier ist der HTML-Code:

 <img src="{{ url_for('vid') }}"width='950px' height='450px'>
crispy2k12
quelle
3
Eine Art von 404 deutet darauf hin, dass Sie möglicherweise die falsche URL oder Portnummer verwenden. Können Sie bestätigen, dass Sie die Seite erreichen können, wenn ihr Inhalt auskommentiert ist?
Goobering
Ich stelle fest, dass ich die Funktion render_template nach dem if- Namen == ' main ' gesetzt habe: app.run (host = '169.254.21.3), aber ich erhalte einen neuen Fehler "werkzeug.routing.BuildError, BuildError: URL konnte nicht erstellt werden für Endpunkt 'vid'. Meinten Sie stattdessen 'statisch'? " und danke
crispy2k12
1
Könnten Sie versuchen, ein @ -Symbol vor 'app.route' zu setzen und erneut auszuführen?
goobering
Prost, ich sollte wirklich meine Syntax überprüfen, jetzt wird meine Seite angezeigt, aber der Stream wird nicht angezeigt?
crispy2k12
1
Sie geben nichts von der vid () - Funktion zurück - Sie sammeln JPEGs, übergeben sie aber nicht an die Ansicht. Fügen Sie den Import hinzu: von flask import send_file, und versuchen Sie außerhalb der for-Schleife Folgendes hinzuzufügen: return send_file (stream, mimetype = 'image / jpeg')
goobering

Antworten:

5

Ich habe noch etwas gelesen und glaube nicht, dass Ihr Ansatz jemals wie gewünscht funktionieren wird. Der Artikel von Miguel Grinberg beschreibt hier , wie man ein Raspberry Pi-Kamera-Streaming zu Flask erreicht, und bietet einige nützliche Beispiele. Es wird ein einfaches, vollständiges Programm (ohne Pi-Kamera) bereitgestellt, das die Verwendung einer Generatorfunktion und eines mehrteiligen Antworttyps zum Erzielen eines animierten Streamings zeigt:

#!/usr/bin/env python
from flask import Flask, render_template, Response
from camera import Camera

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

def gen(camera):
    while True:
        frame = camera.get_frame()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

@app.route('/video_feed')
def video_feed():
    return Response(gen(Camera()),
                    mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

Sie können sehen, dass die /video-feedRoute ein mehrteiliges Antworttypobjekt zurückgibt, das kontinuierlich von der gen(camera)Funktion generiert wird . Ohne diesen Ansatz ist vermutlich nur ein statisches Bild zu sehen. Es gibt ein komplettes Beispiel einer picamera-to-Flask - Streaming - Anwendung auf dem obigen Tutorial basierte hier .

goobering
quelle
Nur eine kleine Anmerkung, aber das Beispiel ist nicht vollständig. Es erfordert eine zusätzliche Datei ( camera.py) aus dem Tutorial.
Machow
-1

Ändern Sie einfach die Importkamera in Picamera. Sie müssen ffpmeg ang mpeg-streamer installieren. Wenn diese beiden Module nicht funktionieren, installieren Sie auch uv4l. Danach starten Sie es neu und es funktioniert

Ruchir
quelle