Raspberry Pi зависает при потоковой передаче видео с Flask - PullRequest
0 голосов
/ 02 марта 2020

У меня есть приложение Flask -Socketio, которое отображает информацию о системе Raspberry Pi, такую ​​как температура, оперативная память и дисковое пространство. Это приложение также имеет компонент потокового видео VideroStream.py.

Я добавил VideroStream.py маршрут к index.py, используя Flask план. При доступе к приложению в браузере RPI зависает и в журнале ошибок отображается:

>  Truncated or oversized response headers received from daemon process
> 'rpiWebServer': /var/www/rpiWebServer.wsgi

Почему это происходит? Эта строка верна videoStreamBp = Blueprint('video_stream', __name__)? Должен ли я использовать videopi вместо video_stream?

Когда я создаю автономное приложение без светокопии и потоковая передача Socketio работает отлично.

ОБНОВЛЕНИЕ:

Когда я удаляю изображение src="{{url_for(videopi)}}" страница загружается без видео, как ожидалось.

index.py

from flask import Flask, render_template, Response, request
from flask_socketio import SocketIO, emit
from threading import Lock

#for temp
import os
import datetime
import ast
import psutil

app = Flask(__name__)
#for socket
async_mode = None
socketio = SocketIO(app, async_mode=async_mode)
#thread = None
thread1 = None
thread_lock = Lock()

from findPath import findPathBp
app.register_blueprint(findPathBp)
from videoStream import videoStreamBp
app.register_blueprint(videoStreamBp)

# GET RAM info
def getSysInfo():
    count = 0
    while True:
        #RAM
        memory = psutil.virtual_memory()
        ramAvailable = round(memory.available/1024.0/1024.0,1) # Divide from Bytes -> KB -> MB
        ramTotal = round(memory.total/1024.0/1024.0,1)

        #Temp
        temp = os.popen("vcgencmd measure_temp").readline()
        cpuTemp = temp.replace("temp=","")
        cpuTemp = cpuTemp.replace("'C","°C")

        #DISK
        disk = psutil.disk_usage('/')
        # Divide from Bytes -> KB -> MB -> GB
        diskFree = round(disk.free/1024.0/1024.0/1024.0,1)
        diskTotal = round(disk.total/1024.0/1024.0/1024.0,1)

        socketio.sleep(1)
        count += 1
        socketio.emit('sysStat',{'available': ramAvailable, 'total': ramTotal, 'temp': cpuTemp, 'freeDisk': diskFree, 'totalDisk': diskTotal }, namespace='/getSysInfo')



#index route
@app.route("/", methods=['GET', 'POST'])
def index():
    return render_template('index.html', result= timeString)

#socket IO
# Get system info
@socketio.on('connect', namespace='/getSysInfo')
def test_connect():
    global thread1
    with thread_lock:
        if thread1 is None:
            thread1 = socketio.start_background_task(getSysInfo)

if __name__ == "__main__":
   socketio.run(host='192.168.225.47', port=80, debug=True, threaded=True)

videoStream.py

from flask import Blueprint, render_template, Response
videoStreamBp = Blueprint('video_stream', __name__)

# Raspberry Pi camera module (requires picamera package)
from camera_pi import Camera
def gen(camera):
    # Video streaming generator function.
    while True:
        frame = camera.get_frame()
        yield (b'--frame\r\n'
               b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')

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

index. html

        <div class='fifty'>
            <p class='tempConainer'>CPU temperature is: <span id='temp'>Loading..</span></p><br>
            <p class='tempConainer'>RAM available: <span id='ramInfo'>Loading..</span></p>
            <p class='tempConainer'>RAM total: <span id='ramInfo1'>Loading..</span></p><br>
            <p class='tempConainer'>Free disk: <span id='freeDisk'>Loading..</span></p><br>
            <p class='tempConainer'>Total disk: <span id='totalDisk'>Loading..</span></p><br>
        </div>
        <div class='fifty'>
            <img src="{{url_for(videopi)}}">
        </div>

1 Ответ

0 голосов
/ 02 марта 2020

Наконец, я обнаружил, что атрибут изображения sr c неверен, и изменил его на следующее:

<img src='/videopi'>

Работает как шарм.

...