Streaming de la caméra Raspberry Pi vers une page Web HTML à l'aide de picamera et de Flask

8

J'essaie d'utiliser l' API picamera et Flask pour implémenter un flux Python (en direct) pur du JPEG continu à partir du module de caméra Raspberry Pi pour l'afficher à l'aide d'un modèle HTML, mais je reçois toujours une "erreur 404 introuvable"?

Je suis un peu inexpérimenté avec ce sujet particulier, excuses à l'avance.

 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

Voici le code HTML:

 <img src="{{ url_for('vid') }}"width='950px' height='450px'>
crispy2k12
la source
3
Une sorte de 404 suggère que vous utilisez peut-être la mauvaise URL ou le mauvais numéro de port. Pouvez-vous confirmer que vous pouvez accéder à la page si son contenu est commenté?
goobering
Je remarque que j'ai placé la fonction render_template après le if name == ' main ': app.run (host = '169.254.21.3) mais je reçois une nouvelle erreur "werkzeug.routing.BuildError, BuildError: Impossible de construire l'url pour le point de terminaison "vid". Vouliez-vous plutôt dire "statique"? " et merci
crispy2k12
1
Pourriez-vous essayer de coller un symbole @ devant «app.route» et de relancer?
goobering le
cheers, je devrais vraiment vérifier ma syntaxe, maintenant ma page s'affiche mais le flux n'apparaît pas?
crispy2k12
1
Vous ne retournez rien de la fonction vid () - vous collectez des jpegs, mais vous ne les passez pas à la vue. Ajoutez l'importation: depuis flask import send_file, et en dehors de la boucle for , essayez d'ajouter: return send_file (stream, mimetype = 'image / jpeg')
goobering le

Réponses:

5

J'ai fait un peu plus de lecture, et je ne pense pas que votre approche fonctionnera jamais comme souhaité. L'article de Miguel Grinberg décrit ici comment obtenir une caméra Raspberry Pi en streaming sur Flask, et fournit plusieurs exemples utiles. Un programme simple et complet (caméra non Pi) est fourni qui montre l'utilisation d'une fonction de générateur et d'un type de réponse en plusieurs parties pour obtenir une diffusion animée:

#!/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)

Vous pouvez voir que la /video-feedroute renvoie un objet de type de réponse en plusieurs parties qui est généré en continu par la gen(camera)fonction. Sans cette approche, je soupçonne qu'une image statique est tout ce que vous verrez. Il y a un exemple complet d'une application de streaming picamera vers Flask basée sur le tutoriel ci-dessus ici .

goobering
la source
juste une note mineure, mais l'exemple n'est pas complet, il nécessite un fichier supplémentaire ( camera.py) du tutoriel.
machow
-1

Changez simplement la caméra d'importation en picamera. Vous devez installer ffpmeg ang mpeg-streamer. Si ces deux modules ne fonctionnent pas, installez également uv4l. Après cela, redémarrez-le et cela fonctionne

Ruchir
la source