Потоковая передача камеры Raspberry Pi на веб-страницу HTML с использованием Picamera и Flask

8

Я пытаюсь использовать Picamera API и Flask для реализации чистого Python (живого) потока непрерывного JPEG из модуля камеры Raspberry Pi, чтобы отобразить его с помощью шаблона HTML, но я продолжаю получать сообщение «Ошибка 404 не найдена»?

Я немного неопытен с этой конкретной темой, заранее извиняюсь.

 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

Вот HTML-код:

 <img src="{{ url_for('vid') }}"width='950px' height='450px'>
crispy2k12
источник
3
Тип 404 предполагает, что вы можете использовать неправильный URL или номер порта. Можете ли вы подтвердить, что можете перейти на страницу, если ее содержание закомментировано?
Губеринг
Я заметил, что я поместил функцию render_template после if name == ' main ': app.run (host = '169.254.21.3), но я получаю новую ошибку "werkzeug.routing.BuildError, BuildError: Не удалось создать URL для конечной точки vid. Вы имели в виду «static» вместо этого? " и спасибо
crispy2k12
1
Не могли бы вы попробовать вставить символ @ перед app.route и перезапустить?
Губеринг
ура, я должен действительно проверить мой синтаксис, теперь моя страница показывает, но поток не появляется?
crispy2k12
1
Вы ничего не возвращаете из функции vid () - вы собираете JPEG, но не передаете их в представление. Добавьте импорт: из файла импорта send_file и вне цикла for попробуйте добавить: return send_file (stream, mimetype = 'image / jpeg')
goobering

Ответы:

5

Я еще немного почитал, и не думаю, что ваш подход когда-нибудь будет работать так, как хотелось бы. Статья Мигель Гринберг здесь описывается , как достичь Raspberry Pi камеры потоковой в термос, и предоставляет несколько полезных примеров. Предоставляется простая, полная (не камера Pi) программа, которая показывает использование функции генератора и типа ответа из нескольких частей для достижения анимированной потоковой передачи:

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

Вы можете видеть, что /video-feedмаршрут возвращает объект многоэлементного типа ответа, который постоянно генерируется gen(camera)функцией. Без такого подхода я подозреваю, что статичное изображение - это все, что вы когда-либо увидите. Существует полный пример потокового приложения picamera-к-термос на основе выше учебник здесь .

goobering
источник
просто небольшая заметка, но пример не полный, для этого требуется дополнительный файл ( camera.py) из учебника.
machow
-1

Просто измените импорт камеры на Picamera. Вы должны установить ffpmeg ang mpeg-streamer. Если эти два модуля не работают, установите также uv4l. После этого перезапустите и все заработает

Ruchir
источник